Skip to content

Commit

Permalink
Support launch instance on external provider network
Browse files Browse the repository at this point in the history
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.

(cherry picked from commit 3ec6470)
  • Loading branch information
fnordahl committed Jul 20, 2023
1 parent f67bd22 commit 0b69b8d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 11 deletions.
12 changes: 10 additions & 2 deletions zaza/openstack/charm_tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,8 @@ def resource_cleanup(self):
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
Expand All @@ -768,6 +769,9 @@ def launch_guest(self, guest_name, userdata=None, use_boot_volume=False,
: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
"""
Expand Down Expand Up @@ -796,7 +800,8 @@ def launch_guest(self, guest_name, userdata=None, use_boot_volume=False,
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, attach_to_external_network=False,
flavor_name=None):
Expand All @@ -807,6 +812,9 @@ def launch_guests(self, userdata=None, attach_to_external_network=False,
: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]
"""
Expand Down
34 changes: 25 additions & 9 deletions zaza/openstack/configure/guest.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
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.
Expand All @@ -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
"""
Expand All @@ -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',
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit 0b69b8d

Please sign in to comment.