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:
Jordan Tardif 2014-08-14 20:48:40 -04:00
parent f7dbe43371
commit 39c1683d9c
2 changed files with 66 additions and 1 deletions

View File

@ -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

View File

@ -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()