diff --git a/storages/tests/test_pool_target.py b/storages/tests/test_pool_target.py
index 03aede82..bb6ff5de 100644
--- a/storages/tests/test_pool_target.py
+++ b/storages/tests/test_pool_target.py
@@ -74,3 +74,6 @@ class PoolTargetTests(SimpleTestCase):
with self.subTest(form=field.xpath("string(ancestor::form//input[@name='stg_type']/@value)"), name=field.name):
self.assertIsNone(field.get("pattern"))
self.assertGreaterEqual(int(field.get("maxlength", 100)), 100)
+ for name in ("netfs_host", "ceph_host"): # a host name is up to 253 characters
+ with self.subTest(name=name):
+ self.assertGreaterEqual(int(page.xpath(f"//input[@name='{name}']/@maxlength")[0]), 253)
diff --git a/storages/tests/test_pool_xml.py b/storages/tests/test_pool_xml.py
new file mode 100644
index 00000000..5b1809ab
--- /dev/null
+++ b/storages/tests/test_pool_xml.py
@@ -0,0 +1,30 @@
+"""The host, pool, user and format values of a new Ceph or NFS pool go into
+its XML as text, whatever characters they hold."""
+
+from unittest.mock import patch
+
+from django.test import SimpleTestCase
+from lxml import etree
+from vrtManager.storage import wvmStorages
+
+ODD = "a'b\"c
&e"
+
+
+class PoolXmlTests(SimpleTestCase):
+ def defined_xml(self, create, *args):
+ with patch("vrtManager.connection.connection_manager.get_connection") as get:
+ getattr(wvmStorages("host", "login", "pw", 1), create)(*args)
+ return etree.fromstring(get.return_value.storagePoolDefineXML.call_args.args[0])
+
+ def test_ceph_values_are_text(self):
+ pool = self.defined_xml("create_storage_ceph", "rbd", "pool1", ODD + "pool", ODD + "host", ODD + "user", ODD + "secret")
+ self.assertEqual(pool.findtext("source/name"), ODD + "pool")
+ self.assertEqual(pool.find("source/host").get("name"), ODD + "host")
+ self.assertEqual(pool.find("source/auth").get("username"), ODD + "user")
+ self.assertEqual(pool.find("source/auth/secret").get("uuid"), ODD + "secret")
+
+ def test_nfs_values_are_text(self):
+ pool = self.defined_xml("create_storage_netfs", "netfs", "pool1", ODD + "host", "/srv/nfs", ODD + "fmt", "/mnt/pool1")
+ self.assertEqual(pool.find("source/host").get("name"), ODD + "host")
+ self.assertEqual(pool.find("source/format").get("type"), ODD + "fmt")
+ self.assertEqual(pool.find("source/dir").get("path"), "/srv/nfs")
diff --git a/vrtManager/storage.py b/vrtManager/storage.py
index 7cc39122..e7b5a0bd 100644
--- a/vrtManager/storage.py
+++ b/vrtManager/storage.py
@@ -66,6 +66,7 @@ class wvmStorages(wvmConnect):
def create_storage_ceph(
self, stg_type, name, ceph_pool, ceph_host, ceph_user, secret
):
+ ceph_pool, ceph_host, ceph_user, secret = map(util.xml_escape, (ceph_pool, ceph_host, ceph_user, secret))
xml = f"""
{name}
@@ -86,6 +87,7 @@ class wvmStorages(wvmConnect):
def create_storage_netfs(
self, stg_type, name, netfs_host, source, source_format, target
):
+ netfs_host, source_format = util.xml_escape(netfs_host), util.xml_escape(source_format)
xml = f"""
{name}