Merge "Check VM's console log before trying to SSH to it."

This commit is contained in:
Zuul 2020-10-29 09:09:01 +00:00 committed by Gerrit Code Review
commit c10d23bdf9
10 changed files with 45 additions and 4 deletions

View File

@ -122,9 +122,11 @@ class BaseTempestTestCase(base_api.BaseNetworkTest):
if not kwargs.get('security_groups'):
kwargs['security_groups'] = [{'name': 'default'}]
client = self.os_primary.servers_client
if kwargs.get('availability_zone'):
client = self.os_admin.servers_client
client = kwargs.pop('client', None)
if client is None:
client = self.os_primary.servers_client
if kwargs.get('availability_zone'):
client = self.os_admin.servers_client
server = client.create_server(
flavorRef=flavor_ref,
@ -140,6 +142,10 @@ class BaseTempestTestCase(base_api.BaseNetworkTest):
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
client.delete_server,
server['server']['id'])
self.wait_for_server_active(server['server'], client=client)
self.wait_for_guest_os_ready(server['server'], client=client)
return server
@classmethod
@ -253,7 +259,6 @@ class BaseTempestTestCase(base_api.BaseNetworkTest):
server_kwargs['name'] = server_name
self.server = self.create_server(**server_kwargs)
self.wait_for_server_active(self.server['server'])
self.port = self.client.list_ports(network_id=self.network['id'],
device_id=self.server[
'server']['id'])['ports'][0]
@ -465,6 +470,28 @@ class BaseTempestTestCase(base_api.BaseNetworkTest):
self.wait_for_server_status(
server, constants.SERVER_STATUS_ACTIVE, client)
def wait_for_guest_os_ready(self, server, client=None):
if not CONF.compute_feature_enabled.console_output:
LOG.debug('Console output not supported, cannot check if server '
'%s is ready.', server['server']['id'])
return
client = client or self.os_primary.servers_client
def system_booted():
console_output = client.get_console_output(server['id'])['output']
for line in console_output.split('\n'):
if 'login:' in line.lower():
return True
return False
try:
utils.wait_until_true(system_booted, sleep=5)
except utils.WaitTimeout:
LOG.debug("No correct output in console of server %s found. "
"Guest operating system status can't be checked.",
server['id'])
def check_servers_hostnames(self, servers, timeout=None, log_errors=True,
external_port=None):
"""Compare hostnames of given servers with their names."""

View File

@ -65,6 +65,7 @@ class NetworkConnectivityTest(base.BaseTempestTestCase):
for vm in vms:
self.wait_for_server_active(vm['server'])
self.wait_for_guest_os_ready(vm['server'])
return vms
@ -231,6 +232,7 @@ class NetworkConnectivityTest(base.BaseTempestTestCase):
networks=[{'uuid': network['id']}],
security_groups=[{'name': self.secgroup['name']}])
self.wait_for_server_active(vm['server'])
self.wait_for_guest_os_ready(vm['server'])
vm_port = self.client.list_ports(
network_id=network['id'], device_id=vm['server']['id'])['ports'][0]

View File

@ -417,6 +417,7 @@ class TestFloatingIPUpdate(FloatingIpTestCasesMixin,
servers.append(server)
for server in servers:
self.wait_for_server_active(server)
self.wait_for_guest_os_ready(server)
self.fip = self.create_floatingip(port=ports[0])
self.check_connectivity(self.fip['floating_ip_address'],

View File

@ -52,6 +52,7 @@ class InternalDNSTest(base.BaseTempestTestCase):
{'name': self.security_groups[-1]['name']}],
name='leia')
self.wait_for_server_active(leia['server'])
self.wait_for_guest_os_ready(leia['server'])
ssh_client = ssh.Client(
self.fip['floating_ip_address'],

View File

@ -145,6 +145,7 @@ class IPv6Test(base.BaseTempestTestCase):
}
vm = self.create_server(**server_kwargs)['server']
self.wait_for_server_active(vm)
self.wait_for_guest_os_ready(vm)
ipv4_port = self.client.list_ports(
network_id=self.network['id'],
device_id=vm['id'])['ports'][0]

View File

@ -126,6 +126,7 @@ class MetadataTest(base.BaseTempestTestCase):
vm = self._create_server_with_network(
self.network, use_advanced_image=use_advanced_image)
self.wait_for_server_active(server=vm.server)
self.wait_for_guest_os_ready(vm.server)
self._assert_has_ssh_connectivity(vm.ssh_client)
interface = self._get_primary_interface(vm.ssh_client)

View File

@ -201,6 +201,7 @@ class BaseMulticastTest(object):
security_groups=[{'name': self.secgroup['security_group']['name']}]
)['server']
self.wait_for_server_active(server)
self.wait_for_guest_os_ready(server)
port = self.client.list_ports(
network_id=self.network['id'], device_id=server['id'])['ports'][0]
server['fip'] = self.create_floatingip(port=port)

View File

@ -70,6 +70,7 @@ class PortForwardingTestJSON(base.BaseTempestTestCase):
networks=[{'port': port['id']}])['server']
server['name'] = name
self.wait_for_server_active(server)
self.wait_for_guest_os_ready(server)
server['port_forwarding_tcp'] = self.create_port_forwarding(
self.fip['id'],
internal_port_id=port['id'],
@ -255,6 +256,7 @@ class PortForwardingTestJSON(base.BaseTempestTestCase):
name=name, networks=[{'port': port['id']}])['server']
server['name'] = name
self.wait_for_server_active(server)
self.wait_for_guest_os_ready(server)
# Add a second fixed_ip address to port (same subnet)
internal_subnet_id = port['fixed_ips'][0]['subnet_id']

View File

@ -175,6 +175,7 @@ class QoSTestMixin(object):
server = self.create_server(**server_kwargs)
self.wait_for_server_active(server['server'])
self.wait_for_guest_os_ready(server['server'])
self.check_connectivity(self.fip['floating_ip_address'],
CONF.validation.image_ssh_user,
keypair['private_key'])

View File

@ -161,6 +161,7 @@ class TrunkTest(base.BaseTempestTestCase):
def _configure_vlan_subport(self, vm, vlan_tag, vlan_subnet):
self.wait_for_server_active(server=vm.server)
self.wait_for_guest_os_ready(vm.server)
self._wait_for_trunk(trunk=vm.trunk)
self._wait_for_port(port=vm.port)
self._wait_for_port(port=vm.subport)
@ -199,6 +200,7 @@ class TrunkTest(base.BaseTempestTestCase):
vm2 = self._create_server_with_trunk_port()
for vm in (vm1, vm2):
self.wait_for_server_active(server=vm.server)
self.wait_for_guest_os_ready(vm.server)
self._wait_for_trunk(vm.trunk)
self._assert_has_ssh_connectivity(vm.ssh_client)
@ -325,6 +327,7 @@ class TrunkTest(base.BaseTempestTestCase):
use_advanced_image=use_advanced_image)
for role in ['migrate', 'connection_test']:
self.wait_for_server_active(servers[role].server)
self.wait_for_guest_os_ready(servers[role].server)
self._configure_vlan_subport(vm=servers[role],
vlan_tag=vlan_tag,
vlan_subnet=vlan_subnet)
@ -377,6 +380,7 @@ class TrunkTest(base.BaseTempestTestCase):
vlan_subnet=vlan_subnet)
for vm in vms:
self.wait_for_server_active(vm.server)
self.wait_for_guest_os_ready(vm.server)
# allow ICMP traffic
sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])