mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Network duplicate UUID/name checking
The network driver is not doing correct checking for duplicate UUID/name values. This introduces a new method virNetworkObjIsDuplicate, based on the previously written virDomainObjIsDuplicate. * src/conf/network_conf.c, src/conf/network_conf.c, src/libvirt_private.syms: Add virNetworkObjIsDuplicate, * src/network/bridge_driver.c: Call virNetworkObjIsDuplicate for checking uniqueness of uuid/names
This commit is contained in:
parent
627409d1f4
commit
3bb3743934
@ -940,6 +940,71 @@ error:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* virNetworkObjIsDuplicate:
|
||||||
|
* @doms : virNetworkObjListPtr to search
|
||||||
|
* @def : virNetworkDefPtr definition of network to lookup
|
||||||
|
* @check_active: If true, ensure that network is not active
|
||||||
|
*
|
||||||
|
* Returns: -1 on error
|
||||||
|
* 0 if network is new
|
||||||
|
* 1 if network is a duplicate
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
virNetworkObjIsDuplicate(virNetworkObjListPtr doms,
|
||||||
|
virNetworkDefPtr def,
|
||||||
|
unsigned int check_active)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
int dupVM = 0;
|
||||||
|
virNetworkObjPtr vm = NULL;
|
||||||
|
|
||||||
|
/* See if a VM with matching UUID already exists */
|
||||||
|
vm = virNetworkFindByUUID(doms, def->uuid);
|
||||||
|
if (vm) {
|
||||||
|
/* UUID matches, but if names don't match, refuse it */
|
||||||
|
if (STRNEQ(vm->def->name, def->name)) {
|
||||||
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
virUUIDFormat(vm->def->uuid, uuidstr);
|
||||||
|
virNetworkReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
_("network '%s' is already defined with uuid %s"),
|
||||||
|
vm->def->name, uuidstr);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_active) {
|
||||||
|
/* UUID & name match, but if VM is already active, refuse it */
|
||||||
|
if (virNetworkObjIsActive(vm)) {
|
||||||
|
virNetworkReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
_("network is already active as '%s'"),
|
||||||
|
vm->def->name);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dupVM = 1;
|
||||||
|
} else {
|
||||||
|
/* UUID does not match, but if a name matches, refuse it */
|
||||||
|
vm = virNetworkFindByName(doms, def->name);
|
||||||
|
if (vm) {
|
||||||
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
virUUIDFormat(vm->def->uuid, uuidstr);
|
||||||
|
virNetworkReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
_("network '%s' already exists with uuid %s"),
|
||||||
|
def->name, uuidstr);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = dupVM;
|
||||||
|
cleanup:
|
||||||
|
if (vm)
|
||||||
|
virNetworkObjUnlock(vm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void virNetworkObjLock(virNetworkObjPtr obj)
|
void virNetworkObjLock(virNetworkObjPtr obj)
|
||||||
{
|
{
|
||||||
virMutexLock(&obj->lock);
|
virMutexLock(&obj->lock);
|
||||||
|
@ -169,6 +169,10 @@ int virNetworkSetBridgeName(const virNetworkObjListPtr nets,
|
|||||||
virNetworkDefPtr def,
|
virNetworkDefPtr def,
|
||||||
int check_collision);
|
int check_collision);
|
||||||
|
|
||||||
|
int virNetworkObjIsDuplicate(virNetworkObjListPtr doms,
|
||||||
|
virNetworkDefPtr def,
|
||||||
|
unsigned int check_active);
|
||||||
|
|
||||||
void virNetworkObjLock(virNetworkObjPtr obj);
|
void virNetworkObjLock(virNetworkObjPtr obj);
|
||||||
void virNetworkObjUnlock(virNetworkObjPtr obj);
|
void virNetworkObjUnlock(virNetworkObjPtr obj);
|
||||||
|
|
||||||
|
@ -469,6 +469,7 @@ virNetworkSaveConfig;
|
|||||||
virNetworkSetBridgeName;
|
virNetworkSetBridgeName;
|
||||||
virNetworkObjLock;
|
virNetworkObjLock;
|
||||||
virNetworkObjUnlock;
|
virNetworkObjUnlock;
|
||||||
|
virNetworkObjIsDuplicate;
|
||||||
|
|
||||||
|
|
||||||
# nodeinfo.h
|
# nodeinfo.h
|
||||||
|
@ -1378,6 +1378,9 @@ static virNetworkPtr networkCreate(virConnectPtr conn, const char *xml) {
|
|||||||
if (!(def = virNetworkDefParseString(xml)))
|
if (!(def = virNetworkDefParseString(xml)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virNetworkObjIsDuplicate(&driver->networks, def, 1) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (virNetworkSetBridgeName(&driver->networks, def, 1))
|
if (virNetworkSetBridgeName(&driver->networks, def, 1))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1408,12 +1411,16 @@ static virNetworkPtr networkDefine(virConnectPtr conn, const char *xml) {
|
|||||||
virNetworkDefPtr def;
|
virNetworkDefPtr def;
|
||||||
virNetworkObjPtr network = NULL;
|
virNetworkObjPtr network = NULL;
|
||||||
virNetworkPtr ret = NULL;
|
virNetworkPtr ret = NULL;
|
||||||
|
int dupNet;
|
||||||
|
|
||||||
networkDriverLock(driver);
|
networkDriverLock(driver);
|
||||||
|
|
||||||
if (!(def = virNetworkDefParseString(xml)))
|
if (!(def = virNetworkDefParseString(xml)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((dupNet = virNetworkObjIsDuplicate(&driver->networks, def, 0)) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (virNetworkSetBridgeName(&driver->networks, def, 1))
|
if (virNetworkSetBridgeName(&driver->networks, def, 1))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user