Example #1
0
    def test_ensure_filtering_rules_for_instance_timeout(self):
        """ensure_filtering_fules_for_instance() finishes with timeout."""
        # Skip if non-libvirt environment
        if not self.lazy_load_library_exists():
            return

        # Preparing mocks
        def fake_none(self):
            return

        def fake_raise(self):
            raise libvirt.libvirtError('ERR')

        self.create_fake_libvirt_mock(nwfilterLookupByName=fake_raise)
        instance_ref = db.instance_create(self.context, self.test_instance)

        # Start test
        self.mox.ReplayAll()
        try:
            conn = libvirt_conn.LibvirtConnection(False)
            conn.firewall_driver.setattr('setup_basic_filtering', fake_none)
            conn.firewall_driver.setattr('prepare_instance_filter', fake_none)
            conn.ensure_filtering_rules_for_instance(instance_ref)
        except exception.Error, e:
            c1 = (0 <= e.message.find('Timeout migrating for'))
Example #2
0
 def test_get_nic_for_xml_v6(self):
     conn = libvirt_conn.LibvirtConnection(True)
     network, mapping = _create_network_info()[0]
     self.flags(use_ipv6=True)
     params = conn._get_nic_for_xml(network, mapping)['extra_params']
     self.assertTrue(params.find('PROJNETV6') > -1)
     self.assertTrue(params.find('PROJMASKV6') > -1)
Example #3
0
    def test_update_resource_info_no_compute_record_found(self):
        """Raise exception if no recorde found on services table."""
        org_path = FLAGS.instances_path = ''
        FLAGS.instances_path = '.'
        self.create_fake_libvirt_mock()

        self.mox.ReplayAll()
        conn = libvirt_conn.LibvirtConnection(False)
        self.assertRaises(exception.Invalid, conn.update_available_resource,
                          self.context, 'dummy')

        FLAGS.instances_path = org_path
Example #4
0
    def test_update_available_resource_works_correctly(self):
        """Confirm compute_node table is updated successfully."""
        org_path = FLAGS.instances_path = ''
        FLAGS.instances_path = '.'

        # Prepare mocks
        def getVersion():
            return 12003

        def getType():
            return 'qemu'

        def listDomainsID():
            return []

        service_ref = self.create_service(host='dummy')
        self.create_fake_libvirt_mock(getVersion=getVersion,
                                      getType=getType,
                                      listDomainsID=listDomainsID)
        self.mox.StubOutWithMock(libvirt_conn.LibvirtConnection,
                                 'get_cpu_info')
        libvirt_conn.LibvirtConnection.get_cpu_info().AndReturn('cpuinfo')

        # Start test
        self.mox.ReplayAll()
        conn = libvirt_conn.LibvirtConnection(False)
        conn.update_available_resource(self.context, 'dummy')
        service_ref = db.service_get(self.context, service_ref['id'])
        compute_node = service_ref['compute_node'][0]

        if sys.platform.upper() == 'LINUX2':
            self.assertTrue(compute_node['vcpus'] >= 0)
            self.assertTrue(compute_node['memory_mb'] > 0)
            self.assertTrue(compute_node['local_gb'] > 0)
            self.assertTrue(compute_node['vcpus_used'] == 0)
            self.assertTrue(compute_node['memory_mb_used'] > 0)
            self.assertTrue(compute_node['local_gb_used'] > 0)
            self.assertTrue(len(compute_node['hypervisor_type']) > 0)
            self.assertTrue(compute_node['hypervisor_version'] > 0)
        else:
            self.assertTrue(compute_node['vcpus'] >= 0)
            self.assertTrue(compute_node['memory_mb'] == 0)
            self.assertTrue(compute_node['local_gb'] > 0)
            self.assertTrue(compute_node['vcpus_used'] == 0)
            self.assertTrue(compute_node['memory_mb_used'] == 0)
            self.assertTrue(compute_node['local_gb_used'] > 0)
            self.assertTrue(len(compute_node['hypervisor_type']) > 0)
            self.assertTrue(compute_node['hypervisor_version'] > 0)

        db.service_destroy(self.context, service_ref['id'])
        FLAGS.instances_path = org_path
