Exemple #1
0
    def test_minimal_construct(self):
        disk_bus = get_template_default('old', 'disk_bus')
        memory = get_template_default('old', 'memory')
        nic_model = get_template_default('old', 'nic_model')
        fields = (
            ('name', 'test'),
            ('cdrom', self.iso),
            ('os_distro', 'unknown'),
            ('os_version', 'unknown'),
            ('cpu_info', {
                'vcpus': 1,
                'maxvcpus': 1
            }),
            ('memory', memory),
            ('networks', ['default']),
            ('disk_bus', disk_bus),
            ('nic_model', nic_model),
            ('graphics', {
                'type': 'vnc',
                'listen': '127.0.0.1'
            }),
        )

        args = {'name': 'test', 'cdrom': self.iso}
        t = VMTemplate(args)
        for name, val in fields:
            if os.uname()[4] == 's390x' and name == 'networks':
                continue
            self.assertEqual(val, t.info.get(name))
Exemple #2
0
 def test_modern_bases(self):
     for distro, version in modern_version_bases[_get_arch()].iteritems():
         entry = lookup(distro, version)
         self.assertEquals(entry['disk_bus'],
                           get_template_default('modern', 'disk_bus'))
         self.assertEquals(entry['nic_model'],
                           get_template_default('modern', 'nic_model'))
Exemple #3
0
    def test_netboot_vmtemplate(self):
        disk_bus = get_template_default('old', 'disk_bus')
        memory = get_template_default('old', 'memory')
        nic_model = get_template_default('old', 'nic_model')
        fields = (
            ('name', 'test'),
            ('os_distro', 'unknown'),
            ('os_version', 'unknown'),
            ('cpu_info', {
                'vcpus': 1,
                'maxvcpus': 1
            }),
            ('memory', memory),
            ('networks', ['default']),
            ('disk_bus', disk_bus),
            ('nic_model', nic_model),
            ('graphics', {
                'type': 'vnc',
                'listen': '127.0.0.1'
            }),
        )

        t = VMTemplate({'name': 'test'}, netboot=True)
        for name, val in fields:
            if os.uname()[4] == 's390x' and name == 'networks':
                continue
            self.assertEqual(val, t.info.get(name))

        self.assertNotIn('cdrom', t.info.keys())
Exemple #4
0
 def test_modern_bases(self):
     for distro, version in modern_version_bases[_get_arch()].iteritems():
         entry = lookup(distro, version)
         self.assertEquals(entry['disk_bus'],
                           get_template_default('modern', 'disk_bus'))
         self.assertEquals(entry['nic_model'],
                           get_template_default('modern', 'nic_model'))
Exemple #5
0
 def test_modern_bases(self):
     if not os.uname()[4] == 's390x':
         for distro, version in modern_version_bases[_get_arch()].items():
             entry = lookup(distro, version)
             self.assertEqual(entry['disk_bus'],
                              get_template_default('modern', 'disk_bus'))
             self.assertEqual(entry['nic_model'],
                              get_template_default('modern', 'nic_model'))
Exemple #6
0
 def test_lookup_unknown_distro_version_returns_old_distro(self):
     distro = 'unknown_distro'
     version = 'unknown_version'
     entry = lookup(distro, version)
     self.assertEquals(entry['disk_bus'],
                       get_template_default('old', 'disk_bus'))
     self.assertEquals(entry['nic_model'],
                       get_template_default('old', 'nic_model'))
Exemple #7
0
 def test_lookup_unknown_distro_version_returns_old_distro(self):
     distro = 'unknown_distro'
     version = 'unknown_version'
     entry = lookup(distro, version)
     self.assertEqual(entry['disk_bus'],
                      get_template_default('old', 'disk_bus'))
     self.assertEqual(entry['nic_model'],
                      get_template_default('old', 'nic_model'))
Exemple #8
0
 def test_old_distros(self):
     old_versions = {'debian': '5.0', 'ubuntu': '7.04', 'opensuse': '10.1',
                     'centos': '5.1', 'rhel': '5.1', 'fedora': '15'}
     for distro, version in old_versions.iteritems():
         entry = lookup(distro, version)
         self.assertEquals(entry['disk_bus'],
                           get_template_default('old', 'disk_bus'))
         self.assertEquals(entry['nic_model'],
                           get_template_default('old', 'nic_model'))
Exemple #9
0
 def test_modern_distros(self):
     # versions based on ppc64 modern distros
     modern_versions = {'ubuntu': '14.04', 'opensuse': '13.1',
                        'rhel': '6.5', 'fedora': '19', 'sles': '11sp3'}
     for distro, version in modern_versions.iteritems():
         entry = lookup(distro, version)
         self.assertEquals(entry['disk_bus'],
                           get_template_default('modern', 'disk_bus'))
         self.assertEquals(entry['nic_model'],
                           get_template_default('modern', 'nic_model'))
Exemple #10
0
 def test_modern_bases(self):
     if not os.uname()[4] == 's390x':
         for distro, version in modern_version_bases[_get_arch()].items():
             entry = lookup(distro, version)
             self.assertEqual(
                 entry['disk_bus'], get_template_default(
                     'modern', 'disk_bus')
             )
             self.assertEqual(
                 entry['nic_model'], get_template_default(
                     'modern', 'nic_model')
             )
Exemple #11
0
    def test_minimal_construct(self):
        disk_bus = get_template_default('old', 'disk_bus')
        memory = get_template_default('old', 'memory')
        nic_model = get_template_default('old', 'nic_model')
        fields = (('name', 'test'), ('os_distro', 'unknown'),
                  ('os_version', 'unknown'), ('cpus', 1),
                  ('memory', memory), ('networks', ['default']),
                  ('disk_bus', disk_bus), ('nic_model', nic_model),
                  ('graphics', {'type': 'vnc', 'listen': '127.0.0.1'}),
                  ('cdrom', self.iso))

        args = {'name': 'test', 'cdrom': self.iso}
        t = VMTemplate(args)
        for name, val in fields:
            self.assertEquals(val, t.info.get(name))
Exemple #12
0
 def test_old_distros(self):
     old_versions = {
         'debian': '5.0',
         'ubuntu': '7.04',
         'opensuse': '10.1',
         'centos': '5.1',
         'rhel': '5.1',
         'fedora': '15'
     }
     for distro, version in old_versions.iteritems():
         entry = lookup(distro, version)
         self.assertEquals(entry['disk_bus'],
                           get_template_default('old', 'disk_bus'))
         self.assertEquals(entry['nic_model'],
                           get_template_default('old', 'nic_model'))
Exemple #13
0
 def test_modern_distros(self):
     # versions based on ppc64 modern distros
     modern_versions = {
         'ubuntu': '14.04',
         'opensuse': '13.1',
         'rhel': '6.5',
         'fedora': '19',
         'sles': '11sp3'
     }
     for distro, version in modern_versions.iteritems():
         entry = lookup(distro, version)
         self.assertEquals(entry['disk_bus'],
                           get_template_default('modern', 'disk_bus'))
         self.assertEquals(entry['nic_model'],
                           get_template_default('modern', 'nic_model'))
Exemple #14
0
    def test_netboot_vmtemplate(self):
        disk_bus = get_template_default('old', 'disk_bus')
        memory = get_template_default('old', 'memory')
        nic_model = get_template_default('old', 'nic_model')
        fields = (('name', 'test'), ('os_distro', 'unknown'),
                  ('os_version', 'unknown'),
                  ('cpu_info', {'vcpus': 1, 'maxvcpus': 1}),
                  ('memory', memory), ('networks', ['default']),
                  ('disk_bus', disk_bus), ('nic_model', nic_model),
                  ('graphics', {'type': 'vnc', 'listen': '127.0.0.1'}))

        t = VMTemplate({'name': 'test'}, netboot=True)
        for name, val in fields:
            self.assertEquals(val, t.info.get(name))

        self.assertNotIn('cdrom', t.info.keys())
Exemple #15
0
    def test_vm_info(self):
        model.templates_create({'name': u'test',
                                'cdrom': fake_iso})
        task = model.vms_create({'name': u'test-vm',
                                 'template': '/plugins/kimchi/templates/test'})
        wait_task(model.task_lookup, task['id'])
        vms = model.vms_get_list()
        self.assertEquals(2, len(vms))
        self.assertIn(u'test-vm', vms)

        keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info',
                    'screenshot', 'icon', 'graphics', 'users', 'groups',
                    'access', 'persistent'))

        stats_keys = set(('cpu_utilization', 'mem_utilization',
                          'net_throughput', 'net_throughput_peak',
                          'io_throughput', 'io_throughput_peak'))

        info = model.vm_lookup(u'test-vm')
        self.assertEquals(keys, set(info.keys()))
        self.assertEquals('shutoff', info['state'])
        self.assertEquals('test-vm', info['name'])
        self.assertEquals(get_template_default('old', 'memory'),
                          info['memory'])
        self.assertEquals(1, info['cpu_info']['vcpus'])
        self.assertEquals(1, info['cpu_info']['maxvcpus'])
        self.assertEquals('plugins/kimchi/images/icon-vm.png', info['icon'])
        self.assertEquals(stats_keys, set(info['stats'].keys()))
        self.assertEquals('vnc', info['graphics']['type'])
        self.assertEquals('127.0.0.1', info['graphics']['listen'])
Exemple #16
0
    def test_vm_info(self):
        model.templates_create({'name': u'test',
                                'source_media': {'type': 'disk',
                                                 'path': fake_iso}})
        task = model.vms_create({'name': u'test-vm',
                                 'template': '/plugins/kimchi/templates/test'})
        wait_task(model.task_lookup, task['id'])
        vms = model.vms_get_list()
        self.assertEquals(2, len(vms))
        self.assertIn(u'test-vm', vms)

        keys = set(('name', 'state', 'stats', 'uuid', 'memory', 'cpu_info',
                    'screenshot', 'icon', 'graphics', 'users', 'groups',
                    'access', 'persistent', 'bootorder', 'bootmenu', 'title',
                    'description'))

        stats_keys = set(('cpu_utilization', 'mem_utilization',
                          'net_throughput', 'net_throughput_peak',
                          'io_throughput', 'io_throughput_peak'))

        info = model.vm_lookup(u'test-vm')
        self.assertEquals(keys, set(info.keys()))
        self.assertEquals('shutoff', info['state'])
        self.assertEquals('test-vm', info['name'])
        self.assertEquals(get_template_default('old', 'memory'),
                          info['memory'])
        self.assertEquals(1, info['cpu_info']['vcpus'])
        self.assertEquals(1, info['cpu_info']['maxvcpus'])
        self.assertEquals('plugins/kimchi/images/icon-vm.png', info['icon'])
        self.assertEquals(stats_keys, set(info['stats'].keys()))
        self.assertEquals('vnc', info['graphics']['type'])
        self.assertEquals('127.0.0.1', info['graphics']['listen'])
Exemple #17
0
    def test_netboot_vmtemplate(self):
        disk_bus = get_template_default("old", "disk_bus")
        memory = get_template_default("old", "memory")
        nic_model = get_template_default("old", "nic_model")
        fields = (
            ("name", "test"),
            ("os_distro", "unknown"),
            ("os_version", "unknown"),
            ("cpu_info", {"vcpus": 1, "maxvcpus": 1}),
            ("memory", memory),
            ("networks", ["default"]),
            ("disk_bus", disk_bus),
            ("nic_model", nic_model),
            ("graphics", {"type": "vnc", "listen": "127.0.0.1"}),
        )

        t = VMTemplate({"name": "test"}, netboot=True)
        for name, val in fields:
            self.assertEquals(val, t.info.get(name))

        self.assertNotIn("cdrom", t.info.keys())
Exemple #18
0
    def test_minimal_construct(self):
        disk_bus = get_template_default("old", "disk_bus")
        memory = get_template_default("old", "memory")
        nic_model = get_template_default("old", "nic_model")
        fields = (
            ("name", "test"),
            ("cdrom", self.iso),
            ("os_distro", "unknown"),
            ("os_version", "unknown"),
            ("cpu_info", {"vcpus": 1, "maxvcpus": 1}),
            ("memory", memory),
            ("networks", ["default"]),
            ("disk_bus", disk_bus),
            ("nic_model", nic_model),
            ("graphics", {"type": "vnc", "listen": "127.0.0.1"}),
        )

        args = {"name": "test", "cdrom": self.iso}
        t = VMTemplate(args)
        for name, val in fields:
            self.assertEquals(val, t.info.get(name))
Exemple #19
0
def upgrade_objectstore_memory():
    """
        Upgrade the value of a given JSON's item of all Templates.
        Changes 'memory': XXX by 'memory': {'current': XXXX,
                                            'maxmemory': XXXX}
    """
    total = 0
    try:
        conn = sqlite3.connect(config.get_object_store(), timeout=10)
        cursor = conn.cursor()
        sql = "SELECT id,json FROM objects WHERE type='template'"
        cursor.execute(sql)
        for row in cursor.fetchall():
            template = json.loads(row[1])

            # Get memory info
            memory = template['memory']
            # New memory is a dictionary with 'current' and 'maxmemory'
            if type(memory) is not dict:
                maxmem = get_template_default(
                    'modern', 'memory').get('maxmemory')
                if maxmem < memory:
                    maxmem = memory
                template['memory'] = {'current': memory, 'maxmemory': maxmem}
            else:
                continue

            sql = 'UPDATE objects SET json=? WHERE id=?'
            cursor.execute(sql, (json.dumps(template), row[0]))
            conn.commit()
            total += 1
    except sqlite3.Error as e:
        if conn:
            conn.rollback()
        wok_log.error('Error while upgrading objectstore data: %s', e.args[0])
        raise OperationFailed('KCHUTILS0006E')
    finally:
        if conn:
            conn.close()
        if total > 0:
            wok_log.info(
                "%d 'template' memory entries upgraded in objectstore.", total)
Exemple #20
0
def upgrade_objectstore_memory():
    """
        Upgrade the value of a given JSON's item of all Templates.
        Changes 'memory': XXX by 'memory': {'current': XXXX,
                                            'maxmemory': XXXX}
    """
    total = 0
    try:
        conn = sqlite3.connect(config.get_object_store(), timeout=10)
        cursor = conn.cursor()
        sql = "SELECT id,json FROM objects WHERE type='template'"
        cursor.execute(sql)
        for row in cursor.fetchall():
            template = json.loads(row[1])

            # Get memory info
            memory = template['memory']
            # New memory is a dictionary with 'current' and 'maxmemory'
            if type(memory) is not dict:
                maxmem = get_template_default('modern',
                                              'memory').get('maxmemory')
                if maxmem < memory:
                    maxmem = memory
                template['memory'] = {'current': memory, 'maxmemory': maxmem}
            else:
                continue

            sql = 'UPDATE objects SET json=? WHERE id=?'
            cursor.execute(sql, (json.dumps(template), row[0]))
            conn.commit()
            total += 1
    except sqlite3.Error as e:
        if conn:
            conn.rollback()
        wok_log.error('Error while upgrading objectstore data: %s', e.args[0])
        raise OperationFailed('KCHUTILS0006E')
    finally:
        if conn:
            conn.close()
        if total > 0:
            wok_log.info(
                "%d 'template' memory entries upgraded in objectstore.", total)
Exemple #21
0
    def test_vm_info(self):
        model.templates_create({"name": u"test", "cdrom": fake_iso})
        task = model.vms_create({"name": u"test-vm", "template": "/plugins/kimchi/templates/test"})
        wait_task(model.task_lookup, task["id"])
        vms = model.vms_get_list()
        self.assertEquals(2, len(vms))
        self.assertIn(u"test-vm", vms)

        keys = set(
            (
                "name",
                "state",
                "stats",
                "uuid",
                "memory",
                "cpus",
                "screenshot",
                "icon",
                "graphics",
                "users",
                "groups",
                "access",
                "persistent",
            )
        )

        stats_keys = set(
            ("cpu_utilization", "net_throughput", "net_throughput_peak", "io_throughput", "io_throughput_peak")
        )

        info = model.vm_lookup(u"test-vm")
        self.assertEquals(keys, set(info.keys()))
        self.assertEquals("shutoff", info["state"])
        self.assertEquals("test-vm", info["name"])
        self.assertEquals(get_template_default("old", "memory"), info["memory"])
        self.assertEquals(1, info["cpus"])
        self.assertEquals("plugins/kimchi/images/icon-vm.png", info["icon"])
        self.assertEquals(stats_keys, set(info["stats"].keys()))
        self.assertEquals("vnc", info["graphics"]["type"])
        self.assertEquals("127.0.0.1", info["graphics"]["listen"])
Exemple #22
0
    def test_vm_disk(self):
        disk_path = os.path.join(TMP_DIR, "existent2.iso")
        open(disk_path, "w").close()
        modern_disk_bus = osinfo.get_template_default("modern", "disk_bus")

        def _attach_disk(expect_bus=modern_disk_bus):
            disk_args = {"type": "disk", "pool": pool, "vol": vol}
            disk = inst.vmstorages_create(vm_name, disk_args)
            storage_list = inst.vmstorages_get_list(vm_name)
            self.assertEquals(prev_count + 1, len(storage_list))

            # Check the bus type to be 'virtio'
            disk_info = inst.vmstorage_lookup(vm_name, disk)
            self.assertEquals(u"disk", disk_info["type"])
            self.assertEquals(vol_path, disk_info["path"])
            self.assertEquals(expect_bus, disk_info["bus"])
            return disk

        inst = model.Model(objstore_loc=self.tmp_store)
        with RollbackContext() as rollback:
            path = os.path.join(TMP_DIR, "kimchi-images")
            pool = "test-pool"
            vol = "test-volume.img"
            vol_path = "%s/%s" % (path, vol)
            if not os.path.exists(path):
                os.mkdir(path)
            rollback.prependDefer(shutil.rmtree, path)

            args = {"name": pool, "path": path, "type": "dir"}
            inst.storagepools_create(args)
            rollback.prependDefer(inst.storagepool_delete, pool)

            # Activate the pool before adding any volume
            inst.storagepool_activate(pool)
            rollback.prependDefer(inst.storagepool_deactivate, pool)

            params = {
                "name": vol,
                "capacity": 1073741824,  # 1 GiB
                "allocation": 536870912,  # 512 MiB
                "format": "qcow2",
            }
            task_id = inst.storagevolumes_create(pool, params)["id"]
            rollback.prependDefer(inst.storagevolume_delete, pool, vol)
            inst.task_wait(task_id)

            vm_name = "kimchi-cdrom"
            params = {"name": "test", "disks": [], "cdrom": UBUNTU_ISO}
            inst.templates_create(params)
            rollback.prependDefer(inst.template_delete, "test")
            params = {"name": vm_name, "template": "/plugins/kimchi/templates/test"}
            task1 = inst.vms_create(params)
            inst.task_wait(task1["id"])
            rollback.prependDefer(inst.vm_delete, vm_name)

            prev_count = len(inst.vmstorages_get_list(vm_name))
            self.assertEquals(1, prev_count)

            # Volume format with mismatched type raise error
            cdrom_args = {"type": "cdrom", "pool": pool, "vol": vol}
            self.assertRaises(InvalidParameter, inst.vmstorages_create, vm_name, cdrom_args)

            # Cold plug and unplug a disk
            disk = _attach_disk()
            inst.vmstorage_delete(vm_name, disk)

            # Hot plug a disk
            inst.vm_start(vm_name)
            disk = _attach_disk()

            # VM disk still there after powered off
            inst.vm_poweroff(vm_name)
            disk_info = inst.vmstorage_lookup(vm_name, disk)
            self.assertEquals(u"disk", disk_info["type"])
            inst.vmstorage_delete(vm_name, disk)

            # Specifying pool and path at same time will fail
            disk_args = {"type": "disk", "pool": pool, "vol": vol, "path": disk_path}
            self.assertRaises(InvalidParameter, inst.vmstorages_create, vm_name, disk_args)

            old_distro_iso = TMP_DIR + "rhel4_8.iso"
            iso_gen.construct_fake_iso(old_distro_iso, True, "4.8", "rhel")

            vm_name = "kimchi-ide-bus-vm"
            params = {"name": "old_distro_template", "disks": [], "cdrom": old_distro_iso}
            inst.templates_create(params)
            rollback.prependDefer(inst.template_delete, "old_distro_template")
            params = {"name": vm_name, "template": "/plugins/kimchi/templates/old_distro_template"}
            task2 = inst.vms_create(params)
            inst.task_wait(task2["id"])
            rollback.prependDefer(inst.vm_delete, vm_name)

            # Need to check the right disk_bus for old distro
            disk = _attach_disk(osinfo.get_template_default("old", "disk_bus"))
            inst.vmstorage_delete("kimchi-ide-bus-vm", disk)

            # Hot plug IDE bus disk does not work
            inst.vm_start(vm_name)
            self.assertRaises(InvalidOperation, _attach_disk)
            inst.vm_poweroff(vm_name)
Exemple #23
0
    def test_vm_disk(self):
        disk_path = os.path.join(TMP_DIR, 'existent2.iso')
        open(disk_path, 'w').close()
        modern_disk_bus = osinfo.get_template_default('modern', 'disk_bus')

        def _attach_disk(expect_bus=modern_disk_bus):
            disk_args = {"type": "disk",
                         "pool": pool,
                         "vol": vol}
            disk = inst.vmstorages_create(vm_name, disk_args)
            storage_list = inst.vmstorages_get_list(vm_name)
            self.assertEquals(prev_count + 1, len(storage_list))

            # Check the bus type to be 'virtio'
            disk_info = inst.vmstorage_lookup(vm_name, disk)
            self.assertEquals(u'disk', disk_info['type'])
            self.assertEquals(vol_path, disk_info['path'])
            self.assertEquals(expect_bus, disk_info['bus'])
            return disk

        inst = model.Model(objstore_loc=self.tmp_store)
        with RollbackContext() as rollback:
            path = os.path.join(TMP_DIR, 'kimchi-images')
            pool = 'test-pool'
            vol = 'test-volume.img'
            vol_path = "%s/%s" % (path, vol)
            if not os.path.exists(path):
                os.mkdir(path)
            rollback.prependDefer(shutil.rmtree, path)

            args = {'name': pool,
                    'path': path,
                    'type': 'dir'}
            inst.storagepools_create(args)
            rollback.prependDefer(inst.storagepool_delete, pool)

            # Activate the pool before adding any volume
            inst.storagepool_activate(pool)
            rollback.prependDefer(inst.storagepool_deactivate, pool)

            params = {'name': vol,
                      'capacity': 1073741824,  # 1 GiB
                      'allocation': 536870912,  # 512 MiB
                      'format': 'qcow2'}
            task_id = inst.storagevolumes_create(pool, params)['id']
            rollback.prependDefer(inst.storagevolume_delete, pool, vol)
            inst.task_wait(task_id)

            vm_name = 'kimchi-cdrom'
            params = {'name': 'test', 'disks': [], 'cdrom': UBUNTU_ISO}
            inst.templates_create(params)
            rollback.prependDefer(inst.template_delete, 'test')
            params = {'name': vm_name,
                      'template': '/plugins/kimchi/templates/test'}
            task1 = inst.vms_create(params)
            inst.task_wait(task1['id'])
            rollback.prependDefer(inst.vm_delete, vm_name)

            prev_count = len(inst.vmstorages_get_list(vm_name))
            self.assertEquals(1, prev_count)

            # Volume format with mismatched type raise error
            cdrom_args = {"type": "cdrom", "pool": pool, "vol": vol}
            self.assertRaises(InvalidParameter, inst.vmstorages_create,
                              vm_name, cdrom_args)

            # Cold plug and unplug a disk
            disk = _attach_disk()
            inst.vmstorage_delete(vm_name, disk)

            # Hot plug a disk
            inst.vm_start(vm_name)
            disk = _attach_disk()

            # VM disk still there after powered off
            inst.vm_poweroff(vm_name)
            disk_info = inst.vmstorage_lookup(vm_name, disk)
            self.assertEquals(u'disk', disk_info['type'])
            inst.vmstorage_delete(vm_name, disk)

            # Specifying pool and path at same time will fail
            disk_args = {"type": "disk",
                         "pool": pool,
                         "vol": vol,
                         "path": disk_path}
            self.assertRaises(
                InvalidParameter, inst.vmstorages_create, vm_name, disk_args)

            old_distro_iso = TMP_DIR + 'rhel4_8.iso'
            iso_gen.construct_fake_iso(old_distro_iso, True, '4.8', 'rhel')

            vm_name = 'kimchi-ide-bus-vm'
            params = {'name': 'old_distro_template', 'disks': [],
                      'cdrom': old_distro_iso}
            inst.templates_create(params)
            rollback.prependDefer(inst.template_delete, 'old_distro_template')
            params = {
                'name': vm_name,
                'template': '/plugins/kimchi/templates/old_distro_template'
            }
            task2 = inst.vms_create(params)
            inst.task_wait(task2['id'])
            rollback.prependDefer(inst.vm_delete, vm_name)

            # Need to check the right disk_bus for old distro
            disk = _attach_disk(osinfo.get_template_default('old', 'disk_bus'))
            inst.vmstorage_delete('kimchi-ide-bus-vm', disk)

            # Hot plug IDE bus disk does not work
            inst.vm_start(vm_name)
            self.assertRaises(InvalidOperation, _attach_disk)
            inst.vm_poweroff(vm_name)
Exemple #24
0
    def test_vm_disk(self):
        disk_path = os.path.join(TMP_DIR, 'existent2.iso')
        open(disk_path, 'w').close()
        modern_disk_bus = osinfo.get_template_default('modern', 'disk_bus')

        def _attach_disk(expect_bus=modern_disk_bus):
            disk_args = {"type": "disk",
                         "pool": pool,
                         "vol": vol}
            disk = inst.vmstorages_create(vm_name, disk_args)
            storage_list = inst.vmstorages_get_list(vm_name)
            self.assertEquals(prev_count + 1, len(storage_list))

            # Check the bus type to be 'virtio'
            disk_info = inst.vmstorage_lookup(vm_name, disk)
            self.assertEquals(u'disk', disk_info['type'])
            self.assertEquals(vol_path, disk_info['path'])
            self.assertEquals(expect_bus, disk_info['bus'])
            return disk

        inst = model.Model(objstore_loc=self.tmp_store)
        with RollbackContext() as rollback:
            path = os.path.join(TMP_DIR, 'kimchi-images')
            pool = 'test-pool'
            vol = 'test-volume.img'
            vol_path = "%s/%s" % (path, vol)
            if not os.path.exists(path):
                os.mkdir(path)
            rollback.prependDefer(shutil.rmtree, path)

            args = {'name': pool,
                    'path': path,
                    'type': 'dir'}
            inst.storagepools_create(args)
            rollback.prependDefer(inst.storagepool_delete, pool)

            # Activate the pool before adding any volume
            inst.storagepool_activate(pool)
            rollback.prependDefer(inst.storagepool_deactivate, pool)

            params = {'name': vol,
                      'capacity': 1073741824,  # 1 GiB
                      'allocation': 536870912,  # 512 MiB
                      'format': 'qcow2'}
            task_id = inst.storagevolumes_create(pool, params)['id']
            rollback.prependDefer(inst.storagevolume_delete, pool, vol)
            inst.task_wait(task_id)

            vm_name = 'kimchi-cdrom'
            params = {'name': 'test', 'disks': [], 'cdrom': UBUNTU_ISO}
            inst.templates_create(params)
            rollback.prependDefer(inst.template_delete, 'test')
            params = {'name': vm_name,
                      'template': '/plugins/kimchi/templates/test'}
            task1 = inst.vms_create(params)
            inst.task_wait(task1['id'])
            rollback.prependDefer(inst.vm_delete, vm_name)

            prev_count = len(inst.vmstorages_get_list(vm_name))
            self.assertEquals(1, prev_count)

            # Volume format with mismatched type raise error
            cdrom_args = {"type": "cdrom", "pool": pool, "vol": vol}
            self.assertRaises(InvalidParameter, inst.vmstorages_create,
                              vm_name, cdrom_args)

            # Cold plug and unplug a disk
            disk = _attach_disk()
            inst.vmstorage_delete(vm_name, disk)

            # Hot plug a disk
            inst.vm_start(vm_name)
            disk = _attach_disk()

            # VM disk still there after powered off
            inst.vm_poweroff(vm_name)
            disk_info = inst.vmstorage_lookup(vm_name, disk)
            self.assertEquals(u'disk', disk_info['type'])
            inst.vmstorage_delete(vm_name, disk)

            # Specifying pool and path at same time will fail
            disk_args = {"type": "disk",
                         "pool": pool,
                         "vol": vol,
                         "path": disk_path}
            self.assertRaises(
                InvalidParameter, inst.vmstorages_create, vm_name, disk_args)

            old_distro_iso = TMP_DIR + 'rhel4_8.iso'
            iso_gen.construct_fake_iso(old_distro_iso, True, '4.8', 'rhel')

            vm_name = 'kimchi-ide-bus-vm'
            params = {'name': 'old_distro_template', 'disks': [],
                      'cdrom': old_distro_iso}
            inst.templates_create(params)
            rollback.prependDefer(inst.template_delete, 'old_distro_template')
            params = {
                'name': vm_name,
                'template': '/plugins/kimchi/templates/old_distro_template'
            }
            task2 = inst.vms_create(params)
            inst.task_wait(task2['id'])
            rollback.prependDefer(inst.vm_delete, vm_name)

            # Need to check the right disk_bus for old distro
            disk = _attach_disk(osinfo.get_template_default('old', 'disk_bus'))
            inst.vmstorage_delete('kimchi-ide-bus-vm', disk)

            # Hot plug IDE bus disk does not work
            inst.vm_start(vm_name)
            self.assertRaises(InvalidOperation, _attach_disk)
            inst.vm_poweroff(vm_name)