Nir Soffer has uploaded a new change for review.

Change subject: ceph: Quick and dirty prototype
......................................................................

ceph: Quick and dirty prototype

Adds NetworkDrive class that know how to format xml for ceph disks and
probably for other network drives.

Change-Id: I1aa096ef01bca66db0e6796a54eb573ddeb43865
Signed-off-by: Nir Soffer <[email protected]>
---
M tests/vmTests.py
M vdsm/virt/vmdevices/storage.py
2 files changed, 134 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/72/36872/1

diff --git a/tests/vmTests.py b/tests/vmTests.py
index dfb80bd..2ad4715 100644
--- a/tests/vmTests.py
+++ b/tests/vmTests.py
@@ -707,7 +707,16 @@
             {'index': '0', 'propagateErrors': 'off', 'iface': 'scsi',
              'name': 'sda', 'format': 'raw', 'device': 'lun',
              'path': '/dev/mapper/lun1', 'type': 'disk', 'readonly': 'False',
-             'shared': 'none', 'serial': SERIAL, 'sgio': 'unfiltered'}]
+             'shared': 'none', 'serial': SERIAL, 'sgio': 'unfiltered'},
+
+            {'index': '0', 'propagateErrors': 'off', 'iface': 'virtio',
+             'name': 'vda', 'format': 'raw', 'device': 'disk',
+             'path': 'poolname/volumename', 'type': 'disk', 'readonly': 
'False',
+             'shared': 'none', 'serial': SERIAL, 'diskType': 'network',
+             'protocol': 'rbd', 'hosts': [{'address': 'host1', 'port': '6789',
+             'transport': 'tcp'}, {'address': 'host2', 'port': '6788',
+             'transport': 'udp'}]}
+        ]
 
         expectedXMLs = [
             """
@@ -757,11 +766,23 @@
                 <serial>%s</serial>
                 <driver cache="none" error_policy="stop"
                         io="native" name="qemu" type="raw"/>
-            </disk>"""]
+            </disk>""",
 
-        blockDevs = [False, False, True, False, True]
+            """
+            <disk device="disk" snapshot="no" type="network">
+                <source name="poolname/volumename" protocol="rbd">
+                    <host name="host1" port="6789" transport="tcp"/>
+                    <host name="host2" port="6788" transport="udp"/>
+                </source>
+                <target bus="virtio" dev="vda"/>
+                <serial>%s</serial>
+                <driver cache="none" error_policy="stop" io="threads" 
name="qemu" type="raw"/>
+            </disk>""",
+        ]
+
+        blockDevs = [False, False, True, False, True, False]
         vmConfs = [{}, {'custom': {'viodiskcache': 'writethrough'}},
-                   {}, {}, {}]
+                   {}, {}, {}, {}]
 
         for (devConf, xml, blockDev, vmConf) in \
                 zip(devConfs, expectedXMLs, blockDevs, vmConfs):
diff --git a/vdsm/virt/vmdevices/storage.py b/vdsm/virt/vmdevices/storage.py
index 780ffc1..b227cdd 100644
--- a/vdsm/virt/vmdevices/storage.py
+++ b/vdsm/virt/vmdevices/storage.py
@@ -46,10 +46,23 @@
                  'index', 'name', 'optional', 'shared', 'truesize',
                  'volumeChain', 'baseVolumeID', 'serial', 'reqsize', 'cache',
                  '_blockDev', 'extSharedState', 'drv', 'sgio', 'GUID',
-                 'diskReplicate')
+                 'diskReplicate', 'diskType')
     VOLWM_CHUNK_MB = config.getint('irs', 'volume_utilization_chunk_mb')
     VOLWM_FREE_PCT = 100 - config.getint('irs', 'volume_utilization_percent')
     VOLWM_CHUNK_REPLICATE_MULT = 2  # Chunk multiplier during replication
+
+    def __new__(cls, conf, log, **kwargs):
+        """
+        Create the required drive subclass using "diskType" attribute.
+
+        For example: "network" -> NetworkDrive
+        """
+        diskType = kwargs.get("diskType", "legacy")
+        className = diskType.capitalize() + "Drive"
+        driveClass = globals()[className]
+        obj = super(Drive, cls).__new__(driveClass)
+        obj.__init__(conf, log, **kwargs)
+        return obj
 
     def __init__(self, conf, log, **kwargs):
         if not kwargs.get('serial'):
@@ -61,6 +74,9 @@
         self.apparentsize = int(kwargs.get('apparentsize', '0'))
         self.name = self._makeName()
         self.cache = config.get('vars', 'qemu_drive_cache')
+
+        # TODO: separate to another patch
+        self.device = getattr(self, 'device', 'disk')
 
         if self.device in ("cdrom", "floppy"):
             self._blockDev = False
@@ -266,8 +282,6 @@
           <serial>54-a672-23e5b495a9ea</serial>
         </disk>
         """
