コード例 #1
0
ファイル: utils.py プロジェクト: CVL-dev/cvl-user-management
def can_ssh_to_server(vm_name, username='******'):
    host = get_vm_info(vm_name)['ip']
    key_filename = cvl_config.VM_KEY_LOCATION + '/' + cvl_config.VM_KEY_NAME

    try:
        client = ssh.SSHClient()
        client.set_missing_host_key_policy(ssh.AutoAddPolicy())
        client.connect(host, username=username, key_filename=key_filename, timeout=10)
        client.close()
        return True
    except:
        return False
コード例 #2
0
    def test_boot_with_volume(self):
        logger.info("Starting boot instance with volume test")

        # create volume
        logger.info("Creating new volume")
        volume = self.cinder.volumes.create(1, display_name=Nova_health_tests.VOLUME_NAME)
        bdm = {"/dev/vdb": "{0}:::0".format(volume.id)}

        # boot instance
        logger.info("Booting new instance")
        flavor = self.nova.flavors.find(name=self.flavor)
        image = self.nova.images.find(name=self.cirros_image)
        server_id = self.nova.servers.create(
            Nova_health_tests.INSTANCE_NAME, image=image, block_device_mapping=bdm, flavor=flavor
        ).id
        newserver = poll_until(
            lambda: self.nova.servers.get(server_id), lambda inst: inst.status != "BUILD", sleep_time=2
        )
        self.assertEquals("ACTIVE", newserver.status)
        logger.info("Booted new instance: " + server_id)

        client = ssh.SSHClient()
        client.set_missing_host_key_policy(ssh.AutoAddPolicy())
        network = newserver.networks["private"][-1]
        logger.info("SSHing to %s", network)
        poll_until(
            lambda: check_for_exception(client.connect, network, username="******", password="******"),
            lambda result: result,
            sleep_time=2,
        )

        _, stdout, _ = client.exec_command("ls /dev")
        result = stdout.readlines()
        client.close()
        logger.info("Files in /dev: %s", result)
        self.assertTrue("vdb\n" in result)
コード例 #3
0
    def test_boot_with_volume(self):
        logger.info("-----------------------------------------------")
        logger.info("Starting boot instance with volume test")
        logger.info("-----------------------------------------------")

        # Add keypair
        logger.info("Adding new pub key")
        keypair = self.nova.keypairs.create(self.KEY_NAME)
        f = open(self.KEY_FILE_NAME, 'w')
        f.write(keypair.private_key)
        f.close()

        # create sec group + rule
        logger.info("Creating new security group + rules")
        secgroup = self.nova.security_groups.create(self.SECGROUP_NAME,
                                                    'test_boot_with_volume')
        self.nova.security_group_rules.create(secgroup.id, 'tcp', 22, 22,
                                              '0.0.0.0/0')

        # create volume
        logger.info("Creating new volume")
        volume = self.cinder.volumes.create(1, display_name=self.VOLUME_NAME)
        logger.info("Volume created: " + volume.id)
        bdm = {'/dev/vdb': '{0}:::0'.format(volume.id)}

        # boot instance
        logger.info("Booting new instance: %s", self.INSTANCE_NAME)
        flavor = self.nova.flavors.find(name=self.non_eph_flavor)
        image = self.nova.images.find(name=self.image)
        server_id = self.nova.servers.create(self.INSTANCE_NAME,
                                             image=image,
                                             block_device_mapping=bdm,
                                             key_name=self.KEY_NAME,
                                             security_groups=[secgroup.name],
                                             flavor=flavor,
                                             availability_zone=self.availability_zone).id

        logger.info("Instance %s is building",  server_id)
        newserver = poll_until(lambda: self.nova.servers.get(server_id),
                               lambda inst: inst.status != 'BUILD',
                               sleep_time=5)
        self.assertEquals('ACTIVE', newserver.status)
        logger.info("Instance %s is active",  server_id)
        logger.info(vars(newserver))

        time.sleep(10) # sleep 10 seconds while ssh server is starting
        client = ssh.SSHClient()
        client.load_host_keys('/dev/null')
        client.set_missing_host_key_policy(ssh.AutoAddPolicy())
        logger.info("Network label for instance %s: %s", server_id, newserver.networks)
        network = newserver.networks[self.network_label][-1]
        logger.info('SSHing to %s', network)
        poll_until(lambda: check_for_exception(client.connect,
                                               network,
                                               username='******',
                                               key_filename=self
                                               .KEY_FILE_NAME),
                   lambda result: result,
                   sleep_time=5)

        result = execute_ssh_command(client, 'ls /dev')
        client.close()
        logger.info('Files in /dev: %s', result)
        self.assertTrue('vdb\n' in result)
