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:
@@ -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):
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user