Re: [libvirt] [PATCH 3/6] vz: check supported disk format and bus

2016-03-16 Thread Maxim Nestratov

15.03.2016 10:47, Mikhail Feoktistov пишет:

In DomainPostParse phase we check disk format and bus.
If disk format is not specified in XML (VIR_STORAGE_FILE_NONE) than we accept 
this disk.
Otherwise we try to find disk format in vzCapabilities struct.
Also we try to find disk bus in vzCapabilities->diskBuses.
It contains buses that we support.
---
  src/vz/vz_driver.c |  6 +-
  src/vz/vz_sdk.c| 24 ++--
  src/vz/vz_utils.c  | 52 
  src/vz/vz_utils.h  |  3 +++
  4 files changed, 62 insertions(+), 23 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 5d48d7e..4f52bc7 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -175,8 +175,11 @@ static int
  vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED,
   virCapsPtr caps ATTRIBUTE_UNUSED,
   unsigned int parseFlags ATTRIBUTE_UNUSED,
- void *opaque ATTRIBUTE_UNUSED)
+ void *opaque)
  {
+if (vzCheckUnsupportedDisks(def, opaque) < 0)
+return -1;
+
  return 0;
  }
  
@@ -239,6 +242,7 @@ vzOpenDefault(virConnectPtr conn)

  if (!(privconn->caps = vzBuildCapabilities()))
  goto error;
  
+vzDomainDefParserConfig.priv = &privconn->vzCaps;

  if (!(privconn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
 NULL, NULL)))
  goto error;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index de73c31..2a6e908 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3143,30 +3143,10 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
  pret = PrlVmDev_SetConnected(sdkdisk, 1);
  prlsdkCheckRetGoto(pret, cleanup);
  
-if (disk->src->type == VIR_STORAGE_TYPE_FILE) {

-if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
-
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
- "disk %s, vz driver 
supports only "
- "images in ploop format."), 
disk->src->path);
-goto cleanup;
-}
-
+if (disk->src->type == VIR_STORAGE_TYPE_FILE)
  emutype = PDT_USE_IMAGE_FILE;
-} else {
-if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-(virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_RAW &&
- virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE &&
- virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_AUTO)) {
-
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format "
- "of disk %s, it should be 
either not set, or set "
- "to raw or auto."), 
disk->src->path);
-goto cleanup;
-}
+else
  emutype = PDT_USE_REAL_DEVICE;


I know you keep the logic we currently have but this is not true because 
"not file" doesn't mean "real device"
and else if (disk->src->type == VIR_STORAGE_TYPE_BLOCK) would make sence 
here.



-}
  
  pret = PrlVmDev_SetEmulatedType(sdkdisk, emutype);

  prlsdkCheckRetGoto(pret, cleanup);
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index d8a95ac..bf62538 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -249,3 +249,55 @@ vzInitVersion(vzConnPtr privconn)
  VIR_FREE(output);
  return ret;
  }
+
+int vzCheckUnsupportedDisks(virDomainDefPtr def,
+vzCapabilitiesPtr vzCaps)
+{
+size_t i, j;
+virDomainDiskDefPtr disk;
+virStorageFileFormat diskFormat;
+bool supported;
+
+for (i = 0; i < def->ndisks; i++) {
+disk = def->disks[i];
+diskFormat = virDomainDiskGetFormat(disk);
+// disk format


unnecessary commentary


+supported = true;
+if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
+if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
+diskFormat != VIR_STORAGE_FILE_NONE) {
+
+if (IS_CT(def))
+supported = vzCaps->ctDiskFormat == diskFormat;
+else
+supported = vzCaps->vmDiskFormat == diskFormat;
+}
+} else {


again, else if (disk->src->type == VIR_STORAGE_TYPE_BLOCK) would make 
sence here



+if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
+supported = diskFormat == VIR_STORAGE_FILE_RAW ||
+diskFormat == VIR_STORAGE_FILE_NONE ||
+diskFormat == VIR_STORAGE_FILE_AUTO;
+}
+}


else block with supported = false is required because there are 
VIR_STORAGE_TYPE_NETWORK

