]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
network: centralize check for active network during interface attach
authorLaine Stump <laine@laine.org>
Thu, 10 Apr 2014 11:44:07 +0000 (14:44 +0300)
committerLaine Stump <laine@laine.org>
Sun, 27 Apr 2014 09:22:36 +0000 (12:22 +0300)
The check for a network being active during interface attach was being
done individually in several places (by both the lxc driver and the
qemu driver), but those places were too specific, leading to it *not*
being checked when allocating a connection/device from a macvtap or
hostdev network.

This patch puts a single check in networkAllocateActualDevice(), which
is always called before the any network interface is attached to any
type of domain. It also removes all the other now-redundant checks
from the lxc and qemu drivers.

NB: the following patches are prerequisites for this patch, in the
case that it is backported to any branch:

  440beeb network: fix virNetworkObjAssignDef and persistence
  8aaa5b6 network: create statedir during driver initialization
  b9e9549 network: change location of network state xml files
  411c548 network: set macvtap/hostdev networks active if their state
          file exists

This fixes:

  https://bugzilla.redhat.com/show_bug.cgi?id=880483

src/lxc/lxc_driver.c
src/lxc/lxc_process.c
src/network/bridge_driver.c
src/qemu/qemu_command.c
src/qemu/qemu_hotplug.c

index 826d91825f592b7486b93bbc87567a0630b0ff54..dba218229d808e04933f970b18522f79e41dd63b 100644 (file)
@@ -4155,27 +4155,12 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn,
         virNetworkPtr network;
         char *brname = NULL;
         bool fail = false;
-        int active;
         virErrorPtr errobj;
 
-        if (!(network = virNetworkLookupByName(conn,
-                                               net->data.network.name)))
+        if (!(network = virNetworkLookupByName(conn, net->data.network.name)))
             goto cleanup;
-
-        active = virNetworkIsActive(network);
-        if (active != 1) {
-            fail = true;
-            if (active == 0)
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("Network '%s' is not active."),
-                               net->data.network.name);
-        }
-
-        if (!fail) {
-            brname = virNetworkGetBridgeName(network);
-            if (brname == NULL)
-                fail = true;
-        }
+        if (!(brname = virNetworkGetBridgeName(network)))
+           fail = true;
 
         /* Make sure any above failure is preserved */
         errobj = virSaveLastError();
index 091102b4900a3c34754feb6a71be85ad737fa74d..0aef13a0bdf852777109c65912acd5a31f4c5b71 100644 (file)
@@ -387,27 +387,13 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
             virNetworkPtr network;
             char *brname = NULL;
             bool fail = false;
-            int active;
             virErrorPtr errobj;
 
             if (!(network = virNetworkLookupByName(conn,
                                                    def->nets[i]->data.network.name)))
                 goto cleanup;
-
-            active = virNetworkIsActive(network);
-            if (active != 1) {
-                fail = true;
-                if (active == 0)
-                    virReportError(VIR_ERR_INTERNAL_ERROR,
-                                   _("Network '%s' is not active."),
-                                   def->nets[i]->data.network.name);
-            }
-
-            if (!fail) {
-                brname = virNetworkGetBridgeName(network);
-                if (brname == NULL)
-                    fail = true;
-            }
+            if (!(brname = virNetworkGetBridgeName(network)))
+               fail = true;
 
             /* Make sure any above failure is preserved */
             errobj = virSaveLastError();
index 42b0c44e923bf5540517d1a93e4ff5689e82e15b..4e8375dafb34a4bffa32b76ead6763838f834f49 100644 (file)
@@ -3166,7 +3166,8 @@ static int networkDestroy(virNetworkPtr net)
 
     if (!virNetworkObjIsActive(network)) {
         virReportError(VIR_ERR_OPERATION_INVALID,
-                       "%s", _("network is not active"));
+                       _("network '%s' is not active"),
+                       network->def->name);
         goto cleanup;
     }
 
@@ -3510,6 +3511,13 @@ networkAllocateActualDevice(virDomainDefPtr dom,
     }
     netdef = network->def;
 
+    if (!virNetworkObjIsActive(network)) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       _("network '%s' is not active"),
+                       netdef->name);
+        goto error;
+    }
+
     if (VIR_ALLOC(iface->data.network.actual) < 0)
         goto error;
 
index 6d800421c0aa4babd98bb7812278346e40dc353a..961c679f6a8c425929aa417843ed2dc6fc028ce1 100644 (file)
@@ -297,7 +297,6 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
 
     if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
-        int active;
         bool fail = false;
         virErrorPtr errobj;
         virNetworkPtr network = virNetworkLookupByName(conn,
@@ -305,21 +304,8 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
         if (!network)
             return ret;
 
-        active = virNetworkIsActive(network);
-        if (active != 1) {
-            fail = true;
-
-            if (active == 0)
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("Network '%s' is not active."),
-                               net->data.network.name);
-        }
-
-        if (!fail) {
-            brname = virNetworkGetBridgeName(network);
-            if (brname == NULL)
-                fail = true;
-        }
+        if (!(brname = virNetworkGetBridgeName(network)))
+           fail = true;
 
         /* Make sure any above failure is preserved */
         errobj = virSaveLastError();
index 233b1839175c6bf967933c0d52b2b2cc8c20e3e6..ccfb358ff7a4d8b10d7a380d96623cdf461420d4 100644 (file)
@@ -1710,7 +1710,6 @@ qemuDomainNetGetBridgeName(virConnectPtr conn, virDomainNetDefPtr net)
         if (VIR_STRDUP(brname, tmpbr) < 0)
             goto cleanup;
     } else if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
-        int active;
         virErrorPtr errobj;
         virNetworkPtr network;
 
@@ -1720,15 +1719,7 @@ qemuDomainNetGetBridgeName(virConnectPtr conn, virDomainNetDefPtr net)
                            net->data.network.name);
             goto cleanup;
         }
-
-        active = virNetworkIsActive(network);
-        if (active == 1) {
-            brname = virNetworkGetBridgeName(network);
-        } else if (active == 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("Network '%s' is not active."),
-                           net->data.network.name);
-        }
+        brname = virNetworkGetBridgeName(network);
 
         /* Make sure any above failure is preserved */
         errobj = virSaveLastError();