From caf6bd1e06dfc52648194a53ab34595538d3516f Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 12:46:03 -0500 Subject: [PATCH 01/10] Add new API call to delete an iohyve guest REST Request: ------------------------------- PUT /sysadm/iohyve { "action" : "delete", "name" : "bsdguest" } WebSocket Request: ------------------------------- { "namespace" : "sysadm", "id" : "fooid", "args" : { "action" : "delete", "name" : "bsdguest" }, "name" : "iohyve" } Response: ------------------------------- { "args": { "delete": { "name": "bsdguest" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 ++++ src/server/library/sysadm-iohyve.cpp | 29 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 34 insertions(+) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 6e5a30f..2c66a82 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -585,6 +585,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal ok = true; out->insert("create", sysadm::Iohyve::createGuest(in_args.toObject())); } + if(act=="delete"){ + ok = true; + out->insert("delete", sysadm::Iohyve::deleteGuest(in_args.toObject())); + } else if(act=="listvms"){ ok = true; out->insert("listvms", sysadm::Iohyve::listVMs()); diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index 071b7d0..64e693a 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -43,6 +43,35 @@ QJsonObject Iohyve::createGuest(QJsonObject jsin) { return retObject; } +// Delete a guest +QJsonObject Iohyve::deleteGuest(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(); + + // Do the stop right now + QStringList output = General::RunCommand("iohyve delete " + name).split("\n"); + qDebug() << output; + 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("No such guest") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + retObject.insert("name", name); + return retObject; +} + // Queue the fetch of an ISO QJsonObject Iohyve::fetchISO(QJsonObject jsin, DProcess *returnproc) { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index beee371..ea8a31c 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -16,6 +16,7 @@ namespace sysadm{ class Iohyve{ public: static QJsonObject createGuest(QJsonObject); + static QJsonObject deleteGuest(QJsonObject); static QJsonObject fetchISO(QJsonObject, DProcess *); static QJsonObject installGuest(QJsonObject); static QJsonObject isSetup(); From 124172ed8aa136a6af5b360a4d9edd9feed1194b Mon Sep 17 00:00:00 2001 From: dlavigne Date: Thu, 3 Mar 2016 12:59:54 -0500 Subject: [PATCH 02/10] Doc delete action. --- api/classes/iohyve.rst | 50 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/api/classes/iohyve.rst b/api/classes/iohyve.rst index b15421f..8ccf9ff 100644 --- a/api/classes/iohyve.rst +++ b/api/classes/iohyve.rst @@ -21,7 +21,7 @@ Every iohyve class request contains the following parameters: | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ | action | | supported actions include "listvms", "fetchiso", "listisos", "renameiso", "rmiso", "setup", "issetup", "create", | -| | | "install", "start", "stop" | +| | | "install", "start", "stop", and "delete" | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ @@ -587,4 +587,52 @@ The "stop" action stops the specified VM. "id": "fooid", "name": "response", "namespace": "sysadm" + } + +.. index:: delete, iohyve + +.. _Delete a VM: + +Delete a VM +=========== + +The "delete" action deletes the specified iohyve guest. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/iohyve + { + "action" : "delete", + "name" : "bsdguest" + } + +**WebSocket Request** + +.. code-block:: json + + { + "namespace" : "sysadm", + "id" : "fooid", + "args" : { + "action" : "delete", + "name" : "bsdguest" + }, + "name" : "iohyve" + } + +**Response** + +.. code-block:: json + + { + "args": { + "delete": { + "name": "bsdguest" + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" } \ No newline at end of file From 30cb48e9267855d70c294fff40b32826a160efe7 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 13:11:13 -0500 Subject: [PATCH 03/10] Add API call to list disks connected to a VM REST Request: ------------------------------- PUT /sysadm/iohyve { "name" : "bsdguest", "action" : "listdisks" } WebSocket Request: ------------------------------- { "args" : { "action" : "listdisks", "name" : "bsdguest" }, "id" : "fooid", "namespace" : "sysadm", "name" : "iohyve" } Response: ------------------------------- { "args": { "listdisks": { "disk0": "10G" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 ++++ src/server/library/sysadm-iohyve.cpp | 36 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 3 ++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 2c66a82..57ae141 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -589,6 +589,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal ok = true; out->insert("delete", sysadm::Iohyve::deleteGuest(in_args.toObject())); } + else if(act=="listdisks"){ + ok = true; + out->insert("listdisks", sysadm::Iohyve::listDisks(in_args.toObject())); + } else if(act=="listvms"){ ok = true; out->insert("listvms", sysadm::Iohyve::listVMs()); diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index 64e693a..0a43ae6 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -143,6 +143,42 @@ QJsonObject Iohyve::isSetup() { return retObject; } +// List the disks for a VM +QJsonObject Iohyve::listDisks(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 disks " + name).split("\n"); + + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("Listing") != -1 ) + continue; + if ( output.at(i).indexOf("diskN") != -1 ) + continue; + + if ( output.at(i).isEmpty() ) + break; + + QJsonObject vm; + QString line = output.at(i).simplified(); + QString disk = line.section(" ", 0, 0); + QString size = line.section(" ", 1, 1); + retObject.insert(disk, size); + } + + return retObject; +} + + // List the VMs on the box QJsonObject Iohyve::listVMs() { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index ea8a31c..06eb3af 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -20,8 +20,9 @@ public: static QJsonObject fetchISO(QJsonObject, DProcess *); static QJsonObject installGuest(QJsonObject); static QJsonObject isSetup(); - static QJsonObject listVMs(); + static QJsonObject listDisks(QJsonObject); static QJsonArray listISOs(); + static QJsonObject listVMs(); static QJsonObject renameISO(QJsonObject); static QJsonObject rmISO(QJsonObject); static QJsonObject setupIohyve(QJsonObject); From 04ee45494f58ab0be985d4795e69e91a55863782 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 13:24:02 -0500 Subject: [PATCH 04/10] Add new API call to add/create a disk for a VM REST Request: ------------------------------- PUT /sysadm/iohyve { "name" : "bsdguest", "action" : "adddisk", "size" : "10G" } WebSocket Request: ------------------------------- { "args" : { "size" : "10G", "name" : "bsdguest", "action" : "adddisk" }, "id" : "fooid", "namespace" : "sysadm", "name" : "iohyve" } Response: ------------------------------- { "args": { "adddisk": { "bsdguest": { "size": "10G" } } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 ++++ src/server/library/sysadm-iohyve.cpp | 34 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 39 insertions(+) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 57ae141..ce6b35d 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -581,6 +581,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal if(keys.contains("action")){ QString act = JsonValueToString(in_args.toObject().value("action")); //qDebug() << " - iohyve action:" << act; + if(act=="adddisk"){ + ok = true; + out->insert("adddisk", sysadm::Iohyve::addDisk(in_args.toObject())); + } if(act=="create"){ ok = true; out->insert("create", sysadm::Iohyve::createGuest(in_args.toObject())); diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index 0a43ae6..55bf0ef 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -14,6 +14,40 @@ using namespace sysadm; //PLEASE: Keep the functions in the same order as listed in pcbsd-general.h +// Add a new disk for a VM +QJsonObject Iohyve::addDisk(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("name") || ! keys.contains("size") ) { + retObject.insert("error", "Missing required key(s) 'name', 'size'"); + return retObject; + } + + // Get the key values + QString name = jsin.value("name").toString(); + QString size = jsin.value("size").toString(); + QString pool = jsin.value("pool").toString(); + + QStringList output = General::RunCommand("iohyve add " + name + " " + size + " " + pool).split("\n"); + + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("cannot create") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + QJsonObject vm; + vm.insert("size", size); + if ( ! pool.isEmpty() ) + vm.insert("pool", pool); + retObject.insert(name, vm); + + return retObject; +} + // Create a new guest VM QJsonObject Iohyve::createGuest(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index 06eb3af..b5024c0 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -15,6 +15,7 @@ namespace sysadm{ class Iohyve{ public: + static QJsonObject addDisk(QJsonObject); static QJsonObject createGuest(QJsonObject); static QJsonObject deleteGuest(QJsonObject); static QJsonObject fetchISO(QJsonObject, DProcess *); From f180b2ee05d95d29b3e6f9e064fa02665fec5461 Mon Sep 17 00:00:00 2001 From: dlavigne Date: Thu, 3 Mar 2016 13:28:11 -0500 Subject: [PATCH 05/10] Doc adddisk action. --- api/classes/iohyve.rst | 54 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/api/classes/iohyve.rst b/api/classes/iohyve.rst index 8ccf9ff..2f56b6a 100644 --- a/api/classes/iohyve.rst +++ b/api/classes/iohyve.rst @@ -21,7 +21,7 @@ Every iohyve class request contains the following parameters: | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ | action | | supported actions include "listvms", "fetchiso", "listisos", "renameiso", "rmiso", "setup", "issetup", "create", | -| | | "install", "start", "stop", and "delete" | +| | | "install", "start", "stop", "delete", "adddisk" | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ @@ -635,4 +635,56 @@ The "delete" action deletes the specified iohyve guest. "id": "fooid", "name": "response", "namespace": "sysadm" + } + + .. index:: adddisk, iohyve + +.. _Add a Disk: + +Add a Disk +========== + +The "adddisk" action adds and creates a disk for a VM. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/iohyve + { + "name" : "bsdguest", + "action" : "adddisk", + "size" : "10G" + } + +**WebSocket Request** + +.. code-block:: json + + { + "args" : { + "size" : "10G", + "name" : "bsdguest", + "action" : "adddisk" + }, + "id" : "fooid", + "namespace" : "sysadm", + "name" : "iohyve" + } + +**Response** + +.. code-block:: json + + { + "args": { + "adddisk": { + "bsdguest": { + "size": "10G" + } + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" } \ No newline at end of file From 31dce383183aa2a5855299f3b7cfb6827872a099 Mon Sep 17 00:00:00 2001 From: dlavigne Date: Thu, 3 Mar 2016 13:33:23 -0500 Subject: [PATCH 06/10] Doc listdisks action. --- api/classes/iohyve.rst | 52 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/api/classes/iohyve.rst b/api/classes/iohyve.rst index 2f56b6a..a98d92d 100644 --- a/api/classes/iohyve.rst +++ b/api/classes/iohyve.rst @@ -21,7 +21,7 @@ Every iohyve class request contains the following parameters: | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ | action | | supported actions include "listvms", "fetchiso", "listisos", "renameiso", "rmiso", "setup", "issetup", "create", | -| | | "install", "start", "stop", "delete", "adddisk" | +| | | "install", "start", "stop", "delete", "adddisk", and "listdisks" | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ @@ -637,7 +637,7 @@ The "delete" action deletes the specified iohyve guest. "namespace": "sysadm" } - .. index:: adddisk, iohyve +.. index:: adddisk, iohyve .. _Add a Disk: @@ -687,4 +687,52 @@ The "adddisk" action adds and creates a disk for a VM. "id": "fooid", "name": "response", "namespace": "sysadm" + } + +.. index:: listdisks, iohyve + +.. _List Disks: + +List Disks +========== + +The "listdisks" action lists the disks connected to the specified VM. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/iohyve + { + "name" : "bsdguest", + "action" : "listdisks" + } + +**WebSocket Request** + +.. code-block:: json + + { + "args" : { + "action" : "listdisks", + "name" : "bsdguest" + }, + "id" : "fooid", + "namespace" : "sysadm", + "name" : "iohyve" + } + +**Response** + +.. code-block:: json + + { + "args": { + "listdisks": { + "disk0": "10G" + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" } \ No newline at end of file From f91651d34239c53c59facd49046092679129ebb0 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 13:37:57 -0500 Subject: [PATCH 07/10] Add API call to remove a disk from a VM REST Request: ------------------------------- PUT /sysadm/iohyve { "disk" : "disk1", "name" : "bsdguest", "action" : "deletedisk" } WebSocket Request: ------------------------------- { "namespace" : "sysadm", "id" : "fooid", "name" : "iohyve", "args" : { "name" : "bsdguest", "action" : "deletedisk", "disk" : "disk1" } } Response: ------------------------------- { "args": { "deletedisk": { "disk": "disk1", "name": "bsdguest" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 +++ src/server/library/sysadm-iohyve.cpp | 40 ++++++++++++++++++++++++++++ src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 45 insertions(+) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index ce6b35d..b89f785 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -593,6 +593,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal ok = true; out->insert("delete", sysadm::Iohyve::deleteGuest(in_args.toObject())); } + if(act=="deletedisk"){ + ok = true; + out->insert("deletedisk", sysadm::Iohyve::deleteDisk(in_args.toObject())); + } else if(act=="listdisks"){ ok = true; out->insert("listdisks", sysadm::Iohyve::listDisks(in_args.toObject())); diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index 55bf0ef..6351dda 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -77,6 +77,46 @@ QJsonObject Iohyve::createGuest(QJsonObject jsin) { return retObject; } +// Delete a guest disk +QJsonObject Iohyve::deleteDisk(QJsonObject jsin) { + QJsonObject retObject; + + QStringList keys = jsin.keys(); + if (! keys.contains("name") || !keys.contains("disk") ) { + retObject.insert("error", "Missing required key(s) 'name/disk'"); + return retObject; + } + + // Get the key values + QString name = jsin.value("name").toString(); + QString disk = jsin.value("disk").toString(); + + // Can't remove disk0 + if ( disk == "disk0" ) { + retObject.insert("error", "disk0 cannot be removed!"); + return retObject; + } + + // Remove the disk now + QStringList output = General::RunCommand("iohyve remove " + name + " " + disk).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("No such guest") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + if ( output.at(i).indexOf("Not") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + retObject.insert("name", name); + retObject.insert("disk", disk); + return retObject; +} + // Delete a guest QJsonObject Iohyve::deleteGuest(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index b5024c0..b2342ca 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -17,6 +17,7 @@ class Iohyve{ public: static QJsonObject addDisk(QJsonObject); static QJsonObject createGuest(QJsonObject); + static QJsonObject deleteDisk(QJsonObject); static QJsonObject deleteGuest(QJsonObject); static QJsonObject fetchISO(QJsonObject, DProcess *); static QJsonObject installGuest(QJsonObject); From 1edaf3ff6e05bafa6ba9b8fb6546fcd010ab8eac Mon Sep 17 00:00:00 2001 From: dlavigne Date: Thu, 3 Mar 2016 13:49:57 -0500 Subject: [PATCH 08/10] Doc deletedisk action. --- api/classes/iohyve.rst | 53 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/api/classes/iohyve.rst b/api/classes/iohyve.rst index a98d92d..7ed08d0 100644 --- a/api/classes/iohyve.rst +++ b/api/classes/iohyve.rst @@ -21,7 +21,7 @@ Every iohyve class request contains the following parameters: | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ | action | | supported actions include "listvms", "fetchiso", "listisos", "renameiso", "rmiso", "setup", "issetup", "create", | -| | | "install", "start", "stop", "delete", "adddisk", and "listdisks" | +| | | "install", "start", "stop", "delete", "adddisk", "listdisks", and "deletedisk" | | | | | +---------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------+ @@ -735,4 +735,55 @@ The "listdisks" action lists the disks connected to the specified VM. "id": "fooid", "name": "response", "namespace": "sysadm" + } + + .. index:: deletedisk, iohyve + +.. _Delete a Disk: + +Delete a Disk +============= + +The "deletedisk" action removes the specified disk from the specified VM. + +**REST Request** + +.. code-block:: json + + PUT /sysadm/iohyve + { + "disk" : "disk1", + "name" : "bsdguest", + "action" : "deletedisk" + } + +**WebSocket Request** + +.. code-block:: json + + { + "namespace" : "sysadm", + "id" : "fooid", + "name" : "iohyve", + "args" : { + "name" : "bsdguest", + "action" : "deletedisk", + "disk" : "disk1" + } + } + +**Response** + +.. code-block:: json + + { + "args": { + "deletedisk": { + "disk": "disk1", + "name": "bsdguest" + } + }, + "id": "fooid", + "name": "response", + "namespace": "sysadm" } \ No newline at end of file From 9b03d42d8745dd77b25cd9e4e6aca844b4a7793f Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 13:57:16 -0500 Subject: [PATCH 09/10] 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); From 91a2c700cbaebb2c9570a72939230ccca8f0ffd4 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Thu, 3 Mar 2016 14:22:53 -0500 Subject: [PATCH 10/10] Add API call to show iohyve version REST Request: ------------------------------- PUT /sysadm/iohyve { "action" : "version" } WebSocket Request: ------------------------------- { "namespace" : "sysadm", "args" : { "action" : "version" }, "id" : "fooid", "name" : "iohyve" } Response: ------------------------------- { "args": { "version": { "version": "iohyve v0.7.3 2016/01/08 Bear in a Datacenter Edition" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/server/WebBackend.cpp | 4 ++++ src/server/library/sysadm-iohyve.cpp | 10 +++++++++- src/server/library/sysadm-iohyve.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index eb60c8b..c3cf76c 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -648,6 +648,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmIohyveRequest(const QJsonVal ok = true; out->insert("stop", sysadm::Iohyve::stopGuest(in_args.toObject())); } + else if(act=="version"){ + ok = true; + out->insert("version", sysadm::Iohyve::version()); + } //qDebug() << " - iohyve action finished:" << act << ok; } //end of "action" key usage diff --git a/src/server/library/sysadm-iohyve.cpp b/src/server/library/sysadm-iohyve.cpp index e6d938c..b7d3b24 100644 --- a/src/server/library/sysadm-iohyve.cpp +++ b/src/server/library/sysadm-iohyve.cpp @@ -252,7 +252,6 @@ QJsonObject Iohyve::listDisks(QJsonObject jsin) { return retObject; } - // List the VMs on the box QJsonObject Iohyve::listVMs() { QJsonObject retObject; @@ -479,3 +478,12 @@ QJsonObject Iohyve::stopGuest(QJsonObject jsin) { retObject.insert("name", name); return retObject; } + +// List the version of iohyve +QJsonObject Iohyve::version() { + QJsonObject retObject; + QString output = General::RunCommand("iohyve version").simplified(); + retObject.insert("version", output); + return retObject; +} + diff --git a/src/server/library/sysadm-iohyve.h b/src/server/library/sysadm-iohyve.h index 81e469c..7ba98f9 100644 --- a/src/server/library/sysadm-iohyve.h +++ b/src/server/library/sysadm-iohyve.h @@ -31,6 +31,7 @@ public: static QJsonObject setupIohyve(QJsonObject); static QJsonObject startGuest(QJsonObject); static QJsonObject stopGuest(QJsonObject); + static QJsonObject version(); };