]> xenbits.xensource.com Git - libvirt.git/commitdiff
vz: support attach/detach/update/ of graphics device
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Wed, 20 Apr 2016 14:05:42 +0000 (17:05 +0300)
committerMaxim Nestratov <mnestratov@virtuozzo.com>
Sat, 25 Jun 2016 19:56:04 +0000 (22:56 +0300)
Move graphic device config to post parse. This way we
detect error on early stage and leverage checking on detach too.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
src/vz/vz_driver.c
src/vz/vz_sdk.c
src/vz/vz_utils.c
src/vz/vz_utils.h

index f46be971ed2926ad077be49879789afc5fd5c0b3..b17cea7d8d1a5f6778c87ebfb420931cae93120c 100644 (file)
@@ -286,6 +286,8 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
 
     if (dev->type == VIR_DOMAIN_DEVICE_DISK)
         return vzCheckUnsupportedDisk(def, dev->data.disk, opaque);
+    else if (dev->type == VIR_DOMAIN_DEVICE_GRAPHICS)
+        return vzCheckUnsupportedGraphics(dev->data.graphics);
 
     return 0;
 }
index 4e3005f55419a7d3c07c3e3ea5470e5842286b18..16403d70643cd3b1cb5d29ca0bcf579b50cdd1f4 100644 (file)
@@ -2435,9 +2435,6 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom)
     PRL_HANDLE dev;
     int ret = -1;
 
-    pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
-    prlsdkCheckRetGoto(pret, cleanup);
-
     pret = PrlVmCfg_GetAllDevices(sdkdom, &devList);
     prlsdkCheckRetGoto(pret, cleanup);
 
@@ -2521,83 +2518,6 @@ prlsdkAddDeviceToBootList(PRL_HANDLE sdkdom,
     return -1;
 }
 
-static int prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def)
-{
-    virDomainGraphicsDefPtr gr;
-
-    if (def->ngraphics == 0)
-        return 0;
-
-    if (def->ngraphics > 1) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver supports only "
-                         "one VNC per domain."));
-        return -1;
-    }
-
-    gr = def->graphics[0];
-
-    if (gr->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver supports only "
-                         "VNC graphics."));
-        return -1;
-    }
-
-    if (gr->data.vnc.websocket != 0) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver doesn't support "
-                         "websockets for VNC graphics."));
-        return -1;
-    }
-
-    if (gr->data.vnc.keymap != 0 &&
-        STRNEQ(gr->data.vnc.keymap, "en-us")) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver supports only "
-                         "\"en-us\" keymap for VNC graphics."));
-        return -1;
-    }
-
-    if (gr->data.vnc.sharePolicy == VIR_DOMAIN_GRAPHICS_VNC_SHARE_ALLOW_EXCLUSIVE) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver doesn't support "
-                         "exclusive share policy for VNC graphics."));
-        return -1;
-    }
-
-    if (gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_FAIL ||
-        gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_KEEP) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver doesn't support "
-                         "given action in case of password change."));
-        return -1;
-    }
-
-    if (gr->data.vnc.auth.expires) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("vz driver doesn't support "
-                         "setting password expire time."));
-        return -1;
-    }
-
-    if (gr->nListens > 1) {
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
-                       _("vz driver doesn't support more than "
-                         "one listening VNC server per domain"));
-        return -1;
-    }
-
-    if (gr->nListens == 1 &&
-        gr->listens[0].type != VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) {
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
-                       _("vz driver supports only address-based VNC listening"));
-        return -1;
-    }
-
-    return 0;
-}
-
 static int prlsdkCheckVideoUnsupportedParams(virDomainDefPtr def)
 {
     virDomainVideoDefPtr v;
@@ -2820,20 +2740,17 @@ static int prlsdkCheckFSUnsupportedParams(virDomainFSDefPtr fs)
     return 0;
 }
 
-static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom, virDomainDefPtr def)
+static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom,
+                                     virDomainGraphicsDefPtr gr)
 {
-    virDomainGraphicsDefPtr gr;
     virDomainGraphicsListenDefPtr glisten;
     PRL_RESULT pret;
     int ret  = -1;
 
-    if (prlsdkCheckGraphicsUnsupportedParams(def))
-        return -1;
-
-    if (def->ngraphics == 0)
-        return 0;
-
-    gr = def->graphics[0];
+    if (!gr) {
+        pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED);
+        prlsdkCheckRetExit(pret, -1);
+    }
 
     if (gr->data.vnc.autoport) {
         pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_AUTO);
