Result StorageVolControlThread::deleteStorageVol() { Result result; result.name = QString("%1_%2").arg(task.srcConName).arg(currPoolName); QString name = task.object; if (currStoragePool!=NULL) { virStoragePoolFree(currStoragePool); currStoragePool = NULL; }; currStoragePool = virStoragePoolLookupByName( *task.srcConnPtr, currPoolName.toUtf8().data()); // flags: extra flags; not used yet, so callers should always pass 0 unsigned int flags = 0; bool deleted = false; virStorageVol *storageVol = virStorageVolLookupByName( currStoragePool, name.toUtf8().data()); if ( storageVol!=NULL ) { deleted = (virStorageVolDelete(storageVol, flags)+1) ? true : false; if (!deleted) result.err = sendConnErrors(); virStorageVolFree(storageVol); } else result.err = sendConnErrors(); result.msg.append(QString("'<b>%1</b>' StorageVol %2 Deleted.") .arg(name).arg((deleted)?"":"don't")); result.result = deleted; return result; }
void NodeWrap::syncPools() { int maxname; maxname = virConnectNumOfStoragePools(conn); if (maxname < 0) { REPORT_ERR(conn, "virConnectNumOfStroagePools"); return; } else { char **names; names = (char **) malloc(sizeof(char *) * maxname); if ((maxname = virConnectListStoragePools(conn, names, maxname)) < 0) { REPORT_ERR(conn, "virConnectListStoragePools"); return; } for (int i = 0; i < maxname; i++) { checkPool(names[i]); free(names[i]); } free(names); } maxname = virConnectNumOfDefinedStoragePools(conn); if (maxname < 0) { REPORT_ERR(conn, "virConnectNumOfDefinedStoragePools"); return; } else { char **names; names = (char **) malloc(sizeof(char *) * maxname); if ((maxname = virConnectListDefinedStoragePools(conn, names, maxname)) < 0) { REPORT_ERR(conn, "virConnectListDefinedStoragePools"); return; } for (int i = 0; i < maxname; i++) { checkPool(names[i]); free(names[i]); } free(names); } /* Go through our list of pools and ensure that they still exist. */ for (std::vector<PoolWrap*>::iterator iter = pools.begin(); iter != pools.end();) { printf ("Verifying pool %s\n", (*iter)->pool_name.c_str()); virStoragePoolPtr ptr = virStoragePoolLookupByUUIDString(conn, (*iter)->pool_uuid.c_str()); if (ptr == NULL) { printf("Destroying pool %s\n", (*iter)->pool_name.c_str()); delete(*iter); iter = pools.erase(iter); } else { virStoragePoolFree(ptr); iter++; } } }
Result StoragePoolControlThread::defineStoragePool() { Result result; QString path = task.args.path; QByteArray xmlData; QFile f; f.setFileName(path); if ( !f.open(QIODevice::ReadOnly) ) { QString msg = QString("File \"%1\"\nnot opened.").arg(path); emit errorMsg( msg, number ); result.result = false; result.err = msg; return result; }; xmlData = f.readAll(); f.close(); // flags: extra flags; not used yet, so callers should always pass 0 unsigned int flags = 0; virStoragePoolPtr storagePool = virStoragePoolDefineXML( *task.srcConnPtr, xmlData.data(), flags); if ( storagePool==NULL ) { result.err = sendConnErrors(); result.result = false; return result; }; result.name = QString().fromUtf8( virStoragePoolGetName(storagePool) ); result.msg.append( QString("'<b>%1</b>' StoragePool from\n\"%2\"\nis Defined.") .arg(result.name).arg(path)); virStoragePoolFree(storagePool); result.result = true; return result; }
static bool cmdVolClone(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr origpool = NULL; virStorageVolPtr origvol = NULL, newvol = NULL; const char *name = NULL; char *origxml = NULL; xmlChar *newxml = NULL; bool ret = false; unsigned int flags = 0; if (!(origvol = vshCommandOptVol(ctl, cmd, "vol", "pool", NULL))) goto cleanup; if (vshCommandOptBool(cmd, "prealloc-metadata")) flags |= VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA; origpool = virStoragePoolLookupByVolume(origvol); if (!origpool) { vshError(ctl, "%s", _("failed to get parent pool")); goto cleanup; } if (vshCommandOptStringReq(ctl, cmd, "newname", &name) < 0) goto cleanup; origxml = virStorageVolGetXMLDesc(origvol, 0); if (!origxml) goto cleanup; newxml = vshMakeCloneXML(origxml, name); if (!newxml) { vshPrint(ctl, "%s", _("Failed to allocate XML buffer")); goto cleanup; } newvol = virStorageVolCreateXMLFrom(origpool, (char *) newxml, origvol, flags); if (newvol != NULL) { vshPrint(ctl, _("Vol %s cloned from %s\n"), virStorageVolGetName(newvol), virStorageVolGetName(origvol)); } else { vshError(ctl, _("Failed to clone vol from %s"), virStorageVolGetName(origvol)); goto cleanup; } ret = true; cleanup: VIR_FREE(origxml); xmlFree(newxml); if (origvol) virStorageVolFree(origvol); if (newvol) virStorageVolFree(newvol); if (origpool) virStoragePoolFree(origpool); return ret; }
QStringList StoragePoolControlThread::getAllStoragePoolList() { QStringList storagePoolList; if ( currWorkConnect!=NULL && keep_alive ) { virStoragePoolPtr *storagePool; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; int ret = virConnectListAllStoragePools( currWorkConnect, &storagePool, flags); if ( ret<0 ) { sendConnErrors(); free(storagePool); return storagePoolList; }; int i = 0; while ( storagePool[i] != NULL ) { QStringList currentAttr; QString autostartStr; int is_autostart = 0; if (virStoragePoolGetAutostart(storagePool[i], &is_autostart) < 0) { autostartStr.append("no autostart"); } else autostartStr.append( is_autostart ? "yes" : "no" ); currentAttr<< QString().fromUtf8( virStoragePoolGetName(storagePool[i]) ) << QString( virStoragePoolIsActive(storagePool[i]) ? "active" : "inactive" ) << autostartStr << QString( virStoragePoolIsPersistent(storagePool[i]) ? "yes" : "no" ); storagePoolList.append(currentAttr.join(" ")); //qDebug()<<currentAttr; virStoragePoolFree(storagePool[i]); i++; }; free(storagePool); }; return storagePoolList; }
Result StoragePoolControlThread::getStoragePoolXMLDesc() { Result result; QString name = task.object; bool read = false; char *Returns = NULL; virStoragePoolPtr storagePool = virStoragePoolLookupByName( *task.srcConnPtr, name.toUtf8().data()); if ( storagePool!=NULL ) { Returns = (virStoragePoolGetXMLDesc(storagePool, VIR_STORAGE_XML_INACTIVE)); if ( Returns==NULL ) result.err = sendConnErrors(); else read = true; virStoragePoolFree(storagePool); } else result.err = sendConnErrors(); QTemporaryFile f; f.setAutoRemove(false); f.setFileTemplate(QString("%1%2XML_Desc-XXXXXX.xml") .arg(QDir::tempPath()).arg(QDir::separator())); read = f.open(); if (read) f.write(Returns); result.fileName.append(f.fileName()); f.close(); if ( Returns!=NULL ) free(Returns); result.msg.append(QString("'<b>%1</b>' StoragePool %2 XML'ed") .arg(name).arg((read)?"":"don't")); result.name = name; result.result = read; return result; }
Result StorageVolControlThread::resizeStorageVol() { Result result; result.name = QString("%1_%2").arg(task.srcConName).arg(currPoolName); QString name = task.object; if (currStoragePool!=NULL) { virStoragePoolFree(currStoragePool); currStoragePool = NULL; }; currStoragePool = virStoragePoolLookupByName( *task.srcConnPtr, currPoolName.toUtf8().data()); unsigned long long capacity = task.args.size; bool resized = false; virStorageVol *storageVol = virStorageVolLookupByName( currStoragePool, name.toUtf8().data()); if ( storageVol!=NULL ) { int ret = virStorageVolResize( storageVol, capacity, VIR_STORAGE_VOL_RESIZE_ALLOCATE | VIR_STORAGE_VOL_RESIZE_SHRINK); if ( ret<0 ) { result.err = sendConnErrors(); } else resized = true; virStorageVolFree(storageVol); } else result.err = sendConnErrors(); result.msg.append( QString("'<b>%1</b>' StorageVol %2 Resized to %3 (bytes).") .arg(name).arg((resized)?"":"don't").arg(capacity)); result.result = resized; return result; }
static virStorageVolPtr vshCommandOptVolBy(vshControl *ctl, const vshCmd *cmd, const char *optname, const char *pooloptname, const char **name, int flag) { virStorageVolPtr vol = NULL; virStoragePoolPtr pool = NULL; const char *n = NULL, *p = NULL; if (vshCommandOptString(cmd, optname, &n) <= 0) return NULL; if (pooloptname != NULL && vshCommandOptString(cmd, pooloptname, &p) < 0) { vshError(ctl, "%s", _("missing option")); return NULL; } if (p) pool = vshCommandOptPoolBy(ctl, cmd, pooloptname, name, flag); vshDebug(ctl, VSH_ERR_DEBUG, "%s: found option <%s>: %s\n", cmd->def->name, optname, n); if (name) *name = n; /* try it by name */ if (pool && (flag & VSH_BYNAME)) { vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as vol name\n", cmd->def->name, optname); vol = virStorageVolLookupByName(pool, n); } /* try it by key */ if (vol == NULL && (flag & VSH_BYUUID)) { vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as vol key\n", cmd->def->name, optname); vol = virStorageVolLookupByKey(ctl->conn, n); } /* try it by path */ if (vol == NULL && (flag & VSH_BYUUID)) { vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as vol path\n", cmd->def->name, optname); vol = virStorageVolLookupByPath(ctl->conn, n); } if (!vol) { if (pool) vshError(ctl, _("failed to get vol '%s'"), n); else vshError(ctl, _("failed to get vol '%s', specifying --%s " "might help"), n, pooloptname); } if (pool) virStoragePoolFree(pool); return vol; }
static bool cmdVolClone(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr origpool = NULL; virStorageVolPtr origvol = NULL, newvol = NULL; const char *name = NULL; char *origxml = NULL; xmlChar *newxml = NULL; bool ret = false; if (!vshConnectionUsability(ctl, ctl->conn)) goto cleanup; if (!(origvol = vshCommandOptVol(ctl, cmd, "vol", "pool", NULL))) goto cleanup; origpool = virStoragePoolLookupByVolume(origvol); if (!origpool) { vshError(ctl, "%s", _("failed to get parent pool")); goto cleanup; } if (vshCommandOptString(cmd, "newname", &name) <= 0) goto cleanup; origxml = virStorageVolGetXMLDesc(origvol, 0); if (!origxml) goto cleanup; newxml = makeCloneXML(origxml, name); if (!newxml) { vshPrint(ctl, "%s", _("Failed to allocate XML buffer")); goto cleanup; } newvol = virStorageVolCreateXMLFrom(origpool, (char *) newxml, origvol, 0); if (newvol != NULL) { vshPrint(ctl, _("Vol %s cloned from %s\n"), virStorageVolGetName(newvol), virStorageVolGetName(origvol)); } else { vshError(ctl, _("Failed to clone vol from %s"), virStorageVolGetName(origvol)); goto cleanup; } ret = true; cleanup: VIR_FREE(origxml); xmlFree(newxml); if (origvol) virStorageVolFree(origvol); if (newvol) virStorageVolFree(newvol); if (origpool) virStoragePoolFree(origpool); return ret; }
/* public slots */ void StorageVolControlThread::stop() { keep_alive = false; if (currStoragePool!=NULL) { virStoragePoolFree(currStoragePool); currStoragePool = NULL; }; //qDebug()<<"stVol_thread (stop)\n\tConnect\t\t"<<ptr_ConnPtr // <<"\n\tPool\t\t"<<currStoragePool // <<"\n\tName\t\t"<<currPoolName; }
static bool cmdVolCreate(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr pool; virStorageVolPtr vol; const char *from = NULL; bool ret = true; char *buffer; if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (!(pool = vshCommandOptPoolBy(ctl, cmd, "pool", NULL, VSH_BYNAME))) return false; if (vshCommandOptString(cmd, "file", &from) <= 0) { virStoragePoolFree(pool); return false; } if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) { virshReportError(ctl); virStoragePoolFree(pool); return false; } vol = virStorageVolCreateXML(pool, buffer, 0); VIR_FREE(buffer); virStoragePoolFree(pool); if (vol != NULL) { vshPrint(ctl, _("Vol %s created from %s\n"), virStorageVolGetName(vol), from); virStorageVolFree(vol); } else { vshError(ctl, _("Failed to create vol from %s"), from); ret = false; } return ret; }
Result StoragePoolControlThread::getAllStoragePoolDataList() { Result result; QStringList storagePoolDataList; if ( task.srcConnPtr!=NULL && keep_alive ) { virStoragePoolPtr *storagePool = NULL; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; int ret = virConnectListAllStoragePools( *task.srcConnPtr, &storagePool, flags); if ( ret<0 ) { result.err = sendConnErrors(); result.result = false; result.msg = storagePoolDataList; return result; }; // therefore correctly to use for() command, because storagePool[0] can not exist. for (int i = 0; i < ret; i++) { QStringList currentAttr; QString type, source, target; char *Returns = (virStoragePoolGetXMLDesc(storagePool[i], VIR_STORAGE_XML_INACTIVE)); if ( Returns!=NULL ) { QDomDocument doc; QString s; QTextStream str; str.setString(&s); doc.setContent(QString(Returns)); QDomElement _pool, _el; _pool= doc.firstChildElement("pool"); type = _pool.attribute("type"); _el = _pool.firstChildElement("source"); _el.save(str, 4); source = str.readAll(); _el = _pool.firstChildElement("target"); _el.save(str, 4); target = str.readAll(); free(Returns); }; currentAttr<< QString::fromUtf8( virStoragePoolGetName(storagePool[i]) ) << type << source << target; storagePoolDataList.append(currentAttr.join(DFR)); //qDebug()<<currentAttr; virStoragePoolFree(storagePool[i]); }; free(storagePool); result.result = true; } else { result.result = false; }; result.msg = storagePoolDataList; return result; }
QStringList StoragePoolControlThread::changeAutoStartStoragePool() { QStringList result; QString name = args.first(); int autostart; if ( args.count()<2 || args.at(1).isEmpty() ) { result.append("Incorrect parameters."); return result; } else { bool converted; int res = args.at(1).toInt(&converted); if (converted) autostart = (res) ? 1 : 0; else { result.append("Incorrect parameters."); return result; }; }; /* virStoragePoolPtr *storagePool; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; int ret = virConnectListAllStoragePools( currWorkConnect, &storagePool, flags); if ( ret<0 ) { sendConnErrors(); free(storagePool); return result; }; //qDebug()<<QString(virConnectGetURI(currWorkConnect)); int i = 0; */ bool set = false; /* while ( storagePool[i] != NULL ) { QString currNetName = QString( virStoragePoolGetName(storagePool[i]) ); if ( !set && currNetName==name ) { set = (virStoragePoolSetAutostart(storagePool[i], autostart)+1) ? true : false; if (!set) sendGlobalErrors(); }; virStoragePoolFree(storagePool[i]); i++; }; free(storagePool); */ virStoragePoolPtr storagePool = virStoragePoolLookupByName(currWorkConnect, name.toUtf8().data()); if ( storagePool!=NULL ) { set = (virStoragePoolSetAutostart(storagePool, autostart)+1) ? true : false; if (!set) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.append(QString("'<b>%1</b>' StoragePool autostart %2 Set.").arg(name).arg((set)?"":"don't")); return result; }
QStringList StoragePoolControlThread::getStoragePoolXMLDesc() { QStringList result; QString name = args.first(); /* virStoragePoolPtr *storagePool; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; int ret = virConnectListAllStoragePools( currWorkConnect, &storagePool, flags); if ( ret<0 ) { sendConnErrors(); free(storagePool); return result; }; //qDebug()<<QString(virConnectGetURI(currWorkConnect)); int i = 0; */ bool read = false; char *Returns = NULL; /* while ( storagePool[i] != NULL ) { QString currNetName = QString( virStoragePoolGetName(storagePool[i]) ); if ( !read && currNetName==name ) { Returns = (virStoragePoolGetXMLDesc(storagePool[i], VIR_STORAGE_XML_INACTIVE)); if ( Returns==NULL ) sendGlobalErrors(); else read = true; }; virStoragePoolFree(storagePool[i]); i++; }; free(storagePool); */ virStoragePoolPtr storagePool = virStoragePoolLookupByName(currWorkConnect, name.toUtf8().data()); if ( storagePool!=NULL ) { Returns = (virStoragePoolGetXMLDesc(storagePool, VIR_STORAGE_XML_INACTIVE)); if ( Returns==NULL ) sendConnErrors(); else read = true; virStoragePoolFree(storagePool); } else sendConnErrors(); QTemporaryFile f; f.setAutoRemove(false); f.setFileTemplate(QString("%1%2XML_Desc-XXXXXX.xml").arg(QDir::tempPath()).arg(QDir::separator())); read = f.open(); if (read) f.write(Returns); result.append(f.fileName()); f.close(); free(Returns); result.append(QString("'<b>%1</b>' StoragePool %2 XML'ed").arg(name).arg((read)?"":"don't")); return result; }
void vert_cleanup(ErlNifEnv *env, void *obj) { VERT_RESOURCE *vp = obj; if (vp->res == NULL) return; switch (vp->type) { case VERT_RES_CONNECT: (void)virConnectClose(vp->res); break; case VERT_RES_DOMAIN: (void)virDomainFree(vp->res); break; case VERT_RES_INTERFACE: (void)virInterfaceFree(vp->res); break; case VERT_RES_NETWORK: (void)virNetworkFree(vp->res); break; case VERT_RES_NODEDEVICE: (void)virNodeDeviceFree(vp->res); break; #if HAVE_NWFILTER case VERT_RES_NWFILTER: (void)virNWFilterFree(vp->res); break; #endif case VERT_RES_SECRET: (void)virSecretFree(vp->res); break; case VERT_RES_STORAGEPOOL: (void)virStoragePoolFree(vp->res); break; case VERT_RES_STORAGEVOL: (void)virStorageVolFree(vp->res); break; case VERT_RES_STREAM: (void)virStreamFree(vp->res); break; default: break; } vp->res = NULL; }
static bool cmdVolCreateFrom(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr pool = NULL; virStorageVolPtr newvol = NULL, inputvol = NULL; const char *from = NULL; bool ret = false; char *buffer = NULL; unsigned int flags = 0; if (!(pool = vshCommandOptPool(ctl, cmd, "pool", NULL))) goto cleanup; if (vshCommandOptBool(cmd, "prealloc-metadata")) flags |= VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA; if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0) goto cleanup; if (!(inputvol = vshCommandOptVol(ctl, cmd, "vol", "inputpool", NULL))) goto cleanup; if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0) { vshReportError(ctl); goto cleanup; } newvol = virStorageVolCreateXMLFrom(pool, buffer, inputvol, flags); if (newvol != NULL) { vshPrint(ctl, _("Vol %s created from input vol %s\n"), virStorageVolGetName(newvol), virStorageVolGetName(inputvol)); } else { vshError(ctl, _("Failed to create vol from %s"), from); goto cleanup; } ret = true; cleanup: VIR_FREE(buffer); if (pool) virStoragePoolFree(pool); if (inputvol) virStorageVolFree(inputvol); if (newvol) virStorageVolFree(newvol); return ret; }
static bool cmdVolCreateFrom(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr pool = NULL; virStorageVolPtr newvol = NULL, inputvol = NULL; const char *from = NULL; bool ret = false; char *buffer = NULL; if (!vshConnectionUsability(ctl, ctl->conn)) goto cleanup; if (!(pool = vshCommandOptPool(ctl, cmd, "pool", NULL))) goto cleanup; if (vshCommandOptString(cmd, "file", &from) <= 0) { goto cleanup; } if (!(inputvol = vshCommandOptVol(ctl, cmd, "vol", "inputpool", NULL))) goto cleanup; if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) { virshReportError(ctl); goto cleanup; } newvol = virStorageVolCreateXMLFrom(pool, buffer, inputvol, 0); if (newvol != NULL) { vshPrint(ctl, _("Vol %s created from input vol %s\n"), virStorageVolGetName(newvol), virStorageVolGetName(inputvol)); } else { vshError(ctl, _("Failed to create vol from %s"), from); goto cleanup; } ret = true; cleanup: VIR_FREE(buffer); if (pool) virStoragePoolFree(pool); if (inputvol) virStorageVolFree(inputvol); if (newvol) virStorageVolFree(newvol); return ret; }
static void gvir_storage_pool_finalize(GObject *object) { GVirStoragePool *pool = GVIR_STORAGE_POOL(object); GVirStoragePoolPrivate *priv = pool->priv; if (priv->volumes) { g_hash_table_unref(priv->volumes); priv->volumes = NULL; } virStoragePoolFree(priv->handle); g_mutex_free(priv->lock); G_OBJECT_CLASS(gvir_storage_pool_parent_class)->finalize(object); }
Result StoragePoolControlThread::undefineStoragePool() { Result result; QString name = task.object; bool deleted = false; virStoragePoolPtr storagePool = virStoragePoolLookupByName( task.sourceConn, name.toUtf8().data()); if ( storagePool!=NULL ) { deleted = (virStoragePoolUndefine(storagePool)+1) ? true : false; if (!deleted) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.msg.append(QString("'<b>%1</b>' StoragePool %2 Undefined.") .arg(name).arg((deleted)?"":"don't")); result.name = name; result.result = deleted; return result; }
Result StoragePoolControlThread::changeAutoStartStoragePool() { Result result; QString name = task.object; int autostart = task.args.sign; bool set = false; virStoragePoolPtr storagePool = virStoragePoolLookupByName( task.sourceConn, name.toUtf8().data()); if ( storagePool!=NULL ) { set = (virStoragePoolSetAutostart(storagePool, autostart)+1) ? true : false; if (!set) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.msg.append(QString("'<b>%1</b>' StoragePool autostart %2 Set.") .arg(name).arg((set)?"":"don't")); result.name = name; result.result = set; return result; }
static void gvir_storage_pool_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GVirStoragePool *pool = GVIR_STORAGE_POOL(object); GVirStoragePoolPrivate *priv = pool->priv; switch (prop_id) { case PROP_HANDLE: if (priv->handle) virStoragePoolFree(priv->handle); priv->handle = g_value_dup_boxed(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } }
QStringList StoragePoolControlThread::startStoragePool() { QStringList result; QString name = args.first(); unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; /* virStoragePoolPtr *storagePool; int ret = virConnectListAllStoragePools( currWorkConnect, &storagePool, flags); if ( ret<0 ) { sendConnErrors(); free(storagePool); return result; }; //qDebug()<<QString(virConnectGetURI(currWorkConnect)); int i = 0; */ bool started = false; // flags: extra flags; not used yet, so callers should always pass 0 flags = 0; /* while ( storagePool[i] != NULL ) { QString currPoolName = QString( virStoragePoolGetName(storagePool[i]) ); if ( !started && currPoolName==name ) { started = (virStoragePoolCreate(storagePool[i], flags)+1) ? true : false; if (!started) sendGlobalErrors(); }; virStoragePoolFree(storagePool[i]); i++; }; free(storagePool); */ virStoragePoolPtr storagePool = virStoragePoolLookupByName(currWorkConnect, name.toUtf8().data()); if ( storagePool!=NULL ) { started = (virStoragePoolCreate(storagePool, flags)+1) ? true : false; if (!started) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.append(QString("'<b>%1</b>' StoragePool %2 Started.").arg(name).arg((started)?"":"don't")); return result; }
Result StoragePoolControlThread::deleteStoragePool() { Result result; QString name = task.object; uint flags = (task.args.sign)? VIR_STORAGE_POOL_DELETE_ZEROED : VIR_STORAGE_POOL_DELETE_NORMAL; bool deleted = false; virStoragePoolPtr storagePool = virStoragePoolLookupByName( task.sourceConn, name.toUtf8().data()); if ( storagePool!=NULL ) { deleted = (virStoragePoolDelete(storagePool, flags)+1) ? true : false; if (!deleted) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.msg.append(QString("'<b>%1</b>' StoragePool %2 Deleted.") .arg(name).arg((deleted)?"":"don't")); result.name = name; result.result = deleted; return result; }
Result StoragePoolControlThread::destroyStoragePool() { Result result; QString name = task.object; bool deleted = false; virStoragePoolPtr storagePool = virStoragePoolLookupByName( *task.srcConnPtr, name.toUtf8().data()); if ( storagePool!=NULL ) { deleted = (virStoragePoolDestroy(storagePool)+1) ? true : false; if (!deleted) result.err = sendConnErrors(); virStoragePoolFree(storagePool); } else result.err = sendConnErrors(); result.msg.append(QString("'<b>%1</b>' StoragePool %2 Destroyed.") .arg(name).arg((deleted)?"":"don't")); result.name = name; result.result = deleted; return result; }
QStringList StoragePoolControlThread::undefineStoragePool() { QStringList result; QString name = args.first(); /* virStoragePoolPtr *storagePool; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; int ret = virConnectListAllStoragePools( currWorkConnect, &storagePool, flags); if ( ret<0 ) { sendConnErrors(); free(storagePool); return result; }; //qDebug()<<QString(virConnectGetURI(currWorkConnect)); int i = 0; */ bool deleted = false; /* while ( storagePool[i] != NULL ) { QString currPoolName = QString( virStoragePoolGetName(storagePool[i]) ); if ( !deleted && currPoolName==name ) { deleted = (virStoragePoolUndefine(storagePool[i])+1) ? true : false; if (!deleted) sendGlobalErrors(); }; qDebug()<<QVariant(deleted).toString()<<currPoolName<<name; virStoragePoolFree(storagePool[i]); i++; }; free(storagePool); */ virStoragePoolPtr storagePool = virStoragePoolLookupByName(currWorkConnect, name.toUtf8().data()); if ( storagePool!=NULL ) { deleted = (virStoragePoolDestroy(storagePool)+1) ? true : false; if (!deleted) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.append(QString("'<b>%1</b>' StoragePool %2 Undefined.").arg(name).arg((deleted)?"":"don't")); return result; }
Result StoragePoolControlThread::getAllStoragePoolList() { Result result; QStringList storagePoolList; if ( task.srcConnPtr!=NULL && keep_alive ) { virStoragePoolPtr *storagePool = NULL; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; int ret = virConnectListAllStoragePools( *task.srcConnPtr, &storagePool, flags); if ( ret<0 ) { result.err = sendConnErrors(); result.result = false; result.msg = storagePoolList; return result; }; // therefore correctly to use for() command, because storagePool[0] can not exist. for (int i = 0; i < ret; i++) { QStringList currentAttr; QString autostartStr; int is_autostart = 0; if (virStoragePoolGetAutostart(storagePool[i], &is_autostart) < 0) { autostartStr.append("no autostart"); } else autostartStr.append( is_autostart ? "yes" : "no" ); currentAttr<< QString::fromUtf8( virStoragePoolGetName(storagePool[i]) ) << QString( virStoragePoolIsActive(storagePool[i]) ? "active" : "inactive" ) << autostartStr << QString( virStoragePoolIsPersistent(storagePool[i]) ? "yes" : "no" ); storagePoolList.append(currentAttr.join(DFR)); //qDebug()<<currentAttr; virStoragePoolFree(storagePool[i]); }; free(storagePool); result.result = true; } else { result.result = false; }; result.msg = storagePoolList; return result; }
Result StorageVolControlThread::getStorageVolXMLDesc() { Result result; result.name = QString("%1_%2").arg(task.srcConName).arg(currPoolName); QString name = task.object; if (currStoragePool!=NULL) { virStoragePoolFree(currStoragePool); currStoragePool = NULL; }; currStoragePool = virStoragePoolLookupByName( *task.srcConnPtr, currPoolName.toUtf8().data()); bool read = false; char *Returns = NULL; // flags: extra flags; not used yet, so callers should always pass 0 unsigned int flags = 0; virStorageVol *storageVol = virStorageVolLookupByName( currStoragePool, name.toUtf8().data()); if ( storageVol!=NULL ) { Returns = virStorageVolGetXMLDesc(storageVol, flags); if ( Returns==NULL ) result.err = sendConnErrors(); else read = true; virStorageVolFree(storageVol); } else result.err = sendConnErrors(); QTemporaryFile f; f.setAutoRemove(false); f.setFileTemplate(QString("%1%2XML_Desc-XXXXXX.xml") .arg(QDir::tempPath()).arg(QDir::separator())); read = f.open(); if (read) f.write(Returns); result.fileName.append(f.fileName()); f.close(); if ( Returns!=NULL ) free(Returns); result.msg.append(QString("'<b>%1</b>' StorageVol %2 XML'ed") .arg(name).arg((read)?"":"don't")); result.result = read; return result; }
Result StoragePoolControlThread::startStoragePool() { Result result; QString name = task.object; unsigned int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE | VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE; bool started = false; // flags: extra flags; not used yet, so callers should always pass 0 flags = 0; virStoragePoolPtr storagePool = virStoragePoolLookupByName( task.sourceConn, name.toUtf8().data()); if ( storagePool!=NULL ) { started = (virStoragePoolCreate(storagePool, flags)+1) ? true : false; if (!started) sendConnErrors(); virStoragePoolFree(storagePool); } else sendConnErrors(); result.msg.append(QString("'<b>%1</b>' StoragePool %2 Started.") .arg(name).arg((started)?"":"don't")); result.name = name; result.result = started; return result; }
Result StorageVolControlThread::createStorageVol() { Result result; result.name = QString("%1_%2").arg(task.srcConName).arg(currPoolName); QString path = task.args.path; QByteArray xmlData; QFile f; f.setFileName(path); if ( !f.open(QIODevice::ReadOnly) ) { QString msg = QString("File \"%1\"\nnot opened.").arg(path); emit errorMsg( msg, number ); result.result = false; result.err = msg; return result; }; xmlData = f.readAll(); f.close(); if (currStoragePool!=NULL) { virStoragePoolFree(currStoragePool); currStoragePool = NULL; }; currStoragePool = virStoragePoolLookupByName( *task.srcConnPtr, currPoolName.toUtf8().data()); virStorageVolPtr storageVol = virStorageVolCreateXML( currStoragePool, xmlData.data(), VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA); if ( storageVol==NULL ) { result.err = sendConnErrors(); result.result = false; return result; }; QString name = QString().fromUtf8( virStorageVolGetName(storageVol) ); result.msg.append( QString("'<b>%1</b>' StorageVol from\n\"%2\"\nis created.") .arg(name).arg(path)); virStorageVolFree(storageVol); result.result = true; return result; }
static bool cmdVolCreate(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr pool; virStorageVolPtr vol; const char *from = NULL; bool ret = false; unsigned int flags = 0; char *buffer = NULL; if (vshCommandOptBool(cmd, "prealloc-metadata")) flags |= VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA; if (!(pool = vshCommandOptPool(ctl, cmd, "pool", NULL))) return false; if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0) goto cleanup; if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0) { vshSaveLibvirtError(); goto cleanup; } if ((vol = virStorageVolCreateXML(pool, buffer, flags))) { vshPrint(ctl, _("Vol %s created from %s\n"), virStorageVolGetName(vol), from); virStorageVolFree(vol); ret = true; } else { vshError(ctl, _("Failed to create vol from %s"), from); } cleanup: VIR_FREE(buffer); virStoragePoolFree(pool); return ret; }