Re: [libvirt] [PATCH v2] vz: allow to start vz driver without host cache info

2017-11-07 Thread Mikhail Feoktistov


On 11.07.2017 15:55, Martin Kletzander wrote:

On Tue, Jul 11, 2017 at 03:20:38PM +0300, Mikhail Feoktistov wrote:


On 11.07.2017 12:22, Martin Kletzander wrote:

On Tue, Jul 11, 2017 at 04:59:05AM -0400, Mikhail Feoktistov wrote:

Show warning message instead of fail operation.
It happens if kernel or cpu doesn't support reporting cpu cache info.
In case of Virtuozzo file "id" doesn't exist.


What is your kernel version?


 3.10.0-514.16.1.vz7.30.10

Is there another way of getting the information about the cache ID?
Maybe we need to parse the name of the cache directory 'index2' 
would be

id 2 maybe?  If there is no other way, then this fix is fine (as most
drivers do the same thing), but I would rather fix it if that's
possible.  Unfortunately the cache information is structured stupidly
compared to other kernel-provided topology-related information.

Only kernel 4.11 reports cache ID (maybe 4.10, but not checked)
4.9 doesn't report ID


Oh, so that is just older kernel.  OK, then.

Reviewed-by: Martin Kletzander <mklet...@redhat.com>


ID doesn't match to indexN



Yeah, in vanilla it is number per level and easily deductible, but not
really something we want to add into the code.

Martin, do you agree with this patch?

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] vz: allow to start vz driver without host cache info

2017-07-11 Thread Mikhail Feoktistov


On 11.07.2017 12:22, Martin Kletzander wrote:

On Tue, Jul 11, 2017 at 04:59:05AM -0400, Mikhail Feoktistov wrote:

Show warning message instead of fail operation.
It happens if kernel or cpu doesn't support reporting cpu cache info.
In case of Virtuozzo file "id" doesn't exist.


What is your kernel version?


 3.10.0-514.16.1.vz7.30.10

Is there another way of getting the information about the cache ID?
Maybe we need to parse the name of the cache directory 'index2' would be
id 2 maybe?  If there is no other way, then this fix is fine (as most
drivers do the same thing), but I would rather fix it if that's
possible.  Unfortunately the cache information is structured stupidly
compared to other kernel-provided topology-related information.

Only kernel 4.11 reports cache ID (maybe 4.10, but not checked)
4.9 doesn't report ID
ID doesn't match to indexN

[liveuser@localhost-live ~]$ uname -a
Linux localhost-live 4.11.0-2.fc26.x86_64 #1 SMP Tue May 9 15:24:49 UTC 
2017 x86_64 x86_64 x86_64 GNU/Linux
[liveuser@localhost-live ~]$ cat 
/sys/devices/system/cpu/cpu1/cache/index0/id

0
[liveuser@localhost-live ~]$ cat 
/sys/devices/system/cpu/cpu1/cache/index1/id

0
[liveuser@localhost-live ~]$ cat 
/sys/devices/system/cpu/cpu1/cache/index2/id

0
[liveuser@localhost-live ~]$ cat 
/sys/devices/system/cpu/cpu0/cache/index2/id

0
[liveuser@localhost-live ~]$ cat 
/sys/devices/system/cpu/cpu0/cache/index0/id

0


---
src/vz/vz_driver.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 6f4aee3..eb97e54 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -119,7 +119,7 @@ vzBuildCapabilities(void)
goto error;

if (virCapabilitiesInitCaches(caps) < 0)
-goto error;
+VIR_WARN("Failed to get host CPU cache info");

verify(ARRAY_CARDINALITY(archs) == ARRAY_CARDINALITY(emulators));

--
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] vz: allow to start vz driver without host cache info

2017-07-11 Thread Mikhail Feoktistov
Show warning message instead of fail operation.
It happens if kernel or cpu doesn't support reporting cpu cache info.
In case of Virtuozzo file "id" doesn't exist.
---
 src/vz/vz_driver.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 6f4aee3..eb97e54 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -119,7 +119,7 @@ vzBuildCapabilities(void)
 goto error;
 
 if (virCapabilitiesInitCaches(caps) < 0)
-goto error;
+VIR_WARN("Failed to get host CPU cache info");
 
 verify(ARRAY_CARDINALITY(archs) == ARRAY_CARDINALITY(emulators));
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: allow to start vz driver without host cache info

2017-07-11 Thread Mikhail Feoktistov

Error occurs in src/conf/capabilities.c line 1736

int virCapabilitiesInitCaches(virCapsPtr caps)
...
   if (virFileReadValueUint(>id,
"%s/cpu/cpu%zd/cache/%s/id",
 SYSFS_SYSTEM_PATH, pos, 
ent->d_name) < 0)

  goto cleanup;
...

file "id" doesn't exist

ls -al /sys/devices/system/cpu/cpu0/cache/index0/
total 0
drwxr-xr-x 2 root root0 Jun 30 06:03 .
drwxr-xr-x 6 root root0 Jun 29 04:42 ..
-r--r--r-- 1 root root 4096 Jul 10 06:44 coherency_line_size
-r--r--r-- 1 root root 4096 Jul  5 11:33 level
-r--r--r-- 1 root root 4096 Jul 10 06:44 number_of_sets
-r--r--r-- 1 root root 4096 Jul 10 06:44 physical_line_partition
-r--r--r-- 1 root root 4096 Jul 10 06:44 shared_cpu_list
-r--r--r-- 1 root root 4096 Jul 10 06:44 shared_cpu_map
-r--r--r-- 1 root root 4096 Jul 10 06:44 size
-r--r--r-- 1 root root 4096 Jul 10 06:44 type
-r--r--r-- 1 root root 4096 Jul 10 06:44 ways_of_associativity

On 10.07.2017 15:48, Peter Krempa wrote:

On Mon, Jul 10, 2017 at 07:54:03 -0400, Mikhail Feoktistov wrote:

Any justification or explanation when this happens?


---
  src/vz/vz_driver.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: allow to start vz driver without host cache info

2017-07-10 Thread Mikhail Feoktistov
---
 src/vz/vz_driver.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 6f4aee3..eb97e54 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -119,7 +119,7 @@ vzBuildCapabilities(void)
 goto error;
 
 if (virCapabilitiesInitCaches(caps) < 0)
-goto error;
+VIR_WARN("Failed to get host CPU cache info");
 
 verify(ARRAY_CARDINALITY(archs) == ARRAY_CARDINALITY(emulators));
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 2/2] vz: nseclabels member is moved to virDomainChrSourceDef struct

2017-06-29 Thread Mikhail Feoktistov
---
 src/vz/vz_sdk.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index a62b310..0aa1a30 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2894,7 +2894,7 @@ static int 
prlsdkCheckSerialUnsupportedParams(virDomainChrDefPtr chr)
 return -1;
 }
 
-if (chr->nseclabels > 0) {
+if (chr->source->nseclabels > 0) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Setting security labels is not "
  "supported by vz driver."));
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 0/2] vz: fix vz driver compilation

2017-06-29 Thread Mikhail Feoktistov
Mikhail Feoktistov (2):
  vz: add argument xmlopt for virDomainDefCheckABIStability call
  vz: nseclabels member is moved to virDomainChrSourceDef struct

 src/vz/vz_driver.c | 2 +-
 src/vz/vz_sdk.c| 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 1/2] vz: add argument xmlopt for virDomainDefCheckABIStability call

2017-06-29 Thread Mikhail Feoktistov
---
 src/vz/vz_driver.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index d47774c..6f4aee3 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -872,7 +872,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
  * So forbid this operation, if config is changed. If it's
  * not changed - just do nothing. */
 
-if (!virDomainDefCheckABIStability(dom->def, def)) {
+if (!virDomainDefCheckABIStability(dom->def, def, driver->xmlopt)) 
{
 virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
_("Can't change domain configuration "
  "in managed save state"));
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: fix vz driver compilation

2017-06-28 Thread Mikhail Feoktistov
- add argument xmlopt for virDomainDefCheckABIStability
- nseclabels is moved to virDomainChrSourceDefPtr
---
 src/vz/vz_driver.c | 2 +-
 src/vz/vz_sdk.c| 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index d47774c..6f4aee3 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -872,7 +872,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
  * So forbid this operation, if config is changed. If it's
  * not changed - just do nothing. */
 
-if (!virDomainDefCheckABIStability(dom->def, def)) {
+if (!virDomainDefCheckABIStability(dom->def, def, driver->xmlopt)) 
{
 virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
_("Can't change domain configuration "
  "in managed save state"));
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index a62b310..0aa1a30 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2894,7 +2894,7 @@ static int 
prlsdkCheckSerialUnsupportedParams(virDomainChrDefPtr chr)
 return -1;
 }
 
-if (chr->nseclabels > 0) {
+if (chr->source->nseclabels > 0) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Setting security labels is not "
  "supported by vz driver."));
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: Remove unused variable

2017-03-17 Thread Mikhail Feoktistov
emulatedType is not used in prlsdkAddDomainHardDisksInfo()
---
 src/vz/vz_sdk.c | 5 -
 1 file changed, 5 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 3fd17db..8e6e89d 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -817,14 +817,9 @@ prlsdkAddDomainHardDisksInfo(vzDriverPtr driver, 
PRL_HANDLE sdkdom, virDomainDef
 
 for (i = 0; i < hddCount; ++i) {
 
-PRL_UINT32 emulatedType;
-
 pret = PrlVmCfg_GetHardDisk(sdkdom, i, );
 prlsdkCheckRetGoto(pret, error);
 
-pret = PrlVmDev_GetEmulatedType(hdd, );
-prlsdkCheckRetGoto(pret, error);
-
 if (IS_CT(def) &&
 prlsdkInBootList(sdkdom, hdd)) {
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: correct error message

2017-02-20 Thread Mikhail Feoktistov
---
 src/vz/vz_sdk.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index e16bb0c..84e89a5 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2601,8 +2601,10 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 def->onCrash != VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-   _("on_reboot, on_poweroff and on_crash parameters "
- "are not supported by vz driver"));
+   _("The following parameters must be "
+ "on_reboot = restart, on_poweroff = destroy, "
+ "on_crash = destroy. "
+ "Different actions are not supported by vz driver"));
 return -1;
 }
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 1/2] util: qemu: make qemuSafeSerialParamValue function usable by other drivers

2016-10-20 Thread Mikhail Feoktistov


On 20.10.2016 14:09, Maxim Nestratov wrote:

Rename qemuSafeSerialParamValue to virSafeSerialParamValue and move it to utils

Signed-off-by: Maxim Nestratov 
---
  src/libvirt_private.syms |  1 +
  src/qemu/qemu_command.c  | 19 +--
  src/util/virutil.c   | 16 
  src/util/virutil.h   |  2 ++
  4 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 55b6a24..ec9fe1c 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2649,6 +2649,7 @@ virParseVersionString;
  virPipeReadUntilEOF;
  virReadFCHost;
  virReadSCSIUniqueId;
+virSafeSerialParamValue;
  virScaleInteger;
  virSetBlocking;
  virSetCloseExec;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 8282162..0be2ffa 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -427,23 +427,6 @@ qemuBuildIoEventFdStr(virBufferPtr buf,
  return 0;
  }
  
-#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \

-  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ "
-
-static int
-qemuSafeSerialParamValue(const char *value)
-{
-if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen(value)) {
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _("driver serial '%s' contains unsafe characters"),
-   value);
-return -1;
-}
-
-return 0;
-}
-
-
  static int
  qemuNetworkDriveGetPort(int protocol,
  const char *port)
@@ -1600,7 +1583,7 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
  
  if (disk->serial &&

  virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) {
-if (qemuSafeSerialParamValue(disk->serial) < 0)
+if (virSafeSerialParamValue(disk->serial) < 0)
  goto error;
  if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI &&
  disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 844c947..58ace3f 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -2684,3 +2684,19 @@ virMemoryMaxValue(bool capped)
  else
  return LLONG_MAX;
  }
+
+#define VIR_SERIAL_PARAM_ACCEPTED_CHARS \
+  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ "
+
+int
+virSafeSerialParamValue(const char *value)
+{
+if (strspn(value, VIR_SERIAL_PARAM_ACCEPTED_CHARS) != strlen(value)) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("driver serial '%s' contains unsafe characters"),
+   value);
+return -1;
+}
+
+return 0;
+}
diff --git a/src/util/virutil.h b/src/util/virutil.h
index 8c0d83c..f9b4831 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -252,6 +252,8 @@ unsigned long long virMemoryLimitTruncate(unsigned long 
long value);
  bool virMemoryLimitIsSet(unsigned long long value);
  unsigned long long virMemoryMaxValue(bool ulong);
  
+int virSafeSerialParamValue(const char *value);

+
  /**
   * VIR_ASSIGN_IS_OVERFLOW:
   * @rvalue: value that is checked (evaluated twice)


ACK

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 2/2] vz: support setting disk serial number

2016-10-20 Thread Mikhail Feoktistov

On 20.10.2016 14:09, Maxim Nestratov wrote:

Signed-off-by: Maxim Nestratov 
---
  src/vz/vz_sdk.c   | 19 +++
  src/vz/vz_utils.c |  5 -
  2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index b5b0197..f27441d 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -590,6 +590,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
bool isCt)
  {
  char *buf = NULL;
+char *serial = NULL;
  PRL_RESULT pret;
  PRL_UINT32 emulatedType;
  virDomainDeviceDriveAddressPtr address;
@@ -626,6 +627,18 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
  if (*buf != '\0' && virDomainDiskSetSource(disk, buf) < 0)
  goto cleanup;
  
+serial = prlsdkGetStringParamVar(PrlVmDevHd_GetSerialNumber, prldisk);

+if (serial) {
+if (virSafeSerialParamValue(serial) < 0)
+goto cleanup;
+
+if (*serial == '\0')
+VIR_FREE(serial);
+else
+disk->serial = serial;
+serial = NULL;
+}
+
  if (prlsdkGetDiskId(prldisk, >bus, >dst) < 0)
  goto cleanup;
  
@@ -643,6 +656,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
  
   cleanup:

  VIR_FREE(buf);
+VIR_FREE(serial);
  return ret;
  }
  
@@ -3489,6 +3503,11 @@ static int prlsdkConfigureDisk(vzDriverPtr driver,

  pret = PrlVmDev_SetIfaceType(sdkdisk, sdkbus);
  prlsdkCheckRetGoto(pret, cleanup);
  
+if (disk->serial) {

+pret = PrlVmDevHd_SetSerialNumber(sdkdisk, disk->serial);
+prlsdkCheckRetGoto(pret, cleanup);
+}
+
  pret = PrlVmDev_SetStackIndex(sdkdisk, idx);
  prlsdkCheckRetGoto(pret, cleanup);
  
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c

index eaf09f2..f68b3a1 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -323,11 +323,6 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk)
  return -1;
  }
  
-if (disk->serial) {

-VIR_INFO("%s", _("Setting disk serial number is not "
- "supported by vz driver."));
-}
-
  if (disk->wwn) {
  virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
 _("Setting disk wwn id is not "


ACK

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: set localhost as vnc address

2016-10-18 Thread Mikhail Feoktistov
We should set localhost as vnc address in case of empty string.
Because Virtuozzo sets 0.0.0.0 as default vnc address.
---
 src/vz/vz_sdk.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f2a5c96..7235172 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2967,7 +2967,7 @@ static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom,
 
 glisten = virDomainGraphicsGetListen(gr, 0);
 pret = PrlVmCfg_SetVNCHostName(sdkdom, glisten && glisten->address ?
-   glisten->address : "");
+   glisten->address : "127.0.0.1");
 prlsdkCheckRetGoto(pret, cleanup);
 
 ret = 0;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: fix vnc host address

2016-10-10 Thread Mikhail Feoktistov



On 10.10.2016 11:49, Michal Privoznik wrote:

On 08.10.2016 00:05, Mikhail Feoktistov wrote:

Empty string means 127.0.0.1 in terms of vzSDK
But in this case we should set 0.0.0.0
---
  .gnulib | 2 +-
  src/vz/vz_sdk.c | 2 +-
  2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.gnulib b/.gnulib
index e89b4a7..a2a3943 16
--- a/.gnulib
+++ b/.gnulib
@@ -1 +1 @@
-Subproject commit e89b4a7aefce9cb02963920712ba7cdd13641644
+Subproject commit a2a39436b65f329630df4a93ec4e30aeae403c54
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f2a5c96..7011cbf 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2967,7 +2967,7 @@ static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom,
  
  glisten = virDomainGraphicsGetListen(gr, 0);

  pret = PrlVmCfg_SetVNCHostName(sdkdom, glisten && glisten->address ?
-   glisten->address : "");
+   glisten->address : "0.0.0.0");
  prlsdkCheckRetGoto(pret, cleanup);
  
  ret = 0;



Is this true? I mean, in qemu by default vnc/spice listens on the
localhost and not "0.0.0.0". It's more safe that way. Only if you
configure it to listen on "0.0.0.0" you'll get a widely available socket.

I mean for the following XML:

 
   
 

I'd expect the guest to listen to 127.0.0.1. Or is this approached
differently in vz driver?

Michal

Sorry, I see that I send this patch too early.
I need to research more about vz driver behavior.
Please ignore this patch, I'll send another.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: fix vnc host address

2016-10-07 Thread Mikhail Feoktistov
Empty string means 127.0.0.1 in terms of vzSDK
But in this case we should set 0.0.0.0
---
 .gnulib | 2 +-
 src/vz/vz_sdk.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.gnulib b/.gnulib
index e89b4a7..a2a3943 16
--- a/.gnulib
+++ b/.gnulib
@@ -1 +1 @@
-Subproject commit e89b4a7aefce9cb02963920712ba7cdd13641644
+Subproject commit a2a39436b65f329630df4a93ec4e30aeae403c54
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f2a5c96..7011cbf 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2967,7 +2967,7 @@ static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom,
 
 glisten = virDomainGraphicsGetListen(gr, 0);
 pret = PrlVmCfg_SetVNCHostName(sdkdom, glisten && glisten->address ?
-   glisten->address : "");
+   glisten->address : "0.0.0.0");
 prlsdkCheckRetGoto(pret, cleanup);
 
 ret = 0;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: update domain cache after device updates

2016-08-25 Thread Mikhail Feoktistov


On 25.08.2016 11:33, Nikolay Shirokovskiy wrote:

---
  src/vz/vz_driver.c | 3 +++
  1 file changed, 3 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index b34fe33..f223794 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1694,6 +1694,9 @@ static int vzDomainUpdateDeviceFlags(virDomainPtr domain,
  if (prlsdkUpdateDevice(driver, dom, dev) < 0)
  goto cleanup;
  
+if (prlsdkUpdateDomain(driver, dom) < 0)

+goto cleanup;
+
  ret = 0;
   cleanup:
  


Ack

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] vz: fixed race in vzDomainAttach/DettachDevice

2016-08-18 Thread Mikhail Feoktistov

Ack

On 18.08.2016 15:37, Olga Krishtal wrote:

While dettaching/attaching device in OpenStack, nova
calls vzDomainDettachDevice twice, because the update of the internal
configuration of the ct comes a bit latter than the update event.
As the result, we suffer from the second call to dettach the same device.

Signed-off-by: Olga Krishtal 
---
  src/vz/vz_driver.c | 6 ++
  1 file changed, 6 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 2ed12db..26b14a2 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1193,6 +1193,9 @@ static int vzDomainAttachDeviceFlags(virDomainPtr domain, 
const char *xml,
  if (prlsdkAttachDevice(driver, dom, dev) < 0)
  goto cleanup;
  
+if (prlsdkUpdateDomain(driver, dom) < 0)

+goto cleanup;
+
  ret = 0;
   cleanup:
  virDomainDeviceDefFree(dev);
@@ -1245,6 +1248,9 @@ static int vzDomainDetachDeviceFlags(virDomainPtr domain, 
const char *xml,
  if (prlsdkDetachDevice(driver, dom, dev) < 0)
  goto cleanup;
  
+if (prlsdkUpdateDomain(driver, dom) < 0)

+goto cleanup;
+
  ret = 0;
   cleanup:
  virDomainDeviceDefFree(dev);


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: fixed race in vzDomainAttach/DettachDevice

2016-08-18 Thread Mikhail Feoktistov


On 18.08.2016 14:57, Olga Krishtal wrote:

While dettaching/attaching device in OpenStack, nova
calls vzDomainDettachDevice twice, because the update of the internal
configuration of the ct comes a bit latter than the update event.
As the result, we suffer from the second call to dettach the same device.

Signed-off-by: Olga Krishtal 
---
  src/vz/vz_sdk.c | 12 
  1 file changed, 12 insertions(+)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 68dd5b5..9fbf968 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3594,6 +3594,12 @@ prlsdkAttachDevice(vzDriverPtr driver,
  return -1;
  }
  
+if (prlsdkUpdateDomain(driver, dom) < 0) {

+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+_("Failed to save new config"));
+return -1;
+}
+

I suggest to call prlsdkUpdateDomain from vzDomainDetachDeviceFlags and
vzDomainAttachDeviceFlags.

Example for vzDomainAttachDeviceFlags():

if (vzEnsureDomainExists(dom) < 0)
goto cleanup;

if (prlsdkAttachDevice(driver, dom, dev) < 0)
goto cleanup;

+if (prlsdkUpdateDomain(driver, dom) < 0)
 +   goto cleanup;

ret = 0;
 cleanup:
virDomainDeviceDefFree(dev);
if (job)
vzDomainObjEndJob(dom);



  job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
  if (PRL_FAILED(waitDomainJob(job, dom)))
  return -1;
@@ -3661,6 +3667,12 @@ prlsdkDetachDevice(vzDriverPtr driver,
  goto cleanup;
  }
  
+if (prlsdkUpdateDomain(driver, dom) < 0) {

+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+_("Failed to save new config"));
+goto cleanup;
+}
+
  job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
  if (PRL_FAILED(waitDomainJob(job, dom)))
  goto cleanup;


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: add validation callbacks

2016-08-18 Thread Mikhail Feoktistov


On 18.08.2016 14:47, Maxim Nestratov wrote:

18-Aug-16 14:43, Mikhail Feoktistov пишет:


This patch fixes a bug which occurs when we check a bus and unit number
for a new attached disk. We should do this check in ValidadionCallback,
not in PostParse callback. Because in PostParse we have not initialized
disk->info.addr.drive struct yet.
Move part of code from domainPostParseCallback to domainValidateCallback
and part from devicesPostParseCallback to deviceValidateCallback.
PostParse callbacks are for modification data.
ValidateCallbacks are only for checks.
---
  src/vz/vz_driver.c | 23 +--
  src/vz/vz_utils.c  |  2 +-
  src/vz/vz_utils.h  |  2 +-
  3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index b1b6d14..e9f9a17 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -232,6 +232,7 @@ vzConnectGetCapabilities(virConnectPtr conn)
  xml = virCapabilitiesFormatXML(privconn->driver->caps);
  return xml;
  }
+


Unrelated

small cosmetic fix



  static int
  vzDomainDefAddDefaultInputDevices(virDomainDefPtr def)
  {
@@ -258,11 +259,19 @@ static int
  vzDomainDefPostParse(virDomainDefPtr def,
   virCapsPtr caps ATTRIBUTE_UNUSED,
   unsigned int parseFlags ATTRIBUTE_UNUSED,
- void *opaque)
+ void *opaque ATTRIBUTE_UNUSED)
  {
  if (vzDomainDefAddDefaultInputDevices(def) < 0)
  return -1;
  +return 0;
+}
+
+static int
+vzDomainDefValidate(const virDomainDef *def,
+virCapsPtr caps ATTRIBUTE_UNUSED,
+void *opaque)
+{
  if (vzCheckUnsupportedControllers(def, opaque) < 0)
  return -1;
  @@ -284,6 +293,14 @@ 
vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,

  VIR_STRDUP(dev->data.net->model, "e1000") < 0)
  return -1;
  +return 0;
+}
+
+static int
+vzDomainDeviceDefValidate(const virDomainDeviceDef *dev,
+  const virDomainDef *def,
+  void *opaque ATTRIBUTE_UNUSED)
+{
  if (dev->type == VIR_DOMAIN_DEVICE_DISK)
  return vzCheckUnsupportedDisk(def, dev->data.disk, opaque);
  else if (dev->type == VIR_DOMAIN_DEVICE_GRAPHICS)
@@ -299,8 +316,10 @@ static virDomainXMLPrivateDataCallbacks 
vzDomainXMLPrivateDataCallbacksPtr = {

static virDomainDefParserConfig vzDomainDefParserConfig = {
  .macPrefix = {0x42, 0x1C, 0x00},
-.devicesPostParseCallback = vzDomainDeviceDefPostParse,
  .domainPostParseCallback = vzDomainDefPostParse,
+.devicesPostParseCallback = vzDomainDeviceDefPostParse,
+.domainValidateCallback = vzDomainDefValidate,
+.deviceValidateCallback = vzDomainDeviceDefValidate,
  };
static vzDriverPtr
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index 312355d..eaf09f2 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -463,7 +463,7 @@ vzCheckUnsupportedDisk(const virDomainDef *def,
  }
int
-vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr 
vzCaps)
+vzCheckUnsupportedControllers(const virDomainDef *def, 
vzCapabilitiesPtr vzCaps)

  {
  size_t i, j;
  virDomainControllerDefPtr controller;
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index d033f94..4b407ec 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -137,7 +137,7 @@ vzCheckUnsupportedDisk(const virDomainDef *def,
 virDomainDiskDefPtr disk,
 vzCapabilitiesPtr vzCaps);
  int
-vzCheckUnsupportedControllers(virDomainDefPtr def,
+vzCheckUnsupportedControllers(const virDomainDef *def,
vzCapabilitiesPtr vzCaps);
  int
  vzGetDefaultSCSIModel(vzDriverPtr driver,


ACK


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH] vz: add validation callbacks

2016-08-18 Thread Mikhail Feoktistov
This patch fixes a bug which occurs when we check a bus and unit number
for a new attached disk. We should do this check in ValidadionCallback,
not in PostParse callback. Because in PostParse we have not initialized
disk->info.addr.drive struct yet.
Move part of code from domainPostParseCallback to domainValidateCallback
and part from devicesPostParseCallback to deviceValidateCallback.
PostParse callbacks are for modification data.
ValidateCallbacks are only for checks.
---
 src/vz/vz_driver.c | 23 +--
 src/vz/vz_utils.c  |  2 +-
 src/vz/vz_utils.h  |  2 +-
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index b1b6d14..e9f9a17 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -232,6 +232,7 @@ vzConnectGetCapabilities(virConnectPtr conn)
 xml = virCapabilitiesFormatXML(privconn->driver->caps);
 return xml;
 }
+
 static int
 vzDomainDefAddDefaultInputDevices(virDomainDefPtr def)
 {
@@ -258,11 +259,19 @@ static int
 vzDomainDefPostParse(virDomainDefPtr def,
  virCapsPtr caps ATTRIBUTE_UNUSED,
  unsigned int parseFlags ATTRIBUTE_UNUSED,
- void *opaque)
+ void *opaque ATTRIBUTE_UNUSED)
 {
 if (vzDomainDefAddDefaultInputDevices(def) < 0)
 return -1;
 
+return 0;
+}
+
+static int
+vzDomainDefValidate(const virDomainDef *def,
+virCapsPtr caps ATTRIBUTE_UNUSED,
+void *opaque)
+{
 if (vzCheckUnsupportedControllers(def, opaque) < 0)
 return -1;
 
@@ -284,6 +293,14 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
 VIR_STRDUP(dev->data.net->model, "e1000") < 0)
 return -1;
 
+return 0;
+}
+
+static int
+vzDomainDeviceDefValidate(const virDomainDeviceDef *dev,
+  const virDomainDef *def,
+  void *opaque ATTRIBUTE_UNUSED)
+{
 if (dev->type == VIR_DOMAIN_DEVICE_DISK)
 return vzCheckUnsupportedDisk(def, dev->data.disk, opaque);
 else if (dev->type == VIR_DOMAIN_DEVICE_GRAPHICS)
@@ -299,8 +316,10 @@ static virDomainXMLPrivateDataCallbacks 
vzDomainXMLPrivateDataCallbacksPtr = {
 
 static virDomainDefParserConfig vzDomainDefParserConfig = {
 .macPrefix = {0x42, 0x1C, 0x00},
-.devicesPostParseCallback = vzDomainDeviceDefPostParse,
 .domainPostParseCallback = vzDomainDefPostParse,
+.devicesPostParseCallback = vzDomainDeviceDefPostParse,
+.domainValidateCallback = vzDomainDefValidate,
+.deviceValidateCallback = vzDomainDeviceDefValidate,
 };
 
 static vzDriverPtr
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index 312355d..eaf09f2 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -463,7 +463,7 @@ vzCheckUnsupportedDisk(const virDomainDef *def,
 }
 
 int
-vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps)
+vzCheckUnsupportedControllers(const virDomainDef *def, vzCapabilitiesPtr 
vzCaps)
 {
 size_t i, j;
 virDomainControllerDefPtr controller;
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index d033f94..4b407ec 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -137,7 +137,7 @@ vzCheckUnsupportedDisk(const virDomainDef *def,
virDomainDiskDefPtr disk,
vzCapabilitiesPtr vzCaps);
 int
-vzCheckUnsupportedControllers(virDomainDefPtr def,
+vzCheckUnsupportedControllers(const virDomainDef *def,
   vzCapabilitiesPtr vzCaps);
 int
 vzGetDefaultSCSIModel(vzDriverPtr driver,
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2 0/7] qemu: util: vz: some fixes and improvements

2016-08-17 Thread Mikhail Feoktistov
Ack the series, except [PATCH v2 7/7] vz: relax disk bus controller and 
device indices check


On 16.08.2016 15:24, Maxim Nestratov wrote:

v1-v2 changes:
- fixed "vz: reset errors after ignoring return values"
- added "vz: relax disk bus controller and device indices check"

Maxim Nestratov (6):
   vz: get additional error information from job correctly
   util: fix crash in virClassIsDerivedFrom for CloseCallbacks objects
   vz: don't fail query domain info in case we don't have valid stats
 handle
   vz: reset errors after ignoring return values
   vz: specify VIR_DOMAIN_NET_TYPE_NETWORK for routed networks
   vz: relax disk bus controller and device indices check

Yuri Pudgorodskiy (1):
   qemu: guest agent: introduce new error code VIR_ERR_AGENT_UNSYNCED

  include/libvirt/virterror.h  |  2 ++
  src/qemu/qemu_agent.c|  6 +++---
  src/util/virclosecallbacks.c |  3 +++
  src/util/virerror.c  |  6 ++
  src/vz/vz_driver.c   | 13 +
  src/vz/vz_sdk.c  | 42 --
  src/vz/vz_utils.c|  8 
  7 files changed, 47 insertions(+), 33 deletions(-)



--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2 7/7] vz: relax disk bus controller and device indices check

2016-08-17 Thread Mikhail Feoktistov
I think there is a better solution, we should move our checks from 
postParse callback to validateCallback.

I'm doing patch series now, so we can discuss these changes a bit later.

On 16.08.2016 15:24, Maxim Nestratov wrote:

We should not be too strict regarding device indices check
because it is not really necessary and in fact it breaks
some common scenarios when CD-ROMs are added as the only deivce
on IDE bus with /dev/hdd device name, which corresponds to
ide0-1-1 device indices, rather than ide0-0-0(hda).

Signed-off-by: Maxim Nestratov 
---
  src/vz/vz_utils.c | 8 
  1 file changed, 8 deletions(-)

diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index 312355d..c707309 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -279,14 +279,6 @@ 
vzCheckDiskAddressDriveUnsupportedParams(virDomainDiskDefPtr disk)
  return -1;
  }
  
-if (busIdx != drive->bus || devIdx != drive->unit) {

-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("Invalid drive address of disk %s, vz driver "
- "does not support non default name mappings."),
-   disk->dst);
-return -1;
-}
-
  return 0;
  }
  


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: getting bus type for containers

2016-08-15 Thread Mikhail Feoktistov
We should query bus type for containers too, like for VM.
In openstack we add volume disk like SCSI, so we can't
hardcode SATA bus.
---
 src/vz/vz_sdk.c | 32 +---
 1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f81b320..c4a1c3d 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -47,7 +47,7 @@ VIR_LOG_INIT("parallels.sdk");
 static PRL_HANDLE
 prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac);
 static PRL_HANDLE
-prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt);
+prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk);
 
 /*
  * Log error description
@@ -547,7 +547,7 @@ prlsdkAddDomainVideoInfoVm(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 }
 
 static int
-prlsdkGetDiskId(PRL_HANDLE disk, bool isCt, int *bus, char **dst)
+prlsdkGetDiskId(PRL_HANDLE disk, int *bus, char **dst)
 {
 PRL_RESULT pret;
 PRL_UINT32 pos, ifType;
@@ -555,13 +555,8 @@ prlsdkGetDiskId(PRL_HANDLE disk, bool isCt, int *bus, char 
**dst)
 pret = PrlVmDev_GetStackIndex(disk, );
 prlsdkCheckRetExit(pret, -1);
 
-/* Let physical devices added to CT look like SATA disks */
-if (isCt) {
-ifType = PMS_SATA_DEVICE;
-} else {
-pret = PrlVmDev_GetIfaceType(disk, );
-prlsdkCheckRetExit(pret, -1);
-}
+pret = PrlVmDev_GetIfaceType(disk, );
+prlsdkCheckRetExit(pret, -1);
 
 switch (ifType) {
 case PMS_IDE_DEVICE:
@@ -632,7 +627,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
 if (*buf != '\0' && virDomainDiskSetSource(disk, buf) < 0)
 goto cleanup;
 
-if (prlsdkGetDiskId(prldisk, isCt, >bus, >dst) < 0)
+if (prlsdkGetDiskId(prldisk, >bus, >dst) < 0)
 goto cleanup;
 
 if (virDiskNameToBusDeviceIndex(disk, , ) < 0)
@@ -1598,7 +1593,7 @@ prlsdkBootOrderCheck(PRL_HANDLE sdkdom, PRL_DEVICE_TYPE 
sdkType, int sdkIndex,
 goto cleanup;
 }
 
-if (prlsdkGetDiskId(dev, false, , ) < 0)
+if (prlsdkGetDiskId(dev, , ) < 0)
 goto cleanup;
 
 if (!(bus == disk->bus && STREQ(disk->dst, dst)))
@@ -3409,7 +3404,6 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac)
 static int prlsdkConfigureDisk(vzDriverPtr driver,
PRL_HANDLE sdkdom,
virDomainDiskDefPtr disk,
-   bool isCt,
bool create)
 {
 PRL_RESULT pret;
@@ -3432,7 +3426,7 @@ static int prlsdkConfigureDisk(vzDriverPtr driver,
 pret = PrlVmCfg_CreateVmDev(sdkdom, devType, );
 prlsdkCheckRetGoto(pret, cleanup);
 } else {
-sdkdisk = prlsdkGetDisk(sdkdom, disk, isCt);
+sdkdisk = prlsdkGetDisk(sdkdom, disk);
 if (sdkdisk == PRL_INVALID_HANDLE)
 return -1;
 }
@@ -3499,7 +3493,7 @@ static int prlsdkConfigureDisk(vzDriverPtr driver,
 }
 
 static PRL_HANDLE
-prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt)
+prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk)
 {
 PRL_RESULT pret;
 PRL_UINT32 num;
@@ -3521,7 +3515,7 @@ prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr 
disk, bool isCt)
 pret = PrlVmCfg_GetDevByType(sdkdom, devType, i, );
 prlsdkCheckRetGoto(pret, error);
 
