[patch 03/12] Add the virsh net-* commands

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Implement the virsh net-* commands. These too mirror
the domain commands.

Signed-off-by: Mark McLoughlin <markmc@xxxxxxxxxx>

Index: libvirt-foo/src/virsh.c
===================================================================
--- libvirt-foo.orig/src/virsh.c	2007-02-14 16:04:55.000000000 +0000
+++ libvirt-foo.orig/src/virsh.c	2007-02-14 16:04:55.000000000 +0000
@@ -10,7 +10,7 @@
  * Daniel P. Berrange <berrange@xxxxxxxxxx>
  *
  *
- * $Id: virsh.c,v 1.50 2007/02/14 16:04:55 markmc Exp $
+ * $Id: virsh.c,v 1.51 2007/02/14 15:44:58 markmc Exp $
  */
 
 #define _GNU_SOURCE             /* isblank() */
@@ -206,6 +206,14 @@ static virDomainPtr vshCommandOptDomainB
     vshCommandOptDomainBy(_ctl, _cmd, _optname, _name,              \
                           VSH_BYID|VSH_BYUUID|VSH_BYNAME)
 
+static virNetworkPtr vshCommandOptNetworkBy(vshControl * ctl, vshCmd * cmd,
+                            const char *optname, char **name, int flag);
+
+/* default is lookup by Name and UUID */
+#define vshCommandOptNetwork(_ctl, _cmd, _optname, _name)           \
+    vshCommandOptNetworkBy(_ctl, _cmd, _optname, _name,             \
+                           VSH_BYUUID|VSH_BYNAME)
+
 static void vshPrintExtra(vshControl * ctl, const char *format, ...);
 static void vshDebug(vshControl * ctl, int level, const char *format, ...);
 
@@ -1626,6 +1634,459 @@ cmdDomuuid(vshControl * ctl, vshCmd * cm
 
 
 /*
+ * "net-create" command
+ */
+static vshCmdInfo info_network_create[] = {
+    {"syntax", "create a network from an XML <file>"},
+    {"help", gettext_noop("create a network from an XML file")},
+    {"desc", gettext_noop("Create a network.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_create[] = {
+    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file containing an XML network description")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkCreate(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    char *from;
+    int found;
+    int ret = TRUE;
+    char buffer[BUFSIZ];
+    int fd, l;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    from = vshCommandOptString(cmd, "file", &found);
+    if (!found)
+        return FALSE;
+
+    fd = open(from, O_RDONLY);
+    if (fd < 0) {
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
+        return(FALSE);
+    }
+    l = read(fd, &buffer[0], sizeof(buffer));
+    if ((l <= 0) || (l >= (int) sizeof(buffer))) {
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
+        close(fd);
+        return(FALSE);
+    }
+    buffer[l] = 0;
+    network = virNetworkCreateXML(ctl->conn, &buffer[0]);
+    if (network != NULL) {
+        vshPrint(ctl, _("Network %s created from %s\n"),
+                 virNetworkGetName(network), from);
+    } else {
+        vshError(ctl, FALSE, _("Failed to create network from %s"), from);
+        ret = FALSE;
+    }
+    return ret;
+}
+
+
+/*
+ * "net-define" command
+ */
+static vshCmdInfo info_network_define[] = {
+    {"syntax", "define a network from an XML <file>"},
+    {"help", gettext_noop("define (but don't start) a network from an XML file")},
+    {"desc", gettext_noop("Define a network.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_define[] = {
+    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file conatining an XML network description")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkDefine(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    char *from;
+    int found;
+    int ret = TRUE;
+    char buffer[BUFSIZ];
+    int fd, l;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    from = vshCommandOptString(cmd, "file", &found);
+    if (!found)
+        return FALSE;
+
+    fd = open(from, O_RDONLY);
+    if (fd < 0) {
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
+        return(FALSE);
+    }
+    l = read(fd, &buffer[0], sizeof(buffer));
+    if ((l <= 0) || (l >= (int) sizeof(buffer))) {
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
+        close(fd);
+        return(FALSE);
+    }
+    buffer[l] = 0;
+    network = virNetworkDefineXML(ctl->conn, &buffer[0]);
+    if (network != NULL) {
+        vshPrint(ctl, _("Network %s defined from %s\n"),
+                 virNetworkGetName(network), from);
+    } else {
+        vshError(ctl, FALSE, _("Failed to define network from %s"), from);
+        ret = FALSE;
+    }
+    return ret;
+}
+
+
+/*
+ * "net-destroy" command
+ */
+static vshCmdInfo info_network_destroy[] = {
+    {"syntax", "net-destroy <network>"},
+    {"help", gettext_noop("destroy a network")},
+    {"desc", gettext_noop("Destroy a given network.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_destroy[] = {
+    {"network", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("network name, id or uuid")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkDestroy(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    int ret = TRUE;
+    char *name;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    if (!(network = vshCommandOptNetwork(ctl, cmd, "network", &name)))
+        return FALSE;
+
+    if (virNetworkDestroy(network) == 0) {
+        vshPrint(ctl, _("Network %s destroyed\n"), name);
+    } else {
+        vshError(ctl, FALSE, _("Failed to destroy network %s"), name);
+        ret = FALSE;
+        virNetworkFree(network);
+    }
+
+    return ret;
+}
+
+
+/*
+ * "net-dumpxml" command
+ */
+static vshCmdInfo info_network_dumpxml[] = {
+    {"syntax", "net-dumpxml <name>"},
+    {"help", gettext_noop("network information in XML")},
+    {"desc", gettext_noop("Ouput the network information as an XML dump to stdout.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_dumpxml[] = {
+    {"network", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("network name, id or uuid")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkDumpXML(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    int ret = TRUE;
+    char *dump;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    if (!(network = vshCommandOptNetwork(ctl, cmd, "network", NULL)))
+        return FALSE;
+
+    dump = virNetworkGetXMLDesc(network, 0);
+    if (dump != NULL) {
+        printf("%s", dump);
+        free(dump);
+    } else {
+        ret = FALSE;
+    }
+
+    virNetworkFree(network);
+    return ret;
+}
+
+
+/*
+ * "net-list" command
+ */
+static vshCmdInfo info_network_list[] = {
+    {"syntax", "net-list [ --inactive | --all ]"},
+    {"help", gettext_noop("list networks")},
+    {"desc", gettext_noop("Returns list of networks.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_list[] = {
+    {"inactive", VSH_OT_BOOL, 0, gettext_noop("list inactive networks")},
+    {"all", VSH_OT_BOOL, 0, gettext_noop("list inactive & active networks")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkList(vshControl * ctl, vshCmd * cmd ATTRIBUTE_UNUSED)
+{
+    int inactive = vshCommandOptBool(cmd, "inactive");
+    int all = vshCommandOptBool(cmd, "all");
+    int active = !inactive || all ? 1 : 0;
+    int maxactive = 0, maxinactive = 0, i;
+    const char **activeNames = NULL, **inactiveNames = NULL;
+    inactive |= all;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    if (active) {
+      maxactive = virConnectNumOfNetworks(ctl->conn);
+      if (maxactive < 0) {
+        vshError(ctl, FALSE, _("Failed to list active networks"));
+        return FALSE;
+      }
+      if (maxactive) {
+        activeNames = vshMalloc(ctl, sizeof(int) * maxactive);
+
+        if ((maxactive = virConnectListNetworks(ctl->conn, &activeNames[0], maxactive)) < 0) {
+	  vshError(ctl, FALSE, _("Failed to list active networks"));
+	  free(activeNames);
+	  return FALSE;
+        }
+
+	qsort(&activeNames[0], maxactive, sizeof(int), namesorter);
+      }
+    }
+    if (inactive) {
+      maxinactive = virConnectNumOfDefinedNetworks(ctl->conn);
+      if (maxinactive < 0) {
+        vshError(ctl, FALSE, _("Failed to list inactive networks"));
+	if (activeNames)
+	  free(activeNames);
+        return FALSE;
+      }
+      if (maxinactive) {
+        inactiveNames = vshMalloc(ctl, sizeof(char *) * maxinactive);
+
+        if ((maxinactive = virConnectListDefinedNetworks(ctl->conn, inactiveNames, maxinactive)) < 0) {
+	  vshError(ctl, FALSE, _("Failed to list inactive networks"));
+	  if (activeNames)
+	    free(activeNames);
+	  free(inactiveNames);
+	  return FALSE;
+        }
+
+	qsort(&inactiveNames[0], maxinactive, sizeof(char*), namesorter);
+      }
+    }
+    vshPrintExtra(ctl, "%-20s\n", _("Name"));
+    vshPrintExtra(ctl, "----------------------------------\n");
+
+    for (i = 0; i < maxactive; i++) {
+        virNetworkPtr network = virNetworkLookupByName(ctl->conn, activeNames[i]);
+
+        /* this kind of work with networks is not atomic operation */
+        if (!network) {
+            free(activeNames[i]);
+            continue;
+	}
+
+        vshPrint(ctl, "%-20s\n",
+                 virNetworkGetName(network));
+        virNetworkFree(network);
+        free(activeNames[i]);
+    }
+    for (i = 0; i < maxinactive; i++) {
+        virNetworkPtr network = virNetworkLookupByName(ctl->conn, inactiveNames[i]);
+
+        /* this kind of work with networks is not atomic operation */
+        if (!network) {
+            free(inactiveNames[i]);
+            continue;
+	}
+
+	vshPrint(ctl, "%-20s\n",
+		 inactiveNames[i]);
+
+        virNetworkFree(network);
+        free(inactiveNames[i]);
+    }
+    if (activeNames)
+        free(activeNames);
+    if (inactiveNames)
+        free(inactiveNames);
+    return TRUE;
+}
+
+
+/*
+ * "net-name" command
+ */
+static vshCmdInfo info_network_name[] = {
+    {"syntax", "net-name <network>"},
+    {"help", gettext_noop("convert a network UUID to network name")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_name[] = {
+    {"network", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("network uuid")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkName(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+    if (!(network = vshCommandOptNetworkBy(ctl, cmd, "network", NULL,
+					   VSH_BYUUID)))
+        return FALSE;
+
+    vshPrint(ctl, "%s\n", virNetworkGetName(network));
+    virNetworkFree(network);
+    return TRUE;
+}
+
+
+/*
+ * "net-start" command
+ */
+static vshCmdInfo info_network_start[] = {
+    {"syntax", "start <network>"},
+    {"help", gettext_noop("start a (previously defined) inactive network")},
+    {"desc", gettext_noop("Start a network.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_start[] = {
+    {"name", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("name of the inactive network")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkStart(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    char *name;
+    int found;
+    int ret = TRUE;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    name = vshCommandOptString(cmd, "name", &found);
+    if (!found)
+        return FALSE;
+
+    network = virNetworkLookupByName(ctl->conn, name);
+    if (!network)
+        return FALSE;
+
+    if (virNetworkCreate(network) == 0) {
+        vshPrint(ctl, _("Network %s started\n"),
+                 name);
+    } else {
+      vshError(ctl, FALSE, _("Failed to start network %s"), name);
+        ret = FALSE;
+    }
+    return ret;
+}
+
+
+/*
+ * "net-undefine" command
+ */
+static vshCmdInfo info_network_undefine[] = {
+    {"syntax", "net-undefine <network>"},
+    {"help", gettext_noop("undefine an inactive network")},
+    {"desc", gettext_noop("Undefine the configuration for an inactive network.")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_undefine[] = {
+    {"network", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("network name or uuid")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkUndefine(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    int ret = TRUE;
+    char *name;
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    if (!(network = vshCommandOptNetwork(ctl, cmd, "network", &name)))
+        return FALSE;
+
+    if (virNetworkUndefine(network) == 0) {
+        vshPrint(ctl, _("Network %s has been undefined\n"), name);
+    } else {
+        vshError(ctl, FALSE, _("Failed to undefine network %s"), name);
+        ret = FALSE;
+    }
+
+    return ret;
+}
+
+
+/*
+ * "net-uuid" command
+ */
+static vshCmdInfo info_network_uuid[] = {
+    {"syntax", "net-uuid <network>"},
+    {"help", gettext_noop("convert a network name to network UUID")},
+    {NULL, NULL}
+};
+
+static vshCmdOptDef opts_network_uuid[] = {
+    {"network", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("network name")},
+    {NULL, 0, 0, NULL}
+};
+
+static int
+cmdNetworkUuid(vshControl * ctl, vshCmd * cmd)
+{
+    virNetworkPtr network;
+    char uuid[VIR_UUID_STRING_BUFLEN];
+
+    if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+        return FALSE;
+
+    if (!(network = vshCommandOptNetworkBy(ctl, cmd, "network", NULL,
+					   VSH_BYNAME)))
+        return FALSE;
+
+    if (virNetworkGetUUIDString(network, uuid) != -1)
+        vshPrint(ctl, "%s\n", uuid);
+    else
+        vshError(ctl, FALSE, _("failed to get network UUID"));
+
+    return TRUE;
+}
+
+
+/*
  * "version" command
  */
 static vshCmdInfo info_version[] = {
@@ -1821,6 +2282,15 @@ static vshCmdDef commands[] = {
     {"dumpxml", cmdDumpXML, opts_dumpxml, info_dumpxml},
     {"help", cmdHelp, opts_help, info_help},
     {"list", cmdList, opts_list, info_list},
+    {"net-create", cmdNetworkCreate, opts_network_create, info_network_create},
+    {"net-define", cmdNetworkDefine, opts_network_define, info_network_define},
+    {"net-destroy", cmdNetworkDestroy, opts_network_destroy, info_network_destroy},
+    {"net-dumpxml", cmdNetworkDumpXML, opts_network_dumpxml, info_network_dumpxml},
+    {"net-list", cmdNetworkList, opts_network_list, info_network_list},
+    {"net-name", cmdNetworkName, opts_network_name, info_network_name},
+    {"net-start", cmdNetworkStart, opts_network_start, info_network_start},
+    {"net-undefine", cmdNetworkUndefine, opts_network_undefine, info_network_undefine},
+    {"net-uuid", cmdNetworkUuid, opts_network_uuid, info_network_uuid},
     {"nodeinfo", cmdNodeinfo, NULL, info_nodeinfo},
     {"quit", cmdQuit, NULL, info_quit},
     {"reboot", cmdReboot, opts_reboot, info_reboot},
@@ -2118,6 +2588,43 @@ vshCommandOptDomainBy(vshControl * ctl, 
     return dom;
 }
 
+static virNetworkPtr
+vshCommandOptNetworkBy(vshControl * ctl, vshCmd * cmd, const char *optname,
+		       char **name, int flag)
+{
+    virNetworkPtr network = NULL;
+    char *n;
+
+    if (!(n = vshCommandOptString(cmd, optname, NULL))) {
+        vshError(ctl, FALSE, _("undefined network name"));
+        return NULL;
+    }
+
+    vshDebug(ctl, 5, "%s: found option <%s>: %s\n",
+             cmd->def->name, optname, n);
+
+    if (name)
+        *name = n;
+
+    /* try it by UUID */
+    if (network==NULL && (flag & VSH_BYUUID) && strlen(n)==VIR_UUID_STRING_BUFLEN-1) {
+        vshDebug(ctl, 5, "%s: <%s> tring as network UUID\n",
+		 cmd->def->name, optname);
+        network = virNetworkLookupByUUIDString(ctl->conn, n);
+    }
+    /* try it by NAME */
+    if (network==NULL && (flag & VSH_BYNAME)) {
+        vshDebug(ctl, 5, "%s: <%s> tring as network NAME\n",
+                 cmd->def->name, optname);
+        network = virNetworkLookupByName(ctl->conn, n);
+    }
+
+    if (!network)
+        vshError(ctl, FALSE, _("failed to get network '%s'"), n);
+
+    return network;
+}
+
 /*
  * Executes command(s) and returns return code from last command
  */

-- 


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]