Example #5
0
    def test_live_migration_raises_exception(self):
        """Confirms recover method is called when exceptions are raised."""
        # Skip if non-libvirt environment
        if not self.lazy_load_library_exists():
            return

        # Preparing data
        self.compute = utils.import_object(FLAGS.compute_manager)
        instance_dict = {
            'host': 'fake',
            'state': power_state.RUNNING,
            'state_description': 'running'
        }
        instance_ref = db.instance_create(self.context, self.test_instance)
        instance_ref = db.instance_update(self.context, instance_ref['id'],
                                          instance_dict)
        vol_dict = {'status': 'migrating', 'size': 1}
        volume_ref = db.volume_create(self.context, vol_dict)
        db.volume_attached(self.context, volume_ref['id'], instance_ref['id'],
                           '/dev/fake')

        # Preparing mocks
        vdmock = self.mox.CreateMock(libvirt.virDomain)
        self.mox.StubOutWithMock(vdmock, "migrateToURI")
        vdmock.migrateToURI(FLAGS.live_migration_uri % 'dest',
                            mox.IgnoreArg(),
                            None, FLAGS.live_migration_bandwidth).\
                            AndRaise(libvirt.libvirtError('ERR'))

        def fake_lookup(instance_name):
            if instance_name == instance_ref.name:
                return vdmock

        self.create_fake_libvirt_mock(lookupByName=fake_lookup)

        # Start test
        self.mox.ReplayAll()
        conn = libvirt_conn.LibvirtConnection(False)
        self.assertRaises(libvirt.libvirtError, conn._live_migration,
                          self.context, instance_ref, 'dest', '',
                          self.compute.recover_live_migration)

        instance_ref = db.instance_get(self.context, instance_ref['id'])
        self.assertTrue(instance_ref['state_description'] == 'running')
        self.assertTrue(instance_ref['state'] == power_state.RUNNING)
        volume_ref = db.volume_get(self.context, volume_ref['id'])
        self.assertTrue(volume_ref['status'] == 'in-use')

        db.volume_destroy(self.context, volume_ref['id'])
        db.instance_destroy(self.context, instance_ref['id'])
Example #6
0
    def test_preparing_xml_info(self):
        conn = libvirt_conn.LibvirtConnection(True)
        instance_ref = db.instance_create(self.context, self.test_instance)

        result = conn._prepare_xml_info(instance_ref, False)
        self.assertFalse(result['nics'])

        result = conn._prepare_xml_info(instance_ref, False,
                                        _create_network_info())
        self.assertTrue(len(result['nics']) == 1)

        result = conn._prepare_xml_info(instance_ref, False,
                                        _create_network_info(2))
        self.assertTrue(len(result['nics']) == 2)
Example #7
0
 def test_multi_nic(self):
     instance_data = dict(self.test_instance)
     network_info = _create_network_info(2)
     conn = libvirt_conn.LibvirtConnection(True)
     instance_ref = db.instance_create(self.context, instance_data)
     xml = conn.to_xml(instance_ref, False, network_info)
     tree = xml_to_tree(xml)
     interfaces = tree.findall("./devices/interface")
     self.assertEquals(len(interfaces), 2)
     parameters = interfaces[0].findall('./filterref/parameter')
     self.assertEquals(interfaces[0].get('type'), 'bridge')
     self.assertEquals(parameters[0].get('name'), 'IP')
     self.assertEquals(parameters[0].get('value'), '0.0.0.0/0')
     self.assertEquals(parameters[1].get('name'), 'DHCPSERVER')
     self.assertEquals(parameters[1].get('value'), 'fake')
