From 3b19867d5e183ae5dde5fdde606a9208d6dde2dc Mon Sep 17 00:00:00 2001 From: Kobi Samoray Date: Thu, 13 May 2021 15:01:58 +0300 Subject: [PATCH] NSXV: fail attachment of VDRs to flat networks NSXV distributed routers cannot be attached to flat networks. Yet OpenStack should fail with an error instead of letting the backend transaction fail. Change-Id: If2f0c4c47d049ec37348d6cea32f0bb069a0c9b2 --- .../nsx_v/drivers/distributed_router_driver.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/vmware_nsx/plugins/nsx_v/drivers/distributed_router_driver.py b/vmware_nsx/plugins/nsx_v/drivers/distributed_router_driver.py index e2cc5e2e99..5a1d9c742e 100644 --- a/vmware_nsx/plugins/nsx_v/drivers/distributed_router_driver.py +++ b/vmware_nsx/plugins/nsx_v/drivers/distributed_router_driver.py @@ -15,6 +15,7 @@ import netaddr from oslo_log import log as logging +from neutron_lib.api.definitions import provider_net as pnet from neutron_lib.api import validators from neutron_lib import constants from neutron_lib.db import api as db_api @@ -22,6 +23,7 @@ from neutron_lib import exceptions as n_exc from neutron_lib.exceptions import l3 as l3_exc from vmware_nsx.common import locking +from vmware_nsx.common import utils as c_utils from vmware_nsx.db import nsxv_db from vmware_nsx.extensions import routersize from vmware_nsx.plugins.nsx_v.drivers import ( @@ -92,6 +94,17 @@ class RouterDistributedDriver(router_driver.RouterBaseDriver): is_routes_update = True if 'routes' in r else False gw_info = self.plugin._extract_external_gw(context, router, is_extract=True) + # Do not validate if gw_info in None or mock + if isinstance(gw_info, dict) and gw_info.get('network_id'): + gw_net = self.plugin.get_network(context.elevated(), + gw_info['network_id']) + if gw_net.get(pnet.NETWORK_TYPE) == c_utils.NsxVNetworkTypes.FLAT: + msg = _("Gateway for distributer router %(r_id)s cannot be " + "attached to provider network %(net_id)s of type " + "FLAT") % {'r_id': router_id, + 'net_id': gw_info['network_id']} + raise n_exc.InvalidInput(error_message=msg) + super(nsx_v.NsxVPluginV2, self.plugin).update_router( context, router_id, router) if gw_info != constants.ATTR_NOT_SPECIFIED: