From ae82ca3b08d781bdd033d44f22e77180571e6d40 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 30 Nov 2021 02:02:07 +0300 Subject: [PATCH] Pass config path in element instead of an attribute libvirt has always had config in the element for Ceph, we don't want to break it --- patches/libvirt-5.0-vitastor.diff | 44 +++++++++++++++++++++++++------ patches/libvirt-7.0-vitastor.diff | 42 ++++++++++++++++++++++++----- patches/libvirt-7.5-vitastor.diff | 39 ++++++++++++++++++++++++--- patches/libvirt-example.xml | 5 ++-- patches/nova-20.diff | 23 ++++++++-------- 5 files changed, 121 insertions(+), 32 deletions(-) diff --git a/patches/libvirt-5.0-vitastor.diff b/patches/libvirt-5.0-vitastor.diff index 0f03c2a2..ac1ce791 100644 --- a/patches/libvirt-5.0-vitastor.diff +++ b/patches/libvirt-5.0-vitastor.diff @@ -1,4 +1,4 @@ -commit bd283191b3e7a4c6d1c100d3d96e348a1ebffe55 +commit 7f01510ef207940b07fac4f5fc8b9f1580b443aa Author: Vitaliy Filippov Date: Sun Jun 27 12:52:40 2021 +0300 @@ -65,10 +65,38 @@ index 4bf2b5f..dbc011b 100644 int virConnectListAllStoragePools(virConnectPtr conn, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c -index 222bb8c..685d255 100644 +index 222bb8c..2c30c55 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c -@@ -8653,6 +8653,10 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, +@@ -4667,8 +4667,7 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDefPtr dev, + if (dev->type == VIR_DOMAIN_DEVICE_DISK) { + virDomainDiskDefPtr disk = dev->data.disk; + +- /* internal snapshots and config files are currently supported +- * only with rbd: */ ++ /* internal snapshots are currently supported only with rbd: */ + if (virStorageSourceGetActualType(disk->src) != VIR_STORAGE_TYPE_NETWORK && + disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) { + if (disk->src->snapshot) { +@@ -4677,11 +4676,15 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDefPtr dev, + "only with 'rbd' disks")); + return -1; + } +- ++ } ++ /* config files are currently supported only with rbd and vitastor: */ ++ if (virStorageSourceGetActualType(disk->src) != VIR_STORAGE_TYPE_NETWORK && ++ disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD && ++ disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_VITASTOR) { + if (disk->src->configFile) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _(" element is currently supported " +- "only with 'rbd' disks")); ++ "only with 'rbd' and 'vitastor' disks")); + return -1; + } + } +@@ -8653,6 +8656,10 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, goto cleanup; } @@ -79,7 +107,7 @@ index 222bb8c..685d255 100644 if ((haveTLS = virXMLPropString(node, "tls")) && (src->haveTLS = virTristateBoolTypeFromString(haveTLS)) <= 0) { virReportError(VIR_ERR_XML_ERROR, -@@ -23849,6 +23853,10 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf, +@@ -23849,6 +23856,10 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf, virBufferEscapeString(attrBuf, " name='%s'", path ? path : src->path); @@ -90,7 +118,7 @@ index 222bb8c..685d255 100644 VIR_FREE(path); if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT && -@@ -30930,6 +30938,7 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def) +@@ -30930,6 +30941,7 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def) case VIR_STORAGE_POOL_MPATH: case VIR_STORAGE_POOL_RBD: @@ -216,7 +244,7 @@ index 73e988a..ab7bb81 100644 case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c -index cbf0aa4..096700d 100644 +index cbf0aa4..f0ca9e7 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -959,6 +959,42 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src) @@ -275,7 +303,7 @@ index cbf0aa4..096700d 100644 if (!(fileprops = qemuBlockStorageSourceGetSheepdogProps(src))) return NULL; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c -index 822d5f8..e375cef 100644 +index 822d5f8..abec34e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -975,6 +975,43 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, @@ -387,7 +415,7 @@ index 4a13e90..33301c7 100644 ignore_value(VIR_STRDUP(stable_path, data->path)); break; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c -index bd4b027..b323cd6 100644 +index bd4b027..8454906 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -84,7 +84,8 @@ VIR_ENUM_IMPL(virStorageNetProtocol, VIR_STORAGE_NET_PROTOCOL_LAST, diff --git a/patches/libvirt-7.0-vitastor.diff b/patches/libvirt-7.0-vitastor.diff index f7d910d4..74b2153c 100644 --- a/patches/libvirt-7.0-vitastor.diff +++ b/patches/libvirt-7.0-vitastor.diff @@ -1,4 +1,4 @@ -commit 41cdfe8317d98f70aadedfdbb381effed2641bdd +commit 4e74c622884e2585b2cfcdf322fbd2bff6de41ca Author: Vitaliy Filippov Date: Fri Jul 9 01:31:57 2021 +0300 @@ -65,10 +65,38 @@ index 089e1e0..d7e7ef4 100644 int virConnectListAllStoragePools(virConnectPtr conn, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c -index 01b7187..c6e9702 100644 +index 01b7187..645c758 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c -@@ -8261,7 +8261,8 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, +@@ -5230,8 +5230,7 @@ virDomainDiskDefPostParse(virDomainDiskDefPtr disk, + const virDomainDef *def, + virDomainXMLOptionPtr xmlopt) + { +- /* internal snapshots and config files are currently supported +- * only with rbd: */ ++ /* internal snapshots are currently supported only with rbd: */ + if (virStorageSourceGetActualType(disk->src) != VIR_STORAGE_TYPE_NETWORK && + disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) { + if (disk->src->snapshot) { +@@ -5240,11 +5239,15 @@ virDomainDiskDefPostParse(virDomainDiskDefPtr disk, + "only with 'rbd' disks")); + return -1; + } +- ++ } ++ /* config files are currently supported only with rbd and vitastor: */ ++ if (virStorageSourceGetActualType(disk->src) != VIR_STORAGE_TYPE_NETWORK && ++ disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD && ++ disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_VITASTOR) { + if (disk->src->configFile) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _(" element is currently supported " +- "only with 'rbd' disks")); ++ "only with 'rbd' and 'vitastor' disks")); + return -1; + } + } +@@ -8261,7 +8264,8 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, src->configFile = virXPathString("string(./config/@file)", ctxt); if (src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTP || @@ -78,7 +106,7 @@ index 01b7187..c6e9702 100644 src->query = virXMLPropString(node, "query"); if (virDomainStorageNetworkParseHosts(node, ctxt, &src->hosts, &src->nhosts) < 0) -@@ -31392,6 +31393,7 @@ virDomainStorageSourceTranslateSourcePool(virStorageSourcePtr src, +@@ -31392,6 +31396,7 @@ virDomainStorageSourceTranslateSourcePool(virStorageSourcePtr src, case VIR_STORAGE_POOL_MPATH: case VIR_STORAGE_POOL_RBD: @@ -216,7 +244,7 @@ index 17b93d0..c5a0084 100644 case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c -index f9c6da2..922dde5 100644 +index f9c6da2..d837a05 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -938,6 +938,38 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src, @@ -293,7 +321,7 @@ index f9c6da2..922dde5 100644 driver = "sheepdog"; if (!(location = qemuBlockStorageSourceGetSheepdogProps(src))) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c -index 6f970a3..10b39ca 100644 +index 6f970a3..4c03fb8 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1034,6 +1034,43 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, @@ -415,7 +443,7 @@ index 29c4c86..a27ad94 100644 case VIR_STORAGE_POOL_LOGICAL: case VIR_STORAGE_POOL_DISK: diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c -index 0d3c2af..36e3afc 100644 +index 0d3c2af..edb7f9e 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -91,6 +91,7 @@ VIR_ENUM_IMPL(virStorageNetProtocol, diff --git a/patches/libvirt-7.5-vitastor.diff b/patches/libvirt-7.5-vitastor.diff index 0c6fc034..319095d4 100644 --- a/patches/libvirt-7.5-vitastor.diff +++ b/patches/libvirt-7.5-vitastor.diff @@ -1,4 +1,4 @@ -commit c6e1958a1b4974828e8e5852beb252ce6594e670 +commit c97d7f2bfb7798f0d68bdba2646245dcfb940efa Author: Vitaliy Filippov Date: Mon Jun 28 01:20:19 2021 +0300 @@ -86,6 +86,37 @@ index d78f846..f7222e3 100644 case VIR_STORAGE_POOL_SHEEPDOG: case VIR_STORAGE_POOL_GLUSTER: case VIR_STORAGE_POOL_LAST: +diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c +index 2124d25..6acc6fa 100644 +--- a/src/conf/domain_validate.c ++++ b/src/conf/domain_validate.c +@@ -470,7 +470,7 @@ virDomainDiskDefValidateSourceChainOne(const virStorageSource *src) + } + } + +- /* internal snapshots and config files are currently supported only with rbd: */ ++ /* internal snapshots are currently supported only with rbd: */ + if (virStorageSourceGetActualType(src) != VIR_STORAGE_TYPE_NETWORK && + src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) { + if (src->snapshot) { +@@ -479,11 +479,15 @@ virDomainDiskDefValidateSourceChainOne(const virStorageSource *src) + "only with 'rbd' disks")); + return -1; + } +- ++ } ++ /* config files are currently supported only with rbd and vitastor: */ ++ if (virStorageSourceGetActualType(src) != VIR_STORAGE_TYPE_NETWORK && ++ src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD && ++ src->protocol != VIR_STORAGE_NET_PROTOCOL_VITASTOR) { + if (src->configFile) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _(" element is currently supported " +- "only with 'rbd' disks")); ++ "only with 'rbd' and 'vitastor' disks")); + return -1; + } + } diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 2aa9a3d..166ca1f 100644 --- a/src/conf/storage_conf.c @@ -248,7 +279,7 @@ index c0905b0..c172378 100644 case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c -index 6627d04..c33f428 100644 +index 6627d04..f769d24 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -928,6 +928,38 @@ qemuBlockStorageSourceGetRBDProps(virStorageSource *src, @@ -325,7 +356,7 @@ index 6627d04..c33f428 100644 driver = "sheepdog"; if (!(location = qemuBlockStorageSourceGetSheepdogProps(src))) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c -index ea51369..8258632 100644 +index ea51369..d714597 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1074,6 +1074,43 @@ qemuBuildNetworkDriveStr(virStorageSource *src, @@ -435,7 +466,7 @@ index c2ff4b8..70d0689 100644 case VIR_STORAGE_POOL_ZFS: case VIR_STORAGE_POOL_LAST: diff --git a/src/storage_file/storage_source_backingstore.c b/src/storage_file/storage_source_backingstore.c -index e48ae72..d7a9b72 100644 +index e48ae72..2017ccc 100644 --- a/src/storage_file/storage_source_backingstore.c +++ b/src/storage_file/storage_source_backingstore.c @@ -284,6 +284,75 @@ virStorageSourceParseRBDColonString(const char *rbdstr, diff --git a/patches/libvirt-example.xml b/patches/libvirt-example.xml index 0b288ab2..c1bbadfa 100644 --- a/patches/libvirt-example.xml +++ b/patches/libvirt-example.xml @@ -15,9 +15,10 @@ - - + + + diff --git a/patches/nova-20.diff b/patches/nova-20.diff index 17b75f48..487eeb6b 100644 --- a/patches/nova-20.diff +++ b/patches/nova-20.diff @@ -1,5 +1,5 @@ diff --git a/nova/virt/image/model.py b/nova/virt/image/model.py -index 971f7e9c07..70ed70d5e2 100644 +index 971f7e9c07..ec3fca72cb 100644 --- a/nova/virt/image/model.py +++ b/nova/virt/image/model.py @@ -129,3 +129,22 @@ class RBDImage(Image): @@ -19,7 +19,7 @@ index 971f7e9c07..70ed70d5e2 100644 + :param etcd_prefix: etcd prefix (optional) + :param config_path: path to the configuration (optional) + """ -+ super(RBDImage, self).__init__(FORMAT_RAW) ++ super(VitastorImage, self).__init__(FORMAT_RAW) + + self.name = name + self.etcd_address = etcd_address @@ -48,7 +48,7 @@ index 5358f3766a..ebe3d6effb 100644 info = nova.privsep.qemu.privileged_qemu_img_info(path, format=format) diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py -index f9475776b3..51573fe41d 100644 +index f9475776b3..a2e18aab67 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -1060,6 +1060,8 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): @@ -60,18 +60,19 @@ index f9475776b3..51573fe41d 100644 self.source_name = None self.source_hosts = [] self.source_ports = [] -@@ -1186,7 +1188,8 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): - elif self.source_type == "mount": - dev.append(etree.Element("source", dir=self.source_path)) - elif self.source_type == "network" and self.source_protocol: -- source = etree.Element("source", protocol=self.source_protocol) -+ source = etree.Element("source", protocol=self.source_protocol, -+ query=self.source_query, config=self.source_config) +@@ -1189,6 +1191,10 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): + source = etree.Element("source", protocol=self.source_protocol) if self.source_name is not None: source.set('name', self.source_name) ++ if self.source_query is not None: ++ source.set('query', self.source_query) ++ if self.source_config is not None: ++ source.append(etree.Element('config', file=self.source_config)) hosts_info = zip(self.source_hosts, self.source_ports) + for name, port in hosts_info: + host = etree.Element('host', name=name) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py -index 391231c527..34dc60dcdd 100644 +index 391231c527..f38faa1608 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -179,6 +179,7 @@ VOLUME_DRIVERS = {