mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
interface: implement a test driver for network config transaction API.
This commit is contained in:
parent
9c6000579b
commit
88c5b97f7c
@ -1227,6 +1227,44 @@ void virInterfaceObjListFree(virInterfaceObjListPtr interfaces)
|
|||||||
interfaces->count = 0;
|
interfaces->count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int virInterfaceObjListClone(virInterfaceObjListPtr src,
|
||||||
|
virInterfaceObjListPtr dest)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
unsigned int i, cnt;
|
||||||
|
|
||||||
|
if (!src || !dest)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
virInterfaceObjListFree(dest); /* start with an empty list */
|
||||||
|
cnt = src->count;
|
||||||
|
for (i = 0; i < cnt; i++) {
|
||||||
|
virInterfaceDefPtr def = src->objs[i]->def;
|
||||||
|
virInterfaceDefPtr backup;
|
||||||
|
virInterfaceObjPtr iface;
|
||||||
|
char *xml = virInterfaceDefFormat(def);
|
||||||
|
|
||||||
|
if (!xml)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((backup = virInterfaceDefParseString(xml)) == NULL) {
|
||||||
|
VIR_FREE(xml);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_FREE(xml);
|
||||||
|
if ((iface = virInterfaceAssignDef(dest, backup)) == NULL)
|
||||||
|
goto cleanup;
|
||||||
|
virInterfaceObjUnlock(iface); /* was locked by virInterfaceAssignDef */
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = cnt;
|
||||||
|
cleanup:
|
||||||
|
if ((ret < 0) && dest)
|
||||||
|
virInterfaceObjListFree(dest);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
|
virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
|
||||||
const virInterfaceDefPtr def)
|
const virInterfaceDefPtr def)
|
||||||
{
|
{
|
||||||
|
@ -192,6 +192,9 @@ virInterfaceObjPtr virInterfaceFindByName(const virInterfaceObjListPtr
|
|||||||
void virInterfaceDefFree(virInterfaceDefPtr def);
|
void virInterfaceDefFree(virInterfaceDefPtr def);
|
||||||
void virInterfaceObjFree(virInterfaceObjPtr iface);
|
void virInterfaceObjFree(virInterfaceObjPtr iface);
|
||||||
void virInterfaceObjListFree(virInterfaceObjListPtr vms);
|
void virInterfaceObjListFree(virInterfaceObjListPtr vms);
|
||||||
|
int virInterfaceObjListClone(virInterfaceObjListPtr src,
|
||||||
|
virInterfaceObjListPtr dest);
|
||||||
|
|
||||||
|
|
||||||
virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
|
virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces,
|
||||||
const virInterfaceDefPtr def);
|
const virInterfaceDefPtr def);
|
||||||
|
@ -488,6 +488,7 @@ virInterfaceDefParseNode;
|
|||||||
virInterfaceDefParseString;
|
virInterfaceDefParseString;
|
||||||
virInterfaceFindByMACString;
|
virInterfaceFindByMACString;
|
||||||
virInterfaceFindByName;
|
virInterfaceFindByName;
|
||||||
|
virInterfaceObjListClone;
|
||||||
virInterfaceObjListFree;
|
virInterfaceObjListFree;
|
||||||
virInterfaceObjLock;
|
virInterfaceObjLock;
|
||||||
virInterfaceObjUnlock;
|
virInterfaceObjUnlock;
|
||||||
|
@ -85,6 +85,8 @@ struct _testConn {
|
|||||||
virDomainObjList domains;
|
virDomainObjList domains;
|
||||||
virNetworkObjList networks;
|
virNetworkObjList networks;
|
||||||
virInterfaceObjList ifaces;
|
virInterfaceObjList ifaces;
|
||||||
|
bool transaction_running;
|
||||||
|
virInterfaceObjList backupIfaces;
|
||||||
virStoragePoolObjList pools;
|
virStoragePoolObjList pools;
|
||||||
virNodeDeviceObjList devs;
|
virNodeDeviceObjList devs;
|
||||||
int numCells;
|
int numCells;
|
||||||
@ -3455,6 +3457,84 @@ cleanup:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int testInterfaceChangeBegin(virConnectPtr conn,
|
||||||
|
unsigned int flags ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
testConnPtr privconn = conn->privateData;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
testDriverLock(privconn);
|
||||||
|
if (privconn->transaction_running) {
|
||||||
|
testError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
_("there is another transaction running."));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
privconn->transaction_running = true;
|
||||||
|
|
||||||
|
if (virInterfaceObjListClone(&privconn->ifaces,
|
||||||
|
&privconn->backupIfaces) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
testDriverUnlock(privconn);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int testInterfaceChangeCommit(virConnectPtr conn,
|
||||||
|
unsigned int flags ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
testConnPtr privconn = conn->privateData;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
testDriverLock(privconn);
|
||||||
|
|
||||||
|
if (!privconn->transaction_running) {
|
||||||
|
testError(VIR_ERR_OPERATION_INVALID, _("no transaction running, "
|
||||||
|
"nothing to be commited."));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
virInterfaceObjListFree(&privconn->backupIfaces);
|
||||||
|
privconn->transaction_running = false;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
testDriverUnlock(privconn);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int testInterfaceChangeRollback(virConnectPtr conn,
|
||||||
|
unsigned int flags ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
testConnPtr privconn = conn->privateData;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
testDriverLock(privconn);
|
||||||
|
|
||||||
|
if (!privconn->transaction_running) {
|
||||||
|
testError(VIR_ERR_OPERATION_INVALID, _("no transaction running, "
|
||||||
|
"nothing to rollback."));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
virInterfaceObjListFree(&privconn->ifaces);
|
||||||
|
privconn->ifaces.count = privconn->backupIfaces.count;
|
||||||
|
privconn->ifaces.objs = privconn->backupIfaces.objs;
|
||||||
|
privconn->backupIfaces.count = 0;
|
||||||
|
privconn->backupIfaces.objs = NULL;
|
||||||
|
|
||||||
|
privconn->transaction_running = false;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
testDriverUnlock(privconn);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static char *testInterfaceGetXMLDesc(virInterfacePtr iface,
|
static char *testInterfaceGetXMLDesc(virInterfacePtr iface,
|
||||||
unsigned int flags ATTRIBUTE_UNUSED)
|
unsigned int flags ATTRIBUTE_UNUSED)
|
||||||
@ -5428,6 +5508,9 @@ static virInterfaceDriver testInterfaceDriver = {
|
|||||||
.interfaceCreate = testInterfaceCreate, /* 0.7.0 */
|
.interfaceCreate = testInterfaceCreate, /* 0.7.0 */
|
||||||
.interfaceDestroy = testInterfaceDestroy, /* 0.7.0 */
|
.interfaceDestroy = testInterfaceDestroy, /* 0.7.0 */
|
||||||
.interfaceIsActive = testInterfaceIsActive, /* 0.7.3 */
|
.interfaceIsActive = testInterfaceIsActive, /* 0.7.3 */
|
||||||
|
.interfaceChangeBegin = testInterfaceChangeBegin, /* 0.9.2 */
|
||||||
|
.interfaceChangeCommit = testInterfaceChangeCommit, /* 0.9.2 */
|
||||||
|
.interfaceChangeRollback = testInterfaceChangeRollback, /* 0.9.2 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user