From 9b03d42d8745dd77b25cd9e4e6aca844b4a7793f Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 13:57:16 -0500 Subject: [PATCH] Add API call to resize a VM disk REST Request: ------------------------------- PUT /sysadm/iohyve { "disk" : "disk0", "name" : "bsdguest", "action" : "resizedisk", "size" : "20G" } WebSocket Request: ------------------------------- { "name" : "iohyve", "id" : "fooid", "args" : { "size" : "20G", "action" : "resizedisk", "disk" : "disk0", "name" : "bsdguest" }, "namespace" : "sysadm" } Response: ------------------------------- { "args": { "resizedisk": { "disk": "disk0", "name": "bsdguest", "size": "20G" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 ++++ src/server/library/sysadm-iohyve.cpp | 36 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 41 insertions(+) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index b89f785..eb60c8b 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -632,6 +632,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal ok = true; out->insert("rmiso", sysadm::Iohyve::rmISO(in_args.toObject())); } + else if(act=="resizedisk"){ + ok = true; + out->insert("resizedisk", sysadm::Iohyve::resizeDisk(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 6351dda..e6d938c 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -322,6 +322,42 @@ QJsonObject Iohyve::renameISO(QJsonObject jsin) { return retObject; } +// Resize a guest disk +QJsonObject Iohyve::resizeDisk(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("name") || !keys.contains("disk") || !keys.contains("size") ) { + retObject.insert("error", "Missing required key(s) 'name/disk/size'"); + return retObject; + } + + // Get the key values + QString name = jsin.value("name").toString(); + QString disk = jsin.value("disk").toString(); + QString size = jsin.value("size").toString(); + + // Resize the disk now + QStringList output = General::RunCommand("iohyve resize " + name + " " + disk + " " + size).split("\n"); + for ( int i = 0; i < output.size(); i++) + { + // This doesn't work, iohyve doesn't return error message right now + if ( output.at(i).indexOf("Please stop") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + if ( output.at(i).indexOf("Not a valid") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + retObject.insert("name", name); + retObject.insert("disk", disk); + retObject.insert("size", size); + return retObject; +} + // Remove an ISO file QJsonObject Iohyve::rmISO(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index b2342ca..81e469c 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -26,6 +26,7 @@ public: static QJsonArray listISOs(); static QJsonObject listVMs(); static QJsonObject renameISO(QJsonObject); + static QJsonObject resizeDisk(QJsonObject); static QJsonObject rmISO(QJsonObject); static QJsonObject setupIohyve(QJsonObject); static QJsonObject startGuest(QJsonObject);