コード例 #4
0
    def test_boot_with_ephemeral(self):
        logger.info("-----------------------------------------------")
        logger.info("Starting boot instance with ephemeral test")
        logger.info("-----------------------------------------------")

        # # Add keypair
        # logger.info("Adding new pub key")
        # keypair = self.nova.keypairs.create(self.KEY_NAME)
        # f = open(self.KEY_FILE_NAME, 'w')
        # f.write(keypair.private_key)
        # f.close()


        # boot instance
        logger.info("Booting new instance: %s", self.INSTANCE_NAME)
        flavor = self.nova.flavors.find(name=self.flavor)
        image = self.nova.images.find(name=self.image)
        server_id = self.nova.servers.create(self.INSTANCE_NAME,
                                             image=image,
                                             key_name='paas-racks-jenkins',
                                             flavor=flavor,
                                             availability_zone=self.availability_zone).id

        logger.info("Instance %s is building",  server_id)
        newserver = None
        try:
            newserver = poll_until(lambda: self.nova.servers.get(server_id),
                                   lambda inst: inst.status != 'BUILD',
                                   sleep_time=5)
        except PollTimeout as e:

            resized_server = e.previous_result
            error_message = 'Instance is stuck in BUILD.\n' \
                            'Instance ID = ' + server_id + '\n'
            if resized_server is not None:
                error_message = error_message + 'Host ID = ' + resized_server.hostId + '\n' \
                                                'Network = ' + str(resized_server.networks) + '\n'
            self.fail(error_message)
        finally:
            if newserver is not None:
                logger.info(vars(newserver))

        self.assertEquals('ACTIVE', newserver.status, 'The instance %(id)s is in %(status)s' % {'id': server_id, 'status': newserver.status})
        logger.info("Instance %s is active",  server_id)

        # sleep 10 seconds for instance to be ready (ssh server)
        time.sleep(10)

        secGroupExists = False
        groups = self.nova.security_groups.list()
        for group in groups:
            if group.name == self.SECGROUP_NAME:
                secGroupExists = True
                break
        if not secGroupExists:
            logger.info("Creating new security group + rules")
            secgroup = self.nova.security_groups.create(self.SECGROUP_NAME,
                                                        'test_boot_with_ephemeral')
            self.nova.security_group_rules.create(secgroup.id, 'tcp', 22, 22, '0.0.0.0/0')
            self.nova.security_group_rules.create(secgroup.id, 'icmp', -1, -1, '0.0.0.0/0')

        self.nova.servers.add_security_group(server_id, self.SECGROUP_NAME)


        # Ensure secgroup is not open
        logger.info("Network label for instance %s: %s", server_id, newserver.networks)
        network = newserver.networks[self.network_label][-1]

        logger.info('SSHing to %s', network)
        client = ssh.SSHClient()
        client.load_host_keys('/dev/null')
        client.set_missing_host_key_policy(ssh.AutoAddPolicy())
        try:
            poll_until(lambda: check_for_exception(client.connect,
                                                   network,
                                                   username='******',
                                                   key_filename=self
                                                   .KEY_FILE_NAME),
                       lambda result: result,
                       sleep_time=5)
            logger.info('Check for /dev/vdb...')
            _, stdout, _ = client.exec_command('ls /dev')
            result = stdout.readlines()
            self.assertTrue('vdb\n' in result, '/dev/vdb not found')

            # Test outbound connectivity
            logger.info("Pinging google.com...")
            exit_status = 0
            for x in range(0, 5):
                _, stdout, stderr = client.exec_command('ping google.com -c 1')

                while not stdout.channel.exit_status_ready():
                    if stdout.channel.recv_ready():
                        rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
                        if len(rl) > 0:
                            # Print data from stdout
                            logger.info(stdout.channel.recv(1024))
                    if stderr.channel.recv_stderr_ready():
                        rl, wl, xl = select.select([stderr.channel], [], [], 0.0)
                        if len(rl) > 0:
                            # Print data from stderr
                            logger.error(stderr.channel.recv_stderr(1024))
                exit_status = stdout.channel.recv_exit_status()
                if exit_status == 0:
                    break
                else:
                    # sleep for 5 secs to allow network to be ready
                    time.sleep(5)
            self.assertEquals(0, exit_status, 'Ping to google.com failed!')
        except PollTimeout:
            error_message = 'Unable to SSH to ' + network + '\n' \
                            'Instance ID = ' + newserver.id + '\n' \
                            'Host ID = ' + newserver.hostId + '\n' \
                            'Status = ' + newserver.status + '\n' \
                            'Network = ' + str(newserver.networks) + '\n'
            self.fail(error_message)
        finally:
            client.close()
