diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index 707b98ddec..b63bcb34f3 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -393,9 +393,8 @@ class ComputeTaskManager(base.Base): if (requested_networks and not isinstance(requested_networks, objects.NetworkRequestList)): - requested_networks = objects.NetworkRequestList( - objects=[objects.NetworkRequest.from_tuple(t) - for t in requested_networks]) + requested_networks = objects.NetworkRequestList.from_tuples( + requested_networks) # TODO(melwitt): Remove this in version 2.0 of the RPC API flavor = filter_properties.get('instance_type') if flavor and not isinstance(flavor, objects.Flavor): diff --git a/nova/network/manager.py b/nova/network/manager.py index ea51606117..9de2b3a4be 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -398,9 +398,8 @@ class NetworkManager(manager.Manager): if (requested_networks and not isinstance(requested_networks, objects.NetworkRequestList)): - requested_networks = objects.NetworkRequestList( - objects=[objects.NetworkRequest.from_tuple(t) - for t in requested_networks]) + requested_networks = objects.NetworkRequestList.from_tuples( + requested_networks) vpn = kwargs['vpn'] macs = kwargs['macs'] admin_context = context.elevated() diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index 06bbde0b51..833aef52c6 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -1138,9 +1138,8 @@ class API(base_api.NetworkAPI): # TODO(danms): Remove me when all callers pass an object if isinstance(requested_networks[0], tuple): - requested_networks = objects.NetworkRequestList( - objects=[objects.NetworkRequest.from_tuple(t) - for t in requested_networks]) + requested_networks = objects.NetworkRequestList.from_tuples( + requested_networks) for request in requested_networks: if request.port_id: diff --git a/nova/objects/network_request.py b/nova/objects/network_request.py index 8bc0c1d261..a15d12f726 100644 --- a/nova/objects/network_request.py +++ b/nova/objects/network_request.py @@ -63,6 +63,18 @@ class NetworkRequestList(obj_base.ObjectListBase, obj_base.NovaObject): def as_tuples(self): return [x.to_tuple() for x in self.objects] + @classmethod + def from_tuples(cls, net_tuples): + """Convenience method for converting a list of network request tuples + into a NetworkRequestList object. + + :param net_tuples: list of network request tuples + :returns: NetworkRequestList object + """ + requested_networks = cls(objects=[NetworkRequest.from_tuple(t) + for t in net_tuples]) + return requested_networks + @property def is_single_unspecified(self): return ((len(self.objects) == 1) and diff --git a/nova/tests/unit/network/test_manager.py b/nova/tests/unit/network/test_manager.py index 4274a8b550..87dddde2cb 100644 --- a/nova/tests/unit/network/test_manager.py +++ b/nova/tests/unit/network/test_manager.py @@ -2022,10 +2022,8 @@ class CommonNetworkTestCase(test.TestCase): db = manager.db db.virtual_interface_delete_by_instance = mock.Mock() ctx = context.RequestContext('igonre', 'igonre') - requested_networks = objects.NetworkRequestList( - objects=[objects.NetworkRequest.from_tuple(t) - for t in [('123', '1.2.3.4'), ('123', '4.3.2.1'), - ('123', None)]]) + requested_networks = objects.NetworkRequestList.from_tuples( + [('123', '1.2.3.4'), ('123', '4.3.2.1'), ('123', None)]) manager.deallocate_for_instance( ctx, instance=fake_instance.fake_instance_obj(ctx), @@ -2041,9 +2039,8 @@ class CommonNetworkTestCase(test.TestCase): db = manager.db db.virtual_interface_delete_by_instance = mock.Mock() ctx = context.RequestContext('igonre', 'igonre') - requested_networks = objects.NetworkRequestList( - objects=[objects.NetworkRequest.from_tuple(t) - for t in [('123', '1.2.3.4'), ('123', '4.3.2.1')]]) + requested_networks = objects.NetworkRequestList.from_tuples( + [('123', '1.2.3.4'), ('123', '4.3.2.1')]) with mock.patch.object(manager.network_rpcapi, 'update_dns') as mock_update_dns: manager.deallocate_for_instance( diff --git a/nova/tests/unit/objects/test_network_request.py b/nova/tests/unit/objects/test_network_request.py index 8775b3871a..9f1d2f1ef2 100644 --- a/nova/tests/unit/objects/test_network_request.py +++ b/nova/tests/unit/objects/test_network_request.py @@ -49,19 +49,22 @@ class _TestNetworkRequestObject(object): self.assertEqual(('123', '1.2.3.4'), request.to_tuple()) - def test_from_tuple_neutron(self): - request = objects.NetworkRequest.from_tuple( - ('123', '1.2.3.4', FAKE_UUID, None)) - self.assertEqual('123', request.network_id) - self.assertEqual('1.2.3.4', str(request.address)) - self.assertEqual(FAKE_UUID, request.port_id) + def test_from_tuples_neutron(self): + requests = objects.NetworkRequestList.from_tuples( + [('123', '1.2.3.4', FAKE_UUID, None)]) + self.assertEqual(1, len(requests)) + self.assertEqual('123', requests[0].network_id) + self.assertEqual('1.2.3.4', str(requests[0].address)) + self.assertEqual(FAKE_UUID, requests[0].port_id) + self.assertIsNone(requests[0].pci_request_id) - def test_from_tuple_nova(self): - request = objects.NetworkRequest.from_tuple( - ('123', '1.2.3.4')) - self.assertEqual('123', request.network_id) - self.assertEqual('1.2.3.4', str(request.address)) - self.assertIsNone(request.port_id) + def test_from_tuples_nova(self): + requests = objects.NetworkRequestList.from_tuples( + [('123', '1.2.3.4')]) + self.assertEqual(1, len(requests)) + self.assertEqual('123', requests[0].network_id) + self.assertEqual('1.2.3.4', str(requests[0].address)) + self.assertIsNone(requests[0].port_id) @mock.patch('nova.utils.is_neutron', return_value=True) def test_list_as_tuples(self, is_neutron):