Example #8
0
    def test_spawn_with_network_info(self):
        # Skip if non-libvirt environment
        if not self.lazy_load_library_exists():
            return

        # Preparing mocks
        def fake_none(self, instance):
            return

        self.create_fake_libvirt_mock()
        instance = db.instance_create(self.context, self.test_instance)

        # Start test
        self.mox.ReplayAll()
        conn = libvirt_conn.LibvirtConnection(False)
        conn.firewall_driver.setattr('setup_basic_filtering', fake_none)
        conn.firewall_driver.setattr('prepare_instance_filter', fake_none)

        network = db.project_get_network(context.get_admin_context(),
                                         self.project.id)
        ip_dict = {
            'ip': self.test_ip,
            'netmask': network['netmask'],
            'enabled': '1'
        }
        mapping = {
            'label': network['label'],
            'gateway': network['gateway'],
            'mac': instance['mac_address'],
            'dns': [network['dns']],
            'ips': [ip_dict]
        }
        network_info = [(network, mapping)]

        try:
            conn.spawn(instance, network_info)
        except Exception, e:
            count = (0 <= e.message.find('Unexpected method call'))
Example #9
0
    def _check_xml_and_container(self, instance):
        user_context = context.RequestContext(project=self.project,
                                              user=self.user)
        instance_ref = db.instance_create(user_context, instance)
        host = self.network.get_network_host(user_context.elevated())
        network_ref = db.project_get_network(context.get_admin_context(),
                                             self.project.id)

        fixed_ip = {'address': self.test_ip, 'network_id': network_ref['id']}

        ctxt = context.get_admin_context()
        fixed_ip_ref = db.fixed_ip_create(ctxt, fixed_ip)
        db.fixed_ip_update(ctxt, self.test_ip, {
            'allocated': True,
            'instance_id': instance_ref['id']
        })

        self.flags(libvirt_type='lxc')
        conn = libvirt_conn.LibvirtConnection(True)

        uri = conn.get_uri()
        self.assertEquals(uri, 'lxc:///')

        xml = conn.to_xml(instance_ref)
        tree = xml_to_tree(xml)

        check = [(lambda t: t.find('.').get('type'), 'lxc'),
                 (lambda t: t.find('./os/type').text, 'exe'),
                 (lambda t: t.find('./devices/filesystem/target').get('dir'),
                  '/')]

        for i, (check, expected_result) in enumerate(check):
            self.assertEqual(check(tree), expected_result,
                             '%s failed common check %d' % (xml, i))

        target = tree.find('./devices/filesystem/source').get('dir')
        self.assertTrue(len(target) > 0)
