diff --git a/vmware_nsx/plugins/common_v3/plugin.py b/vmware_nsx/plugins/common_v3/plugin.py index 8486e2aef8..896fe1df8b 100644 --- a/vmware_nsx/plugins/common_v3/plugin.py +++ b/vmware_nsx/plugins/common_v3/plugin.py @@ -1160,6 +1160,10 @@ class NsxPluginV3Base(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, if db_entry: return True if db_entry.vlan_transparent else False + def _is_backend_port(self, context, port_data, delete=False): + # Can be implemented by each plugin + return True + def _extend_nsx_port_dict_binding(self, context, port_data): # Not using the register api for this because we need the context # Some attributes were already initialized by _extend_port_portbinding @@ -1176,6 +1180,9 @@ class NsxPluginV3Base(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, constants.DEVICE_OWNER_FLOATINGIP): # floatingip belongs to an external net without nsx-id port_data[pbin.VIF_DETAILS]['nsx-logical-switch-id'] = None + elif not self._is_backend_port(context, port_data): + # this port is not relevant for Nova + port_data[pbin.VIF_DETAILS]['nsx-logical-switch-id'] = None else: port_data[pbin.VIF_DETAILS]['nsx-logical-switch-id'] = ( self._get_network_nsx_id(context, net_id)) diff --git a/vmware_nsx/plugins/nsx_p/plugin.py b/vmware_nsx/plugins/nsx_p/plugin.py index a413aa1d0f..3620d25d72 100644 --- a/vmware_nsx/plugins/nsx_p/plugin.py +++ b/vmware_nsx/plugins/nsx_p/plugin.py @@ -1539,6 +1539,9 @@ class NsxPolicyPlugin(nsx_plugin_common.NsxPluginV3Base): If it was not realized or timed out retrying, it will return None The nova api will use this to attach to the instance. """ + # DEBUG ADIT + #LOG.error("DEBUG ADIT _get_network_nsx_id called") + #raise Exception if network_id in NET_NEUTRON_2_NSX_ID_CACHE: return NET_NEUTRON_2_NSX_ID_CACHE[network_id] @@ -1722,7 +1725,8 @@ class NsxPolicyPlugin(nsx_plugin_common.NsxPluginV3Base): device_owner = port_data.get('device_owner') is_router_interface = (device_owner == l3_db.DEVICE_OWNER_ROUTER_INTF) - is_dhcp_port = (device_owner == const.DEVICE_OWNER_DHCP) + is_dhcp_port = (device_owner == const.DEVICE_OWNER_DHCP and + self.use_policy_dhcp) is_octavia_port = (device_owner == oct_const.DEVICE_OWNER_OCTAVIA) if is_external_net or is_router_interface or is_dhcp_port: diff --git a/vmware_nsx/tests/unit/nsx_p/test_policy_dhcp_metadata.py b/vmware_nsx/tests/unit/nsx_p/test_policy_dhcp_metadata.py index 1fc69124fe..b48eb2bf1d 100644 --- a/vmware_nsx/tests/unit/nsx_p/test_policy_dhcp_metadata.py +++ b/vmware_nsx/tests/unit/nsx_p/test_policy_dhcp_metadata.py @@ -30,7 +30,6 @@ from vmware_nsx.common import exceptions as nsx_exc from vmware_nsx.extensions import advancedserviceproviders as as_providers from vmware_nsx.plugins.nsx_p import availability_zones as nsx_az from vmware_nsx.tests.unit.nsx_p import test_plugin -from vmware_nsxlib.v3 import core_resources from vmware_nsxlib.v3.policy import core_resources as nsx_resources from vmware_nsxlib.v3 import utils as nsxlib_utils @@ -67,14 +66,10 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): self.az_metadata_route = '3.3.3.3' set_az_in_config(self._az_name, native_metadata_route=self.az_metadata_route) - self._patcher = mock.patch.object(core_resources.NsxLibDhcpProfile, - 'get') - self._patcher.start() self._initialize_azs() self.plugin._init_dhcp_metadata() def tearDown(self): - self._patcher.stop() cfg.CONF.set_override('dhcp_agent_notification', self._orig_dhcp_agent_notification) super(NsxPolicyDhcpTestCase, self).tearDown() @@ -217,7 +212,10 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): # Test if DHCP service is disabled when directly deleting a network # with a DHCP-enabled subnet. with self.network() as network: - with self.subnet(network=network, enable_dhcp=True): + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(network=network, enable_dhcp=True): self.plugin.delete_network(context.get_admin_context(), network['network']['id']) self._verify_dhcp_service(network['network']['id'], @@ -249,7 +247,10 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): # Test if DHCP service is enabled on a network when a DHCP-enabled # subnet is created. with self.network() as network: - with self.subnet(network=network, enable_dhcp=True): + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(network=network, enable_dhcp=True): self._verify_dhcp_service(network['network']['id'], network['network']['tenant_id'], True) @@ -257,8 +258,11 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): def test_dhcp_service_with_create_multiple_dhcp_subnets(self): # Test if multiple DHCP-enabled subnets cannot be created in a network. with self.network() as network: - with self.subnet(network=network, cidr='10.0.0.0/24', - enable_dhcp=True): + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(network=network, cidr='10.0.0.0/24', + enable_dhcp=True): subnet = {'subnet': {'network_id': network['network']['id'], 'cidr': '20.0.0.0/24', 'enable_dhcp': True}} @@ -270,7 +274,10 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): # Test if DHCP service is disabled on a network when a DHCP-disabled # subnet is deleted. with self.network() as network: - with self.subnet(network=network, enable_dhcp=True) as subnet: + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(network=network, enable_dhcp=True) as subnet: self._verify_dhcp_service(network['network']['id'], network['network']['tenant_id'], True) @@ -284,7 +291,10 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): # Test if DHCP service is enabled on a network when a DHCP-disabled # subnet is updated to DHCP-enabled. with self.network() as network: - with self.subnet(network=network, enable_dhcp=False) as subnet: + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(network=network, enable_dhcp=False) as subnet: self._verify_dhcp_service(network['network']['id'], network['network']['tenant_id'], False) @@ -299,18 +309,21 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): # Test if a DHCP-disabled subnet cannot be updated to DHCP-enabled # if a DHCP-enabled subnet already exists in the same network. with self.network() as network: - with self.subnet(network=network, cidr='10.0.0.0/24', - enable_dhcp=True): - with self.subnet(network=network, cidr='20.0.0.0/24', - enable_dhcp=False) as subnet: - self._verify_dhcp_service(network['network']['id'], - network['network']['tenant_id'], - True) - data = {'subnet': {'enable_dhcp': True}} - self.assertRaises( - n_exc.InvalidInput, self.plugin.update_subnet, - context.get_admin_context(), subnet['subnet']['id'], - data) + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(network=network, cidr='10.0.0.0/24', + enable_dhcp=True),\ + self.subnet(network=network, cidr='20.0.0.0/24', + enable_dhcp=False) as subnet: + self._verify_dhcp_service(network['network']['id'], + network['network']['tenant_id'], + True) + data = {'subnet': {'enable_dhcp': True}} + self.assertRaises( + n_exc.InvalidInput, self.plugin.update_subnet, + context.get_admin_context(), subnet['subnet']['id'], + data) def test_dhcp_service_with_update_dhcp_port(self): # Test if DHCP server IP is updated when the corresponding DHCP port @@ -318,7 +331,10 @@ class NsxPolicyDhcpTestCase(test_plugin.NsxPPluginTestCaseMixin): with mock.patch('vmware_nsxlib.v3.policy.core_resources.' 'NsxPolicySegmentApi.' 'update') as update_segment_dhcp: - with self.subnet(cidr='10.0.0.0/24', enable_dhcp=True) as subnet: + # make sure the plugin does not wait for segment realization + with mock.patch.object(self.plugin, '_get_network_nsx_id', + side_effect=Exception),\ + self.subnet(cidr='10.0.0.0/24', enable_dhcp=True) as subnet: filters = { 'network_id': [subnet['subnet']['network_id']], 'device_owner': [constants.DEVICE_OWNER_DHCP] @@ -888,14 +904,16 @@ class NsxPolicyMetadataTestCase(test_plugin.NsxPPluginTestCaseMixin): self._az_name = 'zone1' self._az_metadata_proxy = 'dummy' set_az_in_config(self._az_name, metadata_proxy=self._az_metadata_proxy) - self._patcher = mock.patch.object(core_resources.NsxLibMetadataProxy, - 'get') - self._patcher.start() self._initialize_azs() self.plugin._init_dhcp_metadata() + # make sure the plugin does not wait for segment realization + self.realization_patcher = mock.patch.object( + self.plugin, '_get_network_nsx_id', side_effect=Exception) + self.realization_patcher.start() + def tearDown(self): - self._patcher.stop() + self.realization_patcher.stop() cfg.CONF.set_override('dhcp_agent_notification', self._orig_dhcp_agent_notification) super(NsxPolicyMetadataTestCase, self).tearDown()