Support launch instance on external provider network

Allow launching an instance and attaching it directly to the
external provider network.  This is useful in its own right and
is also a requirement in order to successfully test some
configurations.
This commit is contained in:
Frode Nordahl
2022-04-12 17:23:18 +02:00
parent 3f711ff6da
commit 3ec64703ed
2 changed files with 38 additions and 13 deletions
+13 -4
View File
@@ -634,7 +634,8 @@ class OpenStackBaseTest(BaseCharmTest):
pass
def launch_guest(self, guest_name, userdata=None, use_boot_volume=False,
instance_key=None, flavor_name=None):
instance_key=None, flavor_name=None,
attach_to_external_network=False):
"""Launch one guest to use in tests.
Note that it is up to the caller to have set the RESOURCE_PREFIX class
@@ -651,6 +652,9 @@ class OpenStackBaseTest(BaseCharmTest):
:type use_boot_volume: boolean
:param instance_key: Key to collect associated config data with.
:type instance_key: Optional[str]
:param attach_to_external_network: Attach instance directly to external
network.
:type attach_to_external_network: bool
:returns: Nova instance objects
:rtype: Server
"""
@@ -679,9 +683,10 @@ class OpenStackBaseTest(BaseCharmTest):
vm_name=instance_name,
use_boot_volume=use_boot_volume,
userdata=userdata,
flavor_name=flavor_name)
flavor_name=flavor_name,
attach_to_external_network=attach_to_external_network)
def launch_guests(self, userdata=None):
def launch_guests(self, userdata=None, attach_to_external_network=False):
"""Launch two guests to use in tests.
Note that it is up to the caller to have set the RESOURCE_PREFIX class
@@ -689,6 +694,9 @@ class OpenStackBaseTest(BaseCharmTest):
:param userdata: Userdata to attach to instance
:type userdata: Optional[str]
:param attach_to_external_network: Attach instance directly to external
network.
:type attach_to_external_network: bool
:returns: List of launched Nova instance objects
:rtype: List[Server]
"""
@@ -697,7 +705,8 @@ class OpenStackBaseTest(BaseCharmTest):
launched_instances.append(
self.launch_guest(
guest_name='ins-{}'.format(guest_number),
userdata=userdata))
userdata=userdata,
attach_to_external_network=attach_to_external_network))
return launched_instances
def retrieve_guest(self, guest_name):
+25 -9
View File
@@ -53,7 +53,7 @@ boot_tests = {
def launch_instance(instance_key, use_boot_volume=False, vm_name=None,
private_network_name=None, image_name=None,
flavor_name=None, external_network_name=None, meta=None,
userdata=None):
userdata=None, attach_to_external_network=False):
"""Launch an instance.
:param instance_key: Key to collect associated config data with.
@@ -76,6 +76,9 @@ def launch_instance(instance_key, use_boot_volume=False, vm_name=None,
:type meta: dict
:param userdata: Configuration to use upon launch, used by cloud-init.
:type userdata: str
:param attach_to_external_network: Attach instance directly to external
network.
:type attach_to_external_network: bool
:returns: the created instance
:rtype: novaclient.Server
"""
@@ -94,12 +97,18 @@ def launch_instance(instance_key, use_boot_volume=False, vm_name=None,
flavor = nova_client.flavors.find(name=flavor_name)
private_network_name = private_network_name or "private"
net = neutron_client.find_resource("network", private_network_name)
nics = [{'net-id': net.get('id')}]
meta = meta or {}
external_network_name = external_network_name or "ext_net"
if attach_to_external_network:
instance_network_name = external_network_name
else:
instance_network_name = private_network_name
net = neutron_client.find_resource("network", instance_network_name)
nics = [{'net-id': net.get('id')}]
if use_boot_volume:
bdmv2 = [{
'boot_index': '0',
@@ -143,12 +152,19 @@ def launch_instance(instance_key, use_boot_volume=False, vm_name=None,
port = openstack_utils.get_ports_from_device_id(
neutron_client,
instance.id)[0]
logging.info('Assigning floating ip.')
ip = openstack_utils.create_floating_ip(
neutron_client,
external_network_name,
port=port)['floating_ip_address']
logging.info('Assigned floating IP {} to {}'.format(ip, vm_name))
if attach_to_external_network:
logging.info('attach_to_external_network={}, not assigning floating IP'
.format(attach_to_external_network))
ip = port['fixed_ips'][0]['ip_address']
logging.info('Using fixed IP {} on network {} for {}'
.format(ip, instance_network_name, vm_name))
else:
logging.info('Assigning floating ip.')
ip = openstack_utils.create_floating_ip(
neutron_client,
external_network_name,
port=port)['floating_ip_address']
logging.info('Assigned floating IP {} to {}'.format(ip, vm_name))
try:
for attempt in Retrying(
stop=stop_after_attempt(8),