Example #10
0
    def _check_xml_and_uri(self,
                           instance,
                           expect_ramdisk,
                           expect_kernel,
                           rescue=False):
        user_context = context.RequestContext(project=self.project,
                                              user=self.user)
        instance_ref = db.instance_create(user_context, instance)
        host = self.network.get_network_host(user_context.elevated())
        network_ref = db.project_get_network(context.get_admin_context(),
                                             self.project.id)

        fixed_ip = {'address': self.test_ip, 'network_id': network_ref['id']}

        ctxt = context.get_admin_context()
        fixed_ip_ref = db.fixed_ip_create(ctxt, fixed_ip)
        db.fixed_ip_update(ctxt, self.test_ip, {
            'allocated': True,
            'instance_id': instance_ref['id']
        })

        type_uri_map = {
            'qemu': ('qemu:///system',
                     [(lambda t: t.find('.').get('type'), 'qemu'),
                      (lambda t: t.find('./os/type').text, 'hvm'),
                      (lambda t: t.find('./devices/emulator'), None)]),
            'kvm': ('qemu:///system',
                    [(lambda t: t.find('.').get('type'), 'kvm'),
                     (lambda t: t.find('./os/type').text, 'hvm'),
                     (lambda t: t.find('./devices/emulator'), None)]),
            'uml':
            ('uml:///system', [(lambda t: t.find('.').get('type'), 'uml'),
                               (lambda t: t.find('./os/type').text, 'uml')]),
            'xen':
            ('xen:///', [(lambda t: t.find('.').get('type'), 'xen'),
                         (lambda t: t.find('./os/type').text, 'linux')]),
        }

        for hypervisor_type in ['qemu', 'kvm', 'xen']:
            check_list = type_uri_map[hypervisor_type][1]

            if rescue:
                check = (lambda t: t.find('./os/kernel').text.split('/')[1],
                         'kernel.rescue')
                check_list.append(check)
                check = (lambda t: t.find('./os/initrd').text.split('/')[1],
                         'ramdisk.rescue')
                check_list.append(check)
            else:
                if expect_kernel:
                    check = (
                        lambda t: t.find('./os/kernel').text.split('/')[1],
                        'kernel')
                else:
                    check = (lambda t: t.find('./os/kernel'), None)
                check_list.append(check)

                if expect_ramdisk:
                    check = (
                        lambda t: t.find('./os/initrd').text.split('/')[1],
                        'ramdisk')
                else:
                    check = (lambda t: t.find('./os/initrd'), None)
                check_list.append(check)

        common_checks = [
            (lambda t: t.find('.').tag, 'domain'),
            (lambda t: t.find('./devices/interface/filterref/parameter').get(
                'name'), 'IP'),
            (lambda t: t.find('./devices/interface/filterref/parameter').get(
                'value'), '10.11.12.13'),
            (lambda t: t.findall('./devices/interface/filterref/parameter')[1].
             get('name'), 'DHCPSERVER'),
            (lambda t: t.findall('./devices/interface/filterref/parameter')[1].
             get('value'), '10.0.0.1'),
            (lambda t: t.find('./devices/serial/source').get('path').split(
                '/')[1], 'console.log'),
            (lambda t: t.find('./memory').text, '2097152')
        ]
        if rescue:
            common_checks += [(lambda t: t.findall('./devices/disk/source')[0].
                               get('file').split('/')[1], 'disk.rescue'),
                              (lambda t: t.findall('./devices/disk/source')[1].
                               get('file').split('/')[1], 'disk')]
        else:
            common_checks += [(lambda t: t.findall('./devices/disk/source')[0].
                               get('file').split('/')[1], 'disk')]
            common_checks += [(lambda t: t.findall('./devices/disk/source')[1].
                               get('file').split('/')[1], 'disk.local')]

        for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems():
            FLAGS.libvirt_type = libvirt_type
            conn = libvirt_conn.LibvirtConnection(True)

            uri = conn.get_uri()
            self.assertEquals(uri, expected_uri)

            xml = conn.to_xml(instance_ref, rescue)
            tree = xml_to_tree(xml)
            for i, (check, expected_result) in enumerate(checks):
                self.assertEqual(check(tree), expected_result,
                                 '%s failed check %d' % (xml, i))

            for i, (check, expected_result) in enumerate(common_checks):
                self.assertEqual(check(tree), expected_result,
                                 '%s failed common check %d' % (xml, i))

        # This test is supposed to make sure we don't
        # override a specifically set uri
        #
        # Deliberately not just assigning this string to FLAGS.libvirt_uri and
        # checking against that later on. This way we make sure the
        # implementation doesn't fiddle around with the FLAGS.
        testuri = 'something completely different'
        FLAGS.libvirt_uri = testuri
        for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems():
            FLAGS.libvirt_type = libvirt_type
            conn = libvirt_conn.LibvirtConnection(True)
            uri = conn.get_uri()
            self.assertEquals(uri, testuri)
        db.instance_destroy(user_context, instance_ref['id'])
Example #11
0
 def test_get_host_ip_addr(self):
     conn = libvirt_conn.LibvirtConnection(False)
     ip = conn.get_host_ip_addr()
     self.assertEquals(ip, FLAGS.my_ip)