-if (prlsdkGetDiskId(sdkdisk, isCt, , ) < 0)
+if (prlsdkGetDiskId(sdkdisk, , ) < 0)
 goto error;
 
 if (disk->bus == bus && STREQ(disk->dst, dst)) {
@@ -3560,7 +3554,7 @@ prlsdkAttachDevice(vzDriverPtr driver,
 switch (dev->type) {
 case VIR_DOMAIN_DEVICE_DISK:
 if (prlsdkConfigureDisk(driver, privdom->sdkdom,
-dev->data.disk, IS_CT(dom->def), true) < 0)
+dev->data.disk, true) < 0)
 return -1;
 
 break;
@@ -3618,7 +3612,7 @@ prlsdkDetachDevice(vzDriverPtr driver,
 
 switch (dev->type) {
 case VIR_DOMAIN_DEVICE_DISK:
-sdkdev = prlsdkGetDisk(privdom->sdkdom, dev->data.disk, 
IS_CT(dom->def));
+sdkdev = prlsdkGetDisk(privdom->sdkdom, dev->data.disk);
 if (sdkdev == PRL_INVALID_HANDLE)
 goto cleanup;
 
@@ -3688,7 +3682,7 @@ prlsdkUpdateDevice(vzDriverPtr driver,
 switch (dev->type) {
 case VIR_DOMAIN_DEVICE_DISK:
 if (prlsdkConfigureDisk(driver, privdom->sdkdom, dev->data.disk,
-IS_CT(dom->def), false) < 0)
+false) < 0)
 return -1;
 
 break;
@@ -3981,7 +3975,7 @@ prlsdkDoApplyConfig(vzDriverPtr driver,
 
 for (i = 0; i < def->ndisks; i++) {
 if (prlsdkConfigureDisk(driver, sdkdom, def->disks[i],
-IS_CT(def), true) < 0)
+true) < 0)
 goto error;
 }
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 2/6] vz: get additional error information from job correctly

2016-08-12 Thread Mikhail Feoktistov



On 10.08.2016 20:44, Maxim Nestratov wrote:

First, make function logPrlEventErrorHelper be void and only
print information (if any) from an event.
Second, don't rewrite original error with any errors we get
during parsing event info.
Third, ignore PRL_ERR_NO_DATA at all.

Signed-off-by: Maxim Nestratov 
---
  src/vz/vz_sdk.c | 32 ++--
  1 file changed, 14 insertions(+), 18 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f81b320..45cac65 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -105,19 +105,12 @@ logPrlErrorHelper(PRL_RESULT err, const char *filename,
  }  \
  } while (0)
  
-static PRL_RESULT

+static void
  logPrlEventErrorHelper(PRL_HANDLE event, const char *filename,
 const char *funcname, size_t linenr)
  {
-PRL_RESULT ret, retCode;
  char *msg1 = NULL, *msg2 = NULL;
  PRL_UINT32 len = 0;
-int err = -1;
-
-if ((ret = PrlEvent_GetErrCode(event, ))) {
-logPrlError(ret);
-return ret;
-}
  
  PrlEvent_GetErrString(event, PRL_TRUE, PRL_FALSE, NULL, );
  
@@ -136,13 +129,9 @@ logPrlEventErrorHelper(PRL_HANDLE event, const char *filename,

  virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INTERNAL_ERROR,
   filename, funcname, linenr,
   _("%s %s"), msg1, msg2);
-err = 0;
-
   cleanup:
  VIR_FREE(msg1);
  VIR_FREE(msg2);
-
-return err;
  }
  
  static PRL_RESULT

@@ -152,12 +141,12 @@ getJobResultHelper(PRL_HANDLE job, unsigned int timeout, 
PRL_HANDLE *result,
  {
  PRL_RESULT ret, retCode;
  
-if ((ret = PrlJob_Wait(job, timeout))) {

+if (PRL_FAILED(ret = PrlJob_Wait(job, timeout))) {
  logPrlErrorHelper(ret, filename, funcname, linenr);
  goto cleanup;
  }
  
-if ((ret = PrlJob_GetRetCode(job, ))) {

+if (PRL_FAILED(ret = PrlJob_GetRetCode(job, ))) {
  logPrlErrorHelper(ret, filename, funcname, linenr);
  goto cleanup;
  }
@@ -165,17 +154,24 @@ getJobResultHelper(PRL_HANDLE job, unsigned int timeout, 
PRL_HANDLE *result,
  if (retCode) {
  PRL_HANDLE err_handle;
  
+ret = retCode;

+

I think we don't need to store retCode to ret

  /* Sometimes it's possible to get additional error info. */
-if ((ret = PrlJob_GetError(job, _handle))) {
+if (PRL_FAILED(ret = PrlJob_GetError(job, _handle))) {
  logPrlErrorHelper(ret, filename, funcname, linenr);
  goto cleanup;
  }
  
-if (logPrlEventErrorHelper(err_handle, filename, funcname, linenr))

-logPrlErrorHelper(retCode, filename, funcname, linenr);
+if (PRL_FAILED(retCode = PrlEvent_GetErrCode(err_handle, ))) {
+logPrlErrorHelper(ret, filename, funcname, linenr);
+if (PRL_ERR_NO_DATA != retCode)
+logPrlError(retCode);
+goto cleanup;
+}
+
+logPrlEventErrorHelper(err_handle, filename, funcname, linenr);
  
  PrlHandle_Free(err_handle);

-ret = retCode;
  } else {
  ret = PrlJob_GetResult(job, result);
  if (PRL_FAILED(ret)) {


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: implementation of domainSetUserPassword callback

2016-05-27 Thread Mikhail Feoktistov
---
 .gnulib|  2 +-
 src/vz/vz_driver.c | 20 
 src/vz/vz_sdk.c| 31 +++
 src/vz/vz_sdk.h|  5 -
 4 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/.gnulib b/.gnulib
index 8d807a9..6cc32c6 16
--- a/.gnulib
+++ b/.gnulib
@@ -1 +1 @@
-Subproject commit 8d807a99c6e8eecd2a9cf7c7b5d48ec0b2c934f8
+Subproject commit 6cc32c63e80bc1a30c521b2f07f2b54909b59892
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 177a57a..b204248 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1252,6 +1252,25 @@ static int vzDomainDetachDevice(virDomainPtr dom, const 
char *xml)
  VIR_DOMAIN_AFFECT_CONFIG | 
VIR_DOMAIN_AFFECT_LIVE);
 }
 
+static int
+vzDomainSetUserPassword(virDomainPtr domain,
+const char *user,
+const char *password,
+unsigned int flags)
+{
+virDomainObjPtr dom = NULL;
+int ret = -1;
+
+virCheckFlags(0, -1);
+if (!(dom = vzDomObjFromDomain(domain)))
+return -1;
+
+ret = prlsdkDomainSetUserPassword(dom, user, password);
+
+virObjectUnlock(dom);
+return ret;
+}
+
 static unsigned long long
 vzDomainGetMaxMemory(virDomainPtr domain)
 {
@@ -2716,6 +2735,7 @@ static virHypervisorDriver vzHypervisorDriver = {
 .domainIsUpdated = vzDomainIsUpdated, /* 1.2.21 */
 .domainGetVcpusFlags = vzDomainGetVcpusFlags, /* 1.2.21 */
 .domainGetMaxVcpus = vzDomainGetMaxVcpus, /* 1.2.21 */
+.domainSetUserPassword = vzDomainSetUserPassword, /* 1.2.16 */
 .connectDomainEventRegisterAny = vzConnectDomainEventRegisterAny, /* 
1.2.10 */
 .connectDomainEventDeregisterAny = vzConnectDomainEventDeregisterAny, /* 
1.2.10 */
 .nodeGetCPUMap = vzNodeGetCPUMap, /* 1.2.8 */
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 7eb78ca..4e06b7f 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3565,6 +3565,37 @@ prlsdkSetBootOrderVm(PRL_HANDLE sdkdom, virDomainDefPtr 
def)
 return 0;
 }
 
+int
+prlsdkDomainSetUserPassword(virDomainObjPtr dom,
+const char *user,
+const char *password)
+{
+int ret = -1;
+vzDomObjPtr privdom = dom->privateData;
+PRL_HANDLE job = PRL_INVALID_HANDLE;
+
+job = PrlVm_BeginEdit(privdom->sdkdom);
+if (PRL_FAILED(waitJob(job)))
+goto cleanup;
+
+job = PrlVm_SetUserPasswd(privdom->sdkdom,
+  user,
+  password,
+  0);
+
+if (PRL_FAILED(waitJob(job)))
+goto cleanup;
+
+job = PrlVm_CommitEx(privdom->sdkdom, 0);
+if (PRL_FAILED(waitJob(job)))
+goto cleanup;
+
+ret = 0;
+
+ cleanup:
+return ret;
+}
+
 static int
 prlsdkDoApplyConfig(vzDriverPtr driver,
 PRL_HANDLE sdkdom,
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index f570560..a3c423a 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -82,7 +82,10 @@ void
 prlsdkDomObjFreePrivate(void *p);
 /* memsize is in MiB */
 int prlsdkSetMemsize(virDomainObjPtr dom, unsigned int memsize);
-
+int
+prlsdkDomainSetUserPassword(virDomainObjPtr dom,
+const char *user,
+const char *password);
 virDomainSnapshotObjListPtr prlsdkLoadSnapshots(virDomainObjPtr dom);
 int prlsdkCreateSnapshot(virDomainObjPtr dom, const char *description);
 int prlsdkDeleteSnapshot(virDomainObjPtr dom, const char *uuid, bool children);
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] util: compilation fix if build without GNUTLS library

2016-05-21 Thread Mikhail Feoktistov
---
 src/util/vircrypto.c | 13 +++--
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/util/vircrypto.c b/src/util/vircrypto.c
index 5183d49..4f288f0 100644
--- a/src/util/vircrypto.c
+++ b/src/util/vircrypto.c
@@ -24,6 +24,7 @@
 #include "virlog.h"
 #include "virerror.h"
 #include "viralloc.h"
+#include "virrandom.h"
 
 #include "md5.h"
 #include "sha256.h"
@@ -220,14 +221,14 @@ virCryptoEncryptDataAESgnutls(gnutls_cipher_algorithm_t 
gnutls_enc_alg,
  */
 int
 virCryptoEncryptData(virCryptoCipher algorithm,
- uint8_t *enckey,
+ uint8_t *enckey ATTRIBUTE_UNUSED,
  size_t enckeylen,
- uint8_t *iv,
+ uint8_t *iv ATTRIBUTE_UNUSED,
  size_t ivlen,
- uint8_t *data,
- size_t datalen,
- uint8_t **ciphertext,
- size_t *ciphertextlen)
+ uint8_t *data ATTRIBUTE_UNUSED,
+ size_t datalen ATTRIBUTE_UNUSED,
+ uint8_t **ciphertext ATTRIBUTE_UNUSED,
+ size_t *ciphertextlen ATTRIBUTE_UNUSED)
 {
 switch (algorithm) {
 case VIR_CRYPTO_CIPHER_AES256CBC:
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: add error code for case if vm is already stopped

2016-05-21 Thread Mikhail Feoktistov
If try to stop VM or container which is already stopped than
Virtuozzo 7 returns code PRL_ERR_INVALID_ACTION_REQUESTED.
Error code PRL_ERR_DISP_VM_IS_NOT_STARTED is used in Virtuozzo 6
---
 src/vz/vz_sdk.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index a396d41..7eb78ca 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2050,6 +2050,7 @@ prlsdkDomainChangeStateLocked(vzDriverPtr driver,
 switch (pret) {
 case PRL_ERR_DISP_VM_IS_NOT_STARTED:
 case PRL_ERR_DISP_VM_IS_NOT_STOPPED:
+case PRL_ERR_INVALID_ACTION_REQUESTED:
 virerr = VIR_ERR_OPERATION_INVALID;
 break;
 default:
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] storage: dir: adapts .wipeVol for ploop volumes

2016-05-17 Thread Mikhail Feoktistov



On 16.05.2016 10:19, Olga Krishtal wrote:

The modification of .volWipe callback wipes ploop volume using one of
given wiping algorithm: dod, nnsa, etc.
However, in case of ploop volume we need to reinitialize root.hds and 
DiskDescriptor.xml.

Signed-off-by: Olga Krishtal 
---
  src/storage/storage_backend.c | 58 ++-
  1 file changed, 52 insertions(+), 6 deletions(-)

diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index d47a76a..367a887 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -2295,6 +2295,45 @@ virStorageBackendWipeLocal(virStorageVolDefPtr vol,
  return ret;
  }
  
+static int

+virStorageBackendVolWipePloop(virStorageVolDefPtr vol)
+{
+virCommandPtr cmd = NULL;
+char *target_path = NULL;
+char *disk_desc = NULL;
+int ret = -1;
+
+if (virAsprintf(_path, "%s/root.hds", vol->target.path) < 0)
+goto cleanup;
+
+if (virAsprintf(_desc, "%s/DiskDescriptor.xml", vol->target.path) < 0)
+goto cleanup;
+
+if (virFileRemove(disk_desc, 0, 0) < 0) {
+virReportError(errno, _("Failed to delete DiskDescriptor.xml of volume 
'%s'"),
+   vol->target.path);
+goto cleanup;
+}
+if (virFileRemove(target_path, 0, 0) < 0) {
+virReportError(errno, _("failed to delete root.hds of volume '%s'"),
+   vol->target.path);
+goto cleanup;
+}
+
+cmd = virCommandNewArgList("ploop", "init", "-s", NULL);
+
+virCommandAddArgFormat(cmd, "%lluM", VIR_DIV_UP(vol->target.capacity,
+(1024 * 1024)));
+virCommandAddArgList(cmd, "-t", "ext4", NULL);
+virCommandAddArgFormat(cmd, "%s/root.hds", vol->target.path);
+ret = virCommandRun(cmd, NULL);
+
+ cleanup:
+VIR_FREE(disk_desc);
+VIR_FREE(target_path);
+virCommandFree(cmd);
+return ret;
+}
  
  int

  virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
@@ -2307,6 +2346,8 @@ virStorageBackendVolWipeLocal(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  const char *alg_char = NULL;
  struct stat st;
  virCommandPtr cmd = NULL;
+char *path = NULL;
+char *target_path = vol->target.path;
  
  virCheckFlags(0, -1);
  
@@ -2314,12 +2355,12 @@ virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,

vol->target.path, algorithm);
  
  if (vol->target.format == VIR_STORAGE_FILE_PLOOP) {

-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-   _("wiping for ploop volumes is not supported"));
-goto cleanup;
+if (virAsprintf(, "%s/root.hds", vol->target.path) < 0)
+goto cleanup;
+target_path = path;
  }
  
-fd = open(vol->target.path, O_RDWR);

+fd = open(target_path, O_RDWR);
  if (fd == -1) {
  virReportSystemError(errno,
   _("Failed to open storage volume with path 
'%s'"),
@@ -2376,13 +2417,12 @@ virStorageBackendVolWipeLocal(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  if (algorithm != VIR_STORAGE_VOL_WIPE_ALG_ZERO) {
  cmd = virCommandNew(SCRUB);
  virCommandAddArgList(cmd, "-f", "-p", alg_char,
- vol->target.path, NULL);
+ target_path, NULL);
  
  if (virCommandRun(cmd, NULL) < 0)

  goto cleanup;
  
  ret = 0;

-goto cleanup;
  } else {
  if (S_ISREG(st.st_mode) && st.st_blocks < (st.st_size / DEV_BSIZE)) {
  ret = virStorageBackendVolZeroSparseFileLocal(vol, st.st_size, 
fd);
@@ -2392,10 +2432,16 @@ virStorageBackendVolWipeLocal(virConnectPtr conn 
ATTRIBUTE_UNUSED,
   vol->target.allocation,
   st.st_blksize);
  }
+if (ret < 0)
+goto cleanup;
  }
  
+if (vol->target.format == VIR_STORAGE_FILE_PLOOP)

+ret = virStorageBackendVolWipePloop(vol);
+
   cleanup:
  virCommandFree(cmd);
+VIR_FREE(path);
  VIR_FORCE_CLOSE(fd);
  return ret;
  }


Ack

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: fix disk enumeration

2016-04-27 Thread Mikhail Feoktistov
If we want to delete all disks for container or vm
we should make a loop from 0 to NumberOfDisks and always
use zero index in PrlVmCfg_GetHardDisk to get disk handle.
When we delete first disk after that numbers of other disks
will be changed, start from 0 to NumberOfDisks-1.
That's why we should always use zero index.
---
 src/vz/vz_sdk.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 8cc8430..70d61e5 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3810,7 +3810,7 @@ prlsdkDetachDomainHardDisks(PRL_HANDLE sdkdom)
 prlsdkCheckRetGoto(pret, cleanup);
 
 for (i = 0; i < hddCount; ++i) {
-pret = PrlVmCfg_GetHardDisk(sdkdom, i, );
+pret = PrlVmCfg_GetHardDisk(sdkdom, 0, );
 prlsdkCheckRetGoto(pret, cleanup);
 
 pret = PrlVmDev_Remove(sdkdisk);
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: correct iomode check

2016-04-12 Thread Mikhail Feoktistov
Virtuozzo hypervisor supports native iomode.
So we should allow to add disk with iomode "native" or "default".
---
 src/vz/vz_utils.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index fed48a5..a89cf73 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -332,9 +332,10 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk)
 return -1;
 }
 
-if (disk->iomode) {
+if (disk->iomode != VIR_DOMAIN_DISK_IO_DEFAULT &&
+disk->iomode != VIR_DOMAIN_DISK_IO_NATIVE) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-   _("Setting disk io mode is not "
+   _("Only native iomode is "
  "supported by vz driver."));
 return -1;
 }
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] add func to set shared drivers after libvirtd init

2016-04-08 Thread Mikhail Feoktistov


On 07.04.2016 19:28, Maxim Nestratov wrote:

19.11.2015 15:22, Mikhail Feoktistov пишет:

Diff from v1:
Remove vz prefix from the title of this letter. Because this is the 
common case

for all drivers in libvirt.

Description:
Built-in drivers in libvirt are initialized before libvirtd 
initialization.

Libvirt loads shared drivers on libvirtd initialization step.
For built-in drivers we can't set shared drivers, because they are 
not initialized yet.

This patch adds function to set shared drivers after libvirtd init.
---
  daemon/libvirtd.c|  4 
  src/libvirt.c| 41 
+

  src/libvirt_internal.h   |  1 +
  src/libvirt_private.syms |  1 +
  4 files changed, 47 insertions(+)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 250094b..aac1826 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -431,6 +431,10 @@ static void daemonInitialize(void)
  bhyveRegister();
  # endif
  #endif
+# ifdef WITH_VZ
+virAssignSharedDrivers("vz");
+virAssignSharedDrivers("Parallels");
+# endif
  }
diff --git a/src/libvirt.c b/src/libvirt.c
index 25a0040..1763be7 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -1433,3 +1433,44 @@ virTypedParameterValidateSet(virConnectPtr conn,
  }
  return 0;
  }
+
+/**
+ * virAssignSharedDrivers:
+ * @name: name of connection driver
+ *
+ * This function fills in any empty pointers for shared drivers
+ * in connect driver structure
+ *
+ * Returns 0 in case of success, -1 in case of error
+*/
+int
+virAssignSharedDrivers(const char *name)
+{
+size_t i;
+
+if (name == NULL) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Driver name must be specified"));
+return -1;
+}
+
+for (i = 0; i < virConnectDriverTabCount; i++) {
+if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name, 
name)) {

+if (virConnectDriverTab[i]->interfaceDriver == NULL)
+virConnectDriverTab[i]->interfaceDriver = 
virSharedInterfaceDriver;

+if (virConnectDriverTab[i]->networkDriver == NULL)
+virConnectDriverTab[i]->networkDriver = 
virSharedNetworkDriver;

+if (virConnectDriverTab[i]->nodeDeviceDriver == NULL)
+virConnectDriverTab[i]->nodeDeviceDriver = 
virSharedNodeDeviceDriver;

+if (virConnectDriverTab[i]->nwfilterDriver == NULL)
+virConnectDriverTab[i]->nwfilterDriver = 
virSharedNWFilterDriver;

+if (virConnectDriverTab[i]->secretDriver == NULL)
+virConnectDriverTab[i]->secretDriver = 
virSharedSecretDriver;

+if (virConnectDriverTab[i]->storageDriver == NULL)
+virConnectDriverTab[i]->storageDriver = 
virSharedStorageDriver;

+break;
+   }
+}
+
+return 0;
+}
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 1313b58..2a7227b 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -289,4 +289,5 @@ virTypedParameterValidateSet(virConnectPtr conn,
   virTypedParameterPtr params,
   int nparams);
  +int virAssignSharedDrivers(const char *name);
  #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a835f18..a0fcdf5 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -943,6 +943,7 @@ virFDStreamSetInternalCloseCb;
  # libvirt_internal.h
+virAssignSharedDrivers;
  virConnectSupportsFeature;
  virDomainMigrateBegin3;
  virDomainMigrateBegin3Params;


It looks like this patch is not necessary anymore as far as changes 
proposed in the series [1] seem to be the better way to use shared 
drivers.


Maxim

[1] https://www.redhat.com/archives/libvir-list/2016-March/msg01357.html

I agree. Please, do not push this patch.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH v2 0/7] vz: add disk and controller check in domainPostParse phase

2016-03-19 Thread Mikhail Feoktistov

ACK to the series, but please fix [patch 4/7]

On 16.03.2016 17:21, Maxim Nestratov wrote:

Changes from v1
===

A new patch moving prlsdkCheckDiskUnsupportedParams to vz_utils.c added.
Commit messages reworded.
Minor formatting issues fixed.

Maxim Nestratov (1):
   vz: move prlsdkCheckDiskUnsupportedParams to vz_utils.c

Mikhail Feoktistov (6):
   vz: save vz version in connection structure
   vz: add vzCapabilities to connection structure
   vz: check supported disk format and bus
   vz: report correct disk format in domainGetXMLDesc
   vz: check supported controllers
   vz: set default SCSI model

  src/vz/vz_driver.c |  61 +++
  src/vz/vz_sdk.c| 203 +++---
  src/vz/vz_sdk.h|   2 +-
  src/vz/vz_utils.c  | 314 +
  src/vz/vz_utils.h  |  24 
  5 files changed, 397 insertions(+), 207 deletions(-)



--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: code refactoring

2016-03-19 Thread Mikhail Feoktistov
In prlsdkAddNet() Attach/DetachNet() functions
privconn should be the first argument
---
 src/vz/vz_driver.c |  4 ++--
 src/vz/vz_sdk.c| 16 
 src/vz/vz_sdk.h|  4 ++--
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index b02e59f..604e7a8 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1088,7 +1088,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, 
const char *xml,
 }
 break;
 case VIR_DOMAIN_DEVICE_NET:
-ret = prlsdkAttachNet(privdom, privconn, dev->data.net);
+ret = prlsdkAttachNet(privconn, privdom, dev->data.net);
 if (ret) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("network attach failed"));
@@ -1165,7 +1165,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, 
const char *xml,
 }
 break;
 case VIR_DOMAIN_DEVICE_NET:
-ret = prlsdkDetachNet(privdom, privconn, dev->data.net);
+ret = prlsdkDetachNet(privconn, privdom, dev->data.net);
 if (ret) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("network detach failed"));
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 1473866..c0fb4fb 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2608,8 +2608,8 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, 
char *macstr)
 return macstr;
 }
 
