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

Reply via email to