diff --git a/nova_dpm/tests/unit/virt/dpm/test_vif.py b/nova_dpm/tests/unit/virt/dpm/test_vif.py index 9003f76..a2f2268 100644 --- a/nova_dpm/tests/unit/virt/dpm/test_vif.py +++ b/nova_dpm/tests/unit/virt/dpm/test_vif.py @@ -19,7 +19,8 @@ from nova_dpm.virt.dpm.vif import DPMVIF VIF_DICT = { "details": {"port_filter": False, - "object_id": "3ea09d2a-b18d-11e6-89a4-42f2e9ef1641"}, + "object_id": "3ea09d2a-b18d-11e6-89a4-42f2e9ef1641", + "vlan": 1}, "address": "fa:16:3e:e4:9a:98", "type": "dpm_vswitch", "id": "703da361-9d4d-4441-b99b-e081c3e9cfbb"} @@ -43,9 +44,17 @@ class DPMVIFTestCase(TestCase): def test_get_details(self): details = {"port_filter": False, - "object_id": "3ea09d2a-b18d-11e6-89a4-42f2e9ef1641"} + "object_id": "3ea09d2a-b18d-11e6-89a4-42f2e9ef1641", + "vlan": 1} self.assertEqual(details, self.vif_obj.details) def test_get_dpm_nic_object_id(self): self.assertEqual('3ea09d2a-b18d-11e6-89a4-42f2e9ef1641', self.vif_obj.dpm_nic_object_id) + + def test_get_vlan_id(self): + self.assertEqual(1, self.vif_obj.vlan_id) + + def test_get_vlan_id_none(self): + vif_obj = DPMVIF({"details": {}}) + self.assertIsNone(vif_obj.vlan_id) diff --git a/nova_dpm/tests/unit/virt/dpm/test_vm.py b/nova_dpm/tests/unit/virt/dpm/test_vm.py index 7a2a1c3..fa02abb 100755 --- a/nova_dpm/tests/unit/virt/dpm/test_vm.py +++ b/nova_dpm/tests/unit/virt/dpm/test_vm.py @@ -257,6 +257,7 @@ class VmPartitionInstanceTestCase(TestCase): vif.dpm_nic_object_id = "3ea09d2a-b18d-11e6-89a4-42f2e9ef1641" vif.type = "dpm_vswitch" vif.port_id = "703da361-9d4d-4441-b99b-e081c3e9cfbb" + vif.vlan_id = None nic_interface = self.partition_inst.attach_nic(vif) self.assertEqual( 'OpenStack_Port_703da361-9d4d-4441-b99b-e081c3e9cfbb', @@ -270,6 +271,15 @@ class VmPartitionInstanceTestCase(TestCase): exceptions.InvalidVIFTypeError, self.partition_inst.attach_nic, vif) + def test_attach_nic_vlan(self): + vif = mock.Mock() + vif.type = "dpm_vswitch" + vif.vlan_id = 1 + + self.assertRaises( + exceptions.InvalidNetworkTypeError, + self.partition_inst.attach_nic, vif) + @mock.patch.object(vm.PartitionInstance, 'attach_nic') def test_attach_nics(self, mocked_attach_nic): vif1 = {"address": "mac1"} diff --git a/nova_dpm/virt/dpm/exceptions.py b/nova_dpm/virt/dpm/exceptions.py index 98c7453..9adbc5a 100644 --- a/nova_dpm/virt/dpm/exceptions.py +++ b/nova_dpm/virt/dpm/exceptions.py @@ -33,6 +33,13 @@ class InvalidVIFTypeError(NovaException): "hipersockets adapters.") +class InvalidNetworkTypeError(NovaException): + msg_fmt = _("The instance is connected to a network of type %(type)s. " + "Only flat networks are supported for launching DPM " + "partitions. Please reconfigure your Neutron networks to " + "become flat provider networks.") + + class BootOsSpecificParametersPropertyExceededError(NovaException): """The boot-os-specific-parameters property would exceed the allowed max""" msg_fmt = _("Exceeded the maximum len for the partitions " diff --git a/nova_dpm/virt/dpm/vif.py b/nova_dpm/virt/dpm/vif.py index 37dc989..790520a 100644 --- a/nova_dpm/virt/dpm/vif.py +++ b/nova_dpm/virt/dpm/vif.py @@ -37,3 +37,11 @@ class DPMVIF(object): @property def dpm_nic_object_id(self): return self.details['object_id'] + + @property + def vlan_id(self): + """VLAN ID of VIF + + @:returns vlan-id or None + """ + return self.details.get('vlan') diff --git a/nova_dpm/virt/dpm/vm.py b/nova_dpm/virt/dpm/vm.py index 34d5e99..1e3145e 100644 --- a/nova_dpm/virt/dpm/vm.py +++ b/nova_dpm/virt/dpm/vm.py @@ -224,6 +224,15 @@ class PartitionInstance(object): vif_obj.dpm_nic_object_id } + @staticmethod + def _verify_vif_valid(vif_obj): + # Only dpm_vswitch attachments are supported for now + if vif_obj.type != "dpm_vswitch": + raise exceptions.InvalidVIFTypeError(type=vif_obj.type) + + if vif_obj.vlan_id: + raise exceptions.InvalidNetworkTypeError(type="VLAN") + def attach_nics(self, network_info): for vif_dict in network_info: vif_obj = vif.DPMVIF(vif_dict) @@ -233,10 +242,7 @@ class PartitionInstance(object): # TODO(preethipy): Implement the listener flow to register for # nic creation events LOG.debug("Creating nic interface for the instance") - - # Only dpm_vswitch attachments are supported for now - if vif_obj.type != "dpm_vswitch": - raise exceptions.InvalidVIFTypeError(type=vif_obj.type) + self._verify_vif_valid(vif_obj) dpm_nic_dict = self._get_nic_properties_dict(vif_obj) LOG.debug("Creating NIC with properties: %s", dpm_nic_dict)