diff --git a/storages/templates/create_stg_block.html b/storages/templates/create_stg_block.html index c5ed1a8a..51658437 100644 --- a/storages/templates/create_stg_block.html +++ b/storages/templates/create_stg_block.html @@ -120,19 +120,19 @@
- +
- +
- +
@@ -185,7 +185,7 @@
- +
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}