Support for local external port configuration
Add's ensure_local_external_port which sets up an external gateway tap the same way we do for the management network. New config options - external_subnet_id - external_prefix (default 172.16.77.0/24) - plug_external_port (default False)
This commit is contained in:
parent
f7dbe43371
commit
39c1683d9c
|
@ -510,6 +510,54 @@ class Quantum(object):
|
|||
)
|
||||
return new_port
|
||||
|
||||
def ensure_local_external_port(self):
|
||||
driver = importutils.import_object(self.conf.interface_driver,
|
||||
self.conf)
|
||||
|
||||
host_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, socket.gethostname()))
|
||||
|
||||
query_dict = dict(device_owner=DEVICE_OWNER_RUG,
|
||||
device_id=host_id,
|
||||
network_id=self.conf.external_network_id,
|
||||
)
|
||||
ports = self.api_client.list_ports(**query_dict)['ports']
|
||||
|
||||
ip_address = get_local_external_ip(self.conf)
|
||||
|
||||
if ports:
|
||||
port = Port.from_dict(ports[0])
|
||||
LOG.info('already have local external port, using %r', port)
|
||||
else:
|
||||
LOG.info('creating a new local external port')
|
||||
port_dict = dict(
|
||||
admin_state_up=True,
|
||||
network_id=self.conf.external_network_id,
|
||||
device_owner=DEVICE_OWNER_RUG,
|
||||
device_id=host_id,
|
||||
fixed_ips=[{
|
||||
'ip_address': ip_address.split('/')[0],
|
||||
'subnet_id': self.conf.external_subnet_id
|
||||
}]
|
||||
)
|
||||
|
||||
port = Port.from_dict(
|
||||
self.api_client.create_port(dict(port=port_dict))['port'])
|
||||
LOG.info('new local gateway port: %r', port)
|
||||
|
||||
# create the tap interface if it doesn't already exist
|
||||
if not ip_lib.device_exists(driver.get_device_name(port)):
|
||||
driver.plug(
|
||||
port.network_id,
|
||||
port.id,
|
||||
driver.get_device_name(port),
|
||||
port.mac_address)
|
||||
|
||||
# add sleep to ensure that port is setup before use
|
||||
time.sleep(1)
|
||||
|
||||
driver.init_l3(driver.get_device_name(port), [ip_address])
|
||||
return port
|
||||
|
||||
def ensure_local_service_port(self):
|
||||
driver = importutils.import_object(self.conf.interface_driver,
|
||||
self.conf)
|
||||
|
@ -517,7 +565,9 @@ class Quantum(object):
|
|||
host_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, socket.gethostname()))
|
||||
|
||||
query_dict = dict(device_owner=DEVICE_OWNER_RUG,
|
||||
device_id=host_id)
|
||||
device_id=host_id,
|
||||
network_id=self.conf.management_network_id,
|
||||
)
|
||||
|
||||
ports = self.api_client.list_ports(**query_dict)['ports']
|
||||
|
||||
|
@ -594,3 +644,9 @@ def get_local_service_ip(conf):
|
|||
rug_ip = '%s/%s' % (netaddr.IPAddress(mgt_net.first + 1),
|
||||
mgt_net.prefixlen)
|
||||
return rug_ip
|
||||
|
||||
def get_local_external_ip(conf):
|
||||
external_net = netaddr.IPNetwork(conf.external_prefix)
|
||||
external_ip = '%s/%s' % (netaddr.IPAddress(external_net.first + 1),
|
||||
external_net.prefixlen)
|
||||
return external_ip
|
||||
|
|
|
@ -108,9 +108,11 @@ def register_and_load_opts():
|
|||
cfg.StrOpt('management_network_id'),
|
||||
cfg.StrOpt('external_network_id'),
|
||||
cfg.StrOpt('management_subnet_id'),
|
||||
cfg.StrOpt('external_subnet_id'),
|
||||
cfg.StrOpt('router_image_uuid'),
|
||||
|
||||
cfg.StrOpt('management_prefix', default='fdca:3ba5:a17a:acda::/64'),
|
||||
cfg.StrOpt('external_prefix', default='172.16.77.0/24'),
|
||||
cfg.IntOpt('akanda_mgt_service_port', default=5000),
|
||||
cfg.IntOpt('router_instance_flavor', default=1),
|
||||
|
||||
|
@ -120,6 +122,9 @@ def register_and_load_opts():
|
|||
cfg.BoolOpt('ovs_use_veth', default=False),
|
||||
cfg.IntOpt('network_device_mtu'),
|
||||
|
||||
# plug in the external port locally
|
||||
cfg.BoolOpt('plug_external_port', default=False),
|
||||
|
||||
# needed for boot waiting
|
||||
cfg.IntOpt('boot_timeout', default=600),
|
||||
cfg.IntOpt('max_retries', default=3),
|
||||
|
@ -211,6 +216,10 @@ def main(argv=sys.argv[1:]):
|
|||
# bring the mgt tap interface up
|
||||
quantum.ensure_local_service_port()
|
||||
|
||||
# bring the external port
|
||||
if cfg.CONF.plug_external_port:
|
||||
quantum.ensure_local_external_port()
|
||||
|
||||
# Set up the queue to move messages between the eventlet-based
|
||||
# listening process and the scheduler.
|
||||
notification_queue = multiprocessing.Queue()
|
||||
|
|
Loading…
Reference in New Issue