コード例 #5
0
    def test_resize_flavor(self):
        logger.info("-----------------------------------------------")
        logger.info("Starting resize flavor test")
        logger.info("-----------------------------------------------")

        # Add keypair
        logger.info("Adding new pub key")
        keypair = self.nova.keypairs.create(self.KEY_NAME)
        f = open(self.KEY_FILE_NAME, 'w')
        f.write(keypair.private_key)
        f.close()

        # create sec group + rule
        logger.info("Creating new security group + rules")
        secgroup = self.nova.security_groups.create(self.SECGROUP_NAME,
                                                    'test_boot_with_ephemeral')
        self.nova.security_group_rules.create(secgroup.id, 'tcp', 22, 22,
                                              '0.0.0.0/0')

        # boot instance
        logger.info("Booting new instance: %s", self.INSTANCE_NAME)
        small_flavor = self.nova.flavors.find(name=self.flavor)
        medium_flavor = self.nova.flavors.find(name=self.flavor_2)

        image = self.nova.images.find(name=self.image)
        server_id = self.nova.servers.create(self.INSTANCE_NAME,
                                             image=image,
                                             flavor=small_flavor,
                                             key_name=self.KEY_NAME,
                                             security_groups=[secgroup.name],
                                             availability_zone=self.availability_zone).id
        logger.info("Instance %s is building",  server_id)

        newserver = None
        try:
            newserver = poll_until(lambda: self.nova.servers.get(server_id),
                                   lambda inst: inst.status != 'BUILD',
                                   sleep_time=5)
        except PollTimeout as e:
            newserver = e.previous_result
            error_message = 'Instance is stuck in BUILD.\n' \
                            'Instance ID = ' + server_id + '\n'
            if newserver is not None:
                error_message = error_message + 'Host ID = ' + newserver.hostId + '\n'

            self.fail(error_message)
        finally:
            if newserver is not None:
                logger.info(vars(newserver))

        self.assertEquals('ACTIVE', newserver.status, 'The instance %(id)s is in %(status)s' % {'id': server_id, 'status': newserver.status})
        logger.info("Instance %s is active",  server_id)

        # sleep 10 seconds for instance to be ready (ssh server)
        time.sleep(10)

        # SSH into the instance
        logger.info("Network label for instance %s: %s", server_id, newserver.networks)
        network = newserver.networks[self.network_label][-1]
        logger.info('SSHing to %s', network)
        client = ssh.SSHClient()
        client.load_host_keys('/dev/null')
        client.set_missing_host_key_policy(ssh.AutoAddPolicy())
        try:
            poll_until(lambda: check_for_exception(client.connect,
                                                   network,
                                                   username='******',
                                                   key_filename=self
                                                   .KEY_FILE_NAME),
                       lambda result: result,
                       sleep_time=5,
                       time_out=10 * MINUTE)

            # Create new file in the instance
            logger.info("Creating new file, test_file, in root partition of the instance...")
            execute_ssh_command(client, "python -c \"import os; import datetime; f = open('/home/ubuntu/test_file','w'); f.write(str(datetime.datetime.now()) + '\\n') ; f.flush(); os.fsync(f.fileno()); f.close()\"")
            result = execute_ssh_command(client, 'ls')
            logger.info(result)
            file_content_before_resize_root = execute_ssh_command(client, "cat test_file")
            logger.info("Content of test_file: " + str(file_content_before_resize_root))
            self.assertTrue('test_file\n' in result, 'Newly create file in root partition, test_file, not found')

            logger.info("Creating new file, test_file_eph, in the ephemeral partition of the instance...")
            execute_ssh_command(client, "sudo python -c \"import os; import datetime; f = open('/mnt/test_file_eph','w'); f.write(str(datetime.datetime.now()) + '\\n') ; f.flush(); os.fsync(f.fileno()); f.close()\"")
            result = execute_ssh_command(client, 'ls /mnt')
            logger.info(result)
            file_content_before_resize_eph = execute_ssh_command(client, "cat /mnt/test_file_eph")
            logger.info("Content of test_file_eph: " + str(file_content_before_resize_eph))
            self.assertTrue('test_file_eph\n' in result, 'Newly create file in ephemeral partition, test_file_eph, not found')
        except PollTimeout:
            error_message = 'Unable to SSH to ' + network + '\n' \
                            'Instance ID = ' + newserver.id + '\n' \
                            'Host ID = ' + newserver.hostId + '\n' \
                            'Status = ' + newserver.status + '\n' \
                            'Network = ' + str(newserver.networks) + '\n'
            self.fail(error_message)
        finally:
            client.close()

        self.nova.servers.resize(newserver.id, medium_flavor)

        logger.info("Resizing instance %s",  server_id)
        resized_server = None
        try:
            resized_server = poll_until(lambda: self.nova.servers.get(server_id),
                                        lambda inst: inst.status != 'BUILD' and
                                        inst.status != 'RESIZE',
                                        sleep_time=10)
            self.assertEquals('VERIFY_RESIZE', resized_server.status, 'The instance %(id)s is in %(status)s' % {'id': resized_server.id, 'status': resized_server.status})
        except PollTimeout as e:
            resized_server = e.previous_result
            error_message = 'Instance is stuck in RESIZE.\n' \
                            'Instance ID = ' + server_id + '\n'
            if resized_server is not None:
                error_message = error_message + 'Host ID = ' + resized_server.hostId + '\n' \
                                                'Status = ' + resized_server.status + '\n' \
                                                'Network = ' + str(resized_server.networks) + '\n'
            self.fail(error_message)
        finally:
            if resized_server is not None:
                logger.info(vars(resized_server))

        self.nova.servers.confirm_resize(newserver.id)
        try:
            resized_server = poll_until(lambda: self.nova.servers.get(server_id),
                                        lambda inst: inst.status != 'BUILD' and
                                        inst.status != 'VERIFY_RESIZE', sleep_time=5)
            self.assertEquals('ACTIVE', resized_server.status, 'The instance %(id)s is in %(status)s' % {'id': resized_server.id, 'status': resized_server.status})
        except PollTimeout as e:

            resized_server = e.previous_result
            error_message = 'Instance is never became ACTIVE after issuing a confirm_resize.\n' \
                            'Instance ID = ' + server_id + '\n'
            if resized_server is not None:
                error_message = error_message + 'Host ID = ' + resized_server.hostId + '\n' \
                                                'Status = ' + resized_server.status + '\n' \
                                                'Network = ' + str(resized_server.networks) + '\n'
            self.fail(error_message)

        self.assertEquals(medium_flavor.id, resized_server.flavor['id'], 'Flavor on resized instance do not match specified flavor')

        logger.info("Network label for instance %s: %s", server_id, newserver.networks)
        network = newserver.networks[self.network_label][-1]
        # sleep 10 seconds while ssh server is starting
        time.sleep(10)

        logger.info('SSHing to %s', network)
        client = ssh.SSHClient()
        client.load_host_keys('/dev/null')
        client.set_missing_host_key_policy(ssh.AutoAddPolicy())
        try:
            poll_until(lambda: check_for_exception(client.connect,
                                                   network,
                                                   username='******',
                                                   key_filename=self
                                                   .KEY_FILE_NAME),
                       lambda result: result,
                       sleep_time=5,
                       time_out=10 * MINUTE)

            # Testing if created file exists
            logger.info("Verifying test_file exist in root partition of the resized instance...")
            result = execute_ssh_command(client, 'ls')
            logger.info(result)
            file_content_after_resize_root = execute_ssh_command(client, "cat test_file")
            logger.info("Content of test_file: " + str(file_content_after_resize_root))
            self.assertTrue('test_file\n' in result, 'Test file that was created in the root partition before resize is not found after resize')
            self.assertEquals(file_content_before_resize_root[0], file_content_after_resize_root[0], 'Content in files for data stored in ephemeral partition do not match')
            logger.info("Verifying test_file exist in ephemeral partition of the resized instance...")
            result = execute_ssh_command(client, 'sudo ls /mnt')
            logger.info(result)
            file_content_after_resize_eph = execute_ssh_command(client, "cat /mnt/test_file_eph")
            logger.info("Content of test_file_eph: " + str(file_content_after_resize_eph))
            self.assertTrue('test_file_eph\n' in result, 'Test file that was created in the ephemeral partition before resize is not found after resize')
            self.assertEquals(file_content_before_resize_eph[0], file_content_after_resize_eph[0], 'Content in files for data stored in ephemeral partition do not match')

            # Test outbound connectivity
            logger.info("Pinging google.com...")
            exit_status = 0
            for x in range(0, 5):
                _, stdout, stderr = client.exec_command('ping google.com -c 1')

                while not stdout.channel.exit_status_ready():
                    if stdout.channel.recv_ready():
                        rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
                        if len(rl) > 0:
                            # Print data from stdout
                            logger.info(stdout.channel.recv(1024))
                    if stderr.channel.recv_stderr_ready():
                        rl, wl, xl = select.select([stderr.channel], [], [], 0.0)
                        if len(rl) > 0:
                            # Print data from stderr
                            logger.error(stderr.channel.recv_stderr(1024))
                exit_status = stdout.channel.recv_exit_status()
                if exit_status == 0:
                    break
                else:
                    # sleep for 5 secs to allow network to be ready
                    time.sleep(5)
            self.assertEquals(0, exit_status, 'Ping to google.com failed!')
        except PollTimeout:
            error_message = 'Unable to SSH to ' + network + '\n' \
                            'Instance ID = ' + resized_server.id + '\n' \
                            'Host ID = ' + resized_server.hostId + '\n' \
                            'Status = ' + resized_server.status + '\n' \
                            'Network = ' + str(resized_server.networks) + '\n'
            self.fail(error_message)
        finally:
            client.close()