示例#1
0
    def tearDown(self):
        """Forcibly remove current test's VM from all HVs"""

        for hv in HYPERVISORS:
            hv.get_storage_pool().refresh()
            for domain in hv.conn().listAllDomains():
                if domain.name() == self.uid_name:
                    if domain.state()[0] == VIR_DOMAIN_RUNNING:
                        domain.destroy()
                    domain.undefine()
            for vol_name in hv.get_storage_pool().listVolumes():
                if vol_name == self.uid_name:
                    hv.run('mount | grep -q "/dev/{vg}/{vm}" && '
                           ' umount /dev/{vg}/{vm} || true;'.format(
                               vg=VG_NAME, vm=self.uid_name))
                    hv.get_storage_pool().storageVolLookupByName(
                        vol_name, ).delete()
        #Clean up certs after tearing down vm
        obj = Query({
            'hostname': VM_HOSTNAME
        }, [
            'hostname',
            'puppet_ca',
        ]).get()
        clean_cert(obj)
示例#2
0
文件: vm.py 项目: innogames/igvm
    def run_puppet(self, clear_cert=False, debug=False):
        """Runs Puppet in chroot on the hypervisor."""

        if clear_cert:
            clean_cert(self.dataset_obj)

        if self.dataset_obj['datacenter_type'] == 'kvm.dct':
            self.block_autostart()

            puppet_command = (
                '( /opt/puppetlabs/puppet/bin/puppet agent '
                '--detailed-exitcodes '
                '--fqdn={} --server={} --ca_server={} '
                '--no-report --waitforcert=60 --onetime --no-daemonize '
                '--skip_tags=chroot_unsafe --verbose{} ) ;'
                '[ $? -eq 2 ]'.format(
                    self.fqdn,
                    self.dataset_obj['puppet_master'],
                    self.dataset_obj['puppet_ca'],
                    ' --debug' if debug else '',
                ))

            try:
                self.run(puppet_command)
            except RemoteCommandError as e:
                raise VMError('Initial puppetrun failed') from e

            self.unblock_autostart()
示例#3
0
    def setUp(self):
        super(RenameTest, self).setUp()

        # IGVMTest class will make sure puppet certificates for previous
        # hosts have been removed so we only need to take care of left overs
        # of renamed hosts.
        vm = self.vm.dataset_obj
        vm['hostname'] = RenameTest._get_renamed_hostname(vm['hostname'])
        clean_cert(vm)
示例#4
0
    def tearDown(self):
        clean_cert(self.vm_obj)
        clean_all(self.route_network, self.datacenter_type, VM_HOSTNAME)

        # Same as in setUp we need to take care of the renamed hosts.
        vm = self.vm.dataset_obj

        # Depending on where it aborts it might still be renamed
        if 'vm-rename' not in vm['hostname']:
            vm['hostname'] = RenameTest._get_renamed_hostname(vm['hostname'])

        clean_cert(vm)
        clean_all(self.route_network, self.datacenter_type, vm['hostname'])
示例#5
0
def vm_delete(vm_hostname, retire=False):
    """Delete the VM from the hypervisor and from serveradmin

    If retire is True the VM will not be deleted from serveradmin but it's
    state will be updated to 'retired'.
    """

    with _get_vm(vm_hostname, unlock=retire, allow_retired=True) as vm:
        if vm.dataset_obj['datacenter_type'] == 'aws.dct':
            vm_status_code = vm.aws_describe_instance_status(
                vm.dataset_obj['aws_instance_id'])
            if vm_status_code != AWS_RETURN_CODES['stopped']:
                raise InvalidStateError('"{}" is still running.'.format(
                    vm.fqdn))
            else:
                vm.aws_delete()
        elif vm.dataset_obj['datacenter_type'] == 'kvm.dct':
            # Make sure the VM has a hypervisor and that it is defined on it.
            # Abort if the VM has not been defined.
            _check_defined(vm)

            # Make sure the VM is shut down, abort if it is not.
            if vm.hypervisor and vm.hypervisor.vm_defined(
                    vm) and vm.is_running():
                raise InvalidStateError('"{}" is still running.'.format(
                    vm.fqdn))

            # Delete the VM from its hypervisor if required.
            if vm.hypervisor and vm.hypervisor.vm_defined(vm):
                vm.hypervisor.undefine_vm(vm)
        else:
            raise NotImplementedError(
                'This operation is not yet supported for {}'.format(
                    vm.dataset_obj['datacenter_type']))

        # Delete the machines cert from puppet in case we want to build one with the same name in the future
        clean_cert(vm.dataset_obj)

        # Delete the serveradmin object of this VM
        # or update its state to 'retired' if retire is True.
        if retire:
            vm.dataset_obj['state'] = 'retired'
            vm.dataset_obj.commit()
            log.info('"{}" is destroyed and set to "retired" state.'.format(
                vm.fqdn))
        else:
            vm.dataset_obj.delete()
            vm.dataset_obj.commit()
            log.info('"{}" is destroyed and deleted from Serveradmin'.format(
                vm.fqdn))
