[PATCH v4 3/4] test_driver: Introduce testDomainObjCheckTaint

Luke Yue posted 4 patches 4 years, 7 months ago
[PATCH v4 3/4] test_driver: Introduce testDomainObjCheckTaint
Posted by Luke Yue 4 years, 7 months ago
In order to test the virDomainGetMessages for test driver, we need to
check some taints or deprecations, so introduce testDomainObjCheckTaint
for checking taints.

As we introduced testDomainObjCheckTaint for test driver, the `dominfo`
command in virshtest will now print tainting messages, so add them for
test.

Signed-off-by: Luke Yue <lukedyue@gmail.com>
---
 src/test/test_driver.c | 77 ++++++++++++++++++++++++++++++++++++++++++
 tests/virshtest.c      |  2 ++
 2 files changed, 79 insertions(+)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ef406a3d99..ca9c2fa2fb 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -747,6 +747,81 @@ static char *testBuildFilename(const char *relativeTo,
     return g_strdup_printf("%s/%s", basename, filename);
 }
 
+static void
+testDomainObjCheckCPUTaint(virDomainObj *obj)
+{
+    switch (obj->def->cpu->mode) {
+    case VIR_CPU_MODE_CUSTOM:
+        if (obj->def->cpu->model)
+            if (STREQ(obj->def->cpu->model, "Deprecated-Test")) {
+                virDomainObjTaint(obj, VIR_DOMAIN_TAINT_DEPRECATED_CONFIG);
+                virDomainObjDeprecation(obj, "CPU model Deprecated-Test");
+            }
+
+        break;
+    default:
+        break;
+    }
+}
+
+static void
+testDomainObjCheckDiskTaint(virDomainObj *obj,
+                            virDomainDiskDef *disk)
+{
+    if (disk->rawio == VIR_TRISTATE_BOOL_YES)
+        virDomainObjTaint(obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES);
+
+    if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
+        virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_BLOCK &&
+        disk->src->path)
+        virDomainObjTaint(obj, VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH);
+}
+
+static void
+testDomainObjCheckHostdevTaint(virDomainObj *obj,
+                               virDomainHostdevDef *hostdev)
+{
+    if (!virHostdevIsSCSIDevice(hostdev))
+        return;
+
+    if (hostdev->source.subsys.u.scsi.rawio == VIR_TRISTATE_BOOL_YES)
+        virDomainObjTaint(obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES);
+}
+
+static void
+testDomainObjCheckNetTaint(virDomainObj *obj,
+                           virDomainNetDef *net)
+{
+    /* script is only useful for NET_TYPE_ETHERNET (qemu) and
+     * NET_TYPE_BRIDGE (xen), but could be (incorrectly) specified for
+     * any interface type. In any case, it's adding user sauce into
+     * the soup, so it should taint the domain.
+     */
+    if (net->script != NULL)
+        virDomainObjTaint(obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS);
+}
+
+static void
+testDomainObjCheckTaint(virDomainObj *obj)
+{
+    size_t i;
+
+    for (i = 0; i < obj->def->ndisks; i++)
+        testDomainObjCheckDiskTaint(obj, obj->def->disks[i]);
+
+    for (i = 0; i < obj->def->nhostdevs; i++)
+        testDomainObjCheckHostdevTaint(obj, obj->def->hostdevs[i]);
+
+    for (i = 0; i < obj->def->nnets; i++)
+        testDomainObjCheckNetTaint(obj, obj->def->nets[i]);
+
+    if (obj->def->cpu)
+        testDomainObjCheckCPUTaint(obj);
+
+    if (obj->def->os.dtb)
+        virDomainObjTaint(obj, VIR_DOMAIN_TAINT_CUSTOM_DTB);
+}
+
 static xmlNodePtr
 testParseXMLDocFromFile(xmlNodePtr node, const char *file, const char *type)
 {
@@ -969,6 +1044,8 @@ testParseDomains(testDriver *privconn,
         }
         virDomainObjSetState(obj, nsdata->runstate, 0);
 
+        testDomainObjCheckTaint(obj);
+
         virDomainObjEndAPI(&obj);
     }
 
diff --git a/tests/virshtest.c b/tests/virshtest.c
index c1974c46cb..937448cefc 100644
--- a/tests/virshtest.c
+++ b/tests/virshtest.c
@@ -22,6 +22,7 @@ main(void)
 
 # define DOM_UUID "ef861801-45b9-11cb-88e3-afbfe5370493"
 # define SECURITY_LABEL "libvirt-test (enforcing)"
+# define MESSAGES "tainted: network configuration using opaque shell scripts"
 
 static const char *dominfo_fc4 = "\
 Id:             2\n\
@@ -38,6 +39,7 @@ Managed save:   no\n\
 Security model: testSecurity\n\
 Security DOI:   \n\
 Security label: " SECURITY_LABEL "\n\
+Messages:       " MESSAGES "\n\
 \n";
 static const char *domuuid_fc4 = DOM_UUID "\n\n";
 static const char *domid_fc4 = "2\n\n";
-- 
2.32.0