VIR_STORAGE_TYPE_DIR and VIR_STORAGE_TYPE_VOLUME


+
+if (!supported) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTE

[libvirt] [PATCH 3/6] vz: check supported disk format and bus

2016-03-15 Thread Mikhail Feoktistov
In DomainPostParse phase we check disk format and bus.
If disk format is not specified in XML (VIR_STORAGE_FILE_NONE) than we accept 
this disk.
Otherwise we try to find disk format in vzCapabilities struct.
Also we try to find disk bus in vzCapabilities->diskBuses.
It contains buses that we support.
---
 src/vz/vz_driver.c |  6 +-
 src/vz/vz_sdk.c| 24 ++--
 src/vz/vz_utils.c  | 52 
 src/vz/vz_utils.h  |  3 +++
 4 files changed, 62 insertions(+), 23 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 5d48d7e..4f52bc7 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -175,8 +175,11 @@ static int
 vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED,
  virCapsPtr caps ATTRIBUTE_UNUSED,
  unsigned int parseFlags ATTRIBUTE_UNUSED,
- void *opaque ATTRIBUTE_UNUSED)
+ void *opaque)
 {
+if (vzCheckUnsupportedDisks(def, opaque) < 0)
+return -1;
+
 return 0;
 }
 
@@ -239,6 +242,7 @@ vzOpenDefault(virConnectPtr conn)
 if (!(privconn->caps = vzBuildCapabilities()))
 goto error;
 
+vzDomainDefParserConfig.priv = &privconn->vzCaps;
 if (!(privconn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
NULL, NULL)))
 goto error;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index de73c31..2a6e908 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3143,30 +3143,10 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 pret = PrlVmDev_SetConnected(sdkdisk, 1);
 prlsdkCheckRetGoto(pret, cleanup);
 
-if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
-if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
-
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
- "disk %s, vz driver 
supports only "
- "images in ploop 
format."), disk->src->path);
-goto cleanup;
-}
-
+if (disk->src->type == VIR_STORAGE_TYPE_FILE)
 emutype = PDT_USE_IMAGE_FILE;
-} else {
-if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-(virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_RAW &&
- virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE &&
- virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_AUTO)) {
-
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format "
- "of disk %s, it 
should be either not set, or set "
- "to raw or auto."), 
disk->src->path);
-goto cleanup;
-}
+else
 emutype = PDT_USE_REAL_DEVICE;
-}
 
 pret = PrlVmDev_SetEmulatedType(sdkdisk, emutype);
 prlsdkCheckRetGoto(pret, cleanup);
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index d8a95ac..bf62538 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -249,3 +249,55 @@ vzInitVersion(vzConnPtr privconn)
 VIR_FREE(output);
 return ret;
 }
+
+int vzCheckUnsupportedDisks(virDomainDefPtr def,
+vzCapabilitiesPtr vzCaps)
+{
+size_t i, j;
+virDomainDiskDefPtr disk;
+virStorageFileFormat diskFormat;
+bool supported;
+
+for (i = 0; i < def->ndisks; i++) {
+disk = def->disks[i];
+diskFormat = virDomainDiskGetFormat(disk);
+// disk format
+supported = true;
+if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
+if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
+diskFormat != VIR_STORAGE_FILE_NONE) {
+
+if (IS_CT(def))
+supported = vzCaps->ctDiskFormat == diskFormat;
+else
+supported = vzCaps->vmDiskFormat == diskFormat;
+}
+} else {
+if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
+supported = diskFormat == VIR_STORAGE_FILE_RAW ||
+diskFormat == VIR_STORAGE_FILE_NONE ||
+diskFormat == VIR_STORAGE_FILE_AUTO;
+}
+}
+
+if (!supported) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("Unsupported format of disk %s"),
+   disk->src->path);
+return -1;
+}
+//disk bus
+for (j = 0; vzCaps->diskBuses[j] != VIR_DOMAIN_DISK_BUS_LAST; j++) {
+if (disk->bus == vzCaps->diskBuses[j])
+break;
+}
+
+if (vzCaps->diskBuses[j] == VIR_DOMAIN_DISK_BUS_LAST) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("Unsupported disk bus type %s"),
+