示例#6
0
    def setUp(self):
        """Initialize VM object before every test

        Get object from Serveradmin and initialize it to safe defaults.
        Don't assign VM to any of HVs yet!
        """
        # igvm operates always on hostname of VM and queries it from
        # Serveradmin whenever it needs. Because of that we must never store
        # any igvm objects and query things anew each time.
        obj = Query({
            'hostname': VM_HOSTNAME
        }, [
            'hostname',
            'state',
            'backup_disabled',
            'disk_size_gib',
            'memory',
            'num_cpu',
            'os',
            'environment',
            'no_monitoring',
            'hypervisor',
            'repositories',
            'puppet_environment',
            'puppet_ca',
        ]).get()

        # Fill in defaults in Serveradmin
        obj['state'] = 'online'
        obj['disk_size_gib'] = 3
        obj['memory'] = 2048
        obj['num_cpu'] = 2
        obj['os'] = 'stretch'
        obj['environment'] = 'testing'
        obj['no_monitoring'] = True
        obj['hypervisor'] = None
        obj['repositories'] = [
            'int:basestretch:stable',
            'int:innogames:stable',
        ]
        obj['puppet_environment'] = None
        obj['backup_disabled'] = True
        obj.commit()
        clean_cert(obj)
        self.uid_name = '{}_{}'.format(obj['object_id'], obj['hostname'])
示例#7
0
def vm_delete(vm_hostname, retire=False):
    """Delete the VM from the hypervisor and from serveradmin

    If retire is True the VM will not be deleted from serveradmin but it's
    state will be updated to 'retired'.
    """

    with _get_vm(vm_hostname, unlock=retire, allow_retired=True) as vm:
        # Make sure the VM has a hypervisor and that it is defined on it.
        # Abort if the VM has not been defined.
        _check_defined(vm)

        # Make sure the VM is shut down, abort if it is not.
        if vm.hypervisor and vm.hypervisor.vm_defined(
                vm) and vm.is_running():
            raise InvalidStateError('"{}" is still running.'.format(
                vm.fqdn)
            )

        # Delete the VM from its hypervisor if required.
        if vm.hypervisor and vm.hypervisor.vm_defined(vm):
            vm.hypervisor.undefine_vm(vm)

        # Delete the machines cert from puppet in case we want to build one
        # with the same name in the future
        clean_cert(vm.dataset_obj)

        # Delete the serveradmin object of this VM
        # or update its state to 'retired' if retire is True.
        if retire:
            vm.dataset_obj['state'] = 'retired'
            vm.dataset_obj.commit()
            log.info(
                '"{}" is destroyed and set to "retired" state.'.format(
                    vm.fqdn)
            )
        else:
            vm.dataset_obj.delete()
            vm.dataset_obj.commit()
            log.info(
                '"{}" is destroyed and deleted from Serveradmin'.format(
                    vm.fqdn)
            )
示例#8
0
    def setUp(self):
        """Initialize VM object before every test

        Get object from Serveradmin and initialize it to safe defaults.
        Don't assign VM to any of HVs yet!
        """
        super().setUp()

        # Check that enough HVs are available.
        self.route_network = Query(
            {
                'hostname': VM_NET
            },
            ['route_network'],
        ).get()['route_network']

        self.datacenter_type = Query(
            {
                'hostname': self.route_network
            },
            ['datacenter_type'],
        ).get()['datacenter_type']

        self.hvs = [
            Hypervisor(o) for o in Query(
                {
                    'environment': 'testing',
                    'servertype': 'hypervisor',
                    'state': 'online',
                    'vlan_networks': self.route_network,
                }, HYPERVISOR_ATTRIBUTES)
        ]

        if self.datacenter_type == 'kvm.dct':
            assert len(self.hvs) >= 2, 'Not enough testing hypervisors found'

        # Cleanup all leftovers from previous tests or failures.
        clean_all(self.route_network, self.datacenter_type, VM_HOSTNAME)

        # Create subject VM object
        self.vm_obj = Query().new_object('vm')
        self.vm_obj['backup_disabled'] = True
        self.vm_obj['disk_size_gib'] = 3
        self.vm_obj['environment'] = 'testing'
        self.vm_obj['hostname'] = VM_HOSTNAME
        self.vm_obj['hypervisor'] = None
        self.vm_obj['intern_ip'] = get_next_address(VM_NET, 1)
        self.vm_obj['memory'] = 2048
        self.vm_obj['no_monitoring'] = True
        self.vm_obj['num_cpu'] = 2
        self.vm_obj['os'] = 'buster'
        self.vm_obj['project'] = 'test'
        self.vm_obj['puppet_environment'] = None
        self.vm_obj['puppet_ca'] = 'testing-puppetca.innogames.de'
        self.vm_obj['puppet_master'] = 'puppet-lb.test.innogames.net'
        self.vm_obj['repositories'] = [
            'int:basebuster:stable',
            'int:innogames:stable',
        ]
        self.vm_obj['state'] = 'online'

        if self.datacenter_type == 'aws.dct':
            self.vm_obj['aws_image_id'] = 'ami-0e2b90ca04cae8da5'  # buster
            self.vm_obj['aws_instance_type'] = 't2.micro'
            self.vm_obj['aws_key_name'] = 'eu-central-1-key'
            self.vm_obj['disk_size_gib'] = 8

        self.vm_obj.commit()

        # It would be enough to create SGs in AWS once but with parallel runs
        # we can't really test if sync has already been performed.
        if self.datacenter_type == 'aws.dct':
            fw_api = api.get('firewall')
            fw_api.update_config([self.route_network])

        self.uid_name = '{}_{}'.format(
            self.vm_obj['object_id'],
            self.vm_obj['hostname'],
        )

        # Make sure we can make a fresh build
        clean_cert(self.vm_obj)
示例#9
0
    def tearDown(self):
        """Forcibly remove current test's VM from all HVs"""
        super().tearDown()

        clean_cert(self.vm_obj)
        clean_all(self.route_network, self.datacenter_type, VM_HOSTNAME)