return ret;
}
-static void
+void
prlsdkDomObjFreePrivate(void *p)
{
vzDomObjPtr pdom = p;
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, &name, 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;
+ }
+
+ cleanup:
+ VIR_FREE(name);
+ return dom;
+}
+
+int
+prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
+{
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;
virCheckNonNullArgGoto(privconn, error);
- virCheckNonNullArgGoto(sdkdom, error);
+ virCheckNonNullArgGoto(dom, error);
+
+ pdom = dom->privateData;
+ sdkdom = prlsdkSdkDomainLookupByUUID(privconn, dom->def->uuid);
+ if (sdkdom == PRL_INVALID_HANDLE)
+ return -1;
if (!(def = virDomainDefNew()))
goto error;
- if (!olddom) {
- if (VIR_ALLOC(pdom) < 0)
- goto error;
- pdom->cache.stats = PRL_INVALID_HANDLE;
- pdom->cache.count = -1;
- if (virCondInit(&pdom->cache.cond) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize condition"));
- goto error;
- }
- } else {
- pdom = olddom->privateData;
- }
-
- if (STREQ(privconn->drivername, "vz"))
- def->virtType = VIR_DOMAIN_VIRT_VZ;
- else
- def->virtType = VIR_DOMAIN_VIRT_PARALLELS;
-
- def->id = -1;
+ def->virtType = dom->def->virtType;
+ def->id = dom->def->id;
if (prlsdkGetDomainIds(sdkdom, &def->name, def->uuid) < 0)
goto error;
pret = PrlVmCfg_GetEnvId(sdkdom, &envId);
prlsdkCheckRetGoto(pret, error);
- pdom->id = envId;
buflen = 0;
pret = PrlVmCfg_GetHomePath(sdkdom, NULL, &buflen);
prlsdkCheckRetGoto(pret, error);
- VIR_FREE(pdom->home);
- if (VIR_ALLOC_N(pdom->home, buflen) < 0)
+ if (VIR_ALLOC_N(home, buflen) < 0)
goto error;
- pret = PrlVmCfg_GetHomePath(sdkdom, pdom->home, &buflen);
+ pret = PrlVmCfg_GetHomePath(sdkdom, home, &buflen);
prlsdkCheckRetGoto(pret, error);
- /* For VMs pdom->home is actually /directory/config.pvs */
+ /* For VMs home is actually /directory/config.pvs */
if (!IS_CT(def)) {
/* Get rid of /config.pvs in path string */
- char *s = strrchr(pdom->home, '/');
+ char *s = strrchr(home, '/');
if (s)
*s = '\0';
}
pret = PrlVmCfg_GetAutoStart(sdkdom, &autostart);
prlsdkCheckRetGoto(pret, error);
+ if (autostart != PAO_VM_START_ON_LOAD &&
+ autostart != PAO_VM_START_MANUAL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unknown autostart mode: %X"), autostart);
+ goto error;
+ }
if (prlsdkGetDomainState(sdkdom, &domainState) < 0)
goto error;
goto error;
}
- 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:
- dom->autostart = 1;
- break;
- case PAO_VM_START_MANUAL:
- dom->autostart = 0;
- break;
- default:
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Unknown autostart mode: %X"), autostart);
- goto error;
- }
-
if (prlsdkConvertDomainState(domainState, envId, dom) < 0)
goto error;
+ /* assign new virDomainDef without any checks
+ * we can't use virDomainObjAssignDef, because it checks
+ * for state and domain name */
+ virDomainDefFree(dom->def);
+ dom->def = def;
+ pdom->id = envId;
+ VIR_FREE(pdom->home);
+ pdom->home = home;
+
if (!pdom->sdkdom) {
- pret = PrlHandle_AddRef(sdkdom);
- prlsdkCheckRetGoto(pret, error);
+ PrlHandle_AddRef(sdkdom);
pdom->sdkdom = sdkdom;
}
- 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);
-
- 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)
- virDomainDefFree(def);
+ if (autostart == PAO_VM_START_ON_LOAD)
+ dom->autostart = 1;
+ else
+ dom->autostart = 0;
- return NULL;
+ PrlHandle_Free(sdkdom);
+ return 0;
+ error:
+ PrlHandle_Free(sdkdom);
+ VIR_FREE(home);
+ virDomainDefFree(def);
+ return -1;
}
int
{
PRL_HANDLE job = PRL_INVALID_HANDLE;
PRL_HANDLE result;
- PRL_HANDLE sdkdom;
+ PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
PRL_UINT32 paramsCount;
PRL_RESULT pret;
size_t i = 0;
for (i = 0; i < paramsCount; i++) {
pret = PrlResult_GetParamByIndex(result, i, &sdkdom);
- if (PRL_FAILED(pret)) {
- logPrlError(pret);
- PrlHandle_Free(sdkdom);
+ prlsdkCheckRetGoto(pret, error);
+
+ if (!(dom = prlsdkNewDomainByHandle(privconn, sdkdom)))
goto error;
- }
- dom = prlsdkLoadDomain(privconn, sdkdom, NULL);
+ virObjectUnlock(dom);
PrlHandle_Free(sdkdom);
-
- if (!dom)
- goto error;
- else
- virObjectUnlock(dom);
+ sdkdom = PRL_INVALID_HANDLE;
}
PrlHandle_Free(result);
return 0;
error:
+ PrlHandle_Free(sdkdom);
PrlHandle_Free(result);
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)
{
PRL_HANDLE job;
- virDomainObjPtr retdom = NULL;
vzDomObjPtr pdom = dom->privateData;
job = PrlVm_RefreshConfig(pdom->sdkdom);
if (waitJob(job))
return -1;
- retdom = prlsdkLoadDomain(privconn, pdom->sdkdom, dom);
- return retdom ? 0 : -1;
+ return prlsdkLoadDomain(privconn, dom);
}
static int prlsdkSendEvent(vzConnPtr privconn,
unsigned char *uuid)
{
virDomainObjPtr dom = NULL;
+ PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
- dom = prlsdkAddDomain(privconn, uuid);
- if (dom == NULL)
- return;
+ dom = virDomainObjListFindByUUID(privconn->domains, uuid);
+ if (!dom) {
+ sdkdom = prlsdkSdkDomainLookupByUUID(privconn, uuid);
+ if (sdkdom == PRL_INVALID_HANDLE)
+ goto cleanup;
+
+ if (!(dom = prlsdkNewDomainByHandle(privconn, sdkdom)))
+ goto cleanup;
+ }
prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_DEFINED,
VIR_DOMAIN_EVENT_DEFINED_ADDED);
- virObjectUnlock(dom);
+ cleanup:
+ if (dom)
+ virObjectUnlock(dom);
+ PrlHandle_Free(sdkdom);
return;
}