# See the License for the specific language governing permissions and
# limitations under the License.
+import itertools
+import operator
+
from oslo.config import cfg
from oslo.db import exception as db_exc
from oslo import messaging
nets = self._get_active_networks(context, **kwargs)
return [net['id'] for net in nets]
+ def _group_by_network_id(self, res):
+ grouped = {}
+ keyfunc = operator.itemgetter('network_id')
+ for net_id, values in itertools.groupby(sorted(res, key=keyfunc),
+ keyfunc):
+ grouped[net_id] = list(values)
+ return grouped
+
def get_active_networks_info(self, context, **kwargs):
"""Returns all the networks/subnets/ports in system."""
host = kwargs.get('host')
filters['enable_dhcp'] = [True]
subnets = plugin.get_subnets(context, filters=filters)
+ grouped_subnets = self._group_by_network_id(subnets)
+ grouped_ports = self._group_by_network_id(ports)
for network in networks:
- network['subnets'] = [subnet for subnet in subnets
- if subnet['network_id'] == network['id']]
- network['ports'] = [port for port in ports
- if port['network_id'] == network['id']]
+ network['subnets'] = grouped_subnets.get(network['id'], [])
+ network['ports'] = grouped_ports.get(network['id'], [])
return networks
self.assertEqual(len(self.log.mock_calls), 1)
+ def test_group_by_network_id(self):
+ port1 = {'network_id': 'a'}
+ port2 = {'network_id': 'b'}
+ port3 = {'network_id': 'a'}
+ grouped_ports = self.callbacks._group_by_network_id(
+ [port1, port2, port3])
+ expected = {'a': [port1, port3], 'b': [port2]}
+ self.assertEqual(expected, grouped_ports)
+
+ def test_get_active_networks_info(self):
+ plugin_retval = [{'id': 'a'}, {'id': 'b'}]
+ self.plugin.get_networks.return_value = plugin_retval
+ port = {'network_id': 'a'}
+ subnet = {'network_id': 'b'}
+ self.plugin.get_ports.return_value = [port]
+ self.plugin.get_subnets.return_value = [subnet]
+ networks = self.callbacks.get_active_networks_info(mock.Mock(),
+ host='host')
+ expected = [{'id': 'a', 'subnets': [], 'ports': [port]},
+ {'id': 'b', 'subnets': [subnet], 'ports': []}]
+ self.assertEqual(expected, networks)
+
def _test__port_action_with_failures(self, exc=None, action=None):
port = {
'network_id': 'foo_network_id',