Allow config to support virtiofs (driver)

Extends the config handling for virtio mounts.

Manila is the OpenStack Shared Filesystems service.
These series of patches implement changes required in Nova to allow the shares
provided by Manila to be associated with and attached to instances using
virtiofs.

Implements: blueprint libvirt-virtiofs-attach-manila-shares
Change-Id: Ib614c71b8579f09637c087019a3bed9f83ed0842
This commit is contained in:
René Ribaud 2023-06-20 14:56:38 +02:00
parent cd5b7e8068
commit 9aff6e9a9e
2 changed files with 41 additions and 0 deletions

View File

@ -1441,6 +1441,22 @@ class LibvirtConfigGuestFilesysTest(LibvirtConfigBaseTest):
<target dir="/mnt"/>
</filesystem>""")
def test_config_virtiofs(self):
obj = config.LibvirtConfigGuestFilesys()
obj.source_type = "mount"
obj.accessmode = "passthrough"
obj.driver_type = "virtiofs"
obj.source_dir = "/mnt/nfsmount"
obj.target_dir = "mount_tag"
xml = obj.to_xml()
self.assertXmlEqual(xml, """
<filesystem type="mount" accessmode='passthrough'>
<driver type='virtiofs'/>
<source dir="/mnt/nfsmount"/>
<target dir="mount_tag"/>
</filesystem>""")
def test_config_block(self):
obj = config.LibvirtConfigGuestFilesys()
obj.source_type = "block"
@ -1483,6 +1499,22 @@ class LibvirtConfigGuestFilesysTest(LibvirtConfigBaseTest):
self.assertEqual('/tmp/hello', obj.source_dir)
self.assertEqual('/mnt', obj.target_dir)
def test_parse_virtiofs(self):
xmldoc = """
<filesystem type="mount" accessmode='passthrough'>
<driver type='virtiofs'/>
<source dir="/mnt/nfsmount"/>
<target dir="mount_tag"/>
</filesystem>
"""
obj = config.LibvirtConfigGuestFilesys()
obj.parse_str(xmldoc)
self.assertEqual('mount', obj.source_type)
self.assertEqual('passthrough', obj.accessmode)
self.assertEqual('virtiofs', obj.driver_type)
self.assertEqual('/mnt/nfsmount', obj.source_dir)
self.assertEqual('mount_tag', obj.target_dir)
def test_parse_block(self):
xmldoc = """
<filesystem type="block">

View File

@ -1506,6 +1506,7 @@ class LibvirtConfigGuestFilesys(LibvirtConfigGuestDevice):
**kwargs)
self.source_type = "mount"
self.accessmode = None
self.source_dir = None
self.source_file = None
self.source_dev = None
@ -1517,6 +1518,8 @@ class LibvirtConfigGuestFilesys(LibvirtConfigGuestDevice):
dev = super(LibvirtConfigGuestFilesys, self).format_dom()
dev.set("type", self.source_type)
if self.accessmode:
dev.set("accessmode", self.accessmode)
if self.source_type == "file":
dev.append(etree.Element("driver", type = self.driver_type,
@ -1524,6 +1527,9 @@ class LibvirtConfigGuestFilesys(LibvirtConfigGuestDevice):
dev.append(etree.Element("source", file=self.source_file))
elif self.source_type == "block":
dev.append(etree.Element("source", dev=self.source_dev))
elif self.source_type == "mount" and self.driver_type == "virtiofs":
dev.append(etree.Element("driver", type=self.driver_type))
dev.append(etree.Element("source", dir=self.source_dir))
else:
dev.append(etree.Element("source", dir=self.source_dir))
dev.append(etree.Element("target", dir=self.target_dir))
@ -1534,12 +1540,15 @@ class LibvirtConfigGuestFilesys(LibvirtConfigGuestDevice):
super(LibvirtConfigGuestFilesys, self).parse_dom(xmldoc)
self.source_type = xmldoc.get('type')
self.accessmode = xmldoc.get('accessmode')
for c in xmldoc:
if c.tag == 'driver':
if self.source_type == 'file':
self.driver_type = c.get('type')
self.driver_format = c.get('format')
if self.source_type == 'mount':
self.driver_type = c.get('type')
elif c.tag == 'source':
if self.source_type == 'file':
self.source_file = c.get('file')