Merge "NSX|v3: Add routers availability zones"

This commit is contained in:
Zuul 2017-11-26 08:55:54 +00:00 committed by Gerrit Code Review
commit 32199faa02
2 changed files with 40 additions and 0 deletions

View File

@ -38,6 +38,7 @@ from neutron.db import agents_db
from neutron.db import agentschedulers_db from neutron.db import agentschedulers_db
from neutron.db import allowedaddresspairs_db as addr_pair_db from neutron.db import allowedaddresspairs_db as addr_pair_db
from neutron.db import api as db_api 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 db_base_plugin_v2
from neutron.db import dns_db from neutron.db import dns_db
from neutron.db import external_net_db from neutron.db import external_net_db
@ -159,6 +160,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
securitygroups_db.SecurityGroupDbMixin, securitygroups_db.SecurityGroupDbMixin,
external_net_db.External_net_db_mixin, external_net_db.External_net_db_mixin,
extraroute_db.ExtraRoute_db_mixin, extraroute_db.ExtraRoute_db_mixin,
router_az_db.RouterAvailabilityZoneMixin,
l3_gwmode_db.L3_NAT_db_mixin, l3_gwmode_db.L3_NAT_db_mixin,
portbindings_db.PortBindingMixin, portbindings_db.PortBindingMixin,
portsecurity_db.PortSecurityDbMixin, portsecurity_db.PortSecurityDbMixin,
@ -189,6 +191,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
"router", "router",
"availability_zone", "availability_zone",
"network_availability_zone", "network_availability_zone",
"router_availability_zone",
"subnet_allocation", "subnet_allocation",
"security-group-logging", "security-group-logging",
"provider-security-group"] "provider-security-group"]
@ -3193,12 +3196,26 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
def create_router(self, context, router): def create_router(self, context, router):
r = router['router'] r = router['router']
self.validate_router_dhcp_relay(context) self.validate_router_dhcp_relay(context)
# validate the availability zone
if az_def.AZ_HINTS in r:
self.validate_availability_zones(context, 'router',
r[az_def.AZ_HINTS])
gw_info = self._extract_external_gw(context, router, is_extract=True) gw_info = self._extract_external_gw(context, router, is_extract=True)
r['id'] = (r.get('id') or uuidutils.generate_uuid()) r['id'] = (r.get('id') or uuidutils.generate_uuid())
tags = self.nsxlib.build_v3_tags_payload( tags = self.nsxlib.build_v3_tags_payload(
r, resource_type='os-neutron-router-id', r, resource_type='os-neutron-router-id',
project_name=context.tenant_name) project_name=context.tenant_name)
router = super(NsxV3Plugin, self).create_router(context, router) router = super(NsxV3Plugin, self).create_router(context, router)
if az_def.AZ_HINTS in r:
# Update the AZ hints in the neutron object
az_hints = az_validator.convert_az_list_to_string(
r[az_def.AZ_HINTS])
super(NsxV3Plugin, self).update_router(
context,
router['id'],
{'router': {az_def.AZ_HINTS: az_hints}})
with db_api.context_manager.writer.using(context): with db_api.context_manager.writer.using(context):
router_db = self._get_router(context, r['id']) router_db = self._get_router(context, r['id'])
self._process_extra_attr_router_create(context, router_db, r) self._process_extra_attr_router_create(context, router_db, r)
@ -3279,6 +3296,20 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
return ret_val return ret_val
def get_router(self, context, id, fields=None):
with db_api.context_manager.reader.using(context):
# Get router from Neutron database
router = self._get_router(context, id)
# Don't do field selection here otherwise we won't be able to add
# provider networks fields
rtr = self._make_router_dict(router)
rtr['availability_zones'] = self.get_router_availability_zones(rtr)
return db_utils.resource_fields(rtr, fields)
def get_router_availability_zones(self, router):
"""Return availability zones which a router belongs to."""
return [self.get_router_az(router).name]
def _validate_ext_routes(self, context, router_id, gw_info, new_routes): def _validate_ext_routes(self, context, router_id, gw_info, new_routes):
ext_net_id = (gw_info['network_id'] ext_net_id = (gw_info['network_id']
if validators.is_attr_set(gw_info) and gw_info else None) if validators.is_attr_set(gw_info) and gw_info else None)

View File

@ -1696,6 +1696,15 @@ class TestL3NatTestCase(L3NatTest,
def test_router_add_gateway_no_subnet(self): def test_router_add_gateway_no_subnet(self):
self.skipTest('No support for no subnet gateway set') self.skipTest('No support for no subnet gateway set')
@mock.patch.object(nsx_plugin.NsxV3Plugin, 'validate_availability_zones')
def test_create_router_with_availability_zone(self, mock_validate_az):
name = 'rtr-with-zone'
zone = ['zone1']
mock_validate_az.return_value = None
with self.router(name=name, availability_zone_hints=zone) as rtr:
az_hints = rtr['router']['availability_zone_hints']
self.assertListEqual(zone, az_hints)
class ExtGwModeTestCase(test_ext_gw_mode.ExtGwModeIntTestCase, class ExtGwModeTestCase(test_ext_gw_mode.ExtGwModeIntTestCase,
L3NatTest): L3NatTest):