def __init__(self, config): self._dom = FakeDomain(config) self.log = logging.getLogger() self.cif = fake.ClientIF() self._domain = DomainDescriptor(config.xmls["00-before.xml"]) self.id = self._domain.id self._md_desc = metadata.Descriptor.from_xml( config.xmls["00-before.xml"]) drive = config.values["drive"] self._devices = { "disk": [ storage.Drive(**drive, volumeChain=xml_chain( config.xmls["00-before.xml"]), log=self.log) ] } # Add the drives to to IRS: self.cif.irs.prepared_volumes = { (drive["domainID"], drive["imageID"], vol_id): vol_info for vol_id, vol_info in config.values["volumes"].items() } self.conf = self._conf_devices(config) self.conf["vmId"] = config.values["vm-id"] self.conf["xml"] = config.xmls["00-before.xml"] self._external = False # Used when syncing metadata. self.volume_monitor = thinp.VolumeMonitor(self, self.log) self._confLock = threading.Lock() self._drive_merger = DriveMerger(self) self._migrationSourceThread = migration.SourceThread(self)
def testGetChunkedDrives(self, disk_conf, expected): with fake.VM() as testvm: vda = storage.Drive(self.log, **drive_config(**disk_conf)) testvm._devices[hwclass.DISK] = [vda] drives = [drive.name for drive in testvm.getChunkedDrives()] assert drives == expected
def test_devices_storage(self): drive_params = { 'device': hwclass.DISK, 'iface': 'sata', 'index': 0, # *ID are not validated by the Drive class 'shared': 'transient', 'domainID': 'domainID', 'imageID': 'imageID', 'poolID': 'poolID', 'volumeID': 'volumeID', } expected_xml = """<ovirt-vm:vm xmlns:ovirt-vm="http://ovirt.org/vm/1.0"> <ovirt-vm:device devtype="disk" name="sda"> <ovirt-vm:domainID>domainID</ovirt-vm:domainID> <ovirt-vm:imageID>imageID</ovirt-vm:imageID> <ovirt-vm:poolID>poolID</ovirt-vm:poolID> <ovirt-vm:shared>transient</ovirt-vm:shared> <ovirt-vm:volumeID>volumeID</ovirt-vm:volumeID> </ovirt-vm:device> </ovirt-vm:vm>""" dev_map = common.empty_dev_map() dev_map[hwclass.DISK].append(storage.Drive(self.log, **drive_params)) common.save_device_metadata(self.md_desc, dev_map, self.log) self.assertXMLEqual(self.md_desc.to_xml(), expected_xml)
def make_drive(log, index, **param_dict): conf = drive_config(index=str(index), domainID='domain_%s' % index, poolID='pool_%s' % index, imageID='image_%s' % index, volumeID='volume_%s' % index, **param_dict) return storage.Drive(log, **conf)
def test_shared_from_metadata(self): md_desc = metadata.Descriptor.from_xml(_DRIVE_TRANSIENT_DISK_XML) root = xmlutils.fromstring(_DRIVE_TRANSIENT_DISK_XML) dev_xml = root.find('./devices/disk') with md_desc.device(devtype='disk', name='sda') as meta: dev_obj = storage.Drive(self.log, **storagexml.parse(dev_xml, meta)) assert dev_obj['shared'] == storage.DRIVE_SHARED_TYPE.TRANSIENT
def test_devices_storage_iotune(self): drive_params = { 'index': 0, 'cache': 'none', 'name': 'vda', 'format': 'raw', 'bootOrder': '1', 'discard': False, 'diskType': 'block', 'specParams': { 'ioTune': { 'write_bytes_sec': 0, 'total_iops_sec': 0, 'read_iops_sec': 100, 'read_bytes_sec': 0, 'write_iops_sec': 100, 'total_bytes_sec': 0 } }, 'iface': 'virtio', 'device': 'disk', 'path': '/some/path', 'serial': 'random-serial', 'propagateErrors': 'off', 'type': 'disk', # *ID are not validated by the Drive class 'shared': 'transient', 'domainID': 'domainID', 'imageID': 'imageID', 'poolID': 'poolID', 'volumeID': 'volumeID', } expected_xml = """<ovirt-vm:vm xmlns:ovirt-vm="http://ovirt.org/vm/1.0"> <ovirt-vm:device devtype="disk" name="vda"> <ovirt-vm:domainID>domainID</ovirt-vm:domainID> <ovirt-vm:imageID>imageID</ovirt-vm:imageID> <ovirt-vm:managed type="bool">False</ovirt-vm:managed> <ovirt-vm:poolID>poolID</ovirt-vm:poolID> <ovirt-vm:shared>transient</ovirt-vm:shared> <ovirt-vm:volumeID>volumeID</ovirt-vm:volumeID> <ovirt-vm:specParams /> </ovirt-vm:device> </ovirt-vm:vm>""" dev_map = common.empty_dev_map() dev_map[hwclass.DISK].append(storage.Drive(self.log, **drive_params)) common.save_device_metadata(self.md_desc, dev_map, self.log) self.assertXMLEqual(self.md_desc.to_xml(), expected_xml)
def __init__(self, config): self._dom = FakeDomain(config) self.log = logging.getLogger() self.cif = fake.ClientIF() self._domain = DomainDescriptor(config.xmls["00-before.xml"]) self.id = self._domain.id self._md_desc = metadata.Descriptor.from_xml( config.xmls["00-before.xml"]) drive = config.values["drive"] self._devices = { "disk": [ storage.Drive(**drive, volumeChain=xml_chain( config.xmls["00-before.xml"]), log=self.log) ] } # Add the drives to to IRS: self.cif.irs.prepared_volumes = { (drive["domainID"], drive["imageID"], vol_id): vol_info for vol_id, vol_info in config.values["volumes"].items() } # Add the drive block info to fake domain. This value is returned by # FakeDomain.blockInfo(). top_volume = config.values["volumes"][drive["volumeID"]] self._dom.drives[drive["path"]] = { "capacity": top_volume["capacity"], "alloc": 0, "physical": top_volume["apparentsize"], } self.conf = self._conf_devices(config) self.conf["vmId"] = config.values["vm-id"] self.conf["xml"] = config.xmls["00-before.xml"] self._external = False # Used when syncing metadata. self.drive_monitor = FakeDriveMonitor() self._confLock = threading.Lock() self._drive_merger = DriveMerger(self)
def test_disk_specParams_payload_device(self): payload_params = { u'index': u'3', u'iface': u'ide', u'specParams': { u'vmPayload': { u'volId': u'config-2', u'file': { u'openstack/content/0000': u'A', u'openstack/latest/meta_data.json': u'B', u'openstack/latest/user_data': u'C', } } }, u'readonly': u'true', u'deviceId': u'e5cd57aa-6eb6-424b-b16b-83ef07bf9cca', u'shared': u'false', u'device': u'cdrom', u'path': u'', u'type': u'disk' } expected_xml = """<ovirt-vm:vm xmlns:ovirt-vm="http://ovirt.org/vm/1.0"> <ovirt-vm:device name="hdd" devtype="disk"> <ovirt-vm:deviceId>e5cd57aa-6eb6-424b-b16b-83ef07bf9cca</ovirt-vm:deviceId> <ovirt-vm:managed type="bool">False</ovirt-vm:managed> <ovirt-vm:shared>false</ovirt-vm:shared> <ovirt-vm:specParams> <ovirt-vm:vmPayload> <ovirt-vm:volId>config-2</ovirt-vm:volId> <ovirt-vm:file path='openstack/content/0000'>A</ovirt-vm:file> <ovirt-vm:file path='openstack/latest/meta_data.json'>B</ovirt-vm:file> <ovirt-vm:file path='openstack/latest/user_data'>C</ovirt-vm:file> </ovirt-vm:vmPayload> </ovirt-vm:specParams> </ovirt-vm:device> </ovirt-vm:vm>""" dev_map = common.empty_dev_map() dev_map[hwclass.DISK].append(storage.Drive(self.log, **payload_params)) common.save_device_metadata(self.md_desc, dev_map, self.log) self.assertXMLEqual(self.md_desc.to_xml(), expected_xml)
def make_drive(drive_conf, shared_type=storage.DRIVE_SHARED_TYPE.EXCLUSIVE): drive_conf['shared'] = shared_type return storage.Drive(log, **drive_conf)