]> xenbits.xensource.com Git - libvirt.git/commitdiff
network: convert hook script to take a network port XML
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 19 Dec 2018 15:36:04 +0000 (15:36 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 17 Jun 2019 14:19:54 +0000 (15:19 +0100)
When (un)plugging an interface into a network, the 'plugged'
and 'unplugged' operations are invoked in the hook script.

The data provided to the script contains the network XML, the
domain XML and the domain interface XML. When we strictly split the
drivers up this will no longer be possible and thus breakage is
unavoidable. The hook scripts are not considered to be covered by the
API guarantee so this is OK.

To avoid existing scripts taking the wrong action, the existing
operations are changed to 'port-created' and 'port-deleted'
instead. These will receive the network XML and the network port
XML.

Reviewed-by: Laine Stump <laine@laine.org>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
docs/hooks.html.in
src/network/bridge_driver.c
src/util/virhook.c
src/util/virhook.h

index 2c4c39b7715f5f2e02d0d25761fb2fee70756ba3..7c9d3ef7f3e81603e46b04ca83009877147cd53f 100644 (file)
   &lt;/network&gt;
 &lt;/hookData&gt;</pre>
 
-    <p>In the case of an interface
-       being plugged/unplugged to/from the network, the network XML will be
-       followed with the full XML description of the domain containing the
-       interface that is being plugged/unplugged:</p>
+    <p>In the case of an network port being created / deleted, the network
+       XML will be followed with the full XML description of the port:</p>
 
 <pre>&lt;hookData&gt;
   &lt;network&gt;
      &lt;uuid&gt;afca425a-2c3a-420c-b2fb-dd7b4950d722&lt;/uuid&gt;
      ...
   &lt;/network&gt;
-  &lt;domain type='$domain_type' id='$domain_id'&gt;
-     &lt;name&gt;$domain_name&lt;/name&gt;
-     &lt;uuid&gt;afca425a-2c3a-420c-b2fb-dd7b4950d722&lt;/uuid&gt;
-     ...
-  &lt;/domain&gt;
+  &lt;networkport&gt;
+    &lt;uuid&gt;5d744f21-ba4a-4d6e-bdb2-30a35ff3207d&lt;/uuid&gt;
+    ...
+    &lt;plug type='direct' dev='ens3' mode='vepa'/&gt;
+  &lt;/networkport&gt;
 &lt;/hookData&gt;</pre>
 
     <p>Please note that this approach is different from other cases such as
           <pre>/etc/libvirt/hooks/network network_name stopped end -</pre></li>
       <li>Later, when network is started and there's an interface from a
         domain to be plugged into the network, the hook script is called as:<br/>
-          <pre>/etc/libvirt/hooks/network network_name plugged begin -</pre>
+          <pre>/etc/libvirt/hooks/network network_name port-created begin -</pre>
         Please note, that in this case, the script is passed both network and
-        domain XMLs on its stdin.</li>
+        port XMLs on its stdin.</li>
       <li>When network is updated, the hook script is called as:<br/>
           <pre>/etc/libvirt/hooks/network network_name updated begin -</pre></li>
       <li>When the domain from previous case is shutting down, the interface
         is unplugged. This leads to another script invocation:<br/>
-          <pre>/etc/libvirt/hooks/network network_name unplugged begin -</pre>
-        And again, as in previous case, both network and domain XMLs are passed
+          <pre>/etc/libvirt/hooks/network network_name port-deleted begin -</pre>
+        And again, as in previous case, both network and port XMLs are passed
         onto script's stdin.</li>
     </ul>
 
index 615aec71420ca1aaeda340bd6f52786da225f20c..95b7a7cce96eabc31a73a6a88ee7c7290690c7ec 100644 (file)
@@ -205,14 +205,13 @@ networkObjFromNetwork(virNetworkPtr net)
 
 static int
 networkRunHook(virNetworkObjPtr obj,
-               virDomainDefPtr dom,
-               virDomainNetDefPtr iface,
+               virNetworkPortDefPtr port,
                int op,
                int sub_op)
 {
     virNetworkDefPtr def;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
-    char *xml = NULL, *net_xml = NULL, *dom_xml = NULL;
+    char *xml = NULL;
     int hookret;
     int ret = -1;
 
@@ -226,11 +225,9 @@ networkRunHook(virNetworkObjPtr obj,
 
         virBufferAddLit(&buf, "<hookData>\n");
         virBufferAdjustIndent(&buf, 2);
-        if (iface && virDomainNetDefFormat(&buf, iface, NULL, 0) < 0)
-            goto cleanup;
         if (virNetworkDefFormatBuf(&buf, def, 0) < 0)
             goto cleanup;
-        if (dom && virDomainDefFormatInternal(dom, NULL, 0, &buf, NULL) < 0)
+        if (port && virNetworkPortDefFormatBuf(&buf, port) < 0)
             goto cleanup;
 
         virBufferAdjustIndent(&buf, -2);
@@ -256,8 +253,6 @@ networkRunHook(virNetworkObjPtr obj,
  cleanup:
     virBufferFreeAndReset(&buf);
     VIR_FREE(xml);
-    VIR_FREE(net_xml);
-    VIR_FREE(dom_xml);
     return ret;
 }
 
@@ -2777,7 +2772,7 @@ networkStartNetwork(virNetworkDriverStatePtr driver,
 
     /* Run an early hook to set-up missing devices.
      * If the script raised an error abort the launch. */
-    if (networkRunHook(obj, NULL, NULL,
+    if (networkRunHook(obj, NULL,
                        VIR_HOOK_NETWORK_OP_START,
                        VIR_HOOK_SUBOP_BEGIN) < 0)
         goto cleanup;
@@ -2821,7 +2816,7 @@ networkStartNetwork(virNetworkDriverStatePtr driver,
     virNetworkObjSetFloorSum(obj, 0);
 
     /* finally we can call the 'started' hook script if any */
-    if (networkRunHook(obj, NULL, NULL,
+    if (networkRunHook(obj, NULL,
                        VIR_HOOK_NETWORK_OP_STARTED,
                        VIR_HOOK_SUBOP_BEGIN) < 0)
         goto cleanup;
@@ -2905,7 +2900,7 @@ networkShutdownNetwork(virNetworkDriverStatePtr driver,
     }
 
     /* now that we know it's stopped call the hook if present */
-    networkRunHook(obj, NULL, NULL, VIR_HOOK_NETWORK_OP_STOPPED,
+    networkRunHook(obj, NULL, VIR_HOOK_NETWORK_OP_STOPPED,
                    VIR_HOOK_SUBOP_END);
 
     virNetworkObjSetActive(obj, false);
@@ -3881,7 +3876,7 @@ networkUpdate(virNetworkPtr net,
     }
 
     /* call the 'updated' network hook script */
-    if (networkRunHook(obj, NULL, NULL, VIR_HOOK_NETWORK_OP_UPDATED,
+    if (networkRunHook(obj, NULL, VIR_HOOK_NETWORK_OP_UPDATED,
                        VIR_HOOK_SUBOP_BEGIN) < 0)
         goto cleanup;
 
@@ -4706,8 +4701,8 @@ networkAllocateActualDevice(virNetworkPtr net,
     if (dev)
         dev->connections++;
     /* finally we can call the 'plugged' hook script if any */
-    if (networkRunHook(obj, dom, iface,
-                       VIR_HOOK_NETWORK_OP_IFACE_PLUGGED,
+    if (networkRunHook(obj, port,
+                       VIR_HOOK_NETWORK_OP_PORT_CREATED,
                        VIR_HOOK_SUBOP_BEGIN) < 0) {
         /* adjust for failure */
         netdef->connections--;
@@ -4901,7 +4896,7 @@ networkNotifyActualDevice(virNetworkPtr net,
     if (dev)
         dev->connections++;
     /* finally we can call the 'plugged' hook script if any */
-    if (networkRunHook(obj, dom, iface, VIR_HOOK_NETWORK_OP_IFACE_PLUGGED,
+    if (networkRunHook(obj, port, VIR_HOOK_NETWORK_OP_PORT_CREATED,
                        VIR_HOOK_SUBOP_BEGIN) < 0) {
         /* adjust for failure */
         if (dev)
@@ -5053,7 +5048,7 @@ networkReleaseActualDevice(virNetworkPtr net,
     if (dev)
         dev->connections--;
     /* finally we can call the 'unplugged' hook script if any */
-    networkRunHook(obj, dom, iface, VIR_HOOK_NETWORK_OP_IFACE_UNPLUGGED,
+    networkRunHook(obj, port, VIR_HOOK_NETWORK_OP_PORT_DELETED,
                    VIR_HOOK_SUBOP_BEGIN);
     networkLogAllocation(netdef, dev, &port->mac, false);
 
index 57549ef8e510c88e701d320adaf9d315939a4c0a..84b3954872c88de90914252891268d196f54e7d9 100644 (file)
@@ -100,8 +100,8 @@ VIR_ENUM_IMPL(virHookNetworkOp,
               "start",
               "started",
               "stopped",
-              "plugged",
-              "unplugged",
+              "port-created",
+              "port-deleted",
               "updated",
 );
 
index 034fb8f263df9a663c90e544e27b699ba160fd81..fa188c89e3171831585ddb0c28f82ae4e8506625 100644 (file)
@@ -79,8 +79,8 @@ typedef enum {
     VIR_HOOK_NETWORK_OP_START,          /* network is about to start */
     VIR_HOOK_NETWORK_OP_STARTED,        /* network has start */
     VIR_HOOK_NETWORK_OP_STOPPED,        /* network has stopped */
-    VIR_HOOK_NETWORK_OP_IFACE_PLUGGED,  /* an interface has been plugged into the network */
-    VIR_HOOK_NETWORK_OP_IFACE_UNPLUGGED,    /* an interface was unplugged from the network */
+    VIR_HOOK_NETWORK_OP_PORT_CREATED,   /* port has been created in the network */
+    VIR_HOOK_NETWORK_OP_PORT_DELETED,   /* port has been deleted in the network */
     VIR_HOOK_NETWORK_OP_UPDATED,        /* network has been updated */
 
     VIR_HOOK_NETWORK_OP_LAST,