From 0b33d7c921af5cf5ad4354631c4db2e156dd704c Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Thu, 19 Jun 2014 12:58:56 +0300 Subject: [PATCH] interface: clean up virInterfaceDefDevFormat This modifies the formatting function of virInterface to be a proper mirror of the parse function, including the addition of a "parentIfType" arg so that we can decide whether or not it is appropriate to emit the elements that are only in toplevel interfaces, as well as the element (which isn't allowed for bridge interfaces). Since the restructuring of the code necessarily changes the order of some of the elements, some test case data had to be updated. --- src/conf/interface_conf.c | 52 +++++++++---------- tests/interfaceschemadata/bond.xml | 2 +- .../interfaceschemadata/bridge-no-address.xml | 2 +- tests/interfaceschemadata/bridge.xml | 2 +- tests/interfaceschemadata/ethernet-dhcp.xml | 4 +- tests/interfaceschemadata/vlan.xml | 2 +- 6 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index 883053f923..141b4a2632 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -41,7 +41,8 @@ VIR_ENUM_IMPL(virInterface, static virInterfaceDefPtr virInterfaceDefParseXML(xmlXPathContextPtr ctxt, int parentIfType); static int -virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def); +virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def, + virInterfaceType parentIfType); static void virInterfaceIpDefFree(virInterfaceIpDefPtr def) @@ -870,7 +871,8 @@ virInterfaceBridgeDefFormat(virBufferPtr buf, const virInterfaceDef *def) virBufferAdjustIndent(buf, 2); for (i = 0; i < def->data.bridge.nbItf; i++) { - if (virInterfaceDefDevFormat(buf, def->data.bridge.itf[i]) < 0) + if (virInterfaceDefDevFormat(buf, def->data.bridge.itf[i], + VIR_INTERFACE_TYPE_BRIDGE) < 0) ret = -1; } @@ -932,7 +934,8 @@ virInterfaceBondDefFormat(virBufferPtr buf, const virInterfaceDef *def) virBufferAddLit(buf, "/>\n"); } for (i = 0; i < def->data.bond.nbItf; i++) { - if (virInterfaceDefDevFormat(buf, def->data.bond.itf[i]) < 0) + if (virInterfaceDefDevFormat(buf, def->data.bond.itf[i], + VIR_INTERFACE_TYPE_BOND) < 0) ret = -1; } @@ -1035,7 +1038,8 @@ virInterfaceStartmodeDefFormat(virBufferPtr buf, } static int -virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def) +virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def, + virInterfaceType parentIfType) { const char *type = NULL; @@ -1063,39 +1067,33 @@ virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDef *def) virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); + if (parentIfType == VIR_INTERFACE_TYPE_LAST) { + /* these elements are only valid on top-level interfaces - IP + * address info ("protocol") only makes sense for the + * top-level, and subordinate interfaces inherit the toplevel + * setting for mtu and start mode, which cannot be overridden. + */ + virInterfaceStartmodeDefFormat(buf, def->startmode); + if (def->mtu) + virBufferAsprintf(buf, "\n", def->mtu); + virInterfaceProtocolDefFormat(buf, def); + } + + if (def->type != VIR_INTERFACE_TYPE_BRIDGE) { + virInterfaceLinkFormat(buf, &def->lnk); + } switch (def->type) { case VIR_INTERFACE_TYPE_ETHERNET: - virInterfaceStartmodeDefFormat(buf, def->startmode); - if (def->mac != NULL) + if (def->mac) virBufferAsprintf(buf, "\n", def->mac); - virInterfaceLinkFormat(buf, &def->lnk); - if (def->mtu != 0) - virBufferAsprintf(buf, "\n", def->mtu); - virInterfaceProtocolDefFormat(buf, def); break; case VIR_INTERFACE_TYPE_BRIDGE: - virInterfaceStartmodeDefFormat(buf, def->startmode); - if (def->mtu != 0) - virBufferAsprintf(buf, "\n", def->mtu); - virInterfaceProtocolDefFormat(buf, def); virInterfaceBridgeDefFormat(buf, def); break; case VIR_INTERFACE_TYPE_BOND: - virInterfaceStartmodeDefFormat(buf, def->startmode); - virInterfaceLinkFormat(buf, &def->lnk); - if (def->mtu != 0) - virBufferAsprintf(buf, "\n", def->mtu); - virInterfaceProtocolDefFormat(buf, def); virInterfaceBondDefFormat(buf, def); break; case VIR_INTERFACE_TYPE_VLAN: - virInterfaceStartmodeDefFormat(buf, def->startmode); - if (def->mac != NULL) - virBufferAsprintf(buf, "\n", def->mac); - virInterfaceLinkFormat(buf, &def->lnk); - if (def->mtu != 0) - virBufferAsprintf(buf, "\n", def->mtu); - virInterfaceProtocolDefFormat(buf, def); virInterfaceVlanDefFormat(buf, def); break; } @@ -1116,7 +1114,7 @@ char *virInterfaceDefFormat(const virInterfaceDef *def) { virBuffer buf = VIR_BUFFER_INITIALIZER; - if (virInterfaceDefDevFormat(&buf, def) < 0) { + if (virInterfaceDefDevFormat(&buf, def, VIR_INTERFACE_TYPE_LAST) < 0) { virBufferFreeAndReset(&buf); return NULL; } diff --git a/tests/interfaceschemadata/bond.xml b/tests/interfaceschemadata/bond.xml index cbc1dfa8aa..3d24beae9f 100644 --- a/tests/interfaceschemadata/bond.xml +++ b/tests/interfaceschemadata/bond.xml @@ -1,10 +1,10 @@ - + diff --git a/tests/interfaceschemadata/bridge-no-address.xml b/tests/interfaceschemadata/bridge-no-address.xml index 68b8c94bf1..fd6c1a753e 100644 --- a/tests/interfaceschemadata/bridge-no-address.xml +++ b/tests/interfaceschemadata/bridge-no-address.xml @@ -3,8 +3,8 @@ - + diff --git a/tests/interfaceschemadata/bridge.xml b/tests/interfaceschemadata/bridge.xml index c865116548..ece087ea2e 100644 --- a/tests/interfaceschemadata/bridge.xml +++ b/tests/interfaceschemadata/bridge.xml @@ -6,8 +6,8 @@ - + diff --git a/tests/interfaceschemadata/ethernet-dhcp.xml b/tests/interfaceschemadata/ethernet-dhcp.xml index c124372ff1..9a8a160323 100644 --- a/tests/interfaceschemadata/ethernet-dhcp.xml +++ b/tests/interfaceschemadata/ethernet-dhcp.xml @@ -1,9 +1,9 @@ - - + + diff --git a/tests/interfaceschemadata/vlan.xml b/tests/interfaceschemadata/vlan.xml index 6432b96240..301377788a 100644 --- a/tests/interfaceschemadata/vlan.xml +++ b/tests/interfaceschemadata/vlan.xml @@ -1,9 +1,9 @@ - + -- GitLab