-static int prlsdkAddNet(PRL_HANDLE sdkdom,
-vzConnPtr privconn,
+static int prlsdkAddNet(vzConnPtr privconn,
+PRL_HANDLE sdkdom,
 virDomainNetDefPtr net,
 bool isCt)
 {
@@ -2865,8 +2865,8 @@ prlsdkCleanupBridgedNet(vzConnPtr privconn, 
virDomainNetDefPtr net)
 PrlHandle_Free(vnet);
 }
 
-int prlsdkAttachNet(virDomainObjPtr dom,
-vzConnPtr privconn,
+int prlsdkAttachNet(vzConnPtr privconn,
+virDomainObjPtr dom,
 virDomainNetDefPtr net)
 {
 int ret = -1;
@@ -2883,7 +2883,7 @@ int prlsdkAttachNet(virDomainObjPtr dom,
 if (PRL_FAILED(waitJob(job)))
 return ret;
 
-ret = prlsdkAddNet(privdom->sdkdom, privconn, net, IS_CT(dom->def));
+ret = prlsdkAddNet(privconn, privdom->sdkdom, net, IS_CT(dom->def));
 if (ret == 0) {
 job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
 if (PRL_FAILED(waitJob(job)))
@@ -2930,8 +2930,8 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac)
 return adapter;
 }
 
-int prlsdkDetachNet(virDomainObjPtr dom,
-vzConnPtr privconn,
+int prlsdkDetachNet(vzConnPtr privconn,
+virDomainObjPtr dom,
 virDomainNetDefPtr net)
 {
 int ret = -1;
@@ -3372,7 +3372,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 }
 
 for (i = 0; i < def->nnets; i++) {
-if (prlsdkAddNet(sdkdom, conn->privateData, def->nets[i], IS_CT(def)) 
< 0)
+if (prlsdkAddNet(conn->privateData, sdkdom, def->nets[i], IS_CT(def)) 
< 0)
 goto error;
 }
 
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index 8a38797..2f11d4f 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -69,9 +69,9 @@ prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr 
disk);
 int
 prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, 
virDomainBlockStatsPtr stats);
 int
-prlsdkAttachNet(virDomainObjPtr dom, vzConnPtr privconn, virDomainNetDefPtr 
net);
+prlsdkAttachNet(vzConnPtr privconn, virDomainObjPtr dom, virDomainNetDefPtr 
net);
 int
-prlsdkDetachNet(virDomainObjPtr dom, vzConnPtr privconn, virDomainNetDefPtr 
net);
+prlsdkDetachNet(vzConnPtr privconn, virDomainObjPtr dom, virDomainNetDefPtr 
net);
 int
 prlsdkGetNetStats(virDomainObjPtr dom, const char *path, 
virDomainInterfaceStatsPtr stats);
 int
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/6] vz: add disk and controller check in domainPostParse phase

2016-03-15 Thread Mikhail Feoktistov
Mikhail Feoktistov (6):
  vz: save vz version in connection structure
  vz: add vzCapabilities to connection structure
  vz: check supported disk format and bus
  vz: report correct disk format in domainGetXMLDesc
  vz: check supported controllers
  vz: set default SCSI model

 src/vz/vz_driver.c |  61 +
 src/vz/vz_sdk.c|  80 +++---
 src/vz/vz_sdk.h|   2 +-
 src/vz/vz_utils.c  | 191 +
 src/vz/vz_utils.h  |  24 +++
 5 files changed, 274 insertions(+), 84 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[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 = >vzCaps;
 if (!(privconn->xmlopt = virDomainXMLOptionNew(,
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"),
+   

[libvirt] [PATCH 2/6] vz: add vzCapabilities to connection structure

2016-03-15 Thread Mikhail Feoktistov
Virtuozzo6 supports only ploop disks for containers and
virtual machines on IDE SCSI and SATA buses.
Virtuozzo7 supports only qcow2 for virtual machines on IDE and SCSI buses.
In this patch we add vzCapabilities structure to connection structure.
It contains disk formats and list of buses that we support for virtual machines 
and containers.
In openConnection() callback we get virtuozzo version and select proper 
capabilities.
---
 src/vz/vz_utils.c | 24 
 src/vz/vz_utils.h | 10 ++
 2 files changed, 34 insertions(+)

diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index cf37597..d8a95ac 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -36,6 +36,15 @@
 #define VIR_FROM_THIS VIR_FROM_PARALLELS
 #define PRLSRVCTL "prlsrvctl"
 
+static virDomainDiskBus vz6DiskBuses[] = {VIR_DOMAIN_DISK_BUS_IDE,
+  VIR_DOMAIN_DISK_BUS_SCSI,
+  VIR_DOMAIN_DISK_BUS_SATA,
+  VIR_DOMAIN_DISK_BUS_LAST};
+
+static virDomainDiskBus vz7DiskBuses[] = {VIR_DOMAIN_DISK_BUS_IDE,
+  VIR_DOMAIN_DISK_BUS_SCSI,
+  VIR_DOMAIN_DISK_BUS_LAST};
+
 /**
  * vzDomObjFromDomain:
  * @domain: Domain pointer that has to be looked up
@@ -180,6 +189,20 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned 
char *uuid)
 return NULL;
 }
 
+static void
+vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps)
+{
+if (vzVersion < VIRTUOZZO_VER_7) {
+vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
+vzCaps->vmDiskFormat = VIR_STORAGE_FILE_PLOOP;
+vzCaps->diskBuses = vz6DiskBuses;
+} else {
+vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
+vzCaps->vmDiskFormat = VIR_STORAGE_FILE_QCOW2;
+vzCaps->diskBuses = vz7DiskBuses;
+}
+}
+
 int
 vzInitVersion(vzConnPtr privconn)
 {
@@ -219,6 +242,7 @@ vzInitVersion(vzConnPtr privconn)
 goto cleanup;
 }
 
+vzInitCaps(privconn->vzVersion, >vzCaps);
 ret = 0;
 
  cleanup:
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index fbade2e..e0b0105 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -48,6 +48,15 @@
 
 # define PARALLELS_DOMAIN_ROUTED_NETWORK_NAME   "Routed"
 # define PARALLELS_DOMAIN_BRIDGED_NETWORK_NAME  "Bridged"
+# define VIRTUOZZO_VER_7 ((unsigned long) 700)
+
+struct _vzCapabilities {
+virStorageFileFormat vmDiskFormat;
+virStorageFileFormat ctDiskFormat;
+virDomainDiskBus *diskBuses;
+};
+typedef struct _vzCapabilities vzCapabilities;
+typedef struct _vzCapabilities *vzCapabilitiesPtr;
 
 struct _vzConn {
 virMutex lock;
@@ -63,6 +72,7 @@ struct _vzConn {
 /* Immutable pointer, self-locking APIs */
 virConnectCloseCallbackDataPtr closeCallback;
 unsigned long vzVersion;
+vzCapabilities vzCaps;
 };
 
 typedef struct _vzConn vzConn;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 1/6] vz: save vz version in connection structure

2016-03-15 Thread Mikhail Feoktistov
Move code from connectGetVersion callback to vzInitVersion function
---
 src/vz/vz_driver.c | 50 +++---
 src/vz/vz_utils.c  | 47 +++
 src/vz/vz_utils.h  |  3 +++
 3 files changed, 57 insertions(+), 43 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 6de7cb9..5d48d7e 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -62,7 +62,6 @@
 VIR_LOG_INIT("parallels.parallels_driver");
 
 #define PRLCTL  "prlctl"
-#define PRLSRVCTL   "prlsrvctl"
 
 static int vzConnectClose(virConnectPtr conn);
 
@@ -234,6 +233,9 @@ vzOpenDefault(virConnectPtr conn)
 if (prlsdkConnect(privconn) < 0)
 goto err_free;
 
+if (vzInitVersion(privconn) < 0)
+goto error;
+
 if (!(privconn->caps = vzBuildCapabilities()))
 goto error;
 
@@ -345,49 +347,11 @@ vzConnectClose(virConnectPtr conn)
 }
 
 static int
-vzConnectGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned long *hvVer)
+vzConnectGetVersion(virConnectPtr conn, unsigned long *hvVer)
 {
-char *output, *sVer, *tmp;
-const char *searchStr = "prlsrvctl version ";
-int ret = -1;
-
-output = vzGetOutput(PRLSRVCTL, "--help", NULL);
-
-if (!output) {
-vzParseError();
-goto cleanup;
-}
-
-if (!(sVer = strstr(output, searchStr))) {
-vzParseError();
-goto cleanup;
-}
-
-sVer = sVer + strlen(searchStr);
-
-/* parallels server has versions number like 6.0.17977.782218,
- * so libvirt can handle only first two numbers. */
-if (!(tmp = strchr(sVer, '.'))) {
-vzParseError();
-goto cleanup;
-}
-
-if (!(tmp = strchr(tmp + 1, '.'))) {
-vzParseError();
-goto cleanup;
-}
-
-tmp[0] = '\0';
-if (virParseVersionString(sVer, hvVer, true) < 0) {
-vzParseError();
-goto cleanup;
-}
-
-ret = 0;
-
- cleanup:
-VIR_FREE(output);
-return ret;
+vzConnPtr privconn = conn->privateData;
+*hvVer = privconn->vzVersion;
+return 0;
 }
 
 
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index a1ddad0..cf37597 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -34,6 +34,7 @@
 #include "datatypes.h"
 
 #define VIR_FROM_THIS VIR_FROM_PARALLELS
+#define PRLSRVCTL "prlsrvctl"
 
 /**
  * vzDomObjFromDomain:
@@ -178,3 +179,49 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned 
char *uuid)
 VIR_FREE(pdom);
 return NULL;
 }
+
+int
+vzInitVersion(vzConnPtr privconn)
+{
+char *output, *sVer, *tmp;
+const char *searchStr = "prlsrvctl version ";
+int ret = -1;
+
+output = vzGetOutput(PRLSRVCTL, "--help", NULL);
+
+if (!output) {
+vzParseError();
+goto cleanup;
+}
+
+if (!(sVer = strstr(output, searchStr))) {
+vzParseError();
+goto cleanup;
+}
+
+sVer = sVer + strlen(searchStr);
+
+/* parallels server has versions number like 6.0.17977.782218 or 7.0.0,
+ * In libvirt we handle only first two numbers. */
+if (!(tmp = strchr(sVer, '.'))) {
+vzParseError();
+goto cleanup;
+}
+
+if (!(tmp = strchr(tmp + 1, '.'))) {
+vzParseError();
+goto cleanup;
+}
+
+tmp[0] = '\0';
+if (virParseVersionString(sVer, &(privconn->vzVersion), true) < 0) {
+vzParseError();
+goto cleanup;
+}
+
+ret = 0;
+
+ cleanup:
+VIR_FREE(output);
+return ret;
+}
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index ed100ac..fbade2e 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -62,6 +62,7 @@ struct _vzConn {
 const char *drivername;
 /* Immutable pointer, self-locking APIs */
 virConnectCloseCallbackDataPtr closeCallback;
+unsigned long vzVersion;
 };
 
 typedef struct _vzConn vzConn;
@@ -97,6 +98,8 @@ virDomainObjPtr
 vzNewDomain(vzConnPtr privconn,
 char *name,
 const unsigned char *uuid);
+int
+vzInitVersion(vzConnPtr privconn);
 
 # define PARALLELS_BLOCK_STATS_FOREACH(OP)  \
 OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests")\
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 4/6] vz: report correct disk format in domainGetXMLDesc

2016-03-15 Thread Mikhail Feoktistov
We should report correct disk format, because it depends on
virtuozzo version and domain type.
Now we support only one disk format for each domain type.
So we can take it from vzCapabilities structure.
---
 src/vz/vz_sdk.c | 29 +
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 2a6e908..c45ca09 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -458,7 +458,8 @@ prlsdkAddDomainVideoInfo(PRL_HANDLE sdkdom, virDomainDefPtr 
def)
 }
 
 static int
-prlsdkGetDiskInfo(PRL_HANDLE prldisk,
+prlsdkGetDiskInfo(vzConnPtr privconn,
+  PRL_HANDLE prldisk,
   virDomainDiskDefPtr disk,
   bool isCdrom,
   bool isCt)
@@ -476,10 +477,14 @@ prlsdkGetDiskInfo(PRL_HANDLE prldisk,
 prlsdkCheckRetGoto(pret, cleanup);
 if (emulatedType == PDT_USE_IMAGE_FILE) {
 virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
-if (isCdrom)
+if (isCdrom) {
 virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW);
-else
-virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_PLOOP);
+} else {
+if (isCt)
+virDomainDiskSetFormat(disk, privconn->vzCaps.ctDiskFormat);
+else
+virDomainDiskSetFormat(disk, privconn->vzCaps.vmDiskFormat);
+}
 } else {
 virDomainDiskSetType(disk, VIR_STORAGE_TYPE_BLOCK);
 virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW);
@@ -607,7 +612,7 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
 }
 
 static int
-prlsdkAddDomainHardDisksInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
+prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 {
 PRL_RESULT pret;
 PRL_UINT32 hddCount;
@@ -647,7 +652,7 @@ prlsdkAddDomainHardDisksInfo(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 if (!(disk = virDomainDiskDefNew(NULL)))
 goto error;
 
-if (prlsdkGetDiskInfo(hdd, disk, false, IS_CT(def)) < 0)
+if (prlsdkGetDiskInfo(privconn, hdd, disk, false, IS_CT(def)) < 0)
 goto error;
 
 if (VIR_APPEND_ELEMENT(def->disks, def->ndisks, disk) < 0)
@@ -669,7 +674,7 @@ prlsdkAddDomainHardDisksInfo(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 }
 
 static int
-prlsdkAddDomainOpticalDisksInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
+prlsdkAddDomainOpticalDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 {
 PRL_RESULT pret;
 PRL_UINT32 cdromsCount;
@@ -687,7 +692,7 @@ prlsdkAddDomainOpticalDisksInfo(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 if (!(disk = virDomainDiskDefNew(NULL)))
 goto error;
 
-if (prlsdkGetDiskInfo(cdrom, disk, true, IS_CT(def)) < 0)
+if (prlsdkGetDiskInfo(privconn, cdrom, disk, true, IS_CT(def)) < 0)
 goto error;
 
 PrlHandle_Free(cdrom);
@@ -950,16 +955,16 @@ prlsdkAddSerialInfo(PRL_HANDLE sdkdom,
 
 
 static int
-prlsdkAddDomainHardware(PRL_HANDLE sdkdom, virDomainDefPtr def)
+prlsdkAddDomainHardware(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr 
def)
 {
 if (!IS_CT(def))
 if (prlsdkAddDomainVideoInfo(sdkdom, def) < 0)
 goto error;
 
-if (prlsdkAddDomainHardDisksInfo(sdkdom, def) < 0)
+if (prlsdkAddDomainHardDisksInfo(privconn, sdkdom, def) < 0)
 goto error;
 
-if (prlsdkAddDomainOpticalDisksInfo(sdkdom, def) < 0)
+if (prlsdkAddDomainOpticalDisksInfo(privconn, sdkdom, def) < 0)
 goto error;
 
 if (prlsdkAddDomainNetInfo(sdkdom, def) < 0)
@@ -1317,7 +1322,7 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
 if (prlsdkConvertDomainType(sdkdom, def) < 0)
 goto error;
 
-if (prlsdkAddDomainHardware(sdkdom, def) < 0)
+if (prlsdkAddDomainHardware(privconn, sdkdom, def) < 0)
 goto error;
 
 if (prlsdkAddVNCInfo(sdkdom, def) < 0)
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 6/6] vz: set default SCSI model

2016-03-15 Thread Mikhail Feoktistov
Each version of virtuozzo supports only one type of SCSI controller
So if we add disk on SCSI bus, we should set SCSI controller model.
We can take it from vzCapabilities structure.
---
 src/vz/vz_driver.c |  2 +-
 src/vz/vz_sdk.c| 27 +++
 src/vz/vz_sdk.h|  2 +-
 src/vz/vz_utils.c  | 20 
 src/vz/vz_utils.h  |  3 +++
 5 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 74e1f5d..b02e59f 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1080,7 +1080,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, 
const char *xml,
 
 switch (dev->type) {
 case VIR_DOMAIN_DEVICE_DISK:
-ret = prlsdkAttachVolume(privdom, dev->data.disk);
+ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk);
 if (ret) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("disk attach failed"));
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index c45ca09..8baad8e 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3115,7 +3115,8 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
 return ret;
 }
 
-static int prlsdkAddDisk(PRL_HANDLE sdkdom,
+static int prlsdkAddDisk(vzConnPtr privconn,
+ PRL_HANDLE sdkdom,
  virDomainDiskDefPtr disk,
  bool bootDisk,
  bool isCt)
@@ -3129,6 +3130,7 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 virDomainDeviceDriveAddressPtr drive;
 PRL_UINT32 devIndex;
 PRL_DEVICE_TYPE devType;
+PRL_CLUSTERED_DEVICE_SUBTYPE scsiModel;
 char *dst = NULL;
 
 if (prlsdkCheckDiskUnsupportedParams(disk) < 0)
@@ -3229,6 +3231,13 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 goto cleanup;
 }
 
+if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
+if (vzGetDefaultSCSIModel(privconn, ) < 0)
+goto cleanup;
+pret = PrlVmDev_SetSubType(sdkdisk, scsiModel);
+prlsdkCheckRetGoto(pret, cleanup);
+}
+
 pret = PrlVmDev_SetIfaceType(sdkdisk, sdkbus);
 prlsdkCheckRetGoto(pret, cleanup);
 
@@ -3276,7 +3285,9 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 }
 
 int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
+prlsdkAttachVolume(vzConnPtr privconn,
+   virDomainObjPtr dom,
+   virDomainDiskDefPtr disk)
 {
 int ret = -1;
 vzDomObjPtr privdom = dom->privateData;
@@ -3286,7 +3297,11 @@ prlsdkAttachVolume(virDomainObjPtr dom, 
virDomainDiskDefPtr disk)
 if (PRL_FAILED(waitJob(job)))
 goto cleanup;
 
-ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def));
+ret = prlsdkAddDisk(privconn,
+privdom->sdkdom,
+disk,
+false,
+IS_CT(dom->def));
 if (ret == 0) {
 job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
 if (PRL_FAILED(waitJob(job))) {
@@ -3517,7 +3532,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 needBoot = false;
 bootDisk = true;
 }
-if (prlsdkAddDisk(sdkdom, def->disks[i], bootDisk, IS_CT(def)) < 0)
+if (prlsdkAddDisk(conn->privateData,
+  sdkdom,
+  def->disks[i],
+  bootDisk,
+  IS_CT(def)) < 0)
 goto error;
 }
 
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index c2d9cb4..8a38797 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -63,7 +63,7 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr 
dom, unsigned int fla
 int
 prlsdkDomainManagedSaveRemove(virDomainObjPtr dom);
 int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
+prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, 
virDomainDiskDefPtr disk);
 int
 prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
 int
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index 58014ec..ebde0f5 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -349,3 +349,23 @@ int vzCheckUnsupportedControllers(virDomainDefPtr def,
 }
 return 0;
 }
+
+int vzGetDefaultSCSIModel(vzConnPtr privconn,
+  PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel)
+{
+switch (privconn->vzCaps.scsiControllerModel) {
+case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI:
+*scsiModel = PCD_VIRTIO_SCSI;
+break;
+case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC:
+*scsiModel = PCD_BUSLOGIC;
+break;
+default:
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("Unknown SCSI controller model %s"),
+   virDomainControllerModelSCSITypeToString(
+   privconn->vzCaps.scsiControllerModel));
+return -1;
+}
+return 0;
+}
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h

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

2016-03-15 Thread Mikhail Feoktistov
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, 

Re: [libvirt] [PATCH 0/3] vz: disk format support

2016-03-04 Thread Mikhail Feoktistov

Please ignore these patches.
I'll send a new version soon.

On 01.03.2016 13:46, Mikhail Feoktistov wrote:

Mikhail Feoktistov (3):
   vz: add vzInitVersion function
   vz: add virStorageFileFormat to connection structure
   vz: check supported disk format

  src/vz/vz_driver.c | 52 +++---
  src/vz/vz_sdk.c| 28 ---
  src/vz/vz_sdk.h|  2 +-
  src/vz/vz_utils.c  | 66 ++
  src/vz/vz_utils.h  | 10 +
  5 files changed, 105 insertions(+), 53 deletions(-)



--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 2/3] vz: add virStorageFileFormat to connection structure

2016-03-01 Thread Mikhail Feoktistov
Virtuozzo6 supports only ploop disks for containers and virtual machines.
Virtuozzo7 supports only qcow2 for virtual machines.
In this patch we add virStorageFileFormat variables to connection structure.
Each variable contains disk format that we support for virtual machines and 
containers.
In openConnection() callback we get virtuozzo version
and select proper virStorageFileFormat values.
---
 src/vz/vz_utils.c | 8 
 src/vz/vz_utils.h | 3 +++
 2 files changed, 11 insertions(+)

diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index cf37597..f7db9cf 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -219,6 +219,14 @@ vzInitVersion(vzConnPtr privconn)
 goto cleanup;
 }
 
+if (privconn->vzVersion < VIRTUOZZO_VER_7) {
+privconn->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
+privconn->vmDiskFormat = VIR_STORAGE_FILE_PLOOP;
+} else {
+privconn->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
+privconn->vmDiskFormat = VIR_STORAGE_FILE_QCOW2;
+}
+
 ret = 0;
 
  cleanup:
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index 694f204..b1bdcce 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -47,6 +47,7 @@
 
 # define PARALLELS_DOMAIN_ROUTED_NETWORK_NAME   "Routed"
 # define PARALLELS_DOMAIN_BRIDGED_NETWORK_NAME  "Bridged"
+# define VIRTUOZZO_VER_7 ((unsigned long) 700)
 
 struct _vzConn {
 virMutex lock;
@@ -60,6 +61,8 @@ struct _vzConn {
 virObjectEventStatePtr domainEventState;
 const char *drivername;
 unsigned long vzVersion;
+virStorageFileFormat vmDiskFormat;
+virStorageFileFormat ctDiskFormat;
 };
 
 typedef struct _vzConn vzConn;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 1/3] vz: add vzInitVersion function

2016-03-01 Thread Mikhail Feoktistov
Move code from connectGetVersion callback to vzInitVersion function
Move variable contains version number to connection structure.
---
 src/vz/vz_driver.c | 50 +++---
 src/vz/vz_utils.c  | 47 +++
 src/vz/vz_utils.h  |  3 +++
 3 files changed, 57 insertions(+), 43 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index f7a8617..82eba27 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -62,7 +62,6 @@
 VIR_LOG_INIT("parallels.parallels_driver");
 
 #define PRLCTL  "prlctl"
-#define PRLSRVCTL   "prlsrvctl"
 
 static int vzConnectClose(virConnectPtr conn);
 
@@ -238,6 +237,9 @@ vzOpenDefault(virConnectPtr conn)
 if (prlsdkConnect(privconn) < 0)
 goto err_free;
 
+if (vzInitVersion(privconn) < 0)
+goto error;
+
 if (!(privconn->caps = vzBuildCapabilities()))
 goto error;
 
@@ -342,49 +344,11 @@ vzConnectClose(virConnectPtr conn)
 }
 
 static int
-vzConnectGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned long *hvVer)
+vzConnectGetVersion(virConnectPtr conn, unsigned long *hvVer)
 {
-char *output, *sVer, *tmp;
-const char *searchStr = "prlsrvctl version ";
-int ret = -1;
-
-output = vzGetOutput(PRLSRVCTL, "--help", NULL);
-
-if (!output) {
-vzParseError();
-goto cleanup;
-}
-
-if (!(sVer = strstr(output, searchStr))) {
-vzParseError();
-goto cleanup;
-}
-
-sVer = sVer + strlen(searchStr);
-
-/* parallels server has versions number like 6.0.17977.782218,
- * so libvirt can handle only first two numbers. */
-if (!(tmp = strchr(sVer, '.'))) {
-vzParseError();
-goto cleanup;
-}
-
-if (!(tmp = strchr(tmp + 1, '.'))) {
-vzParseError();
-goto cleanup;
-}
-
-tmp[0] = '\0';
-if (virParseVersionString(sVer, hvVer, true) < 0) {
-vzParseError();
-goto cleanup;
-}
-
-ret = 0;
-
- cleanup:
-VIR_FREE(output);
-return ret;
+vzConnPtr privconn = conn->privateData;
+*hvVer = privconn->vzVersion;
+return 0;
 }
 
 
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index a1ddad0..cf37597 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -34,6 +34,7 @@
 #include "datatypes.h"
 
 #define VIR_FROM_THIS VIR_FROM_PARALLELS
+#define PRLSRVCTL "prlsrvctl"
 
 /**
  * vzDomObjFromDomain:
@@ -178,3 +179,49 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned 
char *uuid)
 VIR_FREE(pdom);
 return NULL;
 }
+
+int
+vzInitVersion(vzConnPtr privconn)
+{
+char *output, *sVer, *tmp;
+const char *searchStr = "prlsrvctl version ";
+int ret = -1;
+
+output = vzGetOutput(PRLSRVCTL, "--help", NULL);
+
+if (!output) {
+vzParseError();
+goto cleanup;
+}
+
+if (!(sVer = strstr(output, searchStr))) {
+vzParseError();
+goto cleanup;
+}
+
+sVer = sVer + strlen(searchStr);
+
+/* parallels server has versions number like 6.0.17977.782218 or 7.0.0,
+ * In libvirt we handle only first two numbers. */
+if (!(tmp = strchr(sVer, '.'))) {
+vzParseError();
+goto cleanup;
+}
+
+if (!(tmp = strchr(tmp + 1, '.'))) {
+vzParseError();
+goto cleanup;
+}
+
+tmp[0] = '\0';
+if (virParseVersionString(sVer, &(privconn->vzVersion), true) < 0) {
+vzParseError();
+goto cleanup;
+}
+
+ret = 0;
+
+ cleanup:
+VIR_FREE(output);
+return ret;
+}
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index 0976193..694f204 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -59,6 +59,7 @@ struct _vzConn {
 virDomainXMLOptionPtr xmlopt;
 virObjectEventStatePtr domainEventState;
 const char *drivername;
+unsigned long vzVersion;
 };
 
 typedef struct _vzConn vzConn;
@@ -94,6 +95,8 @@ virDomainObjPtr
 vzNewDomain(vzConnPtr privconn,
 char *name,
 const unsigned char *uuid);
+int
+vzInitVersion(vzConnPtr privconn);
 
 # define PARALLELS_BLOCK_STATS_FOREACH(OP)  \
 OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests")\
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/3] vz: disk format support

2016-03-01 Thread Mikhail Feoktistov
Mikhail Feoktistov (3):
  vz: add vzInitVersion function
  vz: add virStorageFileFormat to connection structure
  vz: check supported disk format

 src/vz/vz_driver.c | 52 +++---
 src/vz/vz_sdk.c| 28 ---
 src/vz/vz_sdk.h|  2 +-
 src/vz/vz_utils.c  | 66 ++
 src/vz/vz_utils.h  | 10 +
 5 files changed, 105 insertions(+), 53 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


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

2016-03-01 Thread Mikhail Feoktistov
In prlsdkAddDisk() we try to check disk format, before adding disk.
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 connection struct.
---
 src/vz/vz_driver.c |  2 +-
 src/vz/vz_sdk.c| 28 
 src/vz/vz_sdk.h|  2 +-
 src/vz/vz_utils.c  | 11 +++
 src/vz/vz_utils.h  |  4 
 5 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 82eba27..c1ccbc5 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1070,7 +1070,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, 
const char *xml,
 
 switch (dev->type) {
 case VIR_DOMAIN_DEVICE_DISK:
-ret = prlsdkAttachVolume(privdom, dev->data.disk);
+ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk);
 if (ret) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("disk attach failed"));
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 92bb7c5..0bd80f0 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3106,7 +3106,8 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
 return ret;
 }
 
-static int prlsdkAddDisk(PRL_HANDLE sdkdom,
+static int prlsdkAddDisk(vzConnPtr privconn,
+ PRL_HANDLE sdkdom,
  virDomainDiskDefPtr disk,
  bool bootDisk,
  bool isCt)
@@ -3141,11 +3142,12 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 
 if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
+virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE &&
+!vzCheckDiskFormat(privconn, virDomainDiskGetFormat(disk), isCt)) {
 
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
- "disk %s, vz driver 
supports only "
- "images in ploop 
format."), disk->src->path);
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("Unsupported format of disk %s"),
+   disk->src->path);
 goto cleanup;
 }
 
@@ -3287,7 +3289,9 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 }
 
 int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
+prlsdkAttachVolume(vzConnPtr privconn,
+   virDomainObjPtr dom,
+   virDomainDiskDefPtr disk)
 {
 int ret = -1;
 vzDomObjPtr privdom = dom->privateData;
@@ -3297,7 +3301,11 @@ prlsdkAttachVolume(virDomainObjPtr dom, 
virDomainDiskDefPtr disk)
 if (PRL_FAILED(waitJob(job)))
 goto cleanup;
 
-ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def));
+ret = prlsdkAddDisk(privconn,
+privdom->sdkdom,
+disk,
+false,
+IS_CT(dom->def));
 if (ret == 0) {
 job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
 if (PRL_FAILED(waitJob(job))) {
@@ -3528,7 +3536,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 needBoot = false;
 bootDisk = true;
 }
-if (prlsdkAddDisk(sdkdom, def->disks[i], bootDisk, IS_CT(def)) < 0)
+if (prlsdkAddDisk(conn->privateData,
+  sdkdom,
+  def->disks[i],
+  bootDisk,
+  IS_CT(def)) < 0)
 goto error;
 }
 
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index c2d9cb4..8a38797 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -63,7 +63,7 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr 
dom, unsigned int fla
 int
 prlsdkDomainManagedSaveRemove(virDomainObjPtr dom);
 int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
+prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, 
virDomainDiskDefPtr disk);
 int
 prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
 int
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
index f7db9cf..e2be56d 100644
--- a/src/vz/vz_utils.c
+++ b/src/vz/vz_utils.c
@@ -233,3 +233,14 @@ vzInitVersion(vzConnPtr privconn)
 VIR_FREE(output);
 return ret;
 }
+
+bool vzCheckDiskFormat(vzConnPtr privconn, virStorageFileFormat format, bool 
isCt)
+{
+if (isCt && privconn->ctDiskFormat == format)
+return true;
+
+if (!isCt && privconn->vmDiskFormat == format)
+return true;
+
+return false;
+}
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index b1bdcce..a6274fb 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -100,6 +100,10 @@ vzNewDomain(vzConnPtr privconn,
 const unsigned char *uuid);
 int
 vzInitVersion(vzConnPtr privconn);
+bool

[libvirt] [PATCH 3/4] vz: fix notification subscription

2016-02-10 Thread Mikhail Feoktistov
Bug cause:
Update the domain that is subscribed to hypervisor notification.
LoadDomain() rewrites notifications fields in vzDomObj structure and makes 
domain as "unsubscribed".
Fix:
Initialize notification fields in vzDomObj only if we create a new domain.
And do not reinitialize these fields if we update domain (by calling LoadDomain 
with olddom argument)
---
 src/vz/vz_sdk.c | 13 ++---
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 3b7d7b3..4423788 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1275,6 +1275,12 @@ prlsdkLoadDomain(vzConnPtr privconn,
 if (!olddom) {
 if (VIR_ALLOC(pdom) < 0)
 goto error;
+pdom->cache.stats = PRL_INVALID_HANDLE;
+pdom->cache.count = -1;
+if (virCondInit(>cache.cond) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize 
condition"));
+goto error;
+}
 } else {
 pdom = olddom->privateData;
 }
@@ -1286,13 +1292,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
 
 def->id = -1;
 
-pdom->cache.stats = PRL_INVALID_HANDLE;
-pdom->cache.count = -1;
-if (virCondInit(>cache.cond) < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize 
condition"));
-goto error;
-}
-
 if (prlsdkGetDomainIds(sdkdom, >name, def->uuid) < 0)
 goto error;
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 2/4] vz: remove unused struct field

2016-02-10 Thread Mikhail Feoktistov
In commit 7039bb3c we have removed code that saves uuid to vzDomObj.uuid
So this field is no longer needed.
---
 src/vz/vz_sdk.c   | 5 -
 src/vz/vz_utils.h | 1 -
 2 files changed, 6 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index a47c5d6..3b7d7b3 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -419,7 +419,6 @@ prlsdkDomObjFreePrivate(void *p)
 PrlHandle_Free(pdom->sdkdom);
 PrlHandle_Free(pdom->cache.stats);
 virCondDestroy(>cache.cond);
-VIR_FREE(pdom->uuid);
 VIR_FREE(pdom->home);
 VIR_FREE(p);
 };
@@ -1287,10 +1286,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
 
 def->id = -1;
 
-/* we will remove this field in the near future, so let's set it
- * to NULL temporarily */
-pdom->uuid = NULL;
-
 pdom->cache.stats = PRL_INVALID_HANDLE;
 pdom->cache.count = -1;
 if (virCondInit(>cache.cond) < 0) {
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index b7a4c81..417f821 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -76,7 +76,6 @@ typedef struct _vzCountersCache vzCountersCache;
 
 struct vzDomObj {
 int id;
-char *uuid;
 char *home;
 PRL_HANDLE sdkdom;
 vzCountersCache cache;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 4/4] vz: fix race condition when adding domain to domains list

2016-02-10 Thread Mikhail Feoktistov
Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains list.
The second thread receives notification from hypervisor that new VM was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain to domains 
list.
These two threads call virDomainObjListFindByUUID() from prlsdkAddDomain() and 
don't find new domain.
So they add two domains with the same uuid to domains list.

This fix splits logic of prlsdkAddDomain() into two functions.
1. vzNewDomain() creates new empty domain in domains list with the specific 
uuid.
2. prlsdkLoadDomain() add data from VM to domain object.

New algorithm for creating an instance:
In vzDomainDefineXMLFlags() we add new domain to domain list by calling 
vzNewDomain()
and only after that we call CreateVm() to create VM.
It means that we "reserve" domain object with the specific uuid.
After creation of new VM we add info from this VM
to reserved domain object by calling prlsdkLoadDomain().

Before this patch prlsdkLoadDomain() worked in 2 different cases:
1. It creates and initializes new domain. Then updates it from sdk handle.
2. It updates existed domain from sdk handle.
In this patch we remove code which creates new domain from LoadDomain()
and move it to vzNewDomain().
Now prlsdkLoadDomain() only updates domain from skd handle.

In notification handler prlsdkHandleVmAddedEvent() we check
the existence of a domain and if it doesn't exist we add new domain by calling
vzNewDomain() and load info from sdk handle via prlsdkLoadDomain().
---
 src/vz/vz_driver.c |  13 +++-
 src/vz/vz_sdk.c| 217 ++---
 src/vz/vz_sdk.h|   7 +-
 src/vz/vz_utils.c  |  44 +++
 src/vz/vz_utils.h  |   4 +
 5 files changed, 152 insertions(+), 133 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 925ff32..f7a8617 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -688,6 +688,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 virDomainPtr retdom = NULL;
 virDomainDefPtr def;
 virDomainObjPtr olddom = NULL;
+virDomainObjPtr newdom = NULL;
 unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
 
 virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
@@ -703,6 +704,9 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
 if (olddom == NULL) {
 virResetLastError();
+newdom = vzNewDomain(privconn, def->name, def->uuid);
+if (!newdom)
+goto cleanup;
 if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
 if (prlsdkCreateVm(conn, def))
 goto cleanup;
@@ -716,8 +720,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 goto cleanup;
 }
 
-olddom = prlsdkAddDomain(privconn, def->uuid);
-if (!olddom)
+if (prlsdkLoadDomain(privconn, newdom))
 goto cleanup;
 } else {
 int state, reason;
@@ -758,6 +761,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
  cleanup:
 if (olddom)
 virObjectUnlock(olddom);
+if (newdom) {
+if (!retdom)
+ virDomainObjListRemove(privconn->domains, newdom);
+else
+ virObjectUnlock(newdom);
+}
 virDomainDefFree(def);
 vzDriverUnlock(privconn);
 return retdom;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 4423788..92bb7c5 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -408,7 +408,7 @@ prlsdkGetDomainState(PRL_HANDLE sdkdom, 
VIRTUAL_MACHINE_STATE_PTR vmState)
 return ret;
 }
 
-static void
+void
 prlsdkDomObjFreePrivate(void *p)
 {
 vzDomObjPtr pdom = p;
@@ -1241,56 +1241,58 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr 
def)
 return -1;
 }
 
-/*
- * This function retrieves information about domain.
- * If the domains is already in the domains list
- * privconn->domains, then locked 'olddom' must be
- * provided. If the domains must be added to the list,
- * olddom must be NULL.
- *
- * The function return a pointer to a locked virDomainObj.
- */
 static virDomainObjPtr
-prlsdkLoadDomain(vzConnPtr privconn,
- PRL_HANDLE sdkdom,
- virDomainObjPtr olddom)
+prlsdkNewDomainByHandle(vzConnPtr privconn, PRL_HANDLE sdkdom)
 {
 virDomainObjPtr dom = NULL;
+unsigned char uuid[VIR_UUID_BUFLEN];
+char *name = NULL;
+
+if (prlsdkGetDomainIds(sdkdom, , uuid) < 0)
+goto cleanup;
+
+if (!(dom = vzNewDomain(privconn, name, uuid)))
+goto cleanup;
+
+if (prlsdkLoadDomain(privconn, dom) < 0) {
+virDomainObjListRemove(privconn->domains, dom);
+dom = NULL;
+goto cleanup;
+}
+
+ 

[libvirt] [PATCH 1/4] vz: make output arguments in prlsdkGetDomainIds as optional

2016-02-10 Thread Mikhail Feoktistov
prlsdkGetDomainIds() returns name and uuid for specified instance.
Now output arguments can be NULL.
It allows to get only necessary info(name or uuid).
---
 src/vz/vz_sdk.c | 38 ++
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 30ea545..a47c5d6 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -346,31 +346,37 @@ prlsdkGetDomainIds(PRL_HANDLE sdkdom,
 PRL_UINT32 len;
 PRL_RESULT pret;
 
-len = 0;
-/* get name length */
-pret = PrlVmCfg_GetName(sdkdom, NULL, );
-prlsdkCheckRetGoto(pret, error);
+if (name) {
+len = 0;
+*name = NULL;
+/* get name length */
+pret = PrlVmCfg_GetName(sdkdom, NULL, );
+prlsdkCheckRetGoto(pret, error);
 
-if (VIR_ALLOC_N(*name, len) < 0)
-goto error;
+if (VIR_ALLOC_N(*name, len) < 0)
+goto error;
 
-PrlVmCfg_GetName(sdkdom, *name, );
-prlsdkCheckRetGoto(pret, error);
+pret = PrlVmCfg_GetName(sdkdom, *name, );
+prlsdkCheckRetGoto(pret, error);
+}
 
-len = sizeof(uuidstr);
-PrlVmCfg_GetUuid(sdkdom, uuidstr, );
-prlsdkCheckRetGoto(pret, error);
+if (uuid) {
+len = sizeof(uuidstr);
+pret = PrlVmCfg_GetUuid(sdkdom, uuidstr, );
+prlsdkCheckRetGoto(pret, error);
 
-if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-   _("Domain UUID is malformed or empty"));
-goto error;
+if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Domain UUID is malformed or empty"));
+goto error;
+}
 }
 
 return 0;
 
  error:
-VIR_FREE(*name);
+if (name)
+VIR_FREE(*name);
 return -1;
 }
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/4] vz: rework domain creation

2016-02-10 Thread Mikhail Feoktistov
Patches 1 and 2 make preparation for patch 4

Patch 3 fixes notification subscription
To get domain info we should receive and handle notification from hypervisor

Patch 4 fixes race condition when adding domain to domains list
Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains list.
The second thread receives notification from hypervisor that new VM was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain to domains 
list.
These two threads call virDomainObjListFindByUUID() from prlsdkAddDomain() and 
don't find new domain.
So they add two domains with the same uuid to domains list.

Mikhail Feoktistov (4):
  vz: make output arguments in prlsdkGetDomainIds as optional
  vz: remove unused struct field
  vz: fix notification subscription
  vz: fix race condition when adding domain to domains list

 src/vz/vz_driver.c |  13 ++-
 src/vz/vz_sdk.c| 261 ++---
 src/vz/vz_sdk.h|   7 +-
 src/vz/vz_utils.c  |  44 +
 src/vz/vz_utils.h  |   5 +-
 5 files changed, 174 insertions(+), 156 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 1/7] storage:dir: added ploop format in vol-create-as cmd

2016-02-08 Thread Mikhail Feoktistov



On 05.02.2016 19:23, Olga Krishtal wrote:

In order to support ploop in storage pools we need separate
volume type: VIR_STORAGE_VOL_PLOOP

Signed-off-by: Olga Krishtal 
---
  include/libvirt/libvirt-storage.h | 2 +-
  src/conf/storage_conf.c   | 2 +-
  src/storage/storage_backend_fs.c  | 3 +++
  tools/virsh-volume.c  | 3 ++-
  4 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/include/libvirt/libvirt-storage.h 
b/include/libvirt/libvirt-storage.h
index 1a868cc..b1e6ba5 100644
--- a/include/libvirt/libvirt-storage.h
+++ b/include/libvirt/libvirt-storage.h
@@ -122,7 +122,7 @@ typedef enum {
  VIR_STORAGE_VOL_NETWORK = 3,  /* Network volumes like RBD (RADOS Block 
Device) */
  VIR_STORAGE_VOL_NETDIR = 4,   /* Network accessible directory that can
 * contain other network volumes */
-
+VIR_STORAGE_VOL_PLOOP = 5, /* Ploop based volumes */
  # ifdef VIR_ENUM_SENTINELS
  VIR_STORAGE_VOL_LAST
  # endif
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 3657dfd..01b52a4 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -52,7 +52,7 @@ VIR_LOG_INIT("conf.storage_conf");
  
  VIR_ENUM_IMPL(virStorageVol,

VIR_STORAGE_VOL_LAST,
-  "file", "block", "dir", "network", "netdir")
+  "file", "block", "dir", "network", "netdir", "ploop")
  
  VIR_ENUM_IMPL(virStoragePool,

VIR_STORAGE_POOL_LAST,
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 692c9ff..525e45c 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -1085,6 +1085,8 @@ virStorageBackendFileSystemVolCreate(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  
  if (vol->target.format == VIR_STORAGE_FILE_DIR)

  vol->type = VIR_STORAGE_VOL_DIR;
+if (vol->target.format == VIR_STORAGE_FILE_PLOOP)
+vol->type = VIR_STORAGE_VOL_PLOOP;
  else
  vol->type = VIR_STORAGE_VOL_FILE;

change your "if" to "else if"
Under first "if" we set vol->type = VIR_STORAGE_VOL_DIR;
and the last "else" rewrites vol->type to VIR_STORAGE_VOL_PLOOP
  
@@ -1243,6 +1245,7 @@ virStorageBackendFileSystemVolDelete(virConnectPtr conn ATTRIBUTE_UNUSED,

  switch ((virStorageVolType) vol->type) {
  case VIR_STORAGE_VOL_FILE:
  case VIR_STORAGE_VOL_DIR:
+case VIR_STORAGE_VOL_PLOOP:
  if (virFileRemove(vol->target.path, vol->target.perms->uid,
vol->target.perms->gid) < 0) {
  /* Silently ignore failures where the vol has already gone away */
diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
index 35f0cbd..1f4b6b6 100644
--- a/tools/virsh-volume.c
+++ b/tools/virsh-volume.c
@@ -956,7 +956,8 @@ VIR_ENUM_IMPL(virshStorageVol,
N_("block"),
N_("dir"),
N_("network"),
-  N_("netdir"))
+  N_("netdir"),
+  N_("ploop"))
  
  static const char *

  virshVolumeTypeToString(int type)


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 0/7] storage:dir: ploop volumes support

2016-02-08 Thread Mikhail Feoktistov

invalid email in cc list
"=nshirokovs...@virtuozzo.com"

On 05.02.2016 19:23, Olga Krishtal wrote:

This series of patches is aimed to support ploop volumes directory storage
pools.

Ploop is a disk loopback block device, not unlike loop but with many features
like dynamic resize, snapshots, backups etc. Container images will be stored
in ploop volumes, that can be manipulated via virsh api.




--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 2/7] storage:dir: .buildVol and .buildVolFrom callbacks for ploop

2016-02-08 Thread Mikhail Feoktistov



On 05.02.2016 19:23, Olga Krishtal wrote:

These callbacks let us to create ploop volumes in directory pools.
If a ploop volume was created via buildVol callback, then this volume
is an empty ploop device with DiskDescriptor.xml.
If the volume was created via .buildFrom - then its content is the
same as input volume.

Ploop volume consists of ploop image file and a corresponding
DiskDescriptor.xml file.

Signed-off-by: Olga Krishtal 
---
  src/storage/storage_backend.c| 90 
  src/storage/storage_backend.h|  8 
  src/storage/storage_backend_fs.c |  4 +-
  3 files changed, 101 insertions(+), 1 deletion(-)

diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index c07b642..96bd3fc 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -773,6 +773,94 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr 
pool,
  return ret;
  }
  
+/* Set up directory for ploop volume. If function fails,

+* volume won't be created.
+*/

Add space before "*". They should be in one line.

+
+static int
+virVolCreateDirForPloop(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
+virStorageVolDefPtr vol)
+{
+int err;
+if ((err = virDirCreate(vol->target.path,
+   (vol->target.perms->mode == (mode_t) -1 ?
+   VIR_STORAGE_DEFAULT_VOL_PERM_MODE:
+   vol->target.perms->mode),
+   vol->target.perms->uid,
+   vol->target.perms->gid,
+   0)) < 0) {
+return -1;
+}
+return 1;
+}
+
Maybe return 0?  Otherwise this function always fails. see 
src/storage/storage_backend.c line 835


 if (!inputvol) {
*  if (!virVolCreateDirForPloop(pool, vol)) {*
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("error creating directory for ploop "
"ploop init"));
return -1;
}

+int virStorageBackendCreatePloop(virConnectPtr conn ATTRIBUTE_UNUSED,
+   virStoragePoolObjPtr pool,
+   virStorageVolDefPtr vol,
+   virStorageVolDefPtr inputvol,
+   unsigned int flags)
+{
+int ret = 0;
+char *size = NULL;
+char *path = NULL;
+virCommandPtr cmd = NULL;
+
+virCheckFlags(0, -1);
+if (vol->target.format != VIR_STORAGE_FILE_PLOOP) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("unsupported storage vol type %d"),
+   vol->target.format);
+return -1;
+}
+if (inputvol && inputvol->target.format != VIR_STORAGE_FILE_PLOOP) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("unsupported input storage vol type %d"),
+   inputvol->target.format);
+return -1;
+}
+
+if (vol->target.encryption != NULL) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   "%s", _("encrypted ploop volumes are not supported 
with"));
+return -1;
+}
+
+if (vol->target.backingStore != NULL) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+_("copy-on-write ploop is not yet supported"));
+return -1;
+}
+
+if (!inputvol) {
+if (!virVolCreateDirForPloop(pool, vol)) {

 check ret code like < 0

+virReportError(VIR_ERR_INTERNAL_ERROR,
+"%s", _("error creating directory for ploop "
+"ploop init"));
+return -1;
+}
+if (virAsprintf(, "%s/%s", vol->target.path, "root.hds") < 0)
+return -1;
+
+if (virAsprintf(, "%lluM", VIR_DIV_UP(vol->target.capacity, 
(1024*1024))) < 0) {
+ret = -1;
+goto cleanup;
+}
+
+cmd = virCommandNewArgList("ploop", "init", "-s", size, "-t", "ext4", 
path, NULL);
+} else {
+vol->target.capacity = inputvol->target.capacity;
+cmd = virCommandNewArgList("cp", "-r", inputvol->target.path, 
vol->target.path, NULL);
+}
+ret = virCommandRun(cmd, NULL);
+
+ cleanup:
+
+virCommandFree(cmd);
+VIR_FREE(size);
+VIR_FREE(path);
+return ret;
+}
+
  enum {
  QEMU_IMG_BACKING_FORMAT_NONE = 0,
  QEMU_IMG_BACKING_FORMAT_FLAG,
@@ -1293,6 +1381,8 @@ 
virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
  
  if (vol->type == VIR_STORAGE_VOL_BLOCK)

  return virStorageBackendCreateBlockFrom;
+if (vol->type == VIR_STORAGE_VOL_PLOOP)
+return virStorageBackendCreatePloop;
  else
  return virStorageBackendCreateRaw;
  }
diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index 20e6079..852d6ed 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -108,6 +108,14 @@ int 

Re: [libvirt] [PATCH 3/7] storage:dir: .deleteVol callback for ploop volume

2016-02-08 Thread Mikhail Feoktistov



On 05.02.2016 19:23, Olga Krishtal wrote:

Deletes whole directory of a ploop volume. To delete ploop image it has
to be unmounted.

Signed-off-by: Olga Krishtal 
---
  src/storage/storage_backend.c| 6 ++
  src/storage/storage_backend.h| 2 ++
  src/storage/storage_backend_fs.c | 5 -
  3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 96bd3fc..1b4ffbc 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -861,6 +861,12 @@ int virStorageBackendCreatePloop(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  return ret;
  }
  
+int virStorageBackendDeletePloop(virConnectPtr conn ATTRIBUTE_UNUSED,

+   virStorageVolDefPtr vol)
+{
+return virFileDeleteTree(vol->target.path);
+}
+
  enum {
  QEMU_IMG_BACKING_FORMAT_NONE = 0,
  QEMU_IMG_BACKING_FORMAT_FLAG,
diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index 852d6ed..7d354c5 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -115,6 +115,8 @@ int virStorageBackendCreatePloop(virConnectPtr conn,
   virStorageVolDefPtr inputvol,
   unsigned int flags);
  
+int virStorageBackendDeletePloop(virConnectPtr conn,

+ virStorageVolDefPtr vol);
  
  virStorageBackendBuildVolFrom

  virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 3487545..9926a6e 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -1247,7 +1247,6 @@ virStorageBackendFileSystemVolDelete(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  switch ((virStorageVolType) vol->type) {
  case VIR_STORAGE_VOL_FILE:
  case VIR_STORAGE_VOL_DIR:
-case VIR_STORAGE_VOL_PLOOP:
  if (virFileRemove(vol->target.path, vol->target.perms->uid,
vol->target.perms->gid) < 0) {
  /* Silently ignore failures where the vol has already gone away */
@@ -1264,6 +1263,10 @@ virStorageBackendFileSystemVolDelete(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  }
  }
  break;
+case VIR_STORAGE_VOL_PLOOP:
+if (virStorageBackendDeletePloop(conn, vol) != 0)

check ret code like < 0

+return -1;
+break;
  case VIR_STORAGE_VOL_BLOCK:
  case VIR_STORAGE_VOL_NETWORK:
  case VIR_STORAGE_VOL_NETDIR:


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 4/7] storage:dir: adapts .uploadVol .dowloadVol for ploop volume

2016-02-08 Thread Mikhail Feoktistov



On 05.02.2016 19:23, Olga Krishtal wrote:

In case of ploop volume, target path of the volume is the path to the
directory that contains image file named root.hds and DiskDescriptor.xml.
While using uploadVol and downloadVol callbacks we need to open root.hds
itself. To accomplish this goal we must change path from
path/to/ploop directory to path/to/ploop/root.hds

Signed-off-by: Olga Krishtal 
---
  src/storage/storage_backend.c | 27 ---
  1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 1b4ffbc..2afcc7c 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -2016,12 +2016,23 @@ virStorageBackendVolUploadLocal(virConnectPtr conn 
ATTRIBUTE_UNUSED,
  unsigned long long len,
  unsigned int flags)
  {
+char *path = NULL;
+char *target_path = vol->target.path;
+int ret;
+
  virCheckFlags(0, -1);
+if (vol->type == VIR_STORAGE_VOL_PLOOP) {
+if (virAsprintf(, "%s/%s", vol->target.path, "root.hds") < 0)
+return -1;
+target_path = path;
+}
  
  /* Not using O_CREAT because the file is required to already exist at

   * this point */
-return virFDStreamOpenBlockDevice(stream, vol->target.path,
+ret =  virFDStreamOpenBlockDevice(stream, target_path,

Delete one space after "="

offset, len, O_WRONLY);
+VIR_FREE(path);
+return ret;
  }
  
  int

@@ -2033,10 +2044,20 @@ virStorageBackendVolDownloadLocal(virConnectPtr conn 
ATTRIBUTE_UNUSED,
unsigned long long len,
unsigned int flags)
  {
-virCheckFlags(0, -1);
+char *path = NULL;
+char *target_path = vol->target.path;
+int ret;
+if (vol->type == VIR_STORAGE_VOL_PLOOP) {
+if (virAsprintf(, "%s/%s", vol->target.path, "root.hds") < 0)
+return -1;
+target_path = path;
+}
  
-return virFDStreamOpenBlockDevice(stream, vol->target.path,

+virCheckFlags(0, -1);
+ret = virFDStreamOpenBlockDevice(stream, target_path,
offset, len, O_RDONLY);
+VIR_FREE(path);
+return ret;
  }

Memory leak.
If virCheckFlags fails than we do not free "path" memory
  
  


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 4/4] vz: fix race condition when adding domain to domains list

2016-01-29 Thread Mikhail Feoktistov



29.01.2016 17:39, Maxim Nestratov пишет:


28.01.2016 18:38, Mikhail Feoktistov пишет:

Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains 
list.
The second thread receives notification from hypervisor that new VM 
was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain 
to domains list.
These two threads call virDomainObjListFindByUUID() from 
prlsdkAddDomain() and don't find new domain.

So they add two domains with the same uuid to domains list.

This fix splits logic of prlsdkAddDomain() into two functions.
1. prlsdkNewDomain() creates new empty domain in domains list with 
the specific uuid.

2. prlsdkLoadDomain() add data from VM to domain object.

New algorithm for creating an instance:
In vzDomainDefineXMLFlags() we add new domain to domain list by 
calling prlsdkNewDomain()

and only after that we call CreateVm() to create VM.
It means that we "reserve" domain object with the specific uuid.
After creation of new VM we add info from this VM
to reserved domain object by calling prlsdkLoadDomain().

Before this patch prlsdkLoadDomain() worked in 2 different cases:
1. It creates and initializes new domain. Then updates it from sdk 
handle.

2. It updates existed domain from sdk handle.
In this patch we remove code which creates new domain from LoadDomain()
and move it to prlsdkNewDomain().
Now prlsdkLoadDomain() only updates domain from skd handle.

In notification handler prlsdkHandleVmAddedEvent() we check
the existence of a domain and if it doesn't exist we add new domain 
by calling

prlsdkNewDomain() and load info from sdk handle via prlsdkLoadDomain().
---
  src/vz/vz_driver.c |  13 ++-
  src/vz/vz_sdk.c| 253 
+++--

  src/vz/vz_sdk.h|   9 +-
  3 files changed, 146 insertions(+), 129 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 91a48b6..521efd4 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -685,6 +685,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const 
char *xml, unsigned int flags)

  virDomainPtr retdom = NULL;
  virDomainDefPtr def;
  virDomainObjPtr olddom = NULL;
+virDomainObjPtr newdom = NULL;
  unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
@@ -700,6 +701,9 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const 
char *xml, unsigned int flags)

  olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
  if (olddom == NULL) {
  virResetLastError();
+newdom = prlsdkNewDomain(privconn, def->name, def->uuid);
+if (!newdom)
+goto cleanup;
  if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
  if (prlsdkCreateVm(conn, def))
  goto cleanup;
@@ -713,8 +717,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const 
char *xml, unsigned int flags)

  goto cleanup;
  }
  -olddom = prlsdkAddDomain(privconn, def->uuid);
-if (!olddom)
+if (prlsdkLoadDomain(privconn, newdom))
  goto cleanup;
  } else {
  int state, reason;
@@ -755,6 +758,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const 
char *xml, unsigned int flags)

   cleanup:
  if (olddom)
  virObjectUnlock(olddom);
+if (newdom) {
+if (!retdom)
+ virDomainObjListRemove(privconn->domains, newdom);
+else
+ virObjectUnlock(newdom);
+}
  virDomainDefFree(def);
  vzDriverUnlock(privconn);
  return retdom;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 6fb2a97..9d2bdab 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1236,58 +1236,35 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, 
virDomainDefPtr def)

  return -1;
  }
  -/*
- * This function retrieves information about domain.
- * If the domains is already in the domains list
- * privconn->domains, then locked 'olddom' must be
- * provided. If the domains must be added to the list,
- * olddom must be NULL.
- *
- * The function return a pointer to a locked virDomainObj.
- */
-static virDomainObjPtr
-prlsdkLoadDomain(vzConnPtr privconn,
- PRL_HANDLE sdkdom,
- virDomainObjPtr olddom)
+int
+prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
  {
-virDomainObjPtr dom = NULL;
  virDomainDefPtr def = NULL;
-vzDomObjPtr pdom = NULL;
  VIRTUAL_MACHINE_STATE domainState;
+char *home = NULL;
PRL_UINT32 buflen = 0;
  PRL_RESULT pret;
  PRL_UINT32 ram;
  PRL_UINT32 envId;
  PRL_VM_AUTOSTART_OPTION autostart;
+PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+vzDomObjPtr pdom = dom->privateData;
virCheckNonNullArgGoto(privconn, error);
-virCheckNonNullArgGoto(sdkdom, error);
+

Re: [libvirt] [PATCH 1/4] vz: make output arguments in prlsdkGetDomainIds as optional

2016-01-29 Thread Mikhail Feoktistov



prlsdkGetDomainIds() returns name and uuid for specified instance.
Now output arguments can be NULL.
It allows to get only necessary info(name or uuid).
---
  src/vz/vz_sdk.c | 34 +++---
  1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 7973d6a..8181149 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -346,25 +346,29 @@ prlsdkGetDomainIds(PRL_HANDLE sdkdom,
  PRL_UINT32 len;
  PRL_RESULT pret;
  
-len = 0;

-/* get name length */
-pret = PrlVmCfg_GetName(sdkdom, NULL, );
-prlsdkCheckRetGoto(pret, error);
+if (name) {
+len = 0;
+/* get name length */
+pret = PrlVmCfg_GetName(sdkdom, NULL, );
+prlsdkCheckRetGoto(pret, error);
  
-if (VIR_ALLOC_N(*name, len) < 0)

-goto error;
+if (VIR_ALLOC_N(*name, len) < 0)
+goto error;
  
-PrlVmCfg_GetName(sdkdom, *name, );

-prlsdkCheckRetGoto(pret, error);
+PrlVmCfg_GetName(sdkdom, *name, );
+prlsdkCheckRetGoto(pret, error);
+}
  
-len = sizeof(uuidstr);

-PrlVmCfg_GetUuid(sdkdom, uuidstr, );
-prlsdkCheckRetGoto(pret, error);
+if (uuid) {
+len = sizeof(uuidstr);
+PrlVmCfg_GetUuid(sdkdom, uuidstr, );
+prlsdkCheckRetGoto(pret, error);
  
-if (prlsdkUUIDParse(uuidstr, uuid) < 0) {

-virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-   _("Domain UUID is malformed or empty"));
-goto error;
+if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Domain UUID is malformed or empty"));
+goto error;
+}
  }
  
  return 0;



ACK, but I would add *name = NULL as another patch or we depend on
caller setting it for us if we follow error path.

Done. Thanks!

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 1/4] vz: make output arguments in prlsdkGetDomainIds as optional

2016-01-29 Thread Mikhail Feoktistov



29.01.2016 11:25, Maxim Nestratov пишет:

28.01.2016 18:38, Mikhail Feoktistov пишет:

prlsdkGetDomainIds() returns name and uuid for specified instance.
Now output arguments can be NULL.
It allows to get only necessary info(name or uuid).
---
  src/vz/vz_sdk.c | 34 +++---
  1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 7973d6a..8181149 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -346,25 +346,29 @@ prlsdkGetDomainIds(PRL_HANDLE sdkdom,
  PRL_UINT32 len;
  PRL_RESULT pret;
  -len = 0;
-/* get name length */
-pret = PrlVmCfg_GetName(sdkdom, NULL, );
-prlsdkCheckRetGoto(pret, error);
+if (name) {
+len = 0;
+/* get name length */
+pret = PrlVmCfg_GetName(sdkdom, NULL, );
+prlsdkCheckRetGoto(pret, error);
  -if (VIR_ALLOC_N(*name, len) < 0)
-goto error;
+if (VIR_ALLOC_N(*name, len) < 0)
+goto error;
  -PrlVmCfg_GetName(sdkdom, *name, );
-prlsdkCheckRetGoto(pret, error);
+PrlVmCfg_GetName(sdkdom, *name, );


I know it's not your mistake, but it would be better not to ignore 
what PrlVmCfg_GetName returns.

Otherwise next statement has no sence.

Yes, of cource. Thanks!

+prlsdkCheckRetGoto(pret, error);
+}
  -len = sizeof(uuidstr);
-PrlVmCfg_GetUuid(sdkdom, uuidstr, );
-prlsdkCheckRetGoto(pret, error);
+if (uuid) {
+len = sizeof(uuidstr);
+PrlVmCfg_GetUuid(sdkdom, uuidstr, );


The same is here.

+prlsdkCheckRetGoto(pret, error);
  -if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-   _("Domain UUID is malformed or empty"));
-goto error;
+if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Domain UUID is malformed or empty"));
+goto error;
+}
  }
return 0;




--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 4/4] vz: fix race condition when adding domain to domains list

2016-01-29 Thread Mikhail Feoktistov



29.01.2016 11:06, Nikolay Shirokovskiy пишет:


On 28.01.2016 18:38, Mikhail Feoktistov wrote:

Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains list.
The second thread receives notification from hypervisor that new VM was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain to domains 
list.
These two threads call virDomainObjListFindByUUID() from prlsdkAddDomain() and 
don't find new domain.
So they add two domains with the same uuid to domains list.

This fix splits logic of prlsdkAddDomain() into two functions.
1. prlsdkNewDomain() creates new empty domain in domains list with the specific 
uuid.
2. prlsdkLoadDomain() add data from VM to domain object.

New algorithm for creating an instance:
In vzDomainDefineXMLFlags() we add new domain to domain list by calling 
prlsdkNewDomain()
and only after that we call CreateVm() to create VM.
It means that we "reserve" domain object with the specific uuid.
After creation of new VM we add info from this VM
to reserved domain object by calling prlsdkLoadDomain().

Before this patch prlsdkLoadDomain() worked in 2 different cases:
1. It creates and initializes new domain. Then updates it from sdk handle.
2. It updates existed domain from sdk handle.
In this patch we remove code which creates new domain from LoadDomain()
and move it to prlsdkNewDomain().
Now prlsdkLoadDomain() only updates domain from skd handle.

In notification handler prlsdkHandleVmAddedEvent() we check
the existence of a domain and if it doesn't exist we add new domain by calling
prlsdkNewDomain() and load info from sdk handle via prlsdkLoadDomain().
---
  src/vz/vz_driver.c |  13 ++-
  src/vz/vz_sdk.c| 253 +++--
  src/vz/vz_sdk.h|   9 +-
  3 files changed, 146 insertions(+), 129 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 91a48b6..521efd4 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -685,6 +685,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
  virDomainPtr retdom = NULL;
  virDomainDefPtr def;
  virDomainObjPtr olddom = NULL;
+virDomainObjPtr newdom = NULL;
  unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
  
  virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);

@@ -700,6 +701,9 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
  olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
  if (olddom == NULL) {
  virResetLastError();
+newdom = prlsdkNewDomain(privconn, def->name, def->uuid);
+if (!newdom)
+goto cleanup;
  if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
  if (prlsdkCreateVm(conn, def))
  goto cleanup;
@@ -713,8 +717,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
  goto cleanup;
  }
  
-olddom = prlsdkAddDomain(privconn, def->uuid);

-if (!olddom)
+if (prlsdkLoadDomain(privconn, newdom))
  goto cleanup;
  } else {
  int state, reason;
@@ -755,6 +758,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
   cleanup:
  if (olddom)
  virObjectUnlock(olddom);
+if (newdom) {
+if (!retdom)
+ virDomainObjListRemove(privconn->domains, newdom);
+else
+ virObjectUnlock(newdom);
+}
  virDomainDefFree(def);
  vzDriverUnlock(privconn);
  return retdom;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 6fb2a97..9d2bdab 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1236,58 +1236,35 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr 
def)
  return -1;
  }
  
-/*

- * This function retrieves information about domain.
- * If the domains is already in the domains list
- * privconn->domains, then locked 'olddom' must be
- * provided. If the domains must be added to the list,
- * olddom must be NULL.
- *
- * The function return a pointer to a locked virDomainObj.
- */
-static virDomainObjPtr
-prlsdkLoadDomain(vzConnPtr privconn,
- PRL_HANDLE sdkdom,
- virDomainObjPtr olddom)
+int
+prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
  {
-virDomainObjPtr dom = NULL;
  virDomainDefPtr def = NULL;
-vzDomObjPtr pdom = NULL;
  VIRTUAL_MACHINE_STATE domainState;
+char *home = NULL;
  
  PRL_UINT32 buflen = 0;

  PRL_RESULT pret;
  PRL_UINT32 ram;
  PRL_UINT32 envId;
  PRL_VM_AUTOSTART_OPTION autostart;
+PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+vzDomObjPtr pdom = dom->privateData;
  
  virCheckNonNullArgGoto(privconn, error);

-virCheckNonNullArgGoto(sdkdom, error);
+

[libvirt] [PATCH 1/4] vz: make output arguments in prlsdkGetDomainIds as optional

2016-01-28 Thread Mikhail Feoktistov
prlsdkGetDomainIds() returns name and uuid for specified instance.
Now output arguments can be NULL.
It allows to get only necessary info(name or uuid).
---
 src/vz/vz_sdk.c | 34 +++---
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 7973d6a..8181149 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -346,25 +346,29 @@ prlsdkGetDomainIds(PRL_HANDLE sdkdom,
 PRL_UINT32 len;
 PRL_RESULT pret;
 
-len = 0;
-/* get name length */
-pret = PrlVmCfg_GetName(sdkdom, NULL, );
-prlsdkCheckRetGoto(pret, error);
+if (name) {
+len = 0;
+/* get name length */
+pret = PrlVmCfg_GetName(sdkdom, NULL, );
+prlsdkCheckRetGoto(pret, error);
 
-if (VIR_ALLOC_N(*name, len) < 0)
-goto error;
+if (VIR_ALLOC_N(*name, len) < 0)
+goto error;
 
-PrlVmCfg_GetName(sdkdom, *name, );
-prlsdkCheckRetGoto(pret, error);
+PrlVmCfg_GetName(sdkdom, *name, );
+prlsdkCheckRetGoto(pret, error);
+}
 
-len = sizeof(uuidstr);
-PrlVmCfg_GetUuid(sdkdom, uuidstr, );
-prlsdkCheckRetGoto(pret, error);
+if (uuid) {
+len = sizeof(uuidstr);
+PrlVmCfg_GetUuid(sdkdom, uuidstr, );
+prlsdkCheckRetGoto(pret, error);
 
-if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-   _("Domain UUID is malformed or empty"));
-goto error;
+if (prlsdkUUIDParse(uuidstr, uuid) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Domain UUID is malformed or empty"));
+goto error;
+}
 }
 
 return 0;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: remove unused struct field

2016-01-28 Thread Mikhail Feoktistov

ignore this patch
I include it into patch series.

26.01.2016 15:16, Mikhail Feoktistov пишет:

In commit 7039bb3c we have removed code that saves uuid to vzDomObj.uuid
So this field is no longer needed.
---
  src/vz/vz_sdk.c   | 5 -
  src/vz/vz_utils.h | 1 -
  2 files changed, 6 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index d610979..5e4c4ac 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -413,7 +413,6 @@ prlsdkDomObjFreePrivate(void *p)
  PrlHandle_Free(pdom->sdkdom);
  PrlHandle_Free(pdom->cache.stats);
  virCondDestroy(>cache.cond);
-VIR_FREE(pdom->uuid);
  VIR_FREE(pdom->home);
  VIR_FREE(p);
  };
@@ -1281,10 +1280,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
  
  def->id = -1;
  
-/* we will remove this field in the near future, so let's set it

- * to NULL temporarily */
-pdom->uuid = NULL;
-
  pdom->cache.stats = PRL_INVALID_HANDLE;
  pdom->cache.count = -1;
  if (virCondInit(>cache.cond) < 0) {
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index b7a4c81..417f821 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -76,7 +76,6 @@ typedef struct _vzCountersCache vzCountersCache;
  
  struct vzDomObj {

  int id;
-char *uuid;
  char *home;
  PRL_HANDLE sdkdom;
  vzCountersCache cache;


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 2/4] vz: remove unused struct field

2016-01-28 Thread Mikhail Feoktistov
In commit 7039bb3c we have removed code that saves uuid to vzDomObj.uuid
So this field is no longer needed.
---
 src/vz/vz_sdk.c   | 5 -
 src/vz/vz_utils.h | 1 -
 2 files changed, 6 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 8181149..40ab2d9 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -417,7 +417,6 @@ prlsdkDomObjFreePrivate(void *p)
 PrlHandle_Free(pdom->sdkdom);
 PrlHandle_Free(pdom->cache.stats);
 virCondDestroy(>cache.cond);
-VIR_FREE(pdom->uuid);
 VIR_FREE(pdom->home);
 VIR_FREE(p);
 };
@@ -1282,10 +1281,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
 
 def->id = -1;
 
-/* we will remove this field in the near future, so let's set it
- * to NULL temporarily */
-pdom->uuid = NULL;
-
 pdom->cache.stats = PRL_INVALID_HANDLE;
 pdom->cache.count = -1;
 if (virCondInit(>cache.cond) < 0) {
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index 84cf08f..0fbbfc7 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -75,7 +75,6 @@ typedef struct _vzCountersCache vzCountersCache;
 
 struct vzDomObj {
 int id;
-char *uuid;
 char *home;
 PRL_HANDLE sdkdom;
 vzCountersCache cache;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 4/4] vz: fix race condition when adding domain to domains list

2016-01-28 Thread Mikhail Feoktistov
Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains list.
The second thread receives notification from hypervisor that new VM was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain to domains 
list.
These two threads call virDomainObjListFindByUUID() from prlsdkAddDomain() and 
don't find new domain.
So they add two domains with the same uuid to domains list.

This fix splits logic of prlsdkAddDomain() into two functions.
1. prlsdkNewDomain() creates new empty domain in domains list with the specific 
uuid.
2. prlsdkLoadDomain() add data from VM to domain object.

New algorithm for creating an instance:
In vzDomainDefineXMLFlags() we add new domain to domain list by calling 
prlsdkNewDomain()
and only after that we call CreateVm() to create VM.
It means that we "reserve" domain object with the specific uuid.
After creation of new VM we add info from this VM
to reserved domain object by calling prlsdkLoadDomain().

Before this patch prlsdkLoadDomain() worked in 2 different cases:
1. It creates and initializes new domain. Then updates it from sdk handle.
2. It updates existed domain from sdk handle.
In this patch we remove code which creates new domain from LoadDomain()
and move it to prlsdkNewDomain().
Now prlsdkLoadDomain() only updates domain from skd handle.

In notification handler prlsdkHandleVmAddedEvent() we check
the existence of a domain and if it doesn't exist we add new domain by calling
prlsdkNewDomain() and load info from sdk handle via prlsdkLoadDomain().
---
 src/vz/vz_driver.c |  13 ++-
 src/vz/vz_sdk.c| 253 +++--
 src/vz/vz_sdk.h|   9 +-
 3 files changed, 146 insertions(+), 129 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 91a48b6..521efd4 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -685,6 +685,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 virDomainPtr retdom = NULL;
 virDomainDefPtr def;
 virDomainObjPtr olddom = NULL;
+virDomainObjPtr newdom = NULL;
 unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
 
 virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
@@ -700,6 +701,9 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
 if (olddom == NULL) {
 virResetLastError();
+newdom = prlsdkNewDomain(privconn, def->name, def->uuid);
+if (!newdom)
+goto cleanup;
 if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
 if (prlsdkCreateVm(conn, def))
 goto cleanup;
@@ -713,8 +717,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 goto cleanup;
 }
 
-olddom = prlsdkAddDomain(privconn, def->uuid);
-if (!olddom)
+if (prlsdkLoadDomain(privconn, newdom))
 goto cleanup;
 } else {
 int state, reason;
@@ -755,6 +758,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
  cleanup:
 if (olddom)
 virObjectUnlock(olddom);
+if (newdom) {
+if (!retdom)
+ virDomainObjListRemove(privconn->domains, newdom);
+else
+ virObjectUnlock(newdom);
+}
 virDomainDefFree(def);
 vzDriverUnlock(privconn);
 return retdom;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 6fb2a97..9d2bdab 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1236,58 +1236,35 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr 
def)
 return -1;
 }
 
-/*
- * This function retrieves information about domain.
- * If the domains is already in the domains list
- * privconn->domains, then locked 'olddom' must be
- * provided. If the domains must be added to the list,
- * olddom must be NULL.
- *
- * The function return a pointer to a locked virDomainObj.
- */
-static virDomainObjPtr
-prlsdkLoadDomain(vzConnPtr privconn,
- PRL_HANDLE sdkdom,
- virDomainObjPtr olddom)
+int
+prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
 {
-virDomainObjPtr dom = NULL;
 virDomainDefPtr def = NULL;
-vzDomObjPtr pdom = NULL;
 VIRTUAL_MACHINE_STATE domainState;
+char *home = NULL;
 
 PRL_UINT32 buflen = 0;
 PRL_RESULT pret;
 PRL_UINT32 ram;
 PRL_UINT32 envId;
 PRL_VM_AUTOSTART_OPTION autostart;
+PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+vzDomObjPtr pdom = dom->privateData;
 
 virCheckNonNullArgGoto(privconn, error);
-virCheckNonNullArgGoto(sdkdom, error);
+virCheckNonNullArgGoto(dom, error);
+
+sdkdom = prlsdkSdkDomainLookupByUUID(privconn, dom->def->uuid);
+if (sdkdom == PRL_INVALID_HANDLE)
+return -1;
 
 if (!(def = 

[libvirt] [PATCH 0/4 v2] vz: rework domain creation

2016-01-28 Thread Mikhail Feoktistov
Patches 1 and 2 make preparation for patch 4

Patch 3 fixes notification subscription
To get domain info we should receive and handle notification from hypervisor

Patch 4 fixes race condition when adding domain to domains list
Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains list.
The second thread receives notification from hypervisor that new VM was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain to domains 
list.
These two threads call virDomainObjListFindByUUID() from prlsdkAddDomain() and 
don't find new domain.
So they add two domains with the same uuid to domains list.

Mikhail Feoktistov (4):
  vz: make output arguments in prlsdkGetDomainIds as optional
  vz: remove unused struct field
  vz: fix notification subscription
  vz: fix race condition when adding domain to domains list

 src/vz/vz_driver.c |  13 ++-
 src/vz/vz_sdk.c| 293 +++--
 src/vz/vz_sdk.h|   9 +-
 src/vz/vz_utils.h  |   1 -
 4 files changed, 165 insertions(+), 151 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 3/4] vz: fix notification subscription

2016-01-28 Thread Mikhail Feoktistov
Bug cause:
Update the domain that is subscribed to hypervisor notification.
LoadDomain() rewrites notifications fields in vzDomObj structure and makes 
domain as "unsubscribed".
Fix:
Initialize notification fields in vzDomObj only if we create a new domain.
And do not reinitialize these fields if we update domain (by calling LoadDomain 
with olddom argument)
---
 src/vz/vz_sdk.c | 13 ++---
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 40ab2d9..6fb2a97 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1270,6 +1270,12 @@ prlsdkLoadDomain(vzConnPtr privconn,
 if (!olddom) {
 if (VIR_ALLOC(pdom) < 0)
 goto error;
+pdom->cache.stats = PRL_INVALID_HANDLE;
+pdom->cache.count = -1;
+if (virCondInit(>cache.cond) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize 
condition"));
+goto error;
+}
 } else {
 pdom = olddom->privateData;
 }
@@ -1281,13 +1287,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
 
 def->id = -1;
 
-pdom->cache.stats = PRL_INVALID_HANDLE;
-pdom->cache.count = -1;
-if (virCondInit(>cache.cond) < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize 
condition"));
-goto error;
-}
-
 if (prlsdkGetDomainIds(sdkdom, >name, def->uuid) < 0)
 goto error;
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: remove unused struct field

2016-01-26 Thread Mikhail Feoktistov
In commit 7039bb3c we have removed code that saves uuid to vzDomObj.uuid
So this field is no longer needed.
---
 src/vz/vz_sdk.c   | 5 -
 src/vz/vz_utils.h | 1 -
 2 files changed, 6 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index d610979..5e4c4ac 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -413,7 +413,6 @@ prlsdkDomObjFreePrivate(void *p)
 PrlHandle_Free(pdom->sdkdom);
 PrlHandle_Free(pdom->cache.stats);
 virCondDestroy(>cache.cond);
-VIR_FREE(pdom->uuid);
 VIR_FREE(pdom->home);
 VIR_FREE(p);
 };
@@ -1281,10 +1280,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
 
 def->id = -1;
 
-/* we will remove this field in the near future, so let's set it
- * to NULL temporarily */
-pdom->uuid = NULL;
-
 pdom->cache.stats = PRL_INVALID_HANDLE;
 pdom->cache.count = -1;
 if (virCondInit(>cache.cond) < 0) {
diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
index b7a4c81..417f821 100644
--- a/src/vz/vz_utils.h
+++ b/src/vz/vz_utils.h
@@ -76,7 +76,6 @@ typedef struct _vzCountersCache vzCountersCache;
 
 struct vzDomObj {
 int id;
-char *uuid;
 char *home;
 PRL_HANDLE sdkdom;
 vzCountersCache cache;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 2/4] vz: Remove prlsdkAddDomain() and use new functions

2016-01-23 Thread Mikhail Feoktistov
Use prlsdkNewDomain() and prlsdkSetDomainInstance() instead of prlsdkAddDomain()
New algorithm for creating an instance:
In vzDomainDefineXMLFlags() we add new domain to domain list by calling 
prlsdkNewDomain()
and only after that we call CreateVm() to create VM.
It means that we "reserve" domain object with the specific uuid.
After creation of new VM we add info from this VM
to reserved domain object by calling sdkSetDomainInstance().

In notification handler prlsdkHandleVmAddedEvent() we check
the existence of a domain and if it doesn't exist we add new domain by calling
prlsdkLoadDomain().
---
 src/vz/vz_driver.c | 14 --
 src/vz/vz_sdk.c| 38 +++---
 src/vz/vz_sdk.h|  2 --
 3 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index f73f8ef..d1cf8d0 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -687,6 +687,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 virDomainPtr retdom = NULL;
 virDomainDefPtr def;
 virDomainObjPtr olddom = NULL;
+virDomainObjPtr newdom = NULL;
 unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
 
 virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
@@ -702,6 +703,10 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
 olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
 if (olddom == NULL) {
 virResetLastError();
+newdom = prlsdkNewDomain(privconn, def->name, def->uuid);
+if (!newdom)
+goto cleanup;
+
 if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
 if (prlsdkCreateVm(conn, def))
 goto cleanup;
@@ -715,8 +720,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, 
unsigned int flags)
 goto cleanup;
 }
 
-olddom = prlsdkAddDomain(privconn, def->uuid);
-if (!olddom)
+if (prlsdkSetDomainInstance(privconn, newdom, def->uuid))
 goto cleanup;
 } else {
 int state, reason;
@@ -757,6 +761,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
  cleanup:
 if (olddom)
 virObjectUnlock(olddom);
+if (newdom) {
+if (!retdom)
+ virDomainObjListRemove(privconn->domains, newdom);
+else
+ virObjectUnlock(newdom);
+}
 virDomainDefFree(def);
 vzDriverUnlock(privconn);
 return retdom;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index c705517..765f5f1 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1473,27 +1473,6 @@ prlsdkLoadDomains(vzConnPtr privconn)
 return -1;
 }
 
-virDomainObjPtr
-prlsdkAddDomain(vzConnPtr privconn, const unsigned char *uuid)
-{
-PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
-virDomainObjPtr dom;
-
-dom = virDomainObjListFindByUUID(privconn->domains, uuid);
-if (dom) {
-/* domain is already in the list */
-return dom;
-}
-
-sdkdom = prlsdkSdkDomainLookupByUUID(privconn, uuid);
-if (sdkdom == PRL_INVALID_HANDLE)
-return NULL;
-
-dom = prlsdkLoadDomain(privconn, sdkdom, NULL);
-PrlHandle_Free(sdkdom);
-return dom;
-}
-
 int
 prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom)
 {
@@ -1672,11 +1651,24 @@ prlsdkHandleVmAddedEvent(vzConnPtr privconn,
  unsigned char *uuid)
 {
 virDomainObjPtr dom = NULL;
+PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
 
-dom = prlsdkAddDomain(privconn, uuid);
-if (dom == NULL)
+dom = virDomainObjListFindByUUID(privconn->domains, uuid);
+if (dom) {
+/* domain is already in the list */
+goto send_event;
+}
+
+sdkdom = prlsdkSdkDomainLookupByUUID(privconn, uuid);
+if (sdkdom == PRL_INVALID_HANDLE)
+return;
+
+dom = prlsdkLoadDomain(privconn, sdkdom, NULL);
+PrlHandle_Free(sdkdom);
+if (!dom)
 return;
 
+ send_event:
 prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_DEFINED,
 VIR_DOMAIN_EVENT_DEFINED_ADDED);
 
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index 060635e..19bce88 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -31,8 +31,6 @@ void prlsdkDisconnect(vzConnPtr privconn);
 int
 prlsdkLoadDomains(vzConnPtr privconn);
 virDomainObjPtr
-prlsdkAddDomain(vzConnPtr privconn, const unsigned char *uuid);
-virDomainObjPtr
 prlsdkNewDomain(vzConnPtr privconn,
 char *name,
 const unsigned char *uuid);
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 1/4] vz: Split logic of prlsdkAddDomain() into two functions

2016-01-23 Thread Mikhail Feoktistov
Add two functions
1. prlsdkNewDomain() creates new empty domain in domains list with the specific 
uuid.
2. prlsdkSetDomainInstance() add data from VM to domain object.
---
 src/vz/vz_sdk.c | 49 +
 src/vz/vz_sdk.h |  8 
 2 files changed, 57 insertions(+)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index b78c413..c705517 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1509,6 +1509,55 @@ prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr 
dom)
 return retdom ? 0 : -1;
 }
 
+int
+prlsdkSetDomainInstance(vzConnPtr privconn, virDomainObjPtr dom, const 
unsigned char *uuid)
+{
+PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+virDomainObjPtr retdom;
+
+sdkdom = prlsdkSdkDomainLookupByUUID(privconn, uuid);
+if (sdkdom == PRL_INVALID_HANDLE)
+return -1;
+
+retdom = prlsdkLoadDomain(privconn, sdkdom, dom);
+PrlHandle_Free(sdkdom);
+return retdom ? 0 : -1;
+}
+
+virDomainObjPtr
+prlsdkNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid)
+{
+virDomainDefPtr def = NULL;
+virDomainObjPtr dom = NULL;
+vzDomObjPtr pdom = NULL;
+
+if (!(def = virDomainDefNewFull(name, uuid, -1)))
+goto error;
+
+if (VIR_ALLOC(pdom) < 0)
+goto error;
+
+if (STREQ(privconn->drivername, "vz"))
+def->virtType = VIR_DOMAIN_VIRT_VZ;
+else
+def->virtType = VIR_DOMAIN_VIRT_PARALLELS;
+
+if (!(dom = virDomainObjListAdd(privconn->domains, def,
+privconn->xmlopt,
+0, NULL)))
+goto error;
+
+dom->privateData = pdom;
+dom->privateDataFreeFunc = prlsdkDomObjFreePrivate;
+dom->persistent = 1;
+return dom;
+
+ error:
+virDomainDefFree(def);
+VIR_FREE(pdom);
+return NULL;
+}
+
 static int prlsdkSendEvent(vzConnPtr privconn,
virDomainObjPtr dom,
virDomainEventType lvEventType,
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index ff6be07..060635e 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -32,6 +32,14 @@ int
 prlsdkLoadDomains(vzConnPtr privconn);
 virDomainObjPtr
 prlsdkAddDomain(vzConnPtr privconn, const unsigned char *uuid);
+virDomainObjPtr
+prlsdkNewDomain(vzConnPtr privconn,
+char *name,
+const unsigned char *uuid);
+int
+prlsdkSetDomainInstance(vzConnPtr privconn,
+virDomainObjPtr dom,
+const unsigned char *uuid);
 int prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom);
 int prlsdkSubscribeToPCSEvents(vzConnPtr privconn);
 void prlsdkUnsubscribeFromPCSEvents(vzConnPtr privconn);
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 3/4] vz: remove code duplication from LoadDomain()

2016-01-23 Thread Mikhail Feoktistov
Now we create new domain by calling prlsdkNewDomain().
In LoadDomain() we just load info from vm instance to domain object.
So remove code to create domain from LoadDomain().

---
 src/vz/vz_sdk.c | 55 +--
 1 file changed, 17 insertions(+), 38 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 765f5f1..d9f2127 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1260,26 +1260,29 @@ prlsdkLoadDomain(vzConnPtr privconn,
 PRL_UINT32 ram;
 PRL_UINT32 envId;
 PRL_VM_AUTOSTART_OPTION autostart;
+unsigned char uuid[VIR_UUID_BUFLEN];
+char *name;
 
 virCheckNonNullArgGoto(privconn, error);
 virCheckNonNullArgGoto(sdkdom, error);
 
-if (!(def = virDomainDefNew()))
+if (prlsdkGetDomainIds(sdkdom, , uuid) < 0)
 goto error;
 
 if (!olddom) {
-if (VIR_ALLOC(pdom) < 0)
-goto error;
+dom = prlsdkNewDomain(privconn, name, uuid);
+def = dom->def;
+pdom = dom->privateData;
 } else {
+if (!(def = virDomainDefNewFull(name, uuid, -1)))
+goto error;
 pdom = olddom->privateData;
+if (STREQ(privconn->drivername, "vz"))
+def->virtType = VIR_DOMAIN_VIRT_VZ;
+else
+def->virtType = VIR_DOMAIN_VIRT_PARALLELS;
 }
-
-if (STREQ(privconn->drivername, "vz"))
-def->virtType = VIR_DOMAIN_VIRT_VZ;
-else
-def->virtType = VIR_DOMAIN_VIRT_PARALLELS;
-
-def->id = -1;
+VIR_FREE(name);
 
 /* we will remove this field in the near future, so let's set it
  * to NULL temporarily */
@@ -1292,9 +1295,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
 goto error;
 }
 
-if (prlsdkGetDomainIds(sdkdom, >name, def->uuid) < 0)
-goto error;
-
 def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
 def->onPoweroff = VIR_DOMAIN_LIFECYCLE_DESTROY;
 def->onCrash = VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY;
@@ -1369,23 +1369,10 @@ prlsdkLoadDomain(vzConnPtr privconn,
 }
 
 if (olddom) {
-/* assign new virDomainDef without any checks */
-/* we can't use virDomainObjAssignDef, because it checks
- * for state and domain name */
 dom = olddom;
 virDomainDefFree(dom->def);
 dom->def = def;
-} else {
-if (!(dom = virDomainObjListAdd(privconn->domains, def,
-privconn->xmlopt,
-0, NULL)))
-goto error;
 }
-/* dom is locked here */
-
-dom->privateData = pdom;
-dom->privateDataFreeFunc = prlsdkDomObjFreePrivate;
-dom->persistent = 1;
 
 switch (autostart) {
 case PAO_VM_START_ON_LOAD:
@@ -1411,19 +1398,11 @@ prlsdkLoadDomain(vzConnPtr privconn,
 
 return dom;
  error:
-if (dom && !olddom) {
-/* Domain isn't persistent means that we haven't yet set
- * prlsdkDomObjFreePrivate and should call it manually
- */
-if (!dom->persistent)
-prlsdkDomObjFreePrivate(pdom);
-
+VIR_FREE(name);
+if (!olddom && dom)
 virDomainObjListRemove(privconn->domains, dom);
-}
-/* Delete newly allocated def only if we haven't assigned it to domain
- * Otherwise we will end up with domain having invalid def within it
- */
-if (!dom)
+
+if (olddom && !dom)
 virDomainDefFree(def);
 
 return NULL;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/4] vz: rework domain creation

2016-01-23 Thread Mikhail Feoktistov
Patch 1 and 2: 
Fix race condition when adding domain to domains list
Race condition:
User calls defineXML to create new instance.
The main thread from vzDomainDefineXMLFlags() creates new instance by 
prlsdkCreateVm.
Then this thread calls prlsdkAddDomain to add new domain to domains list.
The second thread receives notification from hypervisor that new VM was created.
It calls prlsdkHandleVmAddedEvent() and also tries to add new domain to domains 
list.
These two threads call virDomainObjListFindByUUID() from prlsdkAddDomain() and 
don't find new domain.
So they add two domains with the same uuid to domains list.

This fix splits logic of prlsdkAddDomain() into two new functions.
1. prlsdkNewDomain() creates new empty domain in domains list with the specific 
uuid.
2. prlsdkSetDomainInstance() add data from VM to domain object.

Patch 3 fixes notification subscription.
To get domain info we should receive and handle notification from hypervisor.

Mikhail Feoktistov (4):
  vz: Split logic of prlsdkAddDomain() into two functions
  vz: Remove prlsdkAddDomain() and use new functions
  vz: remove code duplication from LoadDomain()
  vz: fix notification subscription

 src/vz/vz_driver.c |  14 -
 src/vz/vz_sdk.c| 156 ++---
 src/vz/vz_sdk.h|   8 ++-
 3 files changed, 107 insertions(+), 71 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 4/4] vz: fix notification subscription

2016-01-23 Thread Mikhail Feoktistov
Bug cause:
Update the domain that is subscribed to hypervisor notification.
LoadDomain() rewrites notifications fields in vzDomObj structure and makes 
domain as "unsubscribed".
Fix:
Initialize notification fields in vzDomObj only if we create a new domain.
And do not reinitialize these fields if we update domain (by calling LoadDomain 
with olddom argument)
---
 src/vz/vz_sdk.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index d9f2127..ef319b7 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1288,13 +1288,6 @@ prlsdkLoadDomain(vzConnPtr privconn,
  * to NULL temporarily */
 pdom->uuid = NULL;
 
-pdom->cache.stats = PRL_INVALID_HANDLE;
-pdom->cache.count = -1;
-if (virCondInit(>cache.cond) < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize 
condition"));
-goto error;
-}
-
 def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
 def->onPoweroff = VIR_DOMAIN_LIFECYCLE_DESTROY;
 def->onCrash = VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY;
@@ -1495,6 +1488,13 @@ prlsdkNewDomain(vzConnPtr privconn, char *name, const 
unsigned char *uuid)
 if (VIR_ALLOC(pdom) < 0)
 goto error;
 
+pdom->cache.stats = PRL_INVALID_HANDLE;
+pdom->cache.count = -1;
+if (virCondInit(>cache.cond) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize 
condition"));
+goto error;
+}
+
 if (STREQ(privconn->drivername, "vz"))
 def->virtType = VIR_DOMAIN_VIRT_VZ;
 else
@@ -1512,7 +1512,7 @@ prlsdkNewDomain(vzConnPtr privconn, char *name, const 
unsigned char *uuid)
 
  error:
 virDomainDefFree(def);
-VIR_FREE(pdom);
+prlsdkDomObjFreePrivate(pdom);
 return NULL;
 }
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] vz: implementation of domainCreateXML callback

2015-12-16 Thread Mikhail Feoktistov

It's my fault.
Please, disregard this patch.
Thanks to Michal.

16.12.2015 11:30, Michal Privoznik пишет:

On 09.12.2015 16:48, Mikhail Feoktistov wrote:

---

  diff from v1.
  Remove call of vzDomainSuspend() in case of VIR_DOMAIN_START_PAUSED flag is 
set.
  Now we don't support to create instance in stopped state.

  src/vz/vz_driver.c | 24 
  1 file changed, 24 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index ea1090a..4498e01 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -979,6 +979,29 @@ vzDomainUndefine(virDomainPtr domain)
  return vzDomainUndefineFlags(domain, 0);
  }
  
+static virDomainPtr

+vzDomainCreateXML(virConnectPtr conn,
+  const char *xml,
+  unsigned int flags)
+{
+virDomainPtr domain;
+int ret;

This variable seem rather redundant.


+
+virCheckFlags(0, NULL);
+
+domain = vzDomainDefineXMLFlags(conn, xml, 0);
+if (domain == NULL)
+return domain;

if (!domain) return NULL;


+
+ret = vzDomainCreate(domain);
+if (ret != 0) {

if (vzDomainCreate(domain) < 0) {


+vzDomainUndefine(domain);
+return NULL;
+}
+
+return domain;
+}
+


But those are just small nits. What I find more wrong is that
virDomainCrateXML() is supposed to create a transient domain. That is -
domain that exists only as long as it is running. When shut down, its
definition is lost - unlike for defined domains which definition is kept
around until undefined. Frankly, I don't know vz that well to say if
that's possible with the driver or not. But if it isn't maybe we should
not add implement the API at all as it may confuse users.

Michal


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 1/3 v2] vz: allow to create container based on template

2015-12-15 Thread Mikhail Feoktistov
We shouldn't delete disk from default config if we create container based on 
template,
because we don't have the new disk from XML, only template name.
And don't add template section from XML as new filesystem,
we use PrlVmCfg_SetOsTemplate function to set template name.
Do not set PRNVM_PRESERVE_DISK flag in PrlVm_RegEx() call,
because this will cause an error during CT startup.
---

 diff from v1:
 Remove unusable variable (PRL_VM_DEV_EMULATION_TYPE emul)
 Add parameter useCtTemplateFs in prlsdkDoApplyConfig() function
 Allow only one fs with "template" type and only for CT creation
 Move this commit to patch series 

 src/vz/vz_sdk.c | 41 +++--
 1 file changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 2b031c9..c5f8edd 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2107,12 +2107,13 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 return 0;
 }
 
-static int prlsdkClearDevices(PRL_HANDLE sdkdom)
+static int prlsdkClearDevices(PRL_HANDLE sdkdom, bool skipdisk)
 {
 PRL_RESULT pret;
 PRL_UINT32 n, i;
 PRL_HANDLE devList;
 PRL_HANDLE dev;
+PRL_DEVICE_TYPE devType;
 int ret = -1;
 
 pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
@@ -2128,6 +2129,15 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom)
 pret = PrlHndlList_GetItem(devList, i, );
 prlsdkCheckRetGoto(pret, cleanup);
 
+if (skipdisk) {
+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (devType == PDE_HARD_DISK) {
+PrlHandle_Free(dev);
+continue;
+}
+}
 pret = PrlVmDev_Remove(dev);
 PrlHandle_Free(dev);
 }
@@ -3470,7 +3480,8 @@ static int
 prlsdkDoApplyConfig(virConnectPtr conn,
 PRL_HANDLE sdkdom,
 virDomainDefPtr def,
-virDomainDefPtr olddef)
+virDomainDefPtr olddef,
+bool useCtTemplateFs)
 {
 PRL_RESULT pret;
 size_t i;
@@ -3526,7 +3537,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 }
 prlsdkCheckRetGoto(pret, error);
 
-if (prlsdkClearDevices(sdkdom) < 0)
+if (prlsdkClearDevices(sdkdom, useCtTemplateFs) < 0)
 goto error;
 
 if (prlsdkRemoveBootDevices(sdkdom) < 0)
@@ -3554,6 +3565,12 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 }
 
 for (i = 0; i < def->nfss; i++) {
+if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
+if(useCtTemplateFs)
+continue;
+else
+goto error;
+}
 if (STREQ(def->fss[i]->dst, "/"))
 needBoot = false;
 if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
@@ -3602,7 +3619,7 @@ prlsdkApplyConfig(virConnectPtr conn,
 if (PRL_FAILED(waitJob(job)))
 return -1;
 
-ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def);
+ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def, false);
 
 if (ret == 0) {
 job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE);
@@ -3642,7 +3659,7 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
 pret = PrlVmCfg_SetOfflineManagementEnabled(sdkdom, 0);
 prlsdkCheckRetGoto(pret, cleanup);
 
-ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
+ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL, false);
 if (ret)
 goto cleanup;
 
@@ -3665,8 +3682,9 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 PRL_HANDLE result = PRL_INVALID_HANDLE;
 PRL_RESULT pret;
 int ret = -1;
-int useTemplate = 0;
+bool useTemplate = false;
 size_t i;
+PRL_UINT32 flags = 0;
 
 if (def->nfss > 1) {
 /* Check all filesystems */
@@ -3679,7 +3697,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 }
 } else if (def->nfss == 1) {
 if (def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
-useTemplate = 1;
+useTemplate = true;
 } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) {
 virReportError(VIR_ERR_INVALID_ARG, "%s",
_("Unsupported filesystem type."));
@@ -3704,12 +3722,15 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 
 }
 
-ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
+ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL, useTemplate);
 if (ret)
 goto cleanup;
 
-job = PrlVm_RegEx(sdkdom, "",
-  PACF_NON_INTERACTIVE_MODE | PRNVM_PRESERVE_DISK);
+flags = PACF_NON_INTERACTIVE_MODE;
+if (!useTemplate)
+flags = flags | PRNVM_PRESERVE_DISK;
+
+job = PrlVm_RegEx(sdkdom, "", flags);
 if (PRL_FAILED(waitJob(job)))
 ret = -1;
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/3] vz: allow to create CT from template and boot VM from cdrom

2015-12-15 Thread Mikhail Feoktistov
Mikhail Feoktistov (3):
  vz: allow to create container based on template
  vz: allow to boot VM from cdrom
  vz: implementation of boot device order

 src/vz/vz_sdk.c | 174 
 1 file changed, 125 insertions(+), 49 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 2/3 v2] vz: allow to boot VM from cdrom

2015-12-15 Thread Mikhail Feoktistov
If user creates virtual machine via virt-manager and select "boot from ISO"
then in libvirt we can see the following devices section

   
 
 
   
   
 
 
 
   

These devices don't have disk->format parameter, so we should
allow to add disks with format = VIR_STORAGE_FILE_NONE.

If user select boot from HDD and add new Cdrom device then we see

 
   
   
 

Cdrom device  doesn't have disk->source parameter,
it means that user did select "attach to real device" or "use ISO".
So we should not return error if we get device with empty source path.
---
 diff from v1:
 Add commit description
 Move this commit to patch series

 src/vz/vz_sdk.c | 22 +-
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index c5f8edd..1fcfb2e 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2026,8 +2026,9 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 }
 
 if (!IS_CT(def)) {
-if (def->os.nBootDevs != 1 ||
-def->os.bootDevs[0] != VIR_DOMAIN_BOOT_DISK ||
+if (def->os.nBootDevs == 0 ||
+(def->os.bootDevs[0] != VIR_DOMAIN_BOOT_DISK &&
+def->os.bootDevs[0] != VIR_DOMAIN_BOOT_CDROM) ||
 def->os.init != NULL || def->os.initargv != NULL) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -3192,11 +3193,12 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 
 if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
+(virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP &&
+ virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE)) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
- "disk %s, vz driver 
supports only "
- "images in ploop 
format."), disk->src->path);
+ "disk %s, it should 
be either not set or "
+ "ploop format."), 
disk->src->path);
 goto cleanup;
 }
 
@@ -3218,11 +3220,13 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 pret = PrlVmDev_SetEmulatedType(sdkdisk, emutype);
 prlsdkCheckRetGoto(pret, cleanup);
 
-pret = PrlVmDev_SetSysName(sdkdisk, disk->src->path);
-prlsdkCheckRetGoto(pret, cleanup);
+if (disk->src->path != NULL) {
+pret = PrlVmDev_SetSysName(sdkdisk, disk->src->path);
+prlsdkCheckRetGoto(pret, cleanup);
 
-pret = PrlVmDev_SetFriendlyName(sdkdisk, disk->src->path);
-prlsdkCheckRetGoto(pret, cleanup);
+pret = PrlVmDev_SetFriendlyName(sdkdisk, disk->src->path);
+prlsdkCheckRetGoto(pret, cleanup);
+}
 
 drive = >info.addr.drive;
 if (drive->controller > 0) {
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 1/3 v3] vz: allow to create container based on template

2015-12-15 Thread Mikhail Feoktistov
We shouldn't delete disk from default config if we create container based on 
template,
because we don't have the new disk from XML, only template name.
And don't add template section from XML as new filesystem,
we use PrlVmCfg_SetOsTemplate function to set template name.
Do not set PRNVM_PRESERVE_DISK flag in PrlVm_RegEx() call,
because this will cause an error during CT startup.
---
 diff from v2:
 fix syntax check

 diff from v1:
 Remove unusable variable (PRL_VM_DEV_EMULATION_TYPE emul)
 Add parameter useCtTemplateFs in prlsdkDoApplyConfig() function
 Allow only one fs with "template" type and only for CT creation
 Move this commit to patch series 

 src/vz/vz_sdk.c | 41 +++--
 1 file changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 2b031c9..c5f8edd 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2107,12 +2107,13 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 return 0;
 }
 
-static int prlsdkClearDevices(PRL_HANDLE sdkdom)
+static int prlsdkClearDevices(PRL_HANDLE sdkdom, bool skipdisk)
 {
 PRL_RESULT pret;
 PRL_UINT32 n, i;
 PRL_HANDLE devList;
 PRL_HANDLE dev;
+PRL_DEVICE_TYPE devType;
 int ret = -1;
 
 pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
@@ -2128,6 +2129,15 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom)
 pret = PrlHndlList_GetItem(devList, i, );
 prlsdkCheckRetGoto(pret, cleanup);
 
+if (skipdisk) {
+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (devType == PDE_HARD_DISK) {
+PrlHandle_Free(dev);
+continue;
+}
+}
 pret = PrlVmDev_Remove(dev);
 PrlHandle_Free(dev);
 }
@@ -3470,7 +3480,8 @@ static int
 prlsdkDoApplyConfig(virConnectPtr conn,
 PRL_HANDLE sdkdom,
 virDomainDefPtr def,
-virDomainDefPtr olddef)
+virDomainDefPtr olddef,
+bool useCtTemplateFs)
 {
 PRL_RESULT pret;
 size_t i;
@@ -3526,7 +3537,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 }
 prlsdkCheckRetGoto(pret, error);
 
-if (prlsdkClearDevices(sdkdom) < 0)
+if (prlsdkClearDevices(sdkdom, useCtTemplateFs) < 0)
 goto error;
 
 if (prlsdkRemoveBootDevices(sdkdom) < 0)
@@ -3554,6 +3565,12 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 }
 
 for (i = 0; i < def->nfss; i++) {
+if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
+if (useCtTemplateFs)
+continue;
+else
+goto error;
+}
 if (STREQ(def->fss[i]->dst, "/"))
 needBoot = false;
 if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
@@ -3602,7 +3619,7 @@ prlsdkApplyConfig(virConnectPtr conn,
 if (PRL_FAILED(waitJob(job)))
 return -1;
 
-ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def);
+ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def, false);
 
 if (ret == 0) {
 job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE);
@@ -3642,7 +3659,7 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
 pret = PrlVmCfg_SetOfflineManagementEnabled(sdkdom, 0);
 prlsdkCheckRetGoto(pret, cleanup);
 
-ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
+ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL, false);
 if (ret)
 goto cleanup;
 
@@ -3665,8 +3682,9 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 PRL_HANDLE result = PRL_INVALID_HANDLE;
 PRL_RESULT pret;
 int ret = -1;
-int useTemplate = 0;
+bool useTemplate = false;
 size_t i;
+PRL_UINT32 flags = 0;
 
 if (def->nfss > 1) {
 /* Check all filesystems */
@@ -3679,7 +3697,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 }
 } else if (def->nfss == 1) {
 if (def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
-useTemplate = 1;
+useTemplate = true;
 } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) {
 virReportError(VIR_ERR_INVALID_ARG, "%s",
_("Unsupported filesystem type."));
@@ -3704,12 +3722,15 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 
 }
 
-ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
+ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL, useTemplate);
 if (ret)
 goto cleanup;
 
-job = PrlVm_RegEx(sdkdom, "",
-  PACF_NON_INTERACTIVE_MODE | PRNVM_PRESERVE_DISK);
+flags = PACF_NON_INTERACTIVE_MODE;
+if (!useTemplate)
+flags = flags | PRNVM_PRESERVE_DISK;
+
+job = PrlVm_RegEx(sdkdom, "", flags);
 if (PRL_FAILED(waitJob(job)))
 ret = -1;
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 3/3 v2] vz: implementation of boot device order

2015-12-15 Thread Mikhail Feoktistov
This patch implements functionality of boot device order
based on boot element from os section in XML.
Now we support boot from CDROM and HDD.
If we have several devices of the same type (for example hdd0 and hdd1),
than we mark the first one as bootable.
---
 diff from v1:
 Move this commit to patch series

 src/vz/vz_sdk.c | 111 +---
 1 file changed, 81 insertions(+), 30 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 1fcfb2e..4cf9871 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2212,6 +2212,78 @@ prlsdkAddDeviceToBootList(PRL_HANDLE sdkdom,
 return -1;
 }
 
+static int
+prlsdkSetBootDevices(PRL_HANDLE sdkdom,
+ virDomainDefPtr def)
+{
+size_t i;
+PRL_RESULT pret;
+PRL_HANDLE devList = PRL_INVALID_HANDLE;
+PRL_HANDLE dev = PRL_INVALID_HANDLE;
+PRL_DEVICE_TYPE currentDevType, bootDevType;
+PRL_UINT32 devIndex, devCount, j;
+PRL_UINT32 bootSequence = 0;
+bool rootMount = false;
+
+pret = PrlVmCfg_GetAllDevices(sdkdom, );
+prlsdkCheckRetGoto(pret, error);
+
+pret = PrlHndlList_GetItemsCount(devList, );
+prlsdkCheckRetGoto(pret, error);
+
+for (i = 0; i < def->os.nBootDevs; i++) {
+switch (def->os.bootDevs[i]) {
+case VIR_DOMAIN_BOOT_CDROM:
+bootDevType = PDE_OPTICAL_DISK;
+break;
+case VIR_DOMAIN_BOOT_DISK:
+bootDevType = PDE_HARD_DISK;
+break;
+default:
+continue;
+}
+
+for (j = 0; j < devCount; j++) {
+pret = PrlHndlList_GetItem(devList, j, );
+prlsdkCheckRetGoto(pret, error);
+
+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, error);
+
+if (currentDevType == bootDevType) {
+pret = PrlVmDev_GetIndex(dev, );
+prlsdkCheckRetGoto(pret, error);
+
+if (prlsdkAddDeviceToBootList(sdkdom, devIndex, 
currentDevType, bootSequence) < 0)
+goto error;
+bootSequence++;
+
+if (IS_CT(def) && !rootMount) {
+/* If we add physical device as a boot disk to container
+   we have to specify mount point for it */
+pret = PrlVmDevHd_SetMountPoint(dev, "/");
+prlsdkCheckRetGoto(pret, error);
+rootMount = true;
+}
+}
+PrlHandle_Free(dev);
+dev = PRL_INVALID_HANDLE;
+}
+}
+
+PrlHandle_Free(devList);
+return 0;
+
+ error:
+if (dev != PRL_INVALID_HANDLE)
+PrlHandle_Free(dev);
+
+if (devList != PRL_INVALID_HANDLE)
+PrlHandle_Free(devList);
+
+return -1;
+}
+
 static int prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def)
 {
 virDomainGraphicsDefPtr gr;
@@ -3159,9 +3231,7 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
 }
 
 static int prlsdkAddDisk(PRL_HANDLE sdkdom,
- virDomainDiskDefPtr disk,
- bool bootDisk,
- bool isCt)
+ virDomainDiskDefPtr disk)
 {
 PRL_RESULT pret;
 PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
@@ -3170,7 +3240,6 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 PRL_MASS_STORAGE_INTERFACE_TYPE sdkbus;
 int idx;
 virDomainDeviceDriveAddressPtr drive;
-PRL_UINT32 devIndex;
 PRL_DEVICE_TYPE devType;
 char *dst = NULL;
 
@@ -3319,21 +3388,6 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 goto cleanup;
 }
 
-if (bootDisk) {
-pret = PrlVmDev_GetIndex(sdkdisk, );
-prlsdkCheckRetGoto(pret, cleanup);
-
-if (prlsdkAddDeviceToBootList(sdkdom, devIndex, devType, 0) < 0)
-goto cleanup;
-
-/* If we add physical device as a boot disk to container
- * we have to specify mount point for it */
-if (isCt) {
-pret = PrlVmDevHd_SetMountPoint(sdkdisk, "/");
-prlsdkCheckRetGoto(pret, cleanup);
-}
-}
-
 return 0;
  cleanup:
 PrlHandle_Free(sdkdisk);
@@ -3352,7 +3406,7 @@ prlsdkAttachVolume(virDomainObjPtr dom, 
virDomainDiskDefPtr disk)
 if (PRL_FAILED(waitJob(job)))
 goto cleanup;
 
-ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def));
+ret = prlsdkAddDisk(privdom->sdkdom, disk);
 if (ret == 0) {
 job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
 if (PRL_FAILED(waitJob(job))) {
@@ -3490,7 +3544,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 PRL_RESULT pret;
 size_t i;
 char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
-bool needBoot = true;
+bool rootfsFound = false;
 char *mask = NULL;
 
 if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0)
@@ -3576,21 +3630,18 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 goto error;
 }
 if 

[libvirt] [PATCH 3/3 v2] vz: implementation of boot device order

2015-12-15 Thread Mikhail Feoktistov
This patch implements functionality of boot device order
based on boot element from os section in XML.
Now we support boot from CDROM and HDD.
If we have several devices of the same type (for example hdd0 and hdd1),
than we mark the first one as bootable.
---
 diff from v1:
 Move this commit to patch series

 src/vz/vz_sdk.c | 111 +---
 1 file changed, 81 insertions(+), 30 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 1fcfb2e..4cf9871 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2212,6 +2212,78 @@ prlsdkAddDeviceToBootList(PRL_HANDLE sdkdom,
 return -1;
 }
 
+static int
+prlsdkSetBootDevices(PRL_HANDLE sdkdom,
+ virDomainDefPtr def)
+{
+size_t i;
+PRL_RESULT pret;
+PRL_HANDLE devList = PRL_INVALID_HANDLE;
+PRL_HANDLE dev = PRL_INVALID_HANDLE;
+PRL_DEVICE_TYPE currentDevType, bootDevType;
+PRL_UINT32 devIndex, devCount, j;
+PRL_UINT32 bootSequence = 0;
+bool rootMount = false;
+
+pret = PrlVmCfg_GetAllDevices(sdkdom, );
+prlsdkCheckRetGoto(pret, error);
+
+pret = PrlHndlList_GetItemsCount(devList, );
+prlsdkCheckRetGoto(pret, error);
+
+for (i = 0; i < def->os.nBootDevs; i++) {
+switch (def->os.bootDevs[i]) {
+case VIR_DOMAIN_BOOT_CDROM:
+bootDevType = PDE_OPTICAL_DISK;
+break;
+case VIR_DOMAIN_BOOT_DISK:
+bootDevType = PDE_HARD_DISK;
+break;
+default:
+continue;
+}
+
+for (j = 0; j < devCount; j++) {
+pret = PrlHndlList_GetItem(devList, j, );
+prlsdkCheckRetGoto(pret, error);
+
+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, error);
+
+if (currentDevType == bootDevType) {
+pret = PrlVmDev_GetIndex(dev, );
+prlsdkCheckRetGoto(pret, error);
+
+if (prlsdkAddDeviceToBootList(sdkdom, devIndex, 
currentDevType, bootSequence) < 0)
+goto error;
+bootSequence++;
+
+if (IS_CT(def) && !rootMount) {
+/* If we add physical device as a boot disk to container
+   we have to specify mount point for it */
+pret = PrlVmDevHd_SetMountPoint(dev, "/");
+prlsdkCheckRetGoto(pret, error);
+rootMount = true;
+}
+}
+PrlHandle_Free(dev);
+dev = PRL_INVALID_HANDLE;
+}
+}
+
+PrlHandle_Free(devList);
+return 0;
+
+ error:
+if (dev != PRL_INVALID_HANDLE)
+PrlHandle_Free(dev);
+
+if (devList != PRL_INVALID_HANDLE)
+PrlHandle_Free(devList);
+
+return -1;
+}
+
 static int prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def)
 {
 virDomainGraphicsDefPtr gr;
@@ -3159,9 +3231,7 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
 }
 
 static int prlsdkAddDisk(PRL_HANDLE sdkdom,
- virDomainDiskDefPtr disk,
- bool bootDisk,
- bool isCt)
+ virDomainDiskDefPtr disk)
 {
 PRL_RESULT pret;
 PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
@@ -3170,7 +3240,6 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 PRL_MASS_STORAGE_INTERFACE_TYPE sdkbus;
 int idx;
 virDomainDeviceDriveAddressPtr drive;
-PRL_UINT32 devIndex;
 PRL_DEVICE_TYPE devType;
 char *dst = NULL;
 
@@ -3319,21 +3388,6 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 goto cleanup;
 }
 
-if (bootDisk) {
-pret = PrlVmDev_GetIndex(sdkdisk, );
-prlsdkCheckRetGoto(pret, cleanup);
-
-if (prlsdkAddDeviceToBootList(sdkdom, devIndex, devType, 0) < 0)
-goto cleanup;
-
-/* If we add physical device as a boot disk to container
- * we have to specify mount point for it */
-if (isCt) {
-pret = PrlVmDevHd_SetMountPoint(sdkdisk, "/");
-prlsdkCheckRetGoto(pret, cleanup);
-}
-}
-
 return 0;
  cleanup:
 PrlHandle_Free(sdkdisk);
@@ -3352,7 +3406,7 @@ prlsdkAttachVolume(virDomainObjPtr dom, 
virDomainDiskDefPtr disk)
 if (PRL_FAILED(waitJob(job)))
 goto cleanup;
 
-ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def));
+ret = prlsdkAddDisk(privdom->sdkdom, disk);
 if (ret == 0) {
 job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
 if (PRL_FAILED(waitJob(job))) {
@@ -3490,7 +3544,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 PRL_RESULT pret;
 size_t i;
 char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
-bool needBoot = true;
+bool rootfsFound = false;
 char *mask = NULL;
 
 if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0)
@@ -3576,21 +3630,18 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 goto error;
 }
 if 

[libvirt] [PATCH 2/3 v2] vz: allow to boot VM from cdrom

2015-12-15 Thread Mikhail Feoktistov
If user creates virtual machine via virt-manager and select "boot from ISO"
then in libvirt we can see the following devices section

   
 
 
   
   
 
 
 
   

These devices don't have disk->format parameter, so we should
allow to add disks with format = VIR_STORAGE_FILE_NONE.

If user select boot from HDD and add new Cdrom device then we see

 
   
   
 

Cdrom device  doesn't have disk->source parameter,
it means that user did select "attach to real device" or "use ISO".
So we should not return error if we get device with empty source path.
---
 diff from v1:
 Add commit description
 Move this commit to patch series

 src/vz/vz_sdk.c | 22 +-
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index c5f8edd..1fcfb2e 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2026,8 +2026,9 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 }
 
 if (!IS_CT(def)) {
-if (def->os.nBootDevs != 1 ||
-def->os.bootDevs[0] != VIR_DOMAIN_BOOT_DISK ||
+if (def->os.nBootDevs == 0 ||
+(def->os.bootDevs[0] != VIR_DOMAIN_BOOT_DISK &&
+def->os.bootDevs[0] != VIR_DOMAIN_BOOT_CDROM) ||
 def->os.init != NULL || def->os.initargv != NULL) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -3192,11 +3193,12 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 
 if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
+(virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP &&
+ virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE)) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
- "disk %s, vz driver 
supports only "
- "images in ploop 
format."), disk->src->path);
+ "disk %s, it should 
be either not set or "
+ "ploop format."), 
disk->src->path);
 goto cleanup;
 }
 
@@ -3218,11 +3220,13 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 pret = PrlVmDev_SetEmulatedType(sdkdisk, emutype);
 prlsdkCheckRetGoto(pret, cleanup);
 
-pret = PrlVmDev_SetSysName(sdkdisk, disk->src->path);
-prlsdkCheckRetGoto(pret, cleanup);
+if (disk->src->path != NULL) {
+pret = PrlVmDev_SetSysName(sdkdisk, disk->src->path);
+prlsdkCheckRetGoto(pret, cleanup);
 
-pret = PrlVmDev_SetFriendlyName(sdkdisk, disk->src->path);
-prlsdkCheckRetGoto(pret, cleanup);
+pret = PrlVmDev_SetFriendlyName(sdkdisk, disk->src->path);
+prlsdkCheckRetGoto(pret, cleanup);
+}
 
 drive = >info.addr.drive;
 if (drive->controller > 0) {
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 0/3] vz: allow to create CT from template and boot VM from cdrom

2015-12-15 Thread Mikhail Feoktistov
Mikhail Feoktistov (3):
  vz: allow to create container based on template
  vz: allow to boot VM from cdrom
  vz: implementation of boot device order

 src/vz/vz_sdk.c | 174 
 1 file changed, 125 insertions(+), 49 deletions(-)

-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] vz: implementation of domainCreateXML callback

2015-12-13 Thread Mikhail Feoktistov
---

 diff from v1.
 Remove call of vzDomainSuspend() in case of VIR_DOMAIN_START_PAUSED flag is 
set.
 Now we don't support to create instance in stopped state.

 src/vz/vz_driver.c | 24 
 1 file changed, 24 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index ea1090a..4498e01 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -979,6 +979,29 @@ vzDomainUndefine(virDomainPtr domain)
 return vzDomainUndefineFlags(domain, 0);
 }
 
+static virDomainPtr
+vzDomainCreateXML(virConnectPtr conn,
+  const char *xml,
+  unsigned int flags)
+{
+virDomainPtr domain;
+int ret;
+
+virCheckFlags(0, NULL);
+
+domain = vzDomainDefineXMLFlags(conn, xml, 0);
+if (domain == NULL)
+return domain;
+
+ret = vzDomainCreate(domain);
+if (ret != 0) {
+vzDomainUndefine(domain);
+return NULL;
+}
+
+return domain;
+}
+
 static int
 vzDomainHasManagedSaveImage(virDomainPtr domain, unsigned int flags)
 {
@@ -1493,6 +1516,7 @@ static virHypervisorDriver vzDriver = {
 .domainShutdown = vzDomainShutdown, /* 0.10.0 */
 .domainCreate = vzDomainCreate,/* 0.10.0 */
 .domainCreateWithFlags = vzDomainCreateWithFlags, /* 1.2.10 */
+.domainCreateXML = vzDomainCreateXML, /* 1.2.22 */
 .domainReboot = vzDomainReboot, /* 1.3.0 */
 .domainDefineXML = vzDomainDefineXML,  /* 0.10.0 */
 .domainDefineXMLFlags = vzDomainDefineXMLFlags, /* 1.2.12 */
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH] vz: Allow to create container based on template

2015-12-10 Thread Mikhail Feoktistov


24.11.2015 17:14, Dmitry Guryanov пишет:

On Thu, 2015-11-19 at 14:44 +0300, Mikhail Feoktistov wrote:

We shouldn't delete disk from default config if we create container based on
template,
because we don't have the new disk from XML, only template name.
And don't add template section from XML as new filesystem,
we use PrlVmCfg_SetOsTemplate function to set template name.
---
  src/vz/vz_sdk.c | 33 +
  1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 89c9e89..865cabe 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2096,12 +2096,14 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom,
virDomainDefPtr def)
  return 0;
  }
  
-static int prlsdkClearDevices(PRL_HANDLE sdkdom)

+static int prlsdkClearDevices(PRL_HANDLE sdkdom, bool skipdisk)
  {
  PRL_RESULT pret;
  PRL_UINT32 n, i;
  PRL_HANDLE devList;
  PRL_HANDLE dev;
+PRL_DEVICE_TYPE devType;
+PRL_VM_DEV_EMULATION_TYPE emul;
  int ret = -1;
  
  pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);

@@ -2117,6 +2119,18 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom)
  pret = PrlHndlList_GetItem(devList, i, );
  prlsdkCheckRetGoto(pret, cleanup);
  
+if (skipdisk) {

+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDev_GetEmulatedType(dev, );

Where do you use this emul?

This emul is unusable variable. Thanks.

+prlsdkCheckRetGoto(pret, cleanup);
+
+if (devType == PDE_HARD_DISK) {
+PrlHandle_Free(dev);
+continue;
+}
+}
  pret = PrlVmDev_Remove(dev);
  PrlHandle_Free(dev);
  }
@@ -3465,6 +3479,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
  char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
  bool needBoot = true;
  char *mask = NULL;
+bool skipdisk = false;
  
  if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0)

  return -1;
@@ -3514,7 +3529,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
  }
  prlsdkCheckRetGoto(pret, error);
  
-if (prlsdkClearDevices(sdkdom) < 0)

+if (def->nfss == 1 &&
+def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
+skipdisk = true;
+
+if (prlsdkClearDevices(sdkdom, skipdisk) < 0)
  goto error;
  

I think we should make this logic more robust. There is only one case,
when VIR_DOMAIN_FS_TYPE_TEMPLATE fs is allowed - when we create new container.
So I'd add a parameter to prlsdkDoApplyConfig, something like useCtTemplateFs,
which means that we should have only one fs of type template and no disks.

Ok. done in patch v2.



  if (prlsdkRemoveBootDevices(sdkdom) < 0)
@@ -3544,6 +3563,8 @@ prlsdkDoApplyConfig(virConnectPtr conn,
  for (i = 0; i < def->nfss; i++) {
  if (STREQ(def->fss[i]->dst, "/"))
  needBoot = false;
+if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
+continue;

If fs with index different from 0 is VIR_DOMAIN_FS_TYPE_TEMPLATE - it's an
error, also if we are not creating new ct - it's also error.

done in patch v2.



  if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
  goto error;
  }
@@ -3655,6 +3676,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
  int ret = -1;
  int useTemplate = 0;
  size_t i;
+PRL_UINT32 flags = 0;
  
  if (def->nfss > 1) {

  /* Check all filesystems */
@@ -3696,8 +3718,11 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
  if (ret)
  goto cleanup;
  
-job = PrlVm_RegEx(sdkdom, "",

-  PACF_NON_INTERACTIVE_MODE | PRNVM_PRESERVE_DISK);
+flags = PACF_NON_INTERACTIVE_MODE;
+if (!useTemplate)
+flags = flags | PRNVM_PRESERVE_DISK;

Why do you need to remove this flag to create ct from template? As I remember
it's needed to keep disk images, which you've remove from config.
If we create ct from template with flag PRNVM_PRESERVE_DISK than error 
occurs
err=SDabbot stat /vz/root/22eba3c0-05d7-452f-89df-5551ec2c85a1: No such 
file or directory Failed to start the Container

So we should not set this flag se of create from template.

+
+job = PrlVm_RegEx(sdkdom, "", flags);
  if (PRL_FAILED(waitJob(job)))
  ret = -1;
  


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH] vz: implementation of boot device order

2015-11-23 Thread Mikhail Feoktistov
This patch implements functionality of boot device order
based on boot element from os section in XML.
Now we support boot from CDROM and HDD.
If we have several devices of the same type (for example hdd0 and hdd1),
than we mark the first one as bootable.
---
 src/vz/vz_sdk.c | 111 +---
 1 file changed, 81 insertions(+), 30 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 750133d..bebd3b8 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2198,6 +2198,78 @@ prlsdkAddDeviceToBootList(PRL_HANDLE sdkdom,
 return -1;
 }
 
+static int
+prlsdkSetBootDevices(PRL_HANDLE sdkdom,
+ virDomainDefPtr def)
+{
+size_t i;
+PRL_RESULT pret;
+PRL_HANDLE devList = PRL_INVALID_HANDLE;
+PRL_HANDLE dev = PRL_INVALID_HANDLE;
+PRL_DEVICE_TYPE currentDevType, bootDevType;
+PRL_UINT32 devIndex, devCount, j;
+PRL_UINT32 bootSequence = 0;
+bool rootMount = false;
+
+pret = PrlVmCfg_GetAllDevices(sdkdom, );
+prlsdkCheckRetGoto(pret, error);
+
+pret = PrlHndlList_GetItemsCount(devList, );
+prlsdkCheckRetGoto(pret, error);
+
+for (i = 0; i < def->os.nBootDevs; i++) {
+switch (def->os.bootDevs[i]) {
+case VIR_DOMAIN_BOOT_CDROM:
+bootDevType = PDE_OPTICAL_DISK;
+break;
+case VIR_DOMAIN_BOOT_DISK:
+bootDevType = PDE_HARD_DISK;
+break;
+default:
+continue;
+}
+
+for (j = 0; j < devCount; j++) {
+pret = PrlHndlList_GetItem(devList, j, );
+prlsdkCheckRetGoto(pret, error);
+
+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, error);
+
+if (currentDevType == bootDevType) {
+pret = PrlVmDev_GetIndex(dev, );
+prlsdkCheckRetGoto(pret, error);
+
+if (prlsdkAddDeviceToBootList(sdkdom, devIndex, 
currentDevType, bootSequence) < 0)
+goto error;
+bootSequence++;
+
+if (IS_CT(def) && !rootMount) {
+/* If we add physical device as a boot disk to container
+   we have to specify mount point for it */
+pret = PrlVmDevHd_SetMountPoint(dev, "/");
+prlsdkCheckRetGoto(pret, error);
+rootMount = true;
+}
+}
+PrlHandle_Free(dev);
+dev = PRL_INVALID_HANDLE;
+}
+}
+
+PrlHandle_Free(devList);
+return 0;
+
+ error:
+if (dev != PRL_INVALID_HANDLE)
+PrlHandle_Free(dev);
+
+if (devList != PRL_INVALID_HANDLE)
+PrlHandle_Free(devList);
+
+return -1;
+}
+
 static int prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def)
 {
 virDomainGraphicsDefPtr gr;
@@ -3145,9 +3217,7 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
 }
 
 static int prlsdkAddDisk(PRL_HANDLE sdkdom,
- virDomainDiskDefPtr disk,
- bool bootDisk,
- bool isCt)
+ virDomainDiskDefPtr disk)
 {
 PRL_RESULT pret;
 PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
@@ -3156,7 +3226,6 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 PRL_MASS_STORAGE_INTERFACE_TYPE sdkbus;
 int idx;
 virDomainDeviceDriveAddressPtr drive;
-PRL_UINT32 devIndex;
 PRL_DEVICE_TYPE devType;
 char *dst = NULL;
 
@@ -3302,21 +3371,6 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 goto cleanup;
 }
 
-if (bootDisk) {
-pret = PrlVmDev_GetIndex(sdkdisk, );
-prlsdkCheckRetGoto(pret, cleanup);
-
-if (prlsdkAddDeviceToBootList(sdkdom, devIndex, devType, 0) < 0)
-goto cleanup;
-
-/* If we add physical device as a boot disk to container
- * we have to specify mount point for it */
-if (isCt) {
-pret = PrlVmDevHd_SetMountPoint(sdkdisk, "/");
-prlsdkCheckRetGoto(pret, cleanup);
-}
-}
-
 return 0;
  cleanup:
 PrlHandle_Free(sdkdisk);
@@ -3335,7 +3389,7 @@ prlsdkAttachVolume(virDomainObjPtr dom, 
virDomainDiskDefPtr disk)
 if (PRL_FAILED(waitJob(job)))
 goto cleanup;
 
-ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def));
+ret = prlsdkAddDisk(privdom->sdkdom, disk);
 if (ret == 0) {
 job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
 if (PRL_FAILED(waitJob(job))) {
@@ -3472,7 +3526,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 PRL_RESULT pret;
 size_t i;
 char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
-bool needBoot = true;
+bool rootfsFound = false;
 char *mask = NULL;
 
 if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0)
@@ -3552,21 +3606,18 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 
 for (i = 0; i < def->nfss; i++) {
 if (STREQ(def->fss[i]->dst, "/"))
-needBoot = false;
+   

[libvirt] [PATCH] vz: implementation of domainCreateXML callback

2015-11-20 Thread Mikhail Feoktistov
---
 src/vz/vz_driver.c | 33 +
 1 file changed, 33 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 39f58a4..31dfb6a 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -979,6 +979,38 @@ vzDomainUndefine(virDomainPtr domain)
 return vzDomainUndefineFlags(domain, 0);
 }
 
+static virDomainPtr
+vzDomainCreateXML(virConnectPtr conn,
+  const char *xml,
+  unsigned int flags)
+{
+virDomainPtr domain;
+int ret;
+
+virCheckFlags(VIR_DOMAIN_START_PAUSED, NULL);
+
+domain = vzDomainDefineXMLFlags(conn, xml, 0);
+if (domain == NULL)
+return domain;
+
+ret = vzDomainCreate(domain);
+if (ret != 0) {
+vzDomainUndefine(domain);
+return NULL;
+}
+
+if (flags & VIR_DOMAIN_START_PAUSED) {
+ret = vzDomainSuspend(domain);
+if (ret != 0) {
+vzDomainDestroy(domain);
+vzDomainUndefine(domain);
+return NULL;
+}
+}
+
+return domain;
+}
+
 static int
 vzDomainHasManagedSaveImage(virDomainPtr domain, unsigned int flags)
 {
@@ -1493,6 +1525,7 @@ static virHypervisorDriver vzDriver = {
 .domainShutdown = vzDomainShutdown, /* 0.10.0 */
 .domainCreate = vzDomainCreate,/* 0.10.0 */
 .domainCreateWithFlags = vzDomainCreateWithFlags, /* 1.2.10 */
+.domainCreateXML = vzDomainCreateXML, /* 1.2.22 */
 .domainReboot = vzDomainReboot, /* 1.2.22 */
 .domainDefineXML = vzDomainDefineXML,  /* 0.10.0 */
 .domainDefineXMLFlags = vzDomainDefineXMLFlags, /* 1.2.12 */
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: allow to boot VM from cdrom

2015-11-20 Thread Mikhail Feoktistov
---
 src/vz/vz_sdk.c | 22 +-
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 750133d..9bdf7aa9a 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2023,8 +2023,9 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 }
 
 if (!IS_CT(def)) {
-if (def->os.nBootDevs != 1 ||
-def->os.bootDevs[0] != VIR_DOMAIN_BOOT_DISK ||
+if (def->os.nBootDevs == 0 ||
+(def->os.bootDevs[0] != VIR_DOMAIN_BOOT_DISK &&
+def->os.bootDevs[0] != VIR_DOMAIN_BOOT_CDROM) ||
 def->os.init != NULL || def->os.initargv != NULL) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -3179,11 +3180,12 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 
 if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
-virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
+(virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP &&
+ virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE)) {
 
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
- "disk %s, vz driver 
supports only "
- "images in ploop 
format."), disk->src->path);
+ "disk %s, it should 
be either not set or "
+ "ploop format."), 
disk->src->path);
 goto cleanup;
 }
 
@@ -3205,11 +3207,13 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 pret = PrlVmDev_SetEmulatedType(sdkdisk, emutype);
 prlsdkCheckRetGoto(pret, cleanup);
 
-pret = PrlVmDev_SetSysName(sdkdisk, disk->src->path);
-prlsdkCheckRetGoto(pret, cleanup);
+if (disk->src->path != NULL) {
+pret = PrlVmDev_SetSysName(sdkdisk, disk->src->path);
+prlsdkCheckRetGoto(pret, cleanup);
 
-pret = PrlVmDev_SetFriendlyName(sdkdisk, disk->src->path);
-prlsdkCheckRetGoto(pret, cleanup);
+pret = PrlVmDev_SetFriendlyName(sdkdisk, disk->src->path);
+prlsdkCheckRetGoto(pret, cleanup);
+}
 
 drive = >info.addr.drive;
 if (drive->controller > 0) {
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: Allow to create container based on template

2015-11-19 Thread Mikhail Feoktistov
We shouldn't delete disk from default config if we create container based on 
template,
because we don't have the new disk from XML, only template name.
And don't add template section from XML as new filesystem,
we use PrlVmCfg_SetOsTemplate function to set template name.
---
 src/vz/vz_sdk.c | 33 +
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 89c9e89..865cabe 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2096,12 +2096,14 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, 
virDomainDefPtr def)
 return 0;
 }
 
-static int prlsdkClearDevices(PRL_HANDLE sdkdom)
+static int prlsdkClearDevices(PRL_HANDLE sdkdom, bool skipdisk)
 {
 PRL_RESULT pret;
 PRL_UINT32 n, i;
 PRL_HANDLE devList;
 PRL_HANDLE dev;
+PRL_DEVICE_TYPE devType;
+PRL_VM_DEV_EMULATION_TYPE emul;
 int ret = -1;
 
 pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
@@ -2117,6 +2119,18 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom)
 pret = PrlHndlList_GetItem(devList, i, );
 prlsdkCheckRetGoto(pret, cleanup);
 
+if (skipdisk) {
+pret = PrlVmDev_GetType(dev, );
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDev_GetEmulatedType(dev, );
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (devType == PDE_HARD_DISK) {
+PrlHandle_Free(dev);
+continue;
+}
+}
 pret = PrlVmDev_Remove(dev);
 PrlHandle_Free(dev);
 }
@@ -3465,6 +3479,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
 bool needBoot = true;
 char *mask = NULL;
+bool skipdisk = false;
 
 if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0)
 return -1;
@@ -3514,7 +3529,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 }
 prlsdkCheckRetGoto(pret, error);
 
-if (prlsdkClearDevices(sdkdom) < 0)
+if (def->nfss == 1 &&
+def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
+skipdisk = true;
+
+if (prlsdkClearDevices(sdkdom, skipdisk) < 0)
 goto error;
 
 if (prlsdkRemoveBootDevices(sdkdom) < 0)
@@ -3544,6 +3563,8 @@ prlsdkDoApplyConfig(virConnectPtr conn,
 for (i = 0; i < def->nfss; i++) {
 if (STREQ(def->fss[i]->dst, "/"))
 needBoot = false;
+if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE)
+continue;
 if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
 goto error;
 }
@@ -3655,6 +3676,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 int ret = -1;
 int useTemplate = 0;
 size_t i;
+PRL_UINT32 flags = 0;
 
 if (def->nfss > 1) {
 /* Check all filesystems */
@@ -3696,8 +3718,11 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 if (ret)
 goto cleanup;
 
-job = PrlVm_RegEx(sdkdom, "",
-  PACF_NON_INTERACTIVE_MODE | PRNVM_PRESERVE_DISK);
+flags = PACF_NON_INTERACTIVE_MODE;
+if (!useTemplate)
+flags = flags | PRNVM_PRESERVE_DISK;
+
+job = PrlVm_RegEx(sdkdom, "", flags);
 if (PRL_FAILED(waitJob(job)))
 ret = -1;
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] vz: implementation of domainReboot callback

2015-11-19 Thread Mikhail Feoktistov
Diff from v1.
1. Add virCheckFlags() call in vzDomainReboot

---
 src/vz/vz_driver.c | 8 
 src/vz/vz_sdk.c| 8 
 src/vz/vz_sdk.h| 1 +
 3 files changed, 17 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 0a968b9..39f58a4 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -923,6 +923,13 @@ static int vzDomainShutdown(virDomainPtr domain)
 return prlsdkDomainChangeState(domain, prlsdkStop);
 }
 
+static int vzDomainReboot(virDomainPtr domain,
+  unsigned int flags)
+{
+virCheckFlags(0, -1);
+return prlsdkDomainChangeState(domain, prlsdkRestart);
+}
+
 static int vzDomainIsActive(virDomainPtr domain)
 {
 virDomainObjPtr dom = NULL;
@@ -1486,6 +1493,7 @@ static virHypervisorDriver vzDriver = {
 .domainShutdown = vzDomainShutdown, /* 0.10.0 */
 .domainCreate = vzDomainCreate,/* 0.10.0 */
 .domainCreateWithFlags = vzDomainCreateWithFlags, /* 1.2.10 */
+.domainReboot = vzDomainReboot, /* 1.2.22 */
 .domainDefineXML = vzDomainDefineXML,  /* 0.10.0 */
 .domainDefineXMLFlags = vzDomainDefineXMLFlags, /* 1.2.12 */
 .domainUndefine = vzDomainUndefine, /* 1.2.10 */
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 89c9e89..bf71e96 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1831,6 +1831,14 @@ PRL_RESULT prlsdkSuspend(PRL_HANDLE sdkdom)
 return waitJob(job);
 }
 
+PRL_RESULT prlsdkRestart(PRL_HANDLE sdkdom)
+{
+PRL_HANDLE job = PRL_INVALID_HANDLE;
+
+job = PrlVm_Restart(sdkdom);
+return waitJob(job);
+}
+
 int
 prlsdkDomainChangeStateLocked(vzConnPtr privconn,
   virDomainObjPtr dom,
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index ebe4591..88ee7d9 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -41,6 +41,7 @@ PRL_RESULT prlsdkStop(PRL_HANDLE sdkdom);
 PRL_RESULT prlsdkPause(PRL_HANDLE sdkdom);
 PRL_RESULT prlsdkResume(PRL_HANDLE sdkdom);
 PRL_RESULT prlsdkSuspend(PRL_HANDLE sdkdom);
+PRL_RESULT prlsdkRestart(PRL_HANDLE sdkdom);
 
 typedef PRL_RESULT (*prlsdkChangeStateFunc)(PRL_HANDLE sdkdom);
 int
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] add func to set shared drivers after libvirtd init

2015-11-19 Thread Mikhail Feoktistov
Diff from v1:
Remove vz prefix from the title of this letter. Because this is the common case
for all drivers in libvirt.

Description:
Built-in drivers in libvirt are initialized before libvirtd initialization.
Libvirt loads shared drivers on libvirtd initialization step.
For built-in drivers we can't set shared drivers, because they are not 
initialized yet.
This patch adds function to set shared drivers after libvirtd init.
---
 daemon/libvirtd.c|  4 
 src/libvirt.c| 41 +
 src/libvirt_internal.h   |  1 +
 src/libvirt_private.syms |  1 +
 4 files changed, 47 insertions(+)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 250094b..aac1826 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -431,6 +431,10 @@ static void daemonInitialize(void)
 bhyveRegister();
 # endif
 #endif
+# ifdef WITH_VZ
+virAssignSharedDrivers("vz");
+virAssignSharedDrivers("Parallels");
+# endif
 }
 
 
diff --git a/src/libvirt.c b/src/libvirt.c
index 25a0040..1763be7 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -1433,3 +1433,44 @@ virTypedParameterValidateSet(virConnectPtr conn,
 }
 return 0;
 }
+
+/**
+ * virAssignSharedDrivers:
+ * @name: name of connection driver
+ *
+ * This function fills in any empty pointers for shared drivers
+ * in connect driver structure
+ *
+ * Returns 0 in case of success, -1 in case of error
+*/
+int
+virAssignSharedDrivers(const char *name)
+{
+size_t i;
+
+if (name == NULL) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Driver name must be specified"));
+return -1;
+}
+
+for (i = 0; i < virConnectDriverTabCount; i++) {
+if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name, name)) {
+if (virConnectDriverTab[i]->interfaceDriver == NULL)
+virConnectDriverTab[i]->interfaceDriver = 
virSharedInterfaceDriver;
+if (virConnectDriverTab[i]->networkDriver == NULL)
+virConnectDriverTab[i]->networkDriver = virSharedNetworkDriver;
+if (virConnectDriverTab[i]->nodeDeviceDriver == NULL)
+virConnectDriverTab[i]->nodeDeviceDriver = 
virSharedNodeDeviceDriver;
+if (virConnectDriverTab[i]->nwfilterDriver == NULL)
+virConnectDriverTab[i]->nwfilterDriver = 
virSharedNWFilterDriver;
+if (virConnectDriverTab[i]->secretDriver == NULL)
+virConnectDriverTab[i]->secretDriver = virSharedSecretDriver;
+if (virConnectDriverTab[i]->storageDriver == NULL)
+virConnectDriverTab[i]->storageDriver = virSharedStorageDriver;
+break;
+   }
+}
+
+return 0;
+}
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 1313b58..2a7227b 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -289,4 +289,5 @@ virTypedParameterValidateSet(virConnectPtr conn,
  virTypedParameterPtr params,
  int nparams);
 
+int virAssignSharedDrivers(const char *name);
 #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a835f18..a0fcdf5 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -943,6 +943,7 @@ virFDStreamSetInternalCloseCb;
 
 
 # libvirt_internal.h
+virAssignSharedDrivers;
 virConnectSupportsFeature;
 virDomainMigrateBegin3;
 virDomainMigrateBegin3Params;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: implementation of domainReboot callback

2015-11-18 Thread Mikhail Feoktistov
---
 src/vz/vz_driver.c | 8 
 src/vz/vz_sdk.c| 8 
 src/vz/vz_sdk.h| 1 +
 3 files changed, 17 insertions(+)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 0a968b9..5f56eaf 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -923,6 +923,13 @@ static int vzDomainShutdown(virDomainPtr domain)
 return prlsdkDomainChangeState(domain, prlsdkStop);
 }
 
+static int vzDomainReboot(virDomainPtr domain,
+  unsigned int flags)
+{
+flags = flags;
+return prlsdkDomainChangeState(domain, prlsdkRestart);
+}
+
 static int vzDomainIsActive(virDomainPtr domain)
 {
 virDomainObjPtr dom = NULL;
@@ -1486,6 +1493,7 @@ static virHypervisorDriver vzDriver = {
 .domainShutdown = vzDomainShutdown, /* 0.10.0 */
 .domainCreate = vzDomainCreate,/* 0.10.0 */
 .domainCreateWithFlags = vzDomainCreateWithFlags, /* 1.2.10 */
+.domainReboot = vzDomainReboot, /* 1.2.22 */
 .domainDefineXML = vzDomainDefineXML,  /* 0.10.0 */
 .domainDefineXMLFlags = vzDomainDefineXMLFlags, /* 1.2.12 */
 .domainUndefine = vzDomainUndefine, /* 1.2.10 */
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 89c9e89..bf71e96 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1831,6 +1831,14 @@ PRL_RESULT prlsdkSuspend(PRL_HANDLE sdkdom)
 return waitJob(job);
 }
 
+PRL_RESULT prlsdkRestart(PRL_HANDLE sdkdom)
+{
+PRL_HANDLE job = PRL_INVALID_HANDLE;
+
+job = PrlVm_Restart(sdkdom);
+return waitJob(job);
+}
+
 int
 prlsdkDomainChangeStateLocked(vzConnPtr privconn,
   virDomainObjPtr dom,
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index ebe4591..88ee7d9 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -41,6 +41,7 @@ PRL_RESULT prlsdkStop(PRL_HANDLE sdkdom);
 PRL_RESULT prlsdkPause(PRL_HANDLE sdkdom);
 PRL_RESULT prlsdkResume(PRL_HANDLE sdkdom);
 PRL_RESULT prlsdkSuspend(PRL_HANDLE sdkdom);
+PRL_RESULT prlsdkRestart(PRL_HANDLE sdkdom);
 
 typedef PRL_RESULT (*prlsdkChangeStateFunc)(PRL_HANDLE sdkdom);
 int
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: allow only en-us keymap for VNC

2015-11-18 Thread Mikhail Feoktistov
In virtuozzo we support only en-us keymap for VMs and containers.
If keymap is specified than check that it's en-us, otherwise
show error message.
---
 src/vz/vz_sdk.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 89c9e89..526c0f2 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2220,10 +2220,11 @@ static int 
prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def)
 return -1;
 }
 
-if (gr->data.vnc.keymap != 0) {
+if (gr->data.vnc.keymap != 0 &&
+STRNEQ(gr->data.vnc.keymap, "en-us")) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-   _("vz driver doesn't support "
- "keymap setting for VNC graphics."));
+   _("vz driver supports only "
+ "\"en-us\" keymap for VNC graphics."));
 return -1;
 }
 
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH] vz: add func to set shared drivers after libvirtd init

2015-10-22 Thread Mikhail Feoktistov
Built-in drivers in libvirt are initialized before libvirtd initialization.
Libvirt loads shared drivers on libvirtd initialization step.
For built-in drivers we can't set shared drivers, because they are not 
initialized yet.
This patch adds function to set shared drivers after libvirtd init.
---
 daemon/libvirtd.c|  4 
 src/libvirt.c| 41 +
 src/libvirt_internal.h   |  1 +
 src/libvirt_private.syms |  1 +
 4 files changed, 47 insertions(+)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 250094b..aac1826 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -431,6 +431,10 @@ static void daemonInitialize(void)
 bhyveRegister();
 # endif
 #endif
+# ifdef WITH_VZ
+virAssignSharedDrivers("vz");
+virAssignSharedDrivers("Parallels");
+# endif
 }
 
 
diff --git a/src/libvirt.c b/src/libvirt.c
index 2602dde..4c4b7bd 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -1433,3 +1433,44 @@ virTypedParameterValidateSet(virConnectPtr conn,
 }
 return 0;
 }
+
+/**
+ * virAssignSharedDrivers:
+ * @name: name of connection driver
+ *
+ * This function fills in any empty pointers for shared drivers
+ * in connect driver structure
+ *
+ * Returns 0 in case of success, -1 in case of error
+*/
+int
+virAssignSharedDrivers(const char *name)
+{
+size_t i;
+
+if (name == NULL) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("Driver name must be specified"));
+return -1;
+}
+
+for (i = 0; i < virConnectDriverTabCount; i++) {
+if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name, name)) {
+if (virConnectDriverTab[i]->interfaceDriver == NULL)
+virConnectDriverTab[i]->interfaceDriver = 
virSharedInterfaceDriver;
+if (virConnectDriverTab[i]->networkDriver == NULL)
+virConnectDriverTab[i]->networkDriver = virSharedNetworkDriver;
+if (virConnectDriverTab[i]->nodeDeviceDriver == NULL)
+virConnectDriverTab[i]->nodeDeviceDriver = 
virSharedNodeDeviceDriver;
+if (virConnectDriverTab[i]->nwfilterDriver == NULL)
+virConnectDriverTab[i]->nwfilterDriver = 
virSharedNWFilterDriver;
+if (virConnectDriverTab[i]->secretDriver == NULL)
+virConnectDriverTab[i]->secretDriver = virSharedSecretDriver;
+if (virConnectDriverTab[i]->storageDriver == NULL)
+virConnectDriverTab[i]->storageDriver = virSharedStorageDriver;
+break;
+   }
+}
+
+return 0;
+}
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 1313b58..2a7227b 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -289,4 +289,5 @@ virTypedParameterValidateSet(virConnectPtr conn,
  virTypedParameterPtr params,
  int nparams);
 
+int virAssignSharedDrivers(const char *name);
 #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index be6ee19..340555a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -943,6 +943,7 @@ virFDStreamSetInternalCloseCb;
 
 
 # libvirt_internal.h
+virAssignSharedDrivers;
 virConnectSupportsFeature;
 virDomainMigrateBegin3;
 virDomainMigrateBegin3Params;
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 0/1] vz: assign static IPs and default gateways for network adapter

2015-07-07 Thread Mikhail Feoktistov
fix avoid_if_before_free warnings for VIR_FREE calls
fix found diagnostic without % warnings for virReportError calls
use virAsprintf instead of virBufferAsprintf
set default gateway only if static ip is present
write inet family to log in case of unsupported gateway

Mikhail Feoktistov (1):
  vz: assign static IPs and default gateways for network adapter

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 1/1] vz: assign static IPs and default gateways for network adapter

2015-07-07 Thread Mikhail Feoktistov
We support only one IPv4 and one IPv6 default gateway.
If static IPs are not present in instance config,
then we switch on DHCP for this adapter.
PrlVmDevNet_SetAutoApply to makes necessary settings within guest OS
In linux case it creates network startup scripts
/etc/sysconfig/network-scripts/ifcfg-ethN and fills it with necessary
parameters.
---
 src/vz/vz_sdk.c |  126 +++
 1 files changed, 126 insertions(+), 0 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 1b66958..1b8298c 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2762,8 +2762,13 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom,
 PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
 PRL_HANDLE vnet = PRL_INVALID_HANDLE;
 PRL_HANDLE job = PRL_INVALID_HANDLE;
+PRL_HANDLE addrlist = PRL_INVALID_HANDLE;
+size_t i;
 int ret = -1;
 char macstr[PRL_MAC_STRING_BUFNAME];
+char *addrstr = NULL;
+bool ipv6present = false;
+bool ipv4present = false;
 
 if (prlsdkCheckNetUnsupportedParams(net)  0)
 return -1;
@@ -2788,6 +2793,125 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom,
 pret = PrlVmDevNet_SetMacAddress(sdknet, macstr);
 prlsdkCheckRetGoto(pret, cleanup);
 
+pret = PrlApi_CreateStringsList(addrlist);
+prlsdkCheckRetGoto(pret, cleanup);
+
+for (i = 0; i  net-nips; i++) {
+char *tmpstr;
+
+if (AF_INET == VIR_SOCKET_ADDR_FAMILY(net-ips[i]-address))
+ipv4present = true;
+else if (AF_INET6 == VIR_SOCKET_ADDR_FAMILY(net-ips[i]-address))
+ipv6present = true;
+else
+continue;
+
+if (!(tmpstr = virSocketAddrFormat(net-ips[i]-address)))
+goto cleanup;
+
+if (virAsprintf(addrstr, %s/%d, tmpstr, net-ips[i]-prefix)  0) {
+VIR_FREE(tmpstr);
+goto cleanup;
+}
+
+VIR_FREE(tmpstr);
+pret = PrlStrList_AddItem(addrlist, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+VIR_FREE(addrstr);
+}
+
+if (ipv4present || ipv6present) {
+pret = PrlVmDevNet_SetNetAddresses(sdknet, addrlist);
+prlsdkCheckRetGoto(pret, cleanup);
+}
+
+pret = PrlVmDevNet_SetConfigureWithDhcp(sdknet, !ipv4present);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDevNet_SetConfigureWithDhcpIPv6(sdknet, !ipv6present);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDevNet_SetAutoApply(sdknet, true);
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (net-nroutes) {
+bool alreadySetIPv4Gateway = false;
+bool alreadySetIPv6Gateway = false;
+
+for (i = 0; i  net-nroutes; i++) {
+virSocketAddrPtr addrdst, gateway;
+virSocketAddr zero;
+
+addrdst = virNetworkRouteDefGetAddress(net-routes[i]);
+gateway = virNetworkRouteDefGetGateway(net-routes[i]);
+
+ignore_value(virSocketAddrParse(zero,
+(VIR_SOCKET_ADDR_IS_FAMILY(addrdst, 
AF_INET)
+ ? VIR_SOCKET_ADDR_IPV4_ALL
+ : VIR_SOCKET_ADDR_IPV6_ALL),
+VIR_SOCKET_ADDR_FAMILY(addrdst)));
+
+if (!virSocketAddrEqual(addrdst, zero)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s,
+   _(Support only default gateway));
+goto cleanup;
+}
+
+switch (VIR_SOCKET_ADDR_FAMILY(gateway)) {
+case AF_INET:
+
+if (!ipv4present)
+continue;
+
+if (alreadySetIPv4Gateway) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s,
+   _(Support only one IPv4 default gateway));
+goto cleanup;
+}
+
+if (!(addrstr = virSocketAddrFormat(gateway)))
+goto cleanup;
+
+pret = PrlVmDevNet_SetDefaultGateway(sdknet, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+alreadySetIPv4Gateway = true;
+break;
+
+case AF_INET6:
+
+if (!ipv6present)
+continue;
+
+if (alreadySetIPv6Gateway) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s,
+   _(Support only one IPv6 default gateway));
+goto cleanup;
+}
+
+if (!(addrstr = virSocketAddrFormat(gateway)))
+goto cleanup;
+
+pret = PrlVmDevNet_SetDefaultGatewayIPv6(sdknet, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+alreadySetIPv6Gateway = true;
+break;
+
+default:
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Unsupported address family %d 
+   

Re: [libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter

2015-07-07 Thread Mikhail Feoktistov

send v2

06.07.2015 21:28, Dmitry Guryanov пишет:

On 07/01/2015 01:15 PM, Mikhail Feoktistov wrote:

We support only one IPv4 and one IPv6 default gateway.
If static IPs are not present in instance config,
then we switch on DHCP for this adapter.
PrlVmDevNet_SetAutoApply to makes necessary settings within guest OS
In linux case it creates network startup scripts
/etc/sysconfig/network-scripts/ifcfg-ethN and fills it with necessary
parameters.
---
  src/vz/vz_sdk.c |  120 
+++

  1 files changed, 120 insertions(+), 0 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f27098c..7d318f8 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2788,8 +2788,13 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom,
  PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
  PRL_HANDLE vnet = PRL_INVALID_HANDLE;
  PRL_HANDLE job = PRL_INVALID_HANDLE;
+PRL_HANDLE addrlist = PRL_INVALID_HANDLE;
+size_t i;
  int ret = -1;
  char macstr[PRL_MAC_STRING_BUFNAME];
+char *addrstr = NULL;
+bool ipv6present = false;
+bool ipv4present = false;
if (prlsdkCheckNetUnsupportedParams(net)  0)
  return -1;
@@ -2814,6 +2819,118 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom,
  pret = PrlVmDevNet_SetMacAddress(sdknet, macstr);
  prlsdkCheckRetGoto(pret, cleanup);
  +pret = PrlApi_CreateStringsList(addrlist);
+prlsdkCheckRetGoto(pret, cleanup);
+
+for (i = 0; i  net-nips; i++) {
+virBuffer buf = VIR_BUFFER_INITIALIZER;
+char *tmpstr;
+
+if (AF_INET == VIR_SOCKET_ADDR_FAMILY(net-ips[i]-address))
+ipv4present = true;
+else if (AF_INET6 == 
VIR_SOCKET_ADDR_FAMILY(net-ips[i]-address))

+ipv6present = true;
+else
+continue;
+
+if (!(tmpstr = virSocketAddrFormat(net-ips[i]-address)))
+goto cleanup;
+
+virBufferAsprintf(buf, %s/%d, tmpstr, net-ips[i]-prefix);
+VIR_FREE(tmpstr);
+if (!(addrstr = virBufferContentAndReset(buf)))
+goto cleanup;


It's better to use virAsprintf here, since you do string formatting 
only once.



+
+pret = PrlStrList_AddItem(addrlist, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+VIR_FREE(addrstr);
+addrstr = NULL;
VIR_FREE sets the pointer to NULL, you don't need to do it by 
yourself. Also it's being caught by make syntax-check Could you, 
please, run it before sending patches?




+}
+
+if (ipv4present || ipv6present) {
+pret = PrlVmDevNet_SetNetAddresses(sdknet, addrlist);
+prlsdkCheckRetGoto(pret, cleanup);
+}
+
+pret = PrlVmDevNet_SetConfigureWithDhcp(sdknet, !ipv4present);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDevNet_SetConfigureWithDhcpIPv6(sdknet, !ipv6present);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDevNet_SetAutoApply(sdknet, true);
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (net-nroutes) {


As I can remember, it's not possible to set gateway together with 
DHCP. So I think you should set up gateways before dhcp and only if 
ipv4present/ipv6present is true.



+bool alreadySetIPv4Gateway = false;
+bool alreadySetIPv6Gateway = false;
+
+for (i = 0; i  net-nroutes; i++) {
+virSocketAddrPtr addrdst, gateway;
+virSocketAddr zero;
+
+addrdst = virNetworkRouteDefGetAddress(net-routes[i]);
+gateway = virNetworkRouteDefGetGateway(net-routes[i]);
+
+ignore_value(virSocketAddrParse(zero,
+ (VIR_SOCKET_ADDR_IS_FAMILY(addrdst, AF_INET)
+ ? VIR_SOCKET_ADDR_IPV4_ALL
+ : VIR_SOCKET_ADDR_IPV6_ALL),
+ VIR_SOCKET_ADDR_FAMILY(addrdst)));
+
+if (!virSocketAddrEqual(addrdst, zero)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only default gateway));
+goto cleanup;
+}
+
+switch (VIR_SOCKET_ADDR_FAMILY(gateway)) {
+case AF_INET:
+if (alreadySetIPv4Gateway) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only one IPv4 default 
gateway));

+goto cleanup;
+}
+
+if (!(addrstr = virSocketAddrFormat(gateway)))
+goto cleanup;
+
+pret = PrlVmDevNet_SetDefaultGateway(sdknet, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+alreadySetIPv4Gateway = true;
+break;
+
+case AF_INET6:
+if (alreadySetIPv6Gateway) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only one IPv6 default 
gateway));

+goto cleanup;
+}
+
+if (!(addrstr = virSocketAddrFormat

[libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter

2015-07-01 Thread Mikhail Feoktistov
We support only one IPv4 and one IPv6 default gateway.
If static IPs are not present in instance config,
then we switch on DHCP for this adapter.
PrlVmDevNet_SetAutoApply to makes necessary settings within guest OS
In linux case it creates network startup scripts
/etc/sysconfig/network-scripts/ifcfg-ethN and fills it with necessary
parameters.
---
 src/vz/vz_sdk.c |  120 +++
 1 files changed, 120 insertions(+), 0 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f27098c..7d318f8 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2788,8 +2788,13 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom,
 PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
 PRL_HANDLE vnet = PRL_INVALID_HANDLE;
 PRL_HANDLE job = PRL_INVALID_HANDLE;
+PRL_HANDLE addrlist = PRL_INVALID_HANDLE;
+size_t i;
 int ret = -1;
 char macstr[PRL_MAC_STRING_BUFNAME];
+char *addrstr = NULL;
+bool ipv6present = false;
+bool ipv4present = false;
 
 if (prlsdkCheckNetUnsupportedParams(net)  0)
 return -1;
@@ -2814,6 +2819,118 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom,
 pret = PrlVmDevNet_SetMacAddress(sdknet, macstr);
 prlsdkCheckRetGoto(pret, cleanup);
 
+pret = PrlApi_CreateStringsList(addrlist);
+prlsdkCheckRetGoto(pret, cleanup);
+
+for (i = 0; i  net-nips; i++) {
+virBuffer buf = VIR_BUFFER_INITIALIZER;
+char *tmpstr;
+
+if (AF_INET == VIR_SOCKET_ADDR_FAMILY(net-ips[i]-address))
+ipv4present = true;
+else if (AF_INET6 == VIR_SOCKET_ADDR_FAMILY(net-ips[i]-address))
+ipv6present = true;
+else
+continue;
+
+if (!(tmpstr = virSocketAddrFormat(net-ips[i]-address)))
+goto cleanup;
+
+virBufferAsprintf(buf, %s/%d, tmpstr, net-ips[i]-prefix);
+VIR_FREE(tmpstr);
+if (!(addrstr = virBufferContentAndReset(buf)))
+goto cleanup;
+
+pret = PrlStrList_AddItem(addrlist, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+VIR_FREE(addrstr);
+addrstr = NULL;
+}
+
+if (ipv4present || ipv6present) {
+pret = PrlVmDevNet_SetNetAddresses(sdknet, addrlist);
+prlsdkCheckRetGoto(pret, cleanup);
+}
+
+pret = PrlVmDevNet_SetConfigureWithDhcp(sdknet, !ipv4present);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDevNet_SetConfigureWithDhcpIPv6(sdknet, !ipv6present);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDevNet_SetAutoApply(sdknet, true);
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (net-nroutes) {
+bool alreadySetIPv4Gateway = false;
+bool alreadySetIPv6Gateway = false;
+
+for (i = 0; i  net-nroutes; i++) {
+virSocketAddrPtr addrdst, gateway;
+virSocketAddr zero;
+
+addrdst = virNetworkRouteDefGetAddress(net-routes[i]);
+gateway = virNetworkRouteDefGetGateway(net-routes[i]);
+
+ignore_value(virSocketAddrParse(zero,
+(VIR_SOCKET_ADDR_IS_FAMILY(addrdst, 
AF_INET)
+ ? VIR_SOCKET_ADDR_IPV4_ALL
+ : VIR_SOCKET_ADDR_IPV6_ALL),
+VIR_SOCKET_ADDR_FAMILY(addrdst)));
+
+if (!virSocketAddrEqual(addrdst, zero)) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only default gateway));
+goto cleanup;
+}
+
+switch (VIR_SOCKET_ADDR_FAMILY(gateway)) {
+case AF_INET:
+if (alreadySetIPv4Gateway) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only one IPv4 default gateway));
+goto cleanup;
+}
+
+if (!(addrstr = virSocketAddrFormat(gateway)))
+goto cleanup;
+
+pret = PrlVmDevNet_SetDefaultGateway(sdknet, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+alreadySetIPv4Gateway = true;
+break;
+
+case AF_INET6:
+if (alreadySetIPv6Gateway) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only one IPv6 default gateway));
+goto cleanup;
+}
+
+if (!(addrstr = virSocketAddrFormat(gateway)))
+goto cleanup;
+
+pret = PrlVmDevNet_SetDefaultGatewayIPv6(sdknet, addrstr);
+prlsdkCheckRetGoto(pret, cleanup);
+
+alreadySetIPv6Gateway = true;
+break;
+
+default:
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _(Support only IPv4 and IPv6 default 
gateways));
+goto cleanup;
+}
+
+if 

[libvirt] [PATCH v2 0/1] vz: Fix error messages in libvirt log caused by unhadled events

2015-06-23 Thread Mikhail Feoktistov
Changes from v1
Rebase patch

Mikhail Feoktistov (1):
  vz: Fix error messages in libvirt log caused by unhadled events

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 1/1] vz: Fix error messages in libvirt log caused by unhadled events

2015-06-23 Thread Mikhail Feoktistov
If the configuration of the instance has been modified, for example added disk 
or network device, then hypervisor
sends event with prlIssuerType = PIE_DISPATCHER and EventType = 
PET_DSP_EVT_VM_CONFIG_CHANGED
We should handle this event in prlsdkHandleVmEvent function to update 
instance's XML config.
prlsdkHandleVmEvent is a common handler and it recieves many events.
We don't need to handle all of them. Remove error message in case of unhandled 
events.
---
 src/vz/vz_sdk.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 98f7a57..d4d48e8 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1736,8 +1736,7 @@ prlsdkHandleVmEvent(vzConnPtr privconn, PRL_HANDLE 
prlEvent)
 prlEvent = PRL_INVALID_HANDLE;
 break;
 default:
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _(Can't handle event of type %d), prlEventType);
+VIR_DEBUG(Skipping event type %d, prlEventType);
 }
 
  cleanup:
@@ -1768,6 +1767,7 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR 
opaque)
 
 switch (prlIssuerType) {
 case PIE_VIRTUAL_MACHINE:
+case PIE_DISPATCHER:
 prlsdkHandleVmEvent(privconn, prlEvent);
 // above function takes own of event
 prlEvent = PRL_INVALID_HANDLE;
-- 
1.7.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] vz: implementation of attach/detach network devices

2015-06-22 Thread Mikhail Feoktistov
Changes from v1
Remove cleanup label and goto operator from prlsdkAttachNet() and 
prlsdkDetachNet()
Replace it with return operator.
Rename netMac variable to expectedMac in prlsdkGetNetIndex()
Move prlsdkGetNetIndex() call after PrlVm_BeginEdit call in prlsdkDetachNet() 
function.

Mikhail Feoktistov (1):
  vz: implementation of attach/detach network devices

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] parallels: implementation of attach/detach network devices

2015-06-22 Thread Mikhail Feoktistov
Changes from v1
Remove cleanup label and goto operator from prlsdkAttachNet() and 
prlsdkDetachNet()
Replace it with return operator.

Rename netMac variable to expectedMac in prlsdkGetNetIndex()

Move prlsdkGetNetIndex() call after PrlVm_BeginEdit call in prlsdkDetachNet() 
function.

Patch comment:
In this patch we add VIR_DOMAIN_DEVICE_NET handlers implementation
for domainAttachDevice and domainDetachDevice callbacks.

As soon as we don't support this operation for hypervisor type domains,
we implement this functionality for containers only.

In detach procedure we find network device by MAC address.
Because PrlVmDevNet_GetMacAddress() returns MAC as a UTF-8 encoded
null-terminated string, we use memcmp() to compare it.
Also we remove corresponding virtual network by prlsdkDelNetAdapter call.
---
 src/vz/vz_driver.c |   16 +++
 src/vz/vz_sdk.c|  123 
 src/vz/vz_sdk.h|4 ++
 3 files changed, 143 insertions(+), 0 deletions(-)

diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index cef3c77..d9ddd4f 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1117,6 +1117,14 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, 
const char *xml,
 goto cleanup;
 }
 break;
+case VIR_DOMAIN_DEVICE_NET:
+ret = prlsdkAttachNet(privdom, privconn, dev-data.net);
+if (ret) {
+virReportError(VIR_ERR_INTERNAL_ERROR, %s,
+   _(network attach failed));
+goto cleanup;
+}
+break;
 default:
 virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
_(device type '%s' cannot be attached),
@@ -1186,6 +1194,14 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, 
const char *xml,
 goto cleanup;
 }
 break;
+case VIR_DOMAIN_DEVICE_NET:
+ret = prlsdkDetachNet(privdom, privconn, dev-data.net);
+if (ret) {
+virReportError(VIR_ERR_INTERNAL_ERROR, %s,
+   _(network detach failed));
+goto cleanup;
+}
+break;
 default:
 virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
_(device type '%s' cannot be detached),
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 090a3ad..6e6d8c9 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2914,6 +2914,129 @@ static void prlsdkDelNet(vzConnPtr privconn, 
virDomainNetDefPtr net)
 PrlHandle_Free(vnet);
 }
 
+int prlsdkAttachNet(virDomainObjPtr dom, parallelsConnPtr privconn, 
virDomainNetDefPtr net)
+{
+int ret = -1;
+parallelsDomObjPtr privdom = dom-privateData;
+PRL_HANDLE job = PRL_INVALID_HANDLE;
+
+if (!IS_CT(dom-def)) {
+virReportError(VIR_ERR_OPERATION_UNSUPPORTED, %s,
+   _(network device cannot be attached));
+return ret;
+}
+
+job = PrlVm_BeginEdit(privdom-sdkdom);
+if (PRL_FAILED(waitJob(job)))
+return ret;
+
+ret = prlsdkAddNet(privdom-sdkdom, privconn, net, IS_CT(dom-def));
+if (ret == 0) {
+job = PrlVm_CommitEx(privdom-sdkdom, PVCF_DETACH_HDD_BUNDLE);
+if (PRL_FAILED(waitJob(job))) {
+return -1;
+}
+}
+
+return ret;
+}
+
+static int
+prlsdkGetNetIndex(PRL_HANDLE sdkdom, virDomainNetDefPtr net)
+{
+int idx = -1;
+PRL_RESULT pret;
+PRL_UINT32 adaptersCount;
+PRL_UINT32 i;
+PRL_HANDLE adapter = PRL_INVALID_HANDLE;
+PRL_UINT32 len;
+char adapterMac[PRL_MAC_STRING_BUFNAME];
+char expectedMac[PRL_MAC_STRING_BUFNAME];
+
+prlsdkFormatMac(net-mac, expectedMac);
+pret = PrlVmCfg_GetNetAdaptersCount(sdkdom, adaptersCount);
+prlsdkCheckRetGoto(pret, cleanup);
+
+for (i = 0; i  adaptersCount; ++i) {
+
+pret = PrlVmCfg_GetNetAdapter(sdkdom, i, adapter);
+prlsdkCheckRetGoto(pret, cleanup);
+
+len = sizeof(adapterMac);
+memset(adapterMac, 0, sizeof(adapterMac));
+pret = PrlVmDevNet_GetMacAddress(adapter, adapterMac, len);
+prlsdkCheckRetGoto(pret, cleanup);
+
+if (memcmp(adapterMac, expectedMac, PRL_MAC_STRING_BUFNAME)) {
+
+PrlHandle_Free(adapter);
+adapter = PRL_INVALID_HANDLE;
+continue;
+}
+
+idx = i;
+break;
+}
+
+ cleanup:
+PrlHandle_Free(adapter);
+return idx;
+}
+
+static int prlsdkDelNetAdapter(PRL_HANDLE sdkdom, int idx)
+{
+int ret = -1;
+PRL_RESULT pret;
+PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
+
+pret = PrlVmCfg_GetNetAdapter(sdkdom, idx, sdknet);
+prlsdkCheckRetGoto(pret, cleanup);
+
+pret = PrlVmDev_Remove(sdknet);
+prlsdkCheckRetGoto(pret, cleanup);
+
+ret = 0;
+
+ cleanup:
+PrlHandle_Free(sdknet);
+return ret;
+}
+
+int prlsdkDetachNet(virDomainObjPtr dom, parallelsConnPtr privconn, 
virDomainNetDefPtr net)
+{
+int ret = -1, idx = -1;
+parallelsDomObjPtr privdom = 

  1   2   >