From d4e2752a67edabbefde45e1c82cb6a4fa2d2d012 Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Wed, 8 Jun 2016 11:31:45 +0100 Subject: [PATCH] Refactor to create _populate_mac_address To help move the population of the mac addresses, extracting it into a separate method. blueprint prep-for-network-aware-scheduling Change-Id: I4a7c0218b1b841856f44c55e33f3cc9a93cf0461 --- nova/network/neutronv2/api.py | 18 ++++++++++----- nova/tests/unit/network/test_neutronv2.py | 28 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index 5868a03175fb..014f77939a30 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -196,12 +196,8 @@ class API(base_api.NetworkAPI): port_req_body['port']['tenant_id'] = instance.project_id if security_group_ids: port_req_body['port']['security_groups'] = security_group_ids - if available_macs is not None: - if not available_macs: - raise exception.PortNotFree( - instance=instance.uuid) - mac_address = available_macs.pop() - port_req_body['port']['mac_address'] = mac_address + mac_address = self._populate_mac_address( + instance, port_req_body, available_macs) if dhcp_opts is not None: port_req_body['port']['extra_dhcp_opts'] = dhcp_opts port = port_client.create_port(port_req_body) @@ -247,6 +243,16 @@ class API(base_api.NetworkAPI): LOG.exception(_LE('Neutron error creating port on network %s'), network_id, instance=instance) + @staticmethod + def _populate_mac_address(instance, port_req_body, available_macs): + if available_macs is not None: + if not available_macs: + raise exception.PortNotFree( + instance=instance.uuid) + mac_address = available_macs.pop() + port_req_body['port']['mac_address'] = mac_address + return mac_address + def _check_external_network_attach(self, context, nets): """Check if attaching to external network is permitted.""" if not soft_external_network_attach_authorize(context): diff --git a/nova/tests/unit/network/test_neutronv2.py b/nova/tests/unit/network/test_neutronv2.py index a99729680eb7..233176a9985f 100644 --- a/nova/tests/unit/network/test_neutronv2.py +++ b/nova/tests/unit/network/test_neutronv2.py @@ -4216,6 +4216,34 @@ class TestNeutronv2ExtraDhcpOpts(TestNeutronv2Base): self._allocate_for_instance(1, dhcp_options=dhcp_opts) +class TestAllocateForInstanceHelpers(test.NoDBTestCase): + def test_populate_mac_address_skip_if_none(self): + api = neutronapi.API() + port_req_body = {} + + api._populate_mac_address(None, port_req_body, None) + + self.assertEqual({}, port_req_body) + + def test_populate_mac_address_raise_if_empty(self): + api = neutronapi.API() + port_req_body = {} + instance = objects.Instance(uuid=uuids.instance) + + self.assertRaises(exception.PortNotFree, + api._populate_mac_address, + instance, port_req_body, []) + + def test_populate_mac_address_adds_last(self): + api = neutronapi.API() + port_req_body = {'port': {"foo": "bar"}} + + api._populate_mac_address(None, port_req_body, ["a", "b"]) + + expected_port = {"foo": "bar", "mac_address": "b"} + self.assertEqual(expected_port, port_req_body["port"]) + + class TestNeutronv2NeutronHostnameDNS(TestNeutronv2Base): def setUp(self): super(TestNeutronv2NeutronHostnameDNS, self).setUp()