Vz containers are able to use ploop volumes from storage pools
to work upon.
To use filesystem type volume, pool name and volume name should be
specifaed in <source>
Signed-off-by: Olga Krishtal <okrishtal(a)virtuozzo.com>
---
src/storage/storage_driver.c | 3 +
src/vz/vz_sdk.c | 127 ++++++++++++++++++++++++++++++++++---------
2 files changed, 105 insertions(+), 25 deletions(-)
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 1d96618..c2c1483 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -3348,6 +3348,9 @@ virStorageTranslateDiskSourcePool(virConnectPtr conn,
def->src->srcpool->actualtype = VIR_STORAGE_TYPE_BLOCK;
break;
+ case VIR_STORAGE_VOL_PLOOP:
+ def->src->srcpool->actualtype = VIR_STORAGE_TYPE_FILE;
+
case VIR_STORAGE_VOL_NETWORK:
case VIR_STORAGE_VOL_NETDIR:
virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 00f42b8..a8b2ffa 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -31,6 +31,8 @@
#include "datatypes.h"
#include "domain_conf.h"
#include "virtime.h"
+#include "dirname.h"
+#include "storage/storage_driver.h"
#include "vz_sdk.h"
@@ -570,8 +572,36 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
PRL_UINT32 buflen = 0;
PRL_RESULT pret;
int ret = -1;
+ char *storage = NULL;
+ char **matches = NULL;
+ virURIPtr uri = NULL;
+
+ pret = PrlVmDevHd_GetStorageURL(prldisk, NULL, &buflen);
+ prlsdkCheckRetGoto(pret, cleanup);
+ if (VIR_ALLOC_N(storage, buflen) < 0)
+ goto cleanup;
+ pret = PrlVmDevHd_GetStorageURL(prldisk, storage, &buflen);
+ prlsdkCheckRetGoto(pret, cleanup);
+
+ if (!virStringIsEmpty(storage)) {
+ uri = virURIParse(storage);
+ if (!uri || STRNEQ("volume", uri->scheme))
+ goto cleanup;
+ if (!(matches = virStringSplitCount(uri->path, "/", 0, NULL)))
+ goto cleanup;
+ if (!matches[1] || !matches[2])
+ goto cleanup;
+ fs->type = VIR_DOMAIN_FS_TYPE_VOLUME;
+ if (VIR_ALLOC(fs->src->srcpool) < 0)
+ goto cleanup;
+ if (VIR_STRDUP(fs->src->srcpool->pool, matches[1]) < 0)
+ goto cleanup;
+ if (VIR_STRDUP(fs->src->srcpool->volume, matches[2]) < 0)
+ goto cleanup;
+ } else {
+ fs->type = VIR_DOMAIN_FS_TYPE_FILE;
+ }
- fs->type = VIR_DOMAIN_FS_TYPE_FILE;
fs->fsdriver = VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP;
fs->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH;
fs->wrpolicy = VIR_DOMAIN_FS_WRPOLICY_DEFAULT;
@@ -608,6 +638,9 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
cleanup:
VIR_FREE(buf);
+ VIR_FREE(storage);
+ virURIFree(uri);
+ virStringFreeList(matches);
return ret;
}
@@ -636,7 +669,7 @@ prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom,
virDomainDef
if (PDT_USE_REAL_DEVICE != emulatedType && IS_CT(def)) {
- if (VIR_ALLOC(fs) < 0)
+ if (!(fs = virDomainFSDefNew()))
goto error;
if (prlsdkGetFSInfo(hdd, fs) < 0)
@@ -2417,13 +2450,14 @@ static int prlsdkCheckNetUnsupportedParams(virDomainNetDefPtr
net)
static int prlsdkCheckFSUnsupportedParams(virDomainFSDefPtr fs)
{
- if (fs->type != VIR_DOMAIN_FS_TYPE_FILE) {
+ if (fs->type != VIR_DOMAIN_FS_TYPE_FILE &&
+ fs->type != VIR_DOMAIN_FS_TYPE_VOLUME) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Only file based filesystems are "
- "supported by vz driver."));
+ _("Unsupported filesystem type."));
return -1;
}
+
if (fs->fsdriver != VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Only ploop fs driver is "
@@ -3266,6 +3300,7 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
PRL_RESULT pret;
PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
int ret = -1;
+ char *storage = NULL;
if (prlsdkCheckFSUnsupportedParams(fs) < 0)
return -1;
@@ -3273,6 +3308,13 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_HARD_DISK, &sdkdisk);
prlsdkCheckRetGoto(pret, cleanup);
+ if (fs->type == VIR_DOMAIN_FS_TYPE_VOLUME) {
+ if (virAsprintf(&storage, "volume///%s/%s",
fs->src->srcpool->pool,
+ fs->src->srcpool->volume) < 0)
+ goto cleanup;
+ pret = PrlVmDevHd_SetStorageURL(sdkdisk, storage);
+ prlsdkCheckRetGoto(pret, cleanup);
+ }
pret = PrlVmDev_SetEnabled(sdkdisk, 1);
prlsdkCheckRetGoto(pret, cleanup);
@@ -3297,6 +3339,7 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
ret = 0;
cleanup:
+ VIR_FREE(storage);
PrlHandle_Free(sdkdisk);
return ret;
}
@@ -3388,10 +3431,10 @@ prlsdkDoApplyConfig(virConnectPtr conn,
}
for (i = 0; i < def->nfss; i++) {
- if (STREQ(def->fss[i]->dst, "/"))
- needBoot = false;
- if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
- goto error;
+ if (STREQ(def->fss[i]->dst, "/"))
+ needBoot = false;
+ if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
+ goto error;
}
for (i = 0; i < def->ndisks; i++) {
@@ -3493,6 +3536,49 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
return ret;
}
+static int
+virStorageTranslatePoolLocal(virConnectPtr conn, virStorageSourcePtr src)
+{
+
+ virStoragePoolPtr pool = NULL;
+ virStorageVolPtr vol = NULL;
+ virStorageVolInfo info;
+ int ret = -1;
+
+ if (!(pool = virStoragePoolLookupByName(conn, src->srcpool->pool)))
+ return -1;
+ if (virStoragePoolIsActive(pool) != 1) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("storage pool '%s' containing volume '%s'
"
+ "is not active"), src->srcpool->pool,
+ src->srcpool->volume);
+ goto cleanup;
+ }
+
+ if (!(vol = virStorageVolLookupByName(pool, src->srcpool->volume)))
+ goto cleanup;
+
+ if (virStorageVolGetInfo(vol, &info) < 0)
+ goto cleanup;
+
+ if (info.type != VIR_STORAGE_VOL_PLOOP) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unsupported volume format '%s'"),
+ virStorageVolTypeToString(info.type));
+ goto cleanup;
+ }
+
+ if (!(src->path = virStorageVolGetPath(vol)))
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ virObjectUnref(pool);
+ virObjectUnref(vol);
+ return ret;
+}
+
int
prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
{
@@ -3506,25 +3592,16 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
int useTemplate = 0;
size_t i;
- if (def->nfss > 1) {
- /* Check all filesystems */
- for (i = 0; i < def->nfss; i++) {
- if (def->fss[i]->type != VIR_DOMAIN_FS_TYPE_FILE) {
- virReportError(VIR_ERR_INVALID_ARG, "%s",
- _("Unsupported filesystem type."));
- return -1;
- }
- }
- } else if (def->nfss == 1) {
- if (def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
+ if (def->nfss == 1 && def->fss[0]->type ==
VIR_DOMAIN_FS_TYPE_TEMPLATE)
useTemplate = 1;
- } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) {
- virReportError(VIR_ERR_INVALID_ARG, "%s",
- _("Unsupported filesystem type."));
- return -1;
+
+ for (i = 0; i < def->nfss; i++) {
+ if (def->fss[i]->type == VIR_DOMAIN_FS_TYPE_VOLUME) {
+ if (virStorageTranslatePoolLocal(conn, def->fss[i]->src) < 0)
+ goto cleanup;
}
- }
+ }
confParam.nVmType = PVT_CT;
confParam.sConfigSample = "vswap.1024MB";
confParam.nOsVersion = 0;
--
1.8.3.1