From 464e83bed6d7b1df5110d65f8a5b1e4417d6476e Mon Sep 17 00:00:00 2001 From: Adit Sarfaty Date: Mon, 26 Jun 2017 14:53:08 +0300 Subject: [PATCH] Create base plugin for common nsx-v/nsx-v3 code Move common code used by both NSXv and NSXv3 core plugins to a new base plugin. Change-Id: I4454d651dd3f9632cbcc00a1ca6c4d2baa88227c --- vmware_nsx/plugins/common/__init__.py | 0 vmware_nsx/plugins/common/plugin.py | 95 +++++++++++++++++++++++++++ vmware_nsx/plugins/nsx_v/plugin.py | 65 +----------------- vmware_nsx/plugins/nsx_v3/plugin.py | 67 +------------------ 4 files changed, 101 insertions(+), 126 deletions(-) create mode 100644 vmware_nsx/plugins/common/__init__.py create mode 100644 vmware_nsx/plugins/common/plugin.py diff --git a/vmware_nsx/plugins/common/__init__.py b/vmware_nsx/plugins/common/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vmware_nsx/plugins/common/plugin.py b/vmware_nsx/plugins/common/plugin.py new file mode 100644 index 0000000000..a78391b692 --- /dev/null +++ b/vmware_nsx/plugins/common/plugin.py @@ -0,0 +1,95 @@ +# Copyright 2017 VMware, Inc. +# All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_log import log as logging + +from neutron.db import _resource_extend as resource_extend +from neutron.db import address_scope_db +from neutron.db import api as db_api +from neutron.db import db_base_plugin_v2 +from neutron.db import l3_db +from neutron_lib.api.definitions import network as net_def +from neutron_lib.api.definitions import port as port_def +from neutron_lib.api.definitions import subnet as subnet_def +from neutron_lib import context as n_context +from neutron_lib import exceptions as n_exc +from neutron_lib.plugins import directory + +from vmware_nsx._i18n import _ + +LOG = logging.getLogger(__name__) + + +@resource_extend.has_resource_extenders +class NsxPluginBase(db_base_plugin_v2.NeutronDbPluginV2, + address_scope_db.AddressScopeDbMixin): + """Common methods for NSX-V and NSX-V3 plugins""" + + @staticmethod + @resource_extend.extends([net_def.COLLECTION_NAME]) + def _ext_extend_network_dict(result, netdb): + ctx = n_context.get_admin_context() + # get the core plugin as this is a static method with no 'self' + plugin = directory.get_plugin() + with db_api.context_manager.writer.using(ctx): + plugin._extension_manager.extend_network_dict( + ctx.session, netdb, result) + + @staticmethod + @resource_extend.extends([port_def.COLLECTION_NAME]) + def _ext_extend_port_dict(result, portdb): + ctx = n_context.get_admin_context() + # get the core plugin as this is a static method with no 'self' + plugin = directory.get_plugin() + with db_api.context_manager.writer.using(ctx): + plugin._extension_manager.extend_port_dict( + ctx.session, portdb, result) + + @staticmethod + @resource_extend.extends([subnet_def.COLLECTION_NAME]) + def _ext_extend_subnet_dict(result, subnetdb): + ctx = n_context.get_admin_context() + # get the core plugin as this is a static method with no 'self' + plugin = directory.get_plugin() + with db_api.context_manager.writer.using(ctx): + plugin._extension_manager.extend_subnet_dict( + ctx.session, subnetdb, result) + + def get_network_az_by_net_id(self, context, network_id): + try: + network = self.get_network(context, network_id) + except Exception: + return self.get_default_az() + + return self.get_network_az(network) + + def _get_router_interface_ports_by_network( + self, context, router_id, network_id): + port_filters = {'device_id': [router_id], + 'device_owner': [l3_db.DEVICE_OWNER_ROUTER_INTF], + 'network_id': [network_id]} + return self.get_ports(context, filters=port_filters) + + def get_router_for_floatingip(self, context, internal_port, + internal_subnet, external_network_id): + router_id = super(NsxPluginBase, self).get_router_for_floatingip( + context, internal_port, internal_subnet, external_network_id) + if router_id: + router = self._get_router(context.elevated(), router_id) + if not router.enable_snat: + msg = _("Unable to assign a floating IP to a router that " + "has SNAT disabled") + raise n_exc.InvalidInput(error_message=msg) + return router_id diff --git a/vmware_nsx/plugins/nsx_v/plugin.py b/vmware_nsx/plugins/nsx_v/plugin.py index acfda6435b..51ee09a142 100644 --- a/vmware_nsx/plugins/nsx_v/plugin.py +++ b/vmware_nsx/plugins/nsx_v/plugin.py @@ -46,12 +46,10 @@ from neutron.common import topics from neutron.common import utils as n_utils from neutron.db import _resource_extend as resource_extend from neutron.db import _utils as db_utils -from neutron.db import address_scope_db from neutron.db import agents_db from neutron.db import allowedaddresspairs_db as addr_pair_db from neutron.db import api as db_api from neutron.db.availability_zone import router as router_az_db -from neutron.db import db_base_plugin_v2 from neutron.db import dns_db from neutron.db import external_net_db from neutron.db import extradhcpopt_db @@ -123,6 +121,7 @@ from vmware_nsx.extensions import routersize from vmware_nsx.extensions import secgroup_rule_local_ip_prefix from vmware_nsx.extensions import securitygrouplogging as sg_logging from vmware_nsx.extensions import securitygrouppolicy as sg_policy +from vmware_nsx.plugins.common import plugin as nsx_plugin_common from vmware_nsx.plugins.nsx_v import availability_zones as nsx_az from vmware_nsx.plugins.nsx_v import managers from vmware_nsx.plugins.nsx_v import md_proxy as nsx_v_md_proxy @@ -146,7 +145,7 @@ VALID_EDGE_SIZES = routersize.VALID_EDGE_SIZES @resource_extend.has_resource_extenders class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, agents_db.AgentDbMixin, - db_base_plugin_v2.NeutronDbPluginV2, + nsx_plugin_common.NsxPluginBase, rt_rtr.RouterType_mixin, external_net_db.External_net_db_mixin, extraroute_db.ExtraRoute_db_mixin, @@ -161,8 +160,7 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, vnic_index_db.VnicIndexDbMixin, dns_db.DNSDbMixin, nsxpolicy.NsxPolicyPluginBase, vlantransparent_db.Vlantransparent_db_mixin, - nsx_com_az.NSXAvailabilityZonesPluginCommon, - address_scope_db.AddressScopeDbMixin): + nsx_com_az.NSXAvailabilityZonesPluginCommon): supported_extension_aliases = ["agent", "allowed-address-pairs", @@ -375,36 +373,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, # Bind FWaaS callbacks to the driver self.fwaas_callbacks = fwaas_callbacks.NsxvFwaasCallbacks() - @staticmethod - @resource_extend.extends([net_def.COLLECTION_NAME]) - def _ext_extend_network_dict(result, netdb): - ctx = n_context.get_admin_context() - # get the core plugin as this is a static method with no 'self' - plugin = directory.get_plugin() - with db_api.context_manager.writer.using(ctx): - plugin._extension_manager.extend_network_dict( - ctx.session, netdb, result) - - @staticmethod - @resource_extend.extends([port_def.COLLECTION_NAME]) - def _ext_extend_port_dict(result, portdb): - ctx = n_context.get_admin_context() - # get the core plugin as this is a static method with no 'self' - plugin = directory.get_plugin() - with db_api.context_manager.writer.using(ctx): - plugin._extension_manager.extend_port_dict( - ctx.session, portdb, result) - - @staticmethod - @resource_extend.extends([subnet_def.COLLECTION_NAME]) - def _ext_extend_subnet_dict(result, subnetdb): - ctx = n_context.get_admin_context() - # get the core plugin as this is a static method with no 'self' - plugin = directory.get_plugin() - with db_api.context_manager.writer.using(ctx): - plugin._extension_manager.extend_subnet_dict( - ctx.session, subnetdb, result) - def _create_security_group_container(self): name = "OpenStack Security Group container" with locking.LockManager.get_lock('security-group-container-init'): @@ -1007,14 +975,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, """ return self.validate_obj_azs(availability_zones) - def get_network_az_by_net_id(self, context, network_id): - try: - network = self.get_network(context, network_id) - except Exception: - return self.get_default_az() - - return self.get_network_az(network) - def _prepare_spoofguard_policy(self, network_type, net_data, net_morefs): # The method will determine if a portgroup is already assigned to a # spoofguard policy. If so, it will return the predefined policy. If @@ -3325,13 +3285,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, intf_net_ids = list(set([port['network_id'] for port in intf_ports])) return intf_net_ids - def _get_router_interface_ports_by_network( - self, context, router_id, network_id): - port_filters = {'device_id': [router_id], - 'device_owner': [l3_db.DEVICE_OWNER_ROUTER_INTF], - 'network_id': [network_id]} - return self.get_ports(context, filters=port_filters) - def _get_router_interfaces(self, context, router_id): port_filters = {'device_id': [router_id], 'device_owner': [l3_db.DEVICE_OWNER_ROUTER_INTF]} @@ -3589,18 +3542,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, if router_id: self._update_edge_router(context, router_id) - def get_router_for_floatingip(self, context, internal_port, - internal_subnet, external_network_id): - router_id = super(NsxVPluginV2, self).get_router_for_floatingip( - context, internal_port, internal_subnet, external_network_id) - if router_id: - router = self._get_router(context.elevated(), router_id) - if not router.enable_snat: - msg = _("Unable to assign a floating IP to a router that " - "has SNAT disabled") - raise n_exc.InvalidInput(error_message=msg) - return router_id - def disassociate_floatingips(self, context, port_id): router_id = None try: diff --git a/vmware_nsx/plugins/nsx_v3/plugin.py b/vmware_nsx/plugins/nsx_v3/plugin.py index 11e02e9ecf..ccb5f2eace 100644 --- a/vmware_nsx/plugins/nsx_v3/plugin.py +++ b/vmware_nsx/plugins/nsx_v3/plugin.py @@ -15,9 +15,7 @@ import netaddr from neutron_lib.api.definitions import network as net_def -from neutron_lib.api.definitions import port as port_def from neutron_lib.api.definitions import port_security as psec -from neutron_lib.api.definitions import subnet as subnet_def from neutron_lib.exceptions import port_security as psec_exc import six @@ -28,7 +26,6 @@ from neutron.common import rpc as n_rpc from neutron.common import topics from neutron.db import _resource_extend as resource_extend from neutron.db import _utils as db_utils -from neutron.db import address_scope_db from neutron.db import agents_db from neutron.db import agentschedulers_db from neutron.db import allowedaddresspairs_db as addr_pair_db @@ -67,7 +64,6 @@ from neutron_lib.callbacks import resources from neutron_lib import constants as const from neutron_lib import context as q_context from neutron_lib import exceptions as n_exc -from neutron_lib.plugins import directory from neutron_lib.utils import helpers from oslo_config import cfg from oslo_db import exception as db_exc @@ -95,6 +91,7 @@ from vmware_nsx.extensions import advancedserviceproviders as as_providers from vmware_nsx.extensions import maclearning as mac_ext from vmware_nsx.extensions import providersecuritygroup as provider_sg from vmware_nsx.extensions import securitygrouplogging as sg_logging +from vmware_nsx.plugins.common import plugin as nsx_plugin_common from vmware_nsx.plugins.nsx_v3 import availability_zones as nsx_az from vmware_nsx.plugins.nsx_v3 import utils as v3_utils from vmware_nsx.services.fwaas.nsx_v3 import fwaas_callbacks @@ -130,7 +127,7 @@ NSX_V3_EXCLUDED_PORT_NSGROUP_NAME = 'neutron_excluded_port_nsgroup' class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, extended_security_group.ExtendedSecurityGroupPropertiesMixin, addr_pair_db.AllowedAddressPairsMixin, - db_base_plugin_v2.NeutronDbPluginV2, + nsx_plugin_common.NsxPluginBase, extend_sg_rule.ExtendedSecurityGroupRuleMixin, securitygroups_db.SecurityGroupDbMixin, external_net_db.External_net_db_mixin, @@ -141,8 +138,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, extradhcpopt_db.ExtraDhcpOptMixin, dns_db.DNSDbMixin, mac_db.MacLearningDbMixin, - nsx_com_az.NSXAvailabilityZonesPluginCommon, - address_scope_db.AddressScopeDbMixin): + nsx_com_az.NSXAvailabilityZonesPluginCommon): __native_bulk_support = True __native_pagination_support = True @@ -582,36 +578,6 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, return self.conn.consume_in_threads() - @staticmethod - @resource_extend.extends([net_def.COLLECTION_NAME]) - def _ext_extend_network_dict(result, netdb): - ctx = q_context.get_admin_context() - # get the core plugin as this is a static method with no 'self' - plugin = directory.get_plugin() - with db_api.context_manager.writer.using(ctx): - plugin._extension_manager.extend_network_dict( - ctx.session, netdb, result) - - @staticmethod - @resource_extend.extends([port_def.COLLECTION_NAME]) - def _ext_extend_port_dict(result, portdb): - ctx = q_context.get_admin_context() - # get the core plugin as this is a static method with no 'self' - plugin = directory.get_plugin() - with db_api.context_manager.writer.using(ctx): - plugin._extension_manager.extend_port_dict( - ctx.session, portdb, result) - - @staticmethod - @resource_extend.extends([subnet_def.COLLECTION_NAME]) - def _ext_extend_subnet_dict(result, subnetdb): - ctx = q_context.get_admin_context() - # get the core plugin as this is a static method with no 'self' - plugin = directory.get_plugin() - with db_api.context_manager.writer.using(ctx): - plugin._extension_manager.extend_subnet_dict( - ctx.session, subnetdb, result) - def _validate_provider_create(self, context, network_data, az): is_provider_net = any( validators.is_attr_set(network_data.get(f)) @@ -3002,13 +2968,6 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, self._routerlib.add_static_routes(nsx_router_id, route) router_db['status'] = curr_status - def _get_router_interface_ports_by_network( - self, context, router_id, network_id): - port_filters = {'device_id': [router_id], - 'device_owner': [l3_db.DEVICE_OWNER_ROUTER_INTF], - 'network_id': [network_id]} - return self.get_ports(context, filters=port_filters) - def _get_ports_and_address_groups(self, context, router_id, network_id, exclude_sub_ids=None): exclude_sub_ids = [] if not exclude_sub_ids else exclude_sub_ids @@ -3265,18 +3224,6 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, 'int_ip': fip['fixed_ip_address']}) super(NsxV3Plugin, self).delete_floatingip(context, fip_id) - def get_router_for_floatingip(self, context, internal_port, - internal_subnet, external_network_id): - router_id = super(NsxV3Plugin, self).get_router_for_floatingip( - context, internal_port, internal_subnet, external_network_id) - if router_id: - router = self._get_router(context.elevated(), router_id) - if not router.enable_snat: - msg = _("Unable to assign a floating IP to a router that " - "has SNAT disabled") - raise n_exc.InvalidInput(error_message=msg) - return router_id - def update_floatingip(self, context, fip_id, floatingip): old_fip = self.get_floatingip(context, fip_id) old_port_id = old_fip['port_id'] @@ -3647,11 +3594,3 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, else: az_name = nsx_az.DEFAULT_NAME net_res[az_ext.AVAILABILITY_ZONES] = [az_name] - - def get_network_az_by_net_id(self, context, network_id): - try: - network = self.get_network(context, network_id) - except Exception: - return self.get_default_az() - - return self.get_network_az(network)