Merge "NSXP: protect router when it hosts a loadbalancer"
This commit is contained in:
commit
e871f7d2e9
|
@ -17,6 +17,7 @@ from neutron_lib.callbacks import events
|
||||||
from neutron_lib.callbacks import registry
|
from neutron_lib.callbacks import registry
|
||||||
from neutron_lib.callbacks import resources
|
from neutron_lib.callbacks import resources
|
||||||
from neutron_lib import constants as n_consts
|
from neutron_lib import constants as n_consts
|
||||||
|
from neutron_lib import exceptions as n_exc
|
||||||
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
|
||||||
|
|
||||||
|
@ -135,9 +136,23 @@ class EdgeLoadbalancerDriverV2(base_mgr.LoadbalancerBaseManager):
|
||||||
def _check_lb_service_on_router(self, resource, event, trigger,
|
def _check_lb_service_on_router(self, resource, event, trigger,
|
||||||
payload=None):
|
payload=None):
|
||||||
"""Prevent removing a router GW or deleting a router used by LB"""
|
"""Prevent removing a router GW or deleting a router used by LB"""
|
||||||
pass
|
router_id = payload.resource_id
|
||||||
|
if self.loadbalancer.core_plugin.service_router_has_loadbalancers(
|
||||||
|
router_id):
|
||||||
|
msg = _('Cannot delete a %s as it still has lb service '
|
||||||
|
'attachment') % resource
|
||||||
|
raise n_exc.BadRequest(resource='lbaas-lb', msg=msg)
|
||||||
|
|
||||||
def _check_lb_service_on_router_interface(
|
def _check_lb_service_on_router_interface(
|
||||||
self, resource, event, trigger, payload=None):
|
self, resource, event, trigger, payload=None):
|
||||||
# Prevent removing the interface of an LB subnet from a router
|
# Prevent removing the interface of an LB subnet from a router
|
||||||
pass
|
router_id = payload.resource_id
|
||||||
|
subnet_id = payload.metadata.get('subnet_id')
|
||||||
|
if not router_id or not subnet_id:
|
||||||
|
return
|
||||||
|
|
||||||
|
# get LB ports and check if any loadbalancer is using this subnet
|
||||||
|
if self._get_lb_ports(payload.context.elevated(), [subnet_id]):
|
||||||
|
msg = _('Cannot delete a router interface as it used by a '
|
||||||
|
'loadbalancer')
|
||||||
|
raise n_exc.BadRequest(resource='lbaas-lb', msg=msg)
|
||||||
|
|
|
@ -48,6 +48,7 @@ from vmware_nsx.common import utils
|
||||||
from vmware_nsx.extensions import providersecuritygroup as provider_sg
|
from vmware_nsx.extensions import providersecuritygroup as provider_sg
|
||||||
from vmware_nsx.plugins.common import plugin as com_plugin
|
from vmware_nsx.plugins.common import plugin as com_plugin
|
||||||
from vmware_nsx.plugins.nsx_p import plugin as nsx_plugin
|
from vmware_nsx.plugins.nsx_p import plugin as nsx_plugin
|
||||||
|
|
||||||
from vmware_nsx.tests import unit as vmware
|
from vmware_nsx.tests import unit as vmware
|
||||||
from vmware_nsx.tests.unit.common_plugin import common_v3
|
from vmware_nsx.tests.unit.common_plugin import common_v3
|
||||||
from vmware_nsxlib.v3 import exceptions as nsxlib_exc
|
from vmware_nsxlib.v3 import exceptions as nsxlib_exc
|
||||||
|
@ -1363,6 +1364,16 @@ class NsxPTestL3NatTest(common_v3.FixExternalNetBaseTest,
|
||||||
kwargs['ext_mgr'] = (kwargs.get('ext_mgr') or
|
kwargs['ext_mgr'] = (kwargs.get('ext_mgr') or
|
||||||
NsxPTestL3ExtensionManager())
|
NsxPTestL3ExtensionManager())
|
||||||
|
|
||||||
|
# Make sure the LB callback is not called on router deletion
|
||||||
|
self.lb_mock1 = mock.patch(
|
||||||
|
"vmware_nsx.services.lbaas.nsx_p.v2.lb_driver_v2."
|
||||||
|
"EdgeLoadbalancerDriverV2._check_lb_service_on_router")
|
||||||
|
self.lb_mock1.start()
|
||||||
|
self.lb_mock2 = mock.patch(
|
||||||
|
"vmware_nsx.services.lbaas.nsx_p.v2.lb_driver_v2."
|
||||||
|
"EdgeLoadbalancerDriverV2._check_lb_service_on_router_interface")
|
||||||
|
self.lb_mock2.start()
|
||||||
|
|
||||||
super(NsxPTestL3NatTest, self).setUp(*args, **kwargs)
|
super(NsxPTestL3NatTest, self).setUp(*args, **kwargs)
|
||||||
self.original_subnet = self.subnet
|
self.original_subnet = self.subnet
|
||||||
self.original_network = self.network
|
self.original_network = self.network
|
||||||
|
|
Loading…
Reference in New Issue