NSX-V3: add transport zones to availability zones
default_overlay_tz and default_vlan_tz will be added as optional parameres for each AZ for provider networks creation Change-Id: I3cedcc5f797b31c4659f96d318b2281677d308ec
This commit is contained in:
parent
653b9bef83
commit
391d0983b7
@ -756,6 +756,18 @@ nsxv3_az_opts = [
|
|||||||
help=_("(Optional) List of nameservers to configure for the "
|
help=_("(Optional) List of nameservers to configure for the "
|
||||||
"DHCP binding entries. These will be used if there are "
|
"DHCP binding entries. These will be used if there are "
|
||||||
"no nameservers defined on the subnet.")),
|
"no nameservers defined on the subnet.")),
|
||||||
|
cfg.StrOpt('default_overlay_tz',
|
||||||
|
help=_("(Optional) This is the name or UUID of the default NSX "
|
||||||
|
"overlay transport zone that will be used for creating "
|
||||||
|
"tunneled isolated Neutron networks. It needs to be "
|
||||||
|
"created in NSX before starting Neutron with the NSX "
|
||||||
|
"plugin.")),
|
||||||
|
cfg.StrOpt('default_vlan_tz',
|
||||||
|
help=_("(Optional) Only required when creating VLAN or flat "
|
||||||
|
"provider networks. Name or UUID of default NSX VLAN "
|
||||||
|
"transport zone that will be used for bridging between "
|
||||||
|
"Neutron networks, if no physical network has been "
|
||||||
|
"specified")),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Register the configuration options
|
# Register the configuration options
|
||||||
|
@ -66,6 +66,14 @@ class NsxV3AvailabilityZone(common_az.ConfiguredAvailabilityZone):
|
|||||||
if self.nameservers is None:
|
if self.nameservers is None:
|
||||||
self.nameservers = cfg.CONF.nsx_v3.nameservers
|
self.nameservers = cfg.CONF.nsx_v3.nameservers
|
||||||
|
|
||||||
|
self.default_overlay_tz = az_info.get('default_overlay_tz')
|
||||||
|
if self.default_overlay_tz is None:
|
||||||
|
self.default_overlay_tz = cfg.CONF.nsx_v3.default_overlay_tz
|
||||||
|
|
||||||
|
self.default_vlan_tz = az_info.get('default_vlan_tz')
|
||||||
|
if self.default_vlan_tz is None:
|
||||||
|
self.default_vlan_tz = cfg.CONF.nsx_v3.default_vlan_tz
|
||||||
|
|
||||||
def init_default_az(self):
|
def init_default_az(self):
|
||||||
# use the default configuration
|
# use the default configuration
|
||||||
self.metadata_proxy = cfg.CONF.nsx_v3.metadata_proxy
|
self.metadata_proxy = cfg.CONF.nsx_v3.metadata_proxy
|
||||||
@ -73,8 +81,11 @@ class NsxV3AvailabilityZone(common_az.ConfiguredAvailabilityZone):
|
|||||||
self.native_metadata_route = cfg.CONF.nsx_v3.native_metadata_route
|
self.native_metadata_route = cfg.CONF.nsx_v3.native_metadata_route
|
||||||
self.dns_domain = cfg.CONF.nsx_v3.dns_domain
|
self.dns_domain = cfg.CONF.nsx_v3.dns_domain
|
||||||
self.nameservers = cfg.CONF.nsx_v3.nameservers
|
self.nameservers = cfg.CONF.nsx_v3.nameservers
|
||||||
|
self.default_overlay_tz = cfg.CONF.nsx_v3.default_overlay_tz
|
||||||
|
self.default_vlan_tz = cfg.CONF.nsx_v3.default_vlan_tz
|
||||||
|
|
||||||
def translate_configured_names_to_uuids(self, nsxlib):
|
def translate_configured_names_to_uuids(self, nsxlib):
|
||||||
|
# Mandatory configurations (in AZ or inherited from global values)
|
||||||
dhcp_id = nsxlib.native_dhcp_profile.get_id_by_name_or_id(
|
dhcp_id = nsxlib.native_dhcp_profile.get_id_by_name_or_id(
|
||||||
self.dhcp_profile)
|
self.dhcp_profile)
|
||||||
self._native_dhcp_profile_uuid = dhcp_id
|
self._native_dhcp_profile_uuid = dhcp_id
|
||||||
@ -83,6 +94,18 @@ class NsxV3AvailabilityZone(common_az.ConfiguredAvailabilityZone):
|
|||||||
self.metadata_proxy)
|
self.metadata_proxy)
|
||||||
self._native_md_proxy_uuid = proxy_id
|
self._native_md_proxy_uuid = proxy_id
|
||||||
|
|
||||||
|
tz_id = nsxlib.transport_zone.get_id_by_name_or_id(
|
||||||
|
self.default_overlay_tz)
|
||||||
|
self._default_overlay_tz_uuid = tz_id
|
||||||
|
|
||||||
|
# Optional configurations (may be None)
|
||||||
|
if self.default_vlan_tz:
|
||||||
|
tz_id = nsxlib.transport_zone.get_id_by_name_or_id(
|
||||||
|
self.default_vlan_tz)
|
||||||
|
self._default_vlan_tz_uuid = tz_id
|
||||||
|
else:
|
||||||
|
self._default_vlan_tz_uuid = None
|
||||||
|
|
||||||
|
|
||||||
class NsxV3AvailabilityZones(common_az.ConfiguredAvailabilityZones):
|
class NsxV3AvailabilityZones(common_az.ConfiguredAvailabilityZones):
|
||||||
|
|
||||||
|
@ -303,20 +303,6 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
'reason': e})
|
'reason': e})
|
||||||
|
|
||||||
def _translate_configured_names_to_uuids(self):
|
def _translate_configured_names_to_uuids(self):
|
||||||
# default VLAN transport zone name / uuid
|
|
||||||
self._default_vlan_tz_uuid = None
|
|
||||||
if cfg.CONF.nsx_v3.default_vlan_tz:
|
|
||||||
tz_id = self.nsxlib.transport_zone.get_id_by_name_or_id(
|
|
||||||
cfg.CONF.nsx_v3.default_vlan_tz)
|
|
||||||
self._default_vlan_tz_uuid = tz_id
|
|
||||||
|
|
||||||
# default overlay transport zone name / uuid
|
|
||||||
self._default_overlay_tz_uuid = None
|
|
||||||
if cfg.CONF.nsx_v3.default_overlay_tz:
|
|
||||||
tz_id = self.nsxlib.transport_zone.get_id_by_name_or_id(
|
|
||||||
cfg.CONF.nsx_v3.default_overlay_tz)
|
|
||||||
self._default_overlay_tz_uuid = tz_id
|
|
||||||
|
|
||||||
# default tier0 router
|
# default tier0 router
|
||||||
self._default_tier0_router = None
|
self._default_tier0_router = None
|
||||||
if cfg.CONF.nsx_v3.default_tier0_router:
|
if cfg.CONF.nsx_v3.default_tier0_router:
|
||||||
@ -332,6 +318,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
if not cfg.CONF.nsx_v3.metadata_proxy:
|
if not cfg.CONF.nsx_v3.metadata_proxy:
|
||||||
raise cfg.RequiredOptError("metadata_proxy")
|
raise cfg.RequiredOptError("metadata_proxy")
|
||||||
|
|
||||||
|
# Translate all the uuids in each of the availability
|
||||||
for az in self.get_azs_list():
|
for az in self.get_azs_list():
|
||||||
az.translate_configured_names_to_uuids(self.nsxlib)
|
az.translate_configured_names_to_uuids(self.nsxlib)
|
||||||
|
|
||||||
@ -610,7 +597,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
self._extension_manager.extend_subnet_dict(
|
self._extension_manager.extend_subnet_dict(
|
||||||
ctx.session, subnetdb, result)
|
ctx.session, subnetdb, result)
|
||||||
|
|
||||||
def _validate_provider_create(self, context, network_data):
|
def _validate_provider_create(self, context, network_data, az):
|
||||||
is_provider_net = any(
|
is_provider_net = any(
|
||||||
validators.is_attr_set(network_data.get(f))
|
validators.is_attr_set(network_data.get(f))
|
||||||
for f in (pnet.NETWORK_TYPE,
|
for f in (pnet.NETWORK_TYPE,
|
||||||
@ -637,11 +624,11 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
# Set VLAN id to 0 for flat networks
|
# Set VLAN id to 0 for flat networks
|
||||||
vlan_id = '0'
|
vlan_id = '0'
|
||||||
if physical_net is None:
|
if physical_net is None:
|
||||||
physical_net = self._default_vlan_tz_uuid
|
physical_net = az._default_vlan_tz_uuid
|
||||||
elif net_type == utils.NsxV3NetworkTypes.VLAN:
|
elif net_type == utils.NsxV3NetworkTypes.VLAN:
|
||||||
# Use default VLAN transport zone if physical network not given
|
# Use default VLAN transport zone if physical network not given
|
||||||
if physical_net is None:
|
if physical_net is None:
|
||||||
physical_net = self._default_vlan_tz_uuid
|
physical_net = az._default_vlan_tz_uuid
|
||||||
|
|
||||||
# Validate VLAN id
|
# Validate VLAN id
|
||||||
if not vlan_id:
|
if not vlan_id:
|
||||||
@ -687,7 +674,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
|
|
||||||
if physical_net is None:
|
if physical_net is None:
|
||||||
# Default to transport type overlay
|
# Default to transport type overlay
|
||||||
physical_net = self._default_overlay_tz_uuid
|
physical_net = az._default_overlay_tz_uuid
|
||||||
|
|
||||||
return is_provider_net, net_type, physical_net, vlan_id
|
return is_provider_net, net_type, physical_net, vlan_id
|
||||||
|
|
||||||
@ -706,9 +693,9 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
self._routerlib.validate_tier0(self.tier0_groups_dict, tier0_uuid)
|
self._routerlib.validate_tier0(self.tier0_groups_dict, tier0_uuid)
|
||||||
return (is_provider_net, utils.NetworkTypes.L3_EXT, tier0_uuid, 0)
|
return (is_provider_net, utils.NetworkTypes.L3_EXT, tier0_uuid, 0)
|
||||||
|
|
||||||
def _create_network_at_the_backend(self, context, net_data):
|
def _create_network_at_the_backend(self, context, net_data, az):
|
||||||
is_provider_net, net_type, physical_net, vlan_id = (
|
is_provider_net, net_type, physical_net, vlan_id = (
|
||||||
self._validate_provider_create(context, net_data))
|
self._validate_provider_create(context, net_data, az))
|
||||||
neutron_net_id = net_data.get('id') or uuidutils.generate_uuid()
|
neutron_net_id = net_data.get('id') or uuidutils.generate_uuid()
|
||||||
# To ensure that the correct tag will be set
|
# To ensure that the correct tag will be set
|
||||||
net_data['id'] = neutron_net_id
|
net_data['id'] = neutron_net_id
|
||||||
@ -784,6 +771,12 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
is_backend_network = False
|
is_backend_network = False
|
||||||
tenant_id = net_data['tenant_id']
|
tenant_id = net_data['tenant_id']
|
||||||
|
|
||||||
|
# validate the availability zone, and get the AZ object
|
||||||
|
if az_ext.AZ_HINTS in net_data:
|
||||||
|
self.validate_availability_zones(context, 'network',
|
||||||
|
net_data[az_ext.AZ_HINTS])
|
||||||
|
az = self.get_obj_az_by_hints(net_data)
|
||||||
|
|
||||||
self._ensure_default_security_group(context, tenant_id)
|
self._ensure_default_security_group(context, tenant_id)
|
||||||
if validators.is_attr_set(external) and external:
|
if validators.is_attr_set(external) and external:
|
||||||
self._assert_on_external_net_with_qos(net_data)
|
self._assert_on_external_net_with_qos(net_data)
|
||||||
@ -791,10 +784,9 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
self._validate_external_net_create(net_data))
|
self._validate_external_net_create(net_data))
|
||||||
else:
|
else:
|
||||||
is_provider_net, net_type, physical_net, vlan_id, nsx_net_id = (
|
is_provider_net, net_type, physical_net, vlan_id, nsx_net_id = (
|
||||||
self._create_network_at_the_backend(context, net_data))
|
self._create_network_at_the_backend(context, net_data, az))
|
||||||
is_backend_network = True
|
is_backend_network = True
|
||||||
try:
|
try:
|
||||||
az_name = nsx_az.DEFAULT_NAME
|
|
||||||
with context.session.begin(subtransactions=True):
|
with context.session.begin(subtransactions=True):
|
||||||
# Create network in Neutron
|
# Create network in Neutron
|
||||||
created_net = super(NsxV3Plugin, self).create_network(context,
|
created_net = super(NsxV3Plugin, self).create_network(context,
|
||||||
@ -808,12 +800,9 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
self._process_l3_create(context, created_net, net_data)
|
self._process_l3_create(context, created_net, net_data)
|
||||||
|
|
||||||
if az_ext.AZ_HINTS in net_data:
|
if az_ext.AZ_HINTS in net_data:
|
||||||
net_hints = net_data[az_ext.AZ_HINTS]
|
# Update the AZ hints in the neutron object
|
||||||
self.validate_availability_zones(context, 'network',
|
az_hints = az_ext.convert_az_list_to_string(
|
||||||
net_hints)
|
net_data[az_ext.AZ_HINTS])
|
||||||
if net_hints:
|
|
||||||
az_name = net_hints[0]
|
|
||||||
az_hints = az_ext.convert_az_list_to_string(net_hints)
|
|
||||||
super(NsxV3Plugin, self).update_network(
|
super(NsxV3Plugin, self).update_network(
|
||||||
context,
|
context,
|
||||||
created_net['id'],
|
created_net['id'],
|
||||||
@ -836,7 +825,6 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
nsx_net_id)
|
nsx_net_id)
|
||||||
|
|
||||||
if is_backend_network and cfg.CONF.nsx_v3.native_dhcp_metadata:
|
if is_backend_network and cfg.CONF.nsx_v3.native_dhcp_metadata:
|
||||||
az = self.get_az_by_hint(az_name)
|
|
||||||
# Enable native metadata proxy for this network.
|
# Enable native metadata proxy for this network.
|
||||||
tags = self.nsxlib.build_v3_tags_payload(
|
tags = self.nsxlib.build_v3_tags_payload(
|
||||||
net_data, resource_type='os-neutron-net-id',
|
net_data, resource_type='os-neutron-net-id',
|
||||||
|
@ -46,7 +46,9 @@ class Nsxv3AvailabilityZonesTestCase(base.BaseTestCase):
|
|||||||
dhcp_profile="dhcp_profile1",
|
dhcp_profile="dhcp_profile1",
|
||||||
native_metadata_route="2.2.2.2",
|
native_metadata_route="2.2.2.2",
|
||||||
dns_domain="aaa.com",
|
dns_domain="aaa.com",
|
||||||
nameservers=["20.1.1.1"]):
|
nameservers=["20.1.1.1"],
|
||||||
|
default_overlay_tz='otz',
|
||||||
|
default_vlan_tz='vtz'):
|
||||||
if metadata_proxy is not None:
|
if metadata_proxy is not None:
|
||||||
cfg.CONF.set_override("metadata_proxy", metadata_proxy,
|
cfg.CONF.set_override("metadata_proxy", metadata_proxy,
|
||||||
group=self.group_name)
|
group=self.group_name)
|
||||||
@ -63,6 +65,12 @@ class Nsxv3AvailabilityZonesTestCase(base.BaseTestCase):
|
|||||||
if nameservers is not None:
|
if nameservers is not None:
|
||||||
cfg.CONF.set_override("nameservers", nameservers,
|
cfg.CONF.set_override("nameservers", nameservers,
|
||||||
group=self.group_name)
|
group=self.group_name)
|
||||||
|
if default_overlay_tz is not None:
|
||||||
|
cfg.CONF.set_override("default_overlay_tz", default_overlay_tz,
|
||||||
|
group=self.group_name)
|
||||||
|
if default_vlan_tz is not None:
|
||||||
|
cfg.CONF.set_override("default_vlan_tz", default_vlan_tz,
|
||||||
|
group=self.group_name)
|
||||||
|
|
||||||
def test_simple_availability_zone(self):
|
def test_simple_availability_zone(self):
|
||||||
self._config_az()
|
self._config_az()
|
||||||
@ -73,6 +81,8 @@ class Nsxv3AvailabilityZonesTestCase(base.BaseTestCase):
|
|||||||
self.assertEqual("2.2.2.2", az.native_metadata_route)
|
self.assertEqual("2.2.2.2", az.native_metadata_route)
|
||||||
self.assertEqual("aaa.com", az.dns_domain)
|
self.assertEqual("aaa.com", az.dns_domain)
|
||||||
self.assertEqual(["20.1.1.1"], az.nameservers)
|
self.assertEqual(["20.1.1.1"], az.nameservers)
|
||||||
|
self.assertEqual("otz", az.default_overlay_tz)
|
||||||
|
self.assertEqual("vtz", az.default_vlan_tz)
|
||||||
|
|
||||||
def test_missing_group_section(self):
|
def test_missing_group_section(self):
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user