TVD: Make sure lbaas subnet belongs to the correct plugin

When creating a loadbalancer via TVD, we need to verify that the assigned
subnet belong to the same plugin as the lasdbalancer

Change-Id: Ia4a288177b06e5e795b3b7753d8571b36700f5b3
This commit is contained in:
Adit Sarfaty 2018-02-15 15:54:40 +02:00
parent 6b8c66140d
commit 2e361c1222
2 changed files with 20 additions and 9 deletions

View File

@ -429,9 +429,12 @@ class NsxTVDPlugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
return (ports if not fields else return (ports if not fields else
[db_utils.resource_fields(port, fields) for port in ports]) [db_utils.resource_fields(port, fields) for port in ports])
def _get_subnet_plugin_by_id(self, context, subnet_id):
db_subnet = self._get_subnet(context, subnet_id)
return self._get_plugin_from_net_id(context, db_subnet['network_id'])
def get_subnet(self, context, id, fields=None): def get_subnet(self, context, id, fields=None):
db_subnet = self._get_subnet(context, id) p = self._get_subnet_plugin_by_id(context, id)
p = self._get_plugin_from_net_id(context, db_subnet['network_id'])
return p.get_subnet(context, id, fields=fields) return p.get_subnet(context, id, fields=fields)
def get_subnets(self, context, filters=None, fields=None, sorts=None, def get_subnets(self, context, filters=None, fields=None, sorts=None,
@ -464,8 +467,7 @@ class NsxTVDPlugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
return subnets return subnets
def delete_subnet(self, context, id): def delete_subnet(self, context, id):
db_subnet = self._get_subnet(context, id) p = self._get_subnet_plugin_by_id(context, id)
p = self._get_plugin_from_net_id(context, db_subnet['network_id'])
p.delete_subnet(context, id) p.delete_subnet(context, id)
def _get_subnet_plugin(self, context, subnet_data): def _get_subnet_plugin(self, context, subnet_data):
@ -492,8 +494,7 @@ class NsxTVDPlugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
return p.create_subnet_bulk(context, subnets) return p.create_subnet_bulk(context, subnets)
def update_subnet(self, context, id, subnet): def update_subnet(self, context, id, subnet):
db_subnet = self._get_subnet(context, id) p = self._get_subnet_plugin_by_id(context, id)
p = self._get_plugin_from_net_id(context, db_subnet['network_id'])
return p.update_subnet(context, id, subnet) return p.update_subnet(context, id, subnet)
def get_router_availability_zones(self, router): def get_router_availability_zones(self, router):

View File

@ -16,6 +16,8 @@
from oslo_log import helpers as log_helpers from oslo_log import helpers as log_helpers
from oslo_log import log as logging from oslo_log import log as logging
from neutron_lib import exceptions as n_exc
from vmware_nsx.services.lbaas import base_mgr from vmware_nsx.services.lbaas import base_mgr
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -39,9 +41,17 @@ class EdgeLoadBalancerManager(base_mgr.LoadbalancerBaseManager):
@log_helpers.log_method_call @log_helpers.log_method_call
def create(self, context, lb): def create(self, context, lb):
p = self.core_plugin._get_plugin_from_project(context, # verify that the subnet belongs to the same plugin as the lb
lb.tenant_id) lb_p = self.core_plugin._get_plugin_from_project(context,
return p.lbv2_driver.loadbalancer.create(context, lb) lb.tenant_id)
subnet_p = self.core_plugin._get_subnet_plugin_by_id(
context, lb.vip_subnet_id)
if lb_p.plugin_type() != subnet_p.plugin_type():
self.lbv2_driver.load_balancer.failed_completion(context, lb)
msg = (_('Subnet must belong to the plugin %s, as the '
'loadbalancer.') % lb_p.plugin_type())
raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)
return lb_p.lbv2_driver.loadbalancer.create(context, lb)
@log_helpers.log_method_call @log_helpers.log_method_call
def update(self, context, old_lb, new_lb): def update(self, context, old_lb, new_lb):