From 87f1b49fed244f820f5a308891d86dce43be0e39 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Fri, 25 Mar 2016 10:40:56 -0400 Subject: [PATCH 1/2] Add new API call to get iohyve properties for a guest Requires the "name" of the guest to get props for REST Request: ------------------------------- PUT /sysadm/iohyve { "action" : "getprops", "name" : "bsdguest" } WebSocket Request: ------------------------------- { "id" : "fooid", "namespace" : "sysadm", "args" : { "name" : "bsdguest", "action" : "getprops" }, "name" : "iohyve" } Response: ------------------------------- { "args": { "getprops": { "bsdguest": { "autogrub": "\\n", "bargs": "-A_-H_-P", "boot": "0", "con": "nmdm0", "cpu": "1", "description": "Tue", "install": "no", "loader": "bhyveload", "name": "bsdguest", "os": "default", "persist": "1", "ram": "256M", "size": "10G", "tap": "tap0" } } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 5 +++- src/server/library/sysadm-iohyve.cpp | 36 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index ed313bd..09803c9 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -615,9 +615,12 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal } else if(act=="fetchiso"){ ok = true; - //DProcess fetchproc; out->insert("fetchiso", sysadm::Iohyve::fetchISO(in_args.toObject())); } + else if(act=="getprops"){ + ok = true; + out->insert("getprops", sysadm::Iohyve::getProps(in_args.toObject())); + } else if(act=="install"){ ok = true; out->insert("install", sysadm::Iohyve::installGuest(in_args.toObject())); diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index 3497d6f..f1df44f 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -146,6 +146,42 @@ QJsonObject Iohyve::deleteGuest(QJsonObject jsin) { return retObject; } +// Get all the properties for a guest +QJsonObject Iohyve::getProps(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("name") ) { + retObject.insert("error", "Missing required key 'name'"); + return retObject; + } + + // Get the key values + QString name = jsin.value("name").toString(); + + QStringList output = General::RunCommand("iohyve", QStringList() << "getall" << name).split("\n"); + + QJsonObject props; + + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("Getting ") != -1 ) + continue; + + if ( output.at(i).isEmpty() ) + break; + + QString line = output.at(i).simplified(); + QString prop = line.section(" ", 0, 0); + QString val = line.section(" ", 1, 1); + props.insert(prop, val); + } + + retObject.insert(name, props); + return retObject; +} + + // Queue the fetch of an ISO QJsonObject Iohyve::fetchISO(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index 395da4d..a7fbfc0 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -20,6 +20,7 @@ public: static QJsonObject deleteDisk(QJsonObject); static QJsonObject deleteGuest(QJsonObject); static QJsonObject fetchISO(QJsonObject); + static QJsonObject getProps(QJsonObject); static QJsonObject installGuest(QJsonObject); static QJsonObject isSetup(); static QJsonObject listDisks(QJsonObject); From 3dfe44dbb02e638ed3283032bd2f2085641a0a63 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Fri, 25 Mar 2016 11:24:13 -0400 Subject: [PATCH 2/2] Add new iohyve API call to set properties Requires "name" of the VM, and then any other args will be set on the VM as properties REST Request: ------------------------------- PUT /sysadm/iohyve { "ram" : "512M", "name" : "bsdguest", "action" : "setprop" } WebSocket Request: ------------------------------- { "namespace" : "sysadm", "id" : "fooid", "args" : { "ram" : "512M", "name" : "bsdguest", "action" : "setprop" }, "name" : "iohyve" } Response: ------------------------------- { "args": { "setprop": { "bsdguest": { "ram": "512M" } } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 +++ src/server/library/sysadm-iohyve.cpp | 49 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 54 insertions(+) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 09803c9..ee45ade 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -641,6 +641,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal ok = true; out->insert("resizedisk", sysadm::Iohyve::resizeDisk(in_args.toObject())); } + else if(act=="setprop"){ + ok = true; + out->insert("setprop", sysadm::Iohyve::setProp(in_args.toObject())); + } else if(act=="setup"){ ok = true; out->insert("setup", sysadm::Iohyve::setupIohyve(in_args.toObject())); diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index f1df44f..cf01e86 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -452,6 +452,55 @@ QJsonObject Iohyve::setupIohyve(QJsonObject jsin) { return retObject; } +// Set properties +QJsonObject Iohyve::setProp(QJsonObject jsin) { + QJsonObject retObject; + QJsonObject props; + + QStringList keys = jsin.keys(); + if (! keys.contains("name") ) { + retObject.insert("error", "Missing required key 'name'"); + return retObject; + } + + // Get the key values + QString name = jsin.value("name").toString(); + + // Load the supplied settings + QStringList settings; + QStringList values; + + for ( int i = 0; i < keys.size(); i++) + { + if ( keys.at(i) == "name" ) + continue; + if ( keys.at(i) == "action" ) + continue; + + settings << keys.at(i); + values << jsin.value(keys.at(i)).toString(); + props.insert(keys.at(i), jsin.value(keys.at(i)).toString()); + } + + if ( settings.isEmpty() ) { + retObject.insert("error", "No settings supplied!"); + return retObject; + } + + QStringList setargs; + setargs << "set" << name; + for ( int i = 0; i < settings.size(); i++) + { + setargs << settings.at(i) + "=" + values.at(i); + } + + // Set it now + QString output = General::RunCommand("iohyve", setargs); + retObject.insert(name, props); + return retObject; +} + + // Start a guest QJsonObject Iohyve::startGuest(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index a7fbfc0..ab8bf3f 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -30,6 +30,7 @@ public: static QJsonObject resizeDisk(QJsonObject); static QJsonObject rmISO(QJsonObject); static QJsonObject setupIohyve(QJsonObject); + static QJsonObject setProp(QJsonObject); static QJsonObject startGuest(QJsonObject); static QJsonObject stopGuest(QJsonObject); static QJsonObject version();