]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: allow bandwidth parsing / formatting to include class ID
authorDaniel P. Berrangé <berrange@redhat.com>
Tue, 14 May 2019 14:44:55 +0000 (15:44 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 17 Jun 2019 14:19:54 +0000 (15:19 +0100)
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>
src/conf/domain_conf.c
src/conf/netdev_bandwidth_conf.c
src/conf/netdev_bandwidth_conf.h
src/conf/network_conf.c
tests/virnetdevbandwidthtest.c

index 97ba8bd53a190ff7c8a6e14e8fe99af122900d30..5c47ba2b379c0d0c0b9451150292c04671f262eb 100644 (file)
@@ -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
index 014941836d2ecb0831b6ba63cc746015e3af07e5..9af2173b7ba35e5704921e642ccac059f40992b0 100644 (file)
@@ -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)
index c10574d0b6014c2fac12b7cc7bc0dee267e12e09..42872cc4969686f7833f41451bec85870433b99d 100644 (file)
 #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)
index 91562de269668f7f2fc2c4a424b42ead592d8ec6..09e379ae9ad92567c5af0fcd538ec6e1f2bb2e25 100644 (file)
@@ -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++) {
index 23788b4164736086862a15abc94b37840236037c..2c0b6a6713c3f090cf75a4751b4670420cc448ca 100644 (file)
@@ -54,6 +54,7 @@ struct testSetStruct {
             goto cleanup; \
  \
         rc = virNetDevBandwidthParse(&(var), \
+                                     NULL, \
                                      ctxt->node, \
                                      true); \
         xmlFreeDoc(doc); \