@@ -3434,6 +3351,17 @@ prlsdkAttachDevice(vzDriverPtr driver,
                                IS_CT(dom->def), true) < 0)
             return -1;
 
+        break;
+    case VIR_DOMAIN_DEVICE_GRAPHICS:
+        if (dom->def->ngraphics > 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("domain already has VNC graphics"));
+            return -1;
+        }
+
+        if (prlsdkApplyGraphicsParams(privdom->sdkdom, dev->data.graphics) < 0)
+            return -1;
+
         break;
     default:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -3490,6 +3418,17 @@ prlsdkDetachDevice(vzDriverPtr driver,
         pret = PrlVmDev_Remove(sdkdev);
         prlsdkCheckRetGoto(pret, cleanup);
 
+        break;
+    case VIR_DOMAIN_DEVICE_GRAPHICS:
+        if (dom->def->ngraphics < 1) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("cannot find VNC graphics device"));
+            goto cleanup;
+        }
+
+        if (prlsdkApplyGraphicsParams(privdom->sdkdom, NULL) < 0)
+            goto cleanup;
+
         break;
     default:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -3534,6 +3473,17 @@ prlsdkUpdateDevice(vzDriverPtr driver,
                                IS_CT(dom->def), false) < 0)
             return -1;
 
+        break;
+    case VIR_DOMAIN_DEVICE_GRAPHICS:
+        if (dom->def->ngraphics < 1) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("cannot find VNC graphics device"));
+            return -1;
+        }
+
+        if (prlsdkApplyGraphicsParams(privdom->sdkdom, dev->data.graphics) < 0)
+            return -1;
+
         break;
     default:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -3772,7 +3722,14 @@ prlsdkDoApplyConfig(vzDriverPtr driver,
             goto error;
     }
 
-    if (prlsdkApplyGraphicsParams(sdkdom, def) < 0)
+    if (def->ngraphics > 1) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver supports only VNC graphics"));
+        goto error;
+    }
+
+    if (prlsdkApplyGraphicsParams(sdkdom,
+                                  def->ngraphics == 1 ? def->graphics[0] : NULL) < 0)
         goto error;
 
     if (prlsdkApplyVideoParams(sdkdom, def) < 0)
index edcdcfa945acb212e4893233994aefade02bd24e..43c531ba5ddd48517a33d7b2357c897e29d3bd79 100644 (file)
@@ -547,3 +547,66 @@ int vzGetDefaultSCSIModel(vzDriverPtr driver,
     }
     return 0;
 }
+
+int vzCheckUnsupportedGraphics(virDomainGraphicsDefPtr gr)
+{
+    if (gr->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver supports only "
+                         "VNC graphics."));
+        return -1;
+    }
+
+    if (gr->data.vnc.websocket != 0) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver doesn't support "
+                         "websockets for VNC graphics."));
+        return -1;
+    }
+
+    if (gr->data.vnc.keymap != 0 &&
+        STRNEQ(gr->data.vnc.keymap, "en-us")) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver supports only "
+                         "\"en-us\" keymap for VNC graphics."));
+        return -1;
+    }
+
+    if (gr->data.vnc.sharePolicy == VIR_DOMAIN_GRAPHICS_VNC_SHARE_ALLOW_EXCLUSIVE) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver doesn't support "
+                         "exclusive share policy for VNC graphics."));
+        return -1;
+    }
+
+    if (gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_FAIL ||
+        gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_KEEP) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver doesn't support "
+                         "given action in case of password change."));
+        return -1;
+    }
+
+    if (gr->data.vnc.auth.expires) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("vz driver doesn't support "
+                         "setting password expire time."));
+        return -1;
+    }
+
+    if (gr->nListens > 1) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("vz driver doesn't support more than "
+                         "one listening VNC server per domain"));
+        return -1;
+    }
+
+    if (gr->nListens == 1 &&
+        gr->listens[0].type != VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("vz driver supports only address-based VNC listening"));
+        return -1;
+    }
+
+    return 0;
+}
index 5c6f770c82f83bd10859374e6b1d56b6efaa0359..ba96765aa04a5d466cfcfc2dba84923de5baf642 100644 (file)
@@ -131,6 +131,8 @@ int
 vzGetDefaultSCSIModel(vzDriverPtr driver,
                       PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel);
 
+int vzCheckUnsupportedGraphics(virDomainGraphicsDefPtr gr);
+
 # define PARALLELS_BLOCK_STATS_FOREACH(OP)                              \
     OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests")        \
     OP(rd_bytes, VIR_DOMAIN_BLOCK_STATS_READ_BYTES, "read_total")       \