On 04/24/2016 07:22 PM, Cole Robinson wrote:
libvirt-daemon-config-nwfilter will put a bunch of xml configs
into /etc/libvirt/nwfilter. These configs don't hardcode a UUID
and depends on libvirt to generate one. However the generated UUID
is never saved to disk, unless the user manually calls Define.
This makes daemon reload quite noisy with many errors like:
error : virNWFilterObjAssignDef:3101 : operation failed: filter
'allow-incoming-ipv4' already exists with uuid
50def3b5-48d6-46a3-b005-cc22df4e5c5c
ahhh... I was wondering about those...
Because a new UUID is generated every time the config is read from
disk, so libvirt constantly thinks it's finding a new nwfilter.
Detect if we generated a UUID when the config file is loaded; if so,
resave the new contents to disk to ensure the UUID is persisteny.
persistent
This is similar to what was done in commit a47ae7c0 with virtual
networks and generated MAC addresses
---
src/conf/nwfilter_conf.c | 6 ++++++
src/conf/nwfilter_conf.h | 1 +
2 files changed, 7 insertions(+)
diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index d8e83f0..f9cb8ea 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -2658,6 +2658,7 @@ virNWFilterDefParseXML(xmlXPathContextPtr ctxt)
}
uuid = virXPathString("string(./uuid)", ctxt);
+ ret->uuid_specified = (uuid != NULL);
I would think this would go in the else of the following if rather than
making the extra check... Although I bet the compiler figures it out...
ACK -
John
if (uuid == NULL) {
if (virUUIDGenerate(ret->uuid) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -3178,6 +3179,11 @@ virNWFilterLoadConfig(virNWFilterObjListPtr nwfilters,
goto error;
}
+ /* We generated a UUID, make it permanent by saving the config to disk */
+ if (!def->uuid_specified &&
+ virNWFilterSaveConfig(configDir, def) < 0)
+ goto error;
+
if (!(nwfilter = virNWFilterObjAssignDef(nwfilters, def))) {
goto error;
}
diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h
index 823cfa4..ea3cd5c 100644
--- a/src/conf/nwfilter_conf.h
+++ b/src/conf/nwfilter_conf.h
@@ -536,6 +536,7 @@ typedef virNWFilterDef *virNWFilterDefPtr;
struct _virNWFilterDef {
char *name;
unsigned char uuid[VIR_UUID_BUFLEN];
+ bool uuid_specified;
char *chainsuffix;
virNWFilterChainPriority chainPriority;