| # import testtools |
| # @test.attr(type='full') |
| # @test.services('compute', 'network') |
| # @testtools.skipUnless(CONF.compute_feature_enabled.live_migration, |
| # 'Live migration must be enabled in tempest.conf') |
| # |
| # def test_live_migrate_to_all_nodes(self): |
| # # collect all active hosts in all az |
| # if not CONF.compute_feature_enabled.live_migration: |
| # raise cls.skipException( |
| # "Live migration is disabled") |
| # available_zone = \ |
| # self.os_adm.availability_zone_client.list_availability_zones( |
| # detail=True)['availabilityZoneInfo'] |
| # hosts = [] |
| # for zone in available_zone: |
| # if zone['zoneState']['available']: |
| # for host in zone['hosts']: |
| # if 'nova-compute' in zone['hosts'][host] and \ |
| # zone['hosts'][host]['nova-compute']['available']: |
| # hosts.append({'zone': zone['zoneName'], |
| # 'host_name': host}) |
| # |
| # # ensure we have at least as many compute hosts as we expect |
| # if len(hosts) < CONF.compute.min_compute_nodes: |
| # raise exceptions.InvalidConfiguration( |
| # "Host list %s is shorter than min_compute_nodes. " |
| # "Did a compute worker not boot correctly?" % hosts) |
| # |
| # # Create 1 VM |
| # servers = [] |
| # first_last_host = hosts[0] |
| # inst = self.create_server( |
| # availability_zone='%(zone)s:%(host_name)s' % hosts[0], |
| # wait_until='ACTIVE') |
| # server = self.servers_client.show_server(inst['id'])['server'] |
| # # ensure server is located on the requested host |
| # self.assertEqual(hosts[0]['host_name'], server['OS-EXT-SRV-ATTR:host']) |
| # hosts.remove(first_last_host) |
| # hosts.append(first_last_host) |
| # |
| # # Live migrate to every host |
| # for host in hosts[:CONF.compute.min_compute_nodes]: |
| # self.servers_client.live_migrate_server(server_id=inst["id"],host=host['host_name'],block_migration=CONF.compute_feature_enabled.block_migration_for_live_migration,disk_over_commit=False) |
| # waiters.wait_for_server_status(self.servers_client, inst["id"], 'ACTIVE') |
| # server = self.servers_client.show_server(inst['id'])['server'] |
| # # ensure server is located on the requested host |
| # self.assertEqual(host['host_name'], server['OS-EXT-SRV-ATTR:host']) |
| # |
| # |
| # from tempest.lib.common.utils import test_utils |
| # class TestServerSshAllComputes(manager.NetworkScenarioTest): |
| # credentials = ['primary', 'admin'] |
| # |
| # |
| # @classmethod |
| # def setup_clients(cls): |
| # super(TestServerSshAllComputes, cls).setup_clients() |
| # # Use admin client by default |
| # cls.manager = cls.admin_manager |
| # # this is needed so that we can use the availability_zone:host |
| # # scheduler hint, which is admin_only by default |
| # cls.servers_client = cls.admin_manager.servers_client |
| # |
| # @test.attr(type='full') |
| # @test.services('compute', 'network') |
| # def test_ssh_to_all_nodes(self): |
| # available_zone = \ |
| # self.os_adm.availability_zone_client.list_availability_zones( |
| # detail=True)['availabilityZoneInfo'] |
| # hosts = [] |
| # for zone in available_zone: |
| # if zone['zoneState']['available']: |
| # for host in zone['hosts']: |
| # if 'nova-compute' in zone['hosts'][host] and \ |
| # zone['hosts'][host]['nova-compute']['available']: |
| # hosts.append({'zone': zone['zoneName'], |
| # 'host_name': host}) |
| # |
| # # ensure we have at least as many compute hosts as we expect |
| # if len(hosts) < CONF.compute.min_compute_nodes: |
| # raise exceptions.InvalidConfiguration( |
| # "Host list %s is shorter than min_compute_nodes. " |
| # "Did a compute worker not boot correctly?" % hosts) |
| # |
| # servers = [] |
| # |
| # # prepare key pair and sec group |
| # keypair = self.os_adm.keypairs_client.create_keypair(name="tempest-live") |
| # secgroup = self._create_security_group(security_groups_client=self.os_adm.security_groups_client, security_group_rules_client=self.os_adm.security_group_rules_client, tenant_id=self.os_adm.security_groups_client.tenant_id) |
| # |
| # # create 1 compute for each node, up to the min_compute_nodes |
| # # threshold (so that things don't get crazy if you have 1000 |
| # # compute nodes but set min to 3). |
| # |
| # for host in hosts[:CONF.compute.min_compute_nodes]: |
| # inst = self.create_server( |
| # availability_zone='%(zone)s:%(host_name)s' % host, |
| # key_name=keypair['keypair']['name']) |
| # server = self.os_adm.servers_client.show_server(inst['id'])['server'] |
| # # TODO we may create server with sec group instead of adding it |
| # self.os_adm.servers_client.add_security_group(server['id'], |
| # name=secgroup['name']) |
| # |
| # # ensure server is located on the requested host |
| # self.assertEqual(host['host_name'], server['OS-EXT-SRV-ATTR:host']) |
| # # TODO maybe check validate = True? |
| # if CONF.network.public_network_id: |
| # # Check VM via ssh |
| # floating_ip = self.os_adm.compute_floating_ips_client.create_floating_ip(pool=CONF.network.floating_network_name)['floating_ip'] |
| # self.addCleanup(test_utils.call_and_ignore_notfound_exc, |
| # self.os_adm.compute_floating_ips_client.delete_floating_ip, |
| # floating_ip['id']) |
| # self.os_adm.compute_floating_ips_client.associate_floating_ip_to_server(floating_ip['ip'], inst['id']) |
| # |
| # # TODO maybe add this |
| # # "Failed to find floating IP '%s' in server addresses: %s" % |
| # # (floating_ip['ip'], server['addresses'])) |
| # |
| # # check that we can SSH to the server |
| # self.linux_client = self.get_remote_client( |
| # floating_ip['ip'], private_key=keypair['keypair']['private_key']) |
| # |
| # servers.append(server) |
| # |
| # # make sure we really have the number of servers we think we should |
| # self.assertEqual( |
| # len(servers), CONF.compute.min_compute_nodes, |
| # "Incorrect number of servers built %s" % servers) |
| # |
| # # ensure that every server ended up on a different host |
| # host_ids = [x['hostId'] for x in servers] |
| # self.assertEqual( |
| # len(set(host_ids)), len(servers), |
| # "Incorrect number of distinct host_ids scheduled to %s" % servers) |
| # self.os_adm.keypairs_client.delete_keypair(keypair['keypair']['name']) |
| # |