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))
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'))
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())
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'))
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'))
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'))
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'))
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'))
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') )
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))
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'))
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'))
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())
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'])
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'])
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())
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))
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)
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)
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"])
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)
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)