]> xenbits.xensource.com Git - libvirt.git/commitdiff
interface: Take interface status into account when starting and destroying
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 10 Dec 2013 18:29:54 +0000 (19:29 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 24 Dec 2013 16:20:00 +0000 (17:20 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=956994

Currently, it is possible to start an interface that is already running:

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

Same applies for destroying a dead interface. We should not allow such
state transitions.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/interface/interface_backend_netcf.c

index 2e681ec6077d504e3a4cb3b2b3059e6be562494f..c525ca9c0b2a454a97a074bcc75684b89ced2012 100644 (file)
@@ -944,6 +944,7 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
     struct netcf_if *iface = NULL;
     virInterfaceDefPtr def = NULL;
     int ret = -1;
+    bool active;
 
     virCheckFlags(0, -1);
 
@@ -962,6 +963,15 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
     if (virInterfaceCreateEnsureACL(ifinfo->conn, def) < 0)
        goto cleanup;
 
+    if (netcfInterfaceObjIsActive(iface, &active) < 0)
+        goto cleanup;
+
+    if (active) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("interface is already running"));
+        goto cleanup;
+    }
+
     ret = ncf_if_up(iface);
     if (ret < 0) {
         const char *errmsg, *details;
@@ -987,6 +997,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
     struct netcf_if *iface = NULL;
     virInterfaceDefPtr def = NULL;
     int ret = -1;
+    bool active;
 
     virCheckFlags(0, -1);
 
@@ -1005,6 +1016,15 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
     if (virInterfaceDestroyEnsureACL(ifinfo->conn, def) < 0)
        goto cleanup;
 
+    if (netcfInterfaceObjIsActive(iface, &active) < 0)
+        goto cleanup;
+
+    if (!active) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("interface is not running"));
+        goto cleanup;
+    }
+
     ret = ncf_if_down(iface);
     if (ret < 0) {
         const char *errmsg, *details;