summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorNitesh Konkar <niteshkonkar.libvirt@gmail.com>2016-05-04 10:26:26 -0400
committerCole Robinson <crobinso@redhat.com>2016-05-04 11:30:46 -0400
commit6289cebf407b050eb913d721ed79f6c4220a96fd (patch)
tree35ac644bf6caaeeaae756c6fda227f7243c309d8 /tools
parentca0d45148d09b6712f7a9563d88a1befb585e88c (diff)
downloadlibvirt-6289cebf407b050eb913d721ed79f6c4220a96fd.tar.gz
virsh: Introduce virshDomainDetachInterface function
virshDomainDetachInterface handles virsh interface detach from the specified live/config domain xml. Signed-off-by: Nitesh Konkar <nitkon12@linux.vnet.ibm.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/virsh-domain.c121
1 files changed, 68 insertions, 53 deletions
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 0a6caae41a..a86dd543d2 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -11199,57 +11199,21 @@ static const vshCmdOptDef opts_detach_interface[] = {
};
static bool
-cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
+virshDomainDetachInterface(char *doc,
+ unsigned int flags,
+ virDomainPtr dom,
+ vshControl *ctl,
+ bool current,
+ const char *type,
+ const char *mac)
{
- virDomainPtr dom = NULL;
xmlDocPtr xml = NULL;
xmlXPathObjectPtr obj = NULL;
xmlXPathContextPtr ctxt = NULL;
xmlNodePtr cur = NULL, matchNode = NULL;
- char *detach_xml = NULL;
- const char *mac = NULL, *type = NULL;
- char *doc = NULL;
- char buf[64];
- int diff_mac;
+ char *detach_xml = NULL, buf[64];
+ int diff_mac, ret = -1;
size_t i;
- int ret;
- bool functionReturn = false;
- unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
- bool current = vshCommandOptBool(cmd, "current");
- bool config = vshCommandOptBool(cmd, "config");
- bool live = vshCommandOptBool(cmd, "live");
- bool persistent = vshCommandOptBool(cmd, "persistent");
-
- VSH_EXCLUSIVE_OPTIONS_VAR(persistent, current);
-
- VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
- VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
-
- if (config || persistent)
- flags |= VIR_DOMAIN_AFFECT_CONFIG;
- if (live)
- flags |= VIR_DOMAIN_AFFECT_LIVE;
-
- if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
- return false;
-
- if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0)
- goto cleanup;
-
- if (vshCommandOptStringReq(ctl, cmd, "mac", &mac) < 0)
- goto cleanup;
-
- if (persistent &&
- virDomainIsActive(dom) == 1)
- flags |= VIR_DOMAIN_AFFECT_LIVE;
-
- if (flags & VIR_DOMAIN_AFFECT_CONFIG)
- doc = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
- else
- doc = virDomainGetXMLDesc(dom, 0);
-
- if (!doc)
- goto cleanup;
if (!(xml = virXMLParseStringCtxt(doc, _("(domain_definition)"), &ctxt))) {
vshError(ctl, "%s", _("Failed to get interface information"));
@@ -11315,21 +11279,72 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
else
ret = virDomainDetachDevice(dom, detach_xml);
- if (ret != 0) {
+ cleanup:
+ VIR_FREE(detach_xml);
+ xmlFreeDoc(xml);
+ xmlXPathFreeObject(obj);
+ xmlXPathFreeContext(ctxt);
+ return ret == 0;
+}
+
+
+static bool
+cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom = NULL;
+ char *doc = NULL;
+ const char *mac = NULL, *type = NULL;
+ bool ret = false;
+ unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
+ bool current = vshCommandOptBool(cmd, "current");
+ bool config = vshCommandOptBool(cmd, "config");
+ bool live = vshCommandOptBool(cmd, "live");
+ bool persistent = vshCommandOptBool(cmd, "persistent");
+
+ VSH_EXCLUSIVE_OPTIONS_VAR(persistent, current);
+
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
+
+ if (config || persistent)
+ flags |= VIR_DOMAIN_AFFECT_CONFIG;
+ if (live)
+ flags |= VIR_DOMAIN_AFFECT_LIVE;
+
+ if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
+ return false;
+
+ if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0)
+ goto cleanup;
+
+ if (vshCommandOptStringReq(ctl, cmd, "mac", &mac) < 0)
+ goto cleanup;
+
+ if (persistent &&
+ virDomainIsActive(dom) == 1)
+ flags |= VIR_DOMAIN_AFFECT_LIVE;
+
+ if (flags & VIR_DOMAIN_AFFECT_CONFIG)
+ doc = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
+ else
+ doc = virDomainGetXMLDesc(dom, 0);
+
+ if (!doc)
+ goto cleanup;
+ else
+ ret = virshDomainDetachInterface(doc, flags, dom, ctl,
+ current, type, mac);
+
+ cleanup:
+ if (!ret) {
vshError(ctl, "%s", _("Failed to detach interface"));
} else {
vshPrint(ctl, "%s", _("Interface detached successfully\n"));
- functionReturn = true;
}
- cleanup:
VIR_FREE(doc);
- VIR_FREE(detach_xml);
virDomainFree(dom);
- xmlXPathFreeObject(obj);
- xmlXPathFreeContext(ctxt);
- xmlFreeDoc(xml);
- return functionReturn;
+ return ret;
}
typedef enum {