Nir Soffer has uploaded a new change for review. Change subject: virt: Add getReplicaXML method ......................................................................
virt: Add getReplicaXML method This method returns destination disk xml required for blockCopy. We need basically the same logic for Drive and replic dict, so _getSourceXML() and _getDriverXML() are now module functions, accepting a dict like object. Change-Id: Iff17e0bfc86fbff9c817a2f126fb71706396833e Signed-off-by: Nir Soffer <[email protected]> --- M tests/vmStorageTests.py M vdsm/virt/vmdevices/storage.py 2 files changed, 136 insertions(+), 46 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/68/40068/1 diff --git a/tests/vmStorageTests.py b/tests/vmStorageTests.py index 055d1c9..5cd9d54 100644 --- a/tests/vmStorageTests.py +++ b/tests/vmStorageTests.py @@ -25,7 +25,7 @@ from vdsm import constants from vdsm import utils -from virt.vmdevices.storage import Drive +from virt.vmdevices.storage import Drive, DISK_TYPE class DriveXMLTests(XMLTestCase): @@ -128,6 +128,82 @@ self.assertXMLEqual(drive.getXML().toxml(), xml) +class DriveReplicaXML(XMLTestCase): + + def test_block_to_block(self): + conf = drive_config( + format='cow', + diskReplicate=replica(DISK_TYPE.BLOCK), + ) + xml = """ + <disk device="disk" snapshot="no" type="block"> + <source dev="/path/to/replica"/> + <driver cache="none" error_policy="stop" + io="native" name="qemu" type="qcow2"/> + </disk> + """ + self.check({}, conf, xml, is_block_device=True) + + def test_block_to_file(self): + conf = drive_config( + format='cow', + diskReplicate=replica(DISK_TYPE.FILE), + ) + xml = """ + <disk device="disk" snapshot="no" type="file"> + <source file="/path/to/replica"/> + <driver cache="none" error_policy="stop" + io="threads" name="qemu" type="qcow2"/> + </disk> + """ + self.check({}, conf, xml, is_block_device=True) + + def test_file_to_file(self): + conf = drive_config( + format='cow', + diskReplicate=replica(DISK_TYPE.FILE), + ) + xml = """ + <disk device="disk" snapshot="no" type="file"> + <source file="/path/to/replica"/> + <driver cache="none" error_policy="stop" + io="threads" name="qemu" type="qcow2"/> + </disk> + """ + self.check({}, conf, xml, is_block_device=False) + + def test_file_to_block(self): + conf = drive_config( + format='cow', + diskReplicate=replica(DISK_TYPE.BLOCK), + ) + xml = """ + <disk device="disk" snapshot="no" type="block"> + <source dev="/path/to/replica"/> + <driver cache="none" error_policy="stop" + io="native" name="qemu" type="qcow2"/> + </disk> + """ + self.check({}, conf, xml, is_block_device=False) + + def check(self, vm_conf, device_conf, xml, is_block_device=False): + drive = Drive(vm_conf, self.log, **device_conf) + # Patch to skip the block device checking. + drive._blockDev = is_block_device + self.assertXMLEqual(drive.getReplicaXML().toxml(), xml) + + +def replica(diskType): + return { + "cache": "none", + "device": "disk", + "diskType": diskType, + "format": "cow", + "path": "/path/to/replica", + "propagateErrors": "off", + } + + @expandPermutations class DriveValidation(VdsmTestCase): diff --git a/vdsm/virt/vmdevices/storage.py b/vdsm/virt/vmdevices/storage.py index af1ddd2..9f3f547 100644 --- a/vdsm/virt/vmdevices/storage.py +++ b/vdsm/virt/vmdevices/storage.py @@ -328,7 +328,7 @@ ['device', 'address', 'sgio']) diskelem.setAttrs(snapshot='no') - diskelem.appendChild(self._getSourceXML()) + diskelem.appendChild(_getSourceXML(self)) diskelem.appendChild(self._getTargetXML()) if self.extSharedState == DRIVE_SHARED_TYPE.SHARED: @@ -348,62 +348,29 @@ diskelem.appendChildWithArgs('boot', order=self.bootOrder) if self.device == 'disk' or self.device == 'lun': - diskelem.appendChild(self._getDriverXML()) + diskelem.appendChild(_getDriverXML(self)) if hasattr(self, 'specParams') and 'ioTune' in self.specParams: diskelem.appendChild(self._getIotuneXML()) return diskelem - def _getSourceXML(self): - source = vmxml.Element('source') - if self.diskType == DISK_TYPE.BLOCK: - source.setAttrs(dev=self.path) - elif self.diskType == DISK_TYPE.NETWORK: - source.setAttrs(protocol=self.volumeInfo['protocol'], - name=self.volumeInfo['path']) - hostAttrs = {'name': self.volumeInfo['volfileServer'], - 'port': self.volumeInfo['volPort'], - 'transport': self.volumeInfo['volTransport']} - source.appendChildWithArgs('host', **hostAttrs) - elif self.diskType == DISK_TYPE.FILE: - source.setAttrs(file=self.path) - if self.device == 'cdrom' or self.device == 'floppy': - source.setAttrs(startupPolicy='optional') - else: - raise RuntimeError("Unsupported diskType %r", self.diskType) - return source + def getReplicaXML(self): + disk = vmxml.Element( + "disk", + device=self.diskReplicate["device"], + snapshot="no", + type=self.diskReplicate["diskType"], + ) + disk.appendChild(_getSourceXML(self.diskReplicate)) + disk.appendChild(_getDriverXML(self.diskReplicate)) + return disk def _getTargetXML(self): target = vmxml.Element('target', dev=self.name) if self.iface: target.setAttrs(bus=self.iface) return target - - def _getDriverXML(self): - driver = vmxml.Element('driver') - driverAttrs = {'name': 'qemu'} - - if self.blockDev: - driverAttrs['io'] = 'native' - else: - driverAttrs['io'] = 'threads' - - if self.format == 'cow': - driverAttrs['type'] = 'qcow2' - elif self.format: - driverAttrs['type'] = 'raw' - - driverAttrs['cache'] = self.cache - - if (self.propagateErrors == 'on' or - utils.tobool(self.propagateErrors)): - driverAttrs['error_policy'] = 'enospace' - else: - driverAttrs['error_policy'] = 'stop' - - driver.setAttrs(**driverAttrs) - return driver def _getIotuneXML(self): iotune = vmxml.Element('iotune') @@ -420,3 +387,50 @@ if hasattr(self, 'specParams') and 'ioTune' in self.specParams: self._validateIoTuneParams(self.specParams['ioTune']) + + +def _getSourceXML(drive): + source = vmxml.Element('source') + if drive["diskType"] == DISK_TYPE.BLOCK: + source.setAttrs(dev=drive["path"]) + elif drive["diskType"] == DISK_TYPE.NETWORK: + info = drive["volumeInfo"] + source.setAttrs(protocol=info['protocol'], + name=info['path']) + hostAttrs = {'name': info['volfileServer'], + 'port': info['volPort'], + 'transport': info['volTransport']} + source.appendChildWithArgs('host', **hostAttrs) + elif drive["diskType"] == DISK_TYPE.FILE: + source.setAttrs(file=drive["path"]) + if drive["device"] == 'cdrom' or drive["device"] == 'floppy': + source.setAttrs(startupPolicy='optional') + else: + raise RuntimeError("Unsupported diskType %r", drive["diskType"]) + return source + + +def _getDriverXML(drive): + driver = vmxml.Element('driver') + driverAttrs = {'name': 'qemu'} + + if drive['diskType'] == DISK_TYPE.BLOCK: + driverAttrs['io'] = 'native' + else: + driverAttrs['io'] = 'threads' + + if drive['format'] == 'cow': + driverAttrs['type'] = 'qcow2' + elif drive['format']: + driverAttrs['type'] = 'raw' + + driverAttrs['cache'] = drive['cache'] + + if (drive['propagateErrors'] == 'on' or + utils.tobool(drive['propagateErrors'])): + driverAttrs['error_policy'] = 'enospace' + else: + driverAttrs['error_policy'] = 'stop' + + driver.setAttrs(**driverAttrs) + return driver -- To view, visit https://gerrit.ovirt.org/40068 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iff17e0bfc86fbff9c817a2f126fb71706396833e Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Nir Soffer <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