-        self.device = getattr(self, 'device', 'disk')
-
         source = vmxml.Element('source')
         if self.blockDev:
             deviceType = 'block'
@@ -343,3 +357,95 @@
             diskelem.appendChild(iotune)
 
         return diskelem
+
+
+class NetworkDrive(Drive):
+
+    __slots__ = ("protocol", "hosts")
+
+    def getXML(self):
+        """
+        Create domxml for disk/cdrom/floppy.
+
+        <disk device="disk" snapshot="no" type="network">
+            <address bus="0x00" domain="0x0000" function="0x0" slot="0x05" 
type="pci"/>
+            <source name="poolname/volumename" protocol="rbd">
+                <host name="1.2.3.4" port="6789" transport="tcp"/>
+            </source>
+            <target bus="virtio" dev="vda"/>
+            <serial/>
+            <boot order="1"/>
+            <driver cache="none" error_policy="stop" io="threads" name="qemu" 
type="raw"/>
+        </disk>
+        """
+        diskelem = self.createXmlElem('disk', self.diskType,
+                                      ['device', 'address', 'sgio'])
+        diskelem.setAttrs(snapshot='no')
+
+        source = vmxml.Element('source')
+        source.setAttrs(protocol=self.protocol, name=self.path)
+        for host in self.hosts:
+            source.appendChildWithArgs('host',
+                                       name=host["address"],
+                                       port=host["port"],
+                                       transport=host["transport"])
+        diskelem.appendChild(source)
+
+        # TODO: This was copied from Drive.getXML. We should probbaly get a
+        # basic drive element from Drive.getXML and add the specific class info
+        # here.
+
+        targetAttrs = {'dev': self.name}
+        if self.iface:
+            targetAttrs['bus'] = self.iface
+        diskelem.appendChildWithArgs('target', **targetAttrs)
+
+        if self.extSharedState == DRIVE_SHARED_TYPE.SHARED:
+            diskelem.appendChildWithArgs('shareable')
+
+        if hasattr(self, 'readonly') and utils.tobool(self.readonly):
+            diskelem.appendChildWithArgs('readonly')
+
+        if hasattr(self, 'serial'):
+            diskelem.appendChildWithArgs('serial', text=self.serial)
+
+        if hasattr(self, 'bootOrder'):
+            diskelem.appendChildWithArgs('boot', order=self.bootOrder)
+
+        # For lun or disk devices
+        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'
+        diskelem.appendChildWithArgs('driver', **driverAttrs)
+
+        # IOTune
+        if hasattr(self, 'specParams') and 'ioTune' in self.specParams:
+            self._validateIoTuneParams(self.specParams['ioTune'])
+            iotune = vmxml.Element('iotune')
+            for key, value in self.specParams['ioTune'].iteritems():
+                iotune.appendChildWithArgs(key, text=str(value))
+            diskelem.appendChild(iotune)
+
+        return diskelem
+
+
+class LegacyDrive(Drive):
+    """
+    Drive supporting old ugly hacks.
+
+    TODO: copy specific hacks from Drive here.
+    """


-- 
To view, visit http://gerrit.ovirt.org/36872
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1aa096ef01bca66db0e6796a54eb573ddeb43865
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