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
