diff --git a/vmware_nsx/common/availability_zones.py b/vmware_nsx/common/availability_zones.py index bfb6ae1471..9aada724d3 100644 --- a/vmware_nsx/common/availability_zones.py +++ b/vmware_nsx/common/availability_zones.py @@ -15,6 +15,8 @@ import abc +from oslo_config import cfg + from neutron_lib.api.definitions import availability_zone as az_def from neutron_lib import exceptions as n_exc from neutron_lib.exceptions import availability_zone as az_exc @@ -84,6 +86,25 @@ class ConfiguredAvailabilityZones(object): obj = az_class(None) self.availability_zones[obj.name] = obj + # validate the default az: + if cfg.CONF.default_availability_zones: + # we support only 1 default az + if len(cfg.CONF.default_availability_zones) > 1: + raise nsx_exc.NsxInvalidConfiguration( + opt_name="default_availability_zones", + opt_value=cfg.CONF.default_availability_zones, + reason=_("The NSX plugin supports only 1 default AZ")) + default_az_name = cfg.CONF.default_availability_zones[0] + if (default_az_name not in self.availability_zones): + raise nsx_exc.NsxInvalidConfiguration( + opt_name="default_availability_zones", + opt_value=cfg.CONF.default_availability_zones, + reason=_("The default AZ is not defined in the NSX " + "plugin")) + self._default_az = self.availability_zones[default_az_name] + else: + self._default_az = self.availability_zones[DEFAULT_NAME] + def get_availability_zone(self, name): """Return an availability zone object by its name """ @@ -94,7 +115,7 @@ class ConfiguredAvailabilityZones(object): def get_default_availability_zone(self): """Return the default availability zone object """ - return self.availability_zones[DEFAULT_NAME] + return self._default_az def list_availability_zones(self): """Return a list of availability zones names diff --git a/vmware_nsx/plugins/nsx_v3/plugin.py b/vmware_nsx/plugins/nsx_v3/plugin.py index f8634243fc..61ae53c3ea 100644 --- a/vmware_nsx/plugins/nsx_v3/plugin.py +++ b/vmware_nsx/plugins/nsx_v3/plugin.py @@ -4258,6 +4258,8 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, # as the hint (or default if none) if net_res[az_def.AZ_HINTS]: az_name = net_res[az_def.AZ_HINTS][0] + elif cfg.CONF.default_availability_zones: + az_name = cfg.CONF.default_availability_zones[0] else: az_name = nsx_az.DEFAULT_NAME net_res[az_def.COLLECTION_NAME] = [az_name] diff --git a/vmware_nsx/tests/unit/nsx_v/test_plugin.py b/vmware_nsx/tests/unit/nsx_v/test_plugin.py index 657de36e59..9759901900 100644 --- a/vmware_nsx/tests/unit/nsx_v/test_plugin.py +++ b/vmware_nsx/tests/unit/nsx_v/test_plugin.py @@ -3494,6 +3494,27 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase, self.assertEqual([az_name], returned_router['availability_zones']) + def test_create_router_with_default_az(self): + az_name = 'az7' + set_az_in_config(az_name) + cfg.CONF.set_override('default_availability_zones', [az_name]) + p = directory.get_plugin() + p._availability_zones_data = nsx_az.NsxVAvailabilityZones() + p._get_edge_id_by_rtr_id = p.real_get_edge + + router = {'router': {'admin_state_up': True, + 'name': 'e161be1d-0d0d-4046-9823-5a593d94f72c', + 'tenant_id': 'fake_tenant', + 'router_type': 'exclusive'}} + + # router creation should succeed + returned_router = p.create_router(context.get_admin_context(), + router) + self.assertEqual([], + returned_router['availability_zone_hints']) + self.assertEqual([az_name], + returned_router['availability_zones']) + def test_floatingip_update_to_same_port_id_twice(self): self.skipTest('Plugin changes floating port status')