[libvirt] [PATCH 5/6] vz: check supported controllers

Mikhail Feoktistov mfeoktistov at virtuozzo.com
Tue Mar 15 07:47:50 UTC 2016


Virtuozzo6 supports only SCSI(BUSLOGIC) IDE and SATA controllers.
Virtuozzo7 supports only SCSI(VIRTIO_SCSI) and IDE.
In this patch we add list of supported controllers and scsi models to vzCapabilities structure.
In openConnection() callback we get virtuozzo version and select proper capabilities values.
In XMLPostParse phase we check controller type and SCSI model.
---
 src/vz/vz_driver.c |  3 +++
 src/vz/vz_utils.c  | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/vz/vz_utils.h  |  5 +++++
 3 files changed, 56 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 4f52bc7..74e1f5d 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -180,6 +180,9 @@ vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED,
     if (vzCheckUnsupportedDisks(def, opaque) < 0)
         return -1;
 
+    if (vzCheckUnsupportedControllers(def, opaque) < 0)
+        return -1;
+
     return 0;
 }
 
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index bf62538..58014ec 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -45,6 +45,15 @@ static virDomainDiskBus vz7DiskBuses[] = {VIR_DOMAIN_DISK_BUS_IDE,
                                           VIR_DOMAIN_DISK_BUS_SCSI,
                                           VIR_DOMAIN_DISK_BUS_LAST};
 
+static virDomainControllerType vz6ControllerTypes[] = {VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
+                                                       VIR_DOMAIN_CONTROLLER_TYPE_IDE,
+                                                       VIR_DOMAIN_CONTROLLER_TYPE_SATA,
+                                                       VIR_DOMAIN_CONTROLLER_TYPE_LAST};
+
+static virDomainControllerType vz7ControllerTypes[] = {VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
+                                                       VIR_DOMAIN_CONTROLLER_TYPE_IDE,
+                                                       VIR_DOMAIN_CONTROLLER_TYPE_LAST};
+
 /**
  * vzDomObjFromDomain:
  * @domain: Domain pointer that has to be looked up
@@ -196,10 +205,14 @@ vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps)
         vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
         vzCaps->vmDiskFormat = VIR_STORAGE_FILE_PLOOP;
         vzCaps->diskBuses = vz6DiskBuses;
+        vzCaps->controllerTypes = vz6ControllerTypes;
+        vzCaps->scsiControllerModel = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC;
     } else {
         vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
         vzCaps->vmDiskFormat = VIR_STORAGE_FILE_QCOW2;
         vzCaps->diskBuses = vz7DiskBuses;
+        vzCaps->controllerTypes = vz7ControllerTypes;
+        vzCaps->scsiControllerModel = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI;
     }
 }
 
@@ -301,3 +314,38 @@ int vzCheckUnsupportedDisks(virDomainDefPtr def,
     }
     return 0;
 }
+
+int vzCheckUnsupportedControllers(virDomainDefPtr def,
+                                 vzCapabilitiesPtr vzCaps)
+{
+    size_t i, j;
+    virDomainControllerDefPtr controller;
+
+    for (i = 0; i < def->ncontrollers; i++) {
+        controller = def->controllers[i];
+
+        for (j = 0; vzCaps->controllerTypes[j] != VIR_DOMAIN_CONTROLLER_TYPE_LAST; j++) {
+            if (controller->type == vzCaps->controllerTypes[j])
+                break;
+        }
+
+        if (vzCaps->controllerTypes[j] == VIR_DOMAIN_CONTROLLER_TYPE_LAST) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("Unsupported controller type %s"),
+                           virDomainControllerTypeToString(controller->type));
+            return -1;
+        }
+
+        if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI &&
+            controller->model != -1 &&
+            controller->model != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO &&
+            controller->model != vzCaps->scsiControllerModel) {
+
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("Unsupported SCSI controller model %s"),
+                               virDomainControllerModelSCSITypeToString(controller->model));
+                return -1;
+        }
+    }
+    return 0;
+}
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index 851322f..88e74fc 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -54,6 +54,8 @@ struct _vzCapabilities {
     virStorageFileFormat vmDiskFormat;
     virStorageFileFormat ctDiskFormat;
     virDomainDiskBus *diskBuses;
+    virDomainControllerType *controllerTypes;
+    virDomainControllerModelSCSI scsiControllerModel;
 };
 typedef struct _vzCapabilities vzCapabilities;
 typedef struct _vzCapabilities *vzCapabilitiesPtr;
@@ -113,6 +115,9 @@ vzInitVersion(vzConnPtr privconn);
 int
 vzCheckUnsupportedDisks(virDomainDefPtr def,
                         vzCapabilitiesPtr vzCaps);
+int
+vzCheckUnsupportedControllers(virDomainDefPtr def,
+                              vzCapabilitiesPtr vzCaps);
 
 # define PARALLELS_BLOCK_STATS_FOREACH(OP)                              \
     OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests")        \
-- 
1.8.3.1




More information about the libvir-list mailing list