mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-21 10:52:22 +00:00
conf: allow bandwidth parsing / formatting to include class ID
The domain conf actual network def stores a <class id='3'/> element separately from the <bandwidth>. The class ID should really just be an attribute on the <bandwidth> element. We can't change existing XML, and this isn't visible to users since it is internal XML only. When we expose the new network port XML to users though, we should get the design right. Reviewed-by: Laine Stump <laine@laine.org> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
f8a53a0795
commit
c0c37de2d6
@ -11280,6 +11280,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
|
||||
bandwidth_node = virXPathNode("./bandwidth", ctxt);
|
||||
if (bandwidth_node &&
|
||||
virNetDevBandwidthParse(&actual->bandwidth,
|
||||
NULL,
|
||||
bandwidth_node,
|
||||
actual->type == VIR_DOMAIN_NET_TYPE_NETWORK) < 0)
|
||||
goto error;
|
||||
@ -11619,6 +11620,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
}
|
||||
} else if (virXMLNodeNameEqual(cur, "bandwidth")) {
|
||||
if (virNetDevBandwidthParse(&def->bandwidth,
|
||||
NULL,
|
||||
cur,
|
||||
def->type == VIR_DOMAIN_NET_TYPE_NETWORK) < 0)
|
||||
goto error;
|
||||
@ -25016,7 +25018,7 @@ virDomainActualNetDefContentsFormat(virBufferPtr buf,
|
||||
return -1;
|
||||
if (virNetDevVPortProfileFormat(virDomainNetGetActualVirtPortProfile(def), buf) < 0)
|
||||
return -1;
|
||||
if (virNetDevBandwidthFormat(virDomainNetGetActualBandwidth(def), buf) < 0)
|
||||
if (virNetDevBandwidthFormat(virDomainNetGetActualBandwidth(def), 0, buf) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
@ -25393,7 +25395,7 @@ virDomainNetDefFormat(virBufferPtr buf,
|
||||
return -1;
|
||||
if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0)
|
||||
return -1;
|
||||
if (virNetDevBandwidthFormat(def->bandwidth, buf) < 0)
|
||||
if (virNetDevBandwidthFormat(def->bandwidth, 0, buf) < 0)
|
||||
return -1;
|
||||
|
||||
/* ONLY for internal status storage - format the ActualNetDef
|
||||
|
@ -99,6 +99,7 @@ virNetDevBandwidthParseRate(xmlNodePtr node, virNetDevBandwidthRatePtr rate)
|
||||
/**
|
||||
* virNetDevBandwidthParse:
|
||||
* @bandwidth: parsed bandwidth
|
||||
* @class_id: parsed class ID
|
||||
* @node: XML node
|
||||
* @allowFloor: whether "floor" setting is supported
|
||||
*
|
||||
@ -110,6 +111,7 @@ virNetDevBandwidthParseRate(xmlNodePtr node, virNetDevBandwidthRatePtr rate)
|
||||
*/
|
||||
int
|
||||
virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth,
|
||||
unsigned int *class_id,
|
||||
xmlNodePtr node,
|
||||
bool allowFloor)
|
||||
{
|
||||
@ -117,6 +119,7 @@ virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth,
|
||||
virNetDevBandwidthPtr def = NULL;
|
||||
xmlNodePtr cur;
|
||||
xmlNodePtr in = NULL, out = NULL;
|
||||
char *class_id_prop = NULL;
|
||||
|
||||
if (VIR_ALLOC(def) < 0)
|
||||
return ret;
|
||||
@ -127,6 +130,22 @@ virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
class_id_prop = virXMLPropString(node, "classID");
|
||||
if (class_id_prop) {
|
||||
if (!class_id) {
|
||||
virReportError(VIR_ERR_XML_DETAIL, "%s",
|
||||
_("classID attribute not supported on <bandwidth> "
|
||||
"in this usage context"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (virStrToLong_ui(class_id_prop, NULL, 10, class_id) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unable to parse class id '%s'"),
|
||||
class_id_prop);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
cur = node->children;
|
||||
|
||||
while (cur) {
|
||||
@ -194,6 +213,7 @@ virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth,
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(class_id_prop);
|
||||
virNetDevBandwidthFree(def);
|
||||
return ret;
|
||||
}
|
||||
@ -231,6 +251,7 @@ virNetDevBandwidthRateFormat(virNetDevBandwidthRatePtr def,
|
||||
/**
|
||||
* virNetDevBandwidthFormat:
|
||||
* @def: Data source
|
||||
* @class_id: the class ID to format, 0 to skip
|
||||
* @buf: Buffer to print to
|
||||
*
|
||||
* Formats bandwidth and prepend each line with @indent.
|
||||
@ -239,7 +260,9 @@ virNetDevBandwidthRateFormat(virNetDevBandwidthRatePtr def,
|
||||
* Returns 0 on success, else -1.
|
||||
*/
|
||||
int
|
||||
virNetDevBandwidthFormat(virNetDevBandwidthPtr def, virBufferPtr buf)
|
||||
virNetDevBandwidthFormat(virNetDevBandwidthPtr def,
|
||||
unsigned int class_id,
|
||||
virBufferPtr buf)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
@ -251,7 +274,10 @@ virNetDevBandwidthFormat(virNetDevBandwidthPtr def, virBufferPtr buf)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
virBufferAddLit(buf, "<bandwidth>\n");
|
||||
virBufferAddLit(buf, "<bandwidth");
|
||||
if (class_id)
|
||||
virBufferAsprintf(buf, " classID='%u'", class_id);
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
if (virNetDevBandwidthRateFormat(def->in, buf, "inbound") < 0 ||
|
||||
virNetDevBandwidthRateFormat(def->out, buf, "outbound") < 0)
|
||||
|
@ -25,10 +25,12 @@
|
||||
#include "domain_conf.h"
|
||||
|
||||
int virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth,
|
||||
unsigned int *class_id,
|
||||
xmlNodePtr node,
|
||||
bool allowFloor)
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||
int virNetDevBandwidthFormat(virNetDevBandwidthPtr def,
|
||||
unsigned int class_id,
|
||||
virBufferPtr buf);
|
||||
|
||||
void virDomainClearNetBandwidth(virDomainObjPtr vm)
|
||||
|
@ -1188,7 +1188,7 @@ virNetworkPortGroupParseXML(virPortGroupDefPtr def,
|
||||
|
||||
bandwidth_node = virXPathNode("./bandwidth", ctxt);
|
||||
if (bandwidth_node &&
|
||||
virNetDevBandwidthParse(&def->bandwidth, bandwidth_node, false) < 0)
|
||||
virNetDevBandwidthParse(&def->bandwidth, NULL, bandwidth_node, false) < 0)
|
||||
goto cleanup;
|
||||
|
||||
vlanNode = virXPathNode("./vlan", ctxt);
|
||||
@ -1682,7 +1682,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
||||
}
|
||||
|
||||
if ((bandwidthNode = virXPathNode("./bandwidth", ctxt)) &&
|
||||
virNetDevBandwidthParse(&def->bandwidth, bandwidthNode, false) < 0)
|
||||
virNetDevBandwidthParse(&def->bandwidth, NULL, bandwidthNode, false) < 0)
|
||||
goto error;
|
||||
|
||||
vlanNode = virXPathNode("./vlan", ctxt);
|
||||
@ -2311,7 +2311,7 @@ virPortGroupDefFormat(virBufferPtr buf,
|
||||
return -1;
|
||||
if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0)
|
||||
return -1;
|
||||
virNetDevBandwidthFormat(def->bandwidth, buf);
|
||||
virNetDevBandwidthFormat(def->bandwidth, 0, buf);
|
||||
virBufferAdjustIndent(buf, -2);
|
||||
virBufferAddLit(buf, "</portgroup>\n");
|
||||
return 0;
|
||||
@ -2566,7 +2566,7 @@ virNetworkDefFormatBuf(virBufferPtr buf,
|
||||
|
||||
if (virNetDevVlanFormat(&def->vlan, buf) < 0)
|
||||
goto error;
|
||||
if (virNetDevBandwidthFormat(def->bandwidth, buf) < 0)
|
||||
if (virNetDevBandwidthFormat(def->bandwidth, 0, buf) < 0)
|
||||
goto error;
|
||||
|
||||
for (i = 0; i < def->nips; i++) {
|
||||
|
@ -54,6 +54,7 @@ struct testSetStruct {
|
||||
goto cleanup; \
|
||||
\
|
||||
rc = virNetDevBandwidthParse(&(var), \
|
||||
NULL, \
|
||||
ctxt->node, \
|
||||
true); \
|
||||
xmlFreeDoc(doc); \
|
||||
|
Loading…
x
Reference in New Issue
Block a user