From 84cb7bb19d2d5baca56bc690e4ffe10d952e8a77 Mon Sep 17 00:00:00 2001 From: Kris Moore Date: Fri, 15 Jan 2016 12:11:01 -0500 Subject: [PATCH] Add new API call to run replication tasks manually REST Request: ------------------------------- PUT /sysadm/lifepreserver { "host" : "10.0.10.100", "dataset" : "mypool", "action" : "runreplication" } REST Response: ------------------------------- { "args": { "runreplication": { "dataset": "mypool", "host": "10.0.10.100" } } } WebSocket Request: ------------------------------- { "id" : "fooid", "name" : "lifepreserver", "args" : { "host" : "10.0.10.100", "dataset" : "mypool", "action" : "runreplication" }, "namespace" : "sysadm" } WebSocket Response: ------------------------------- { "args": { "runreplication": { "dataset": "mypool", "host": "10.0.10.100" } }, "id": "fooid", "name": "response", "namespace": "sysadm" } --- src/library/sysadm-lifepreserver.cpp | 41 ++++++++++++++++++++++++++++ src/library/sysadm-lifepreserver.h | 1 + src/server/WebBackend.cpp | 4 +++ 3 files changed, 46 insertions(+) diff --git a/src/library/sysadm-lifepreserver.cpp b/src/library/sysadm-lifepreserver.cpp index 2cb74ec..d5ca03e 100644 --- a/src/library/sysadm-lifepreserver.cpp +++ b/src/library/sysadm-lifepreserver.cpp @@ -369,6 +369,47 @@ QJsonObject LifePreserver::removeSnapshot(QJsonObject jsin) { return values; } +// Run a replication task +QJsonObject LifePreserver::runReplication(QJsonObject jsin) { + QJsonObject retObject; + QString dataset, host; + + QStringList keys = jsin.keys(); + if(! keys.contains("dataset") || ! keys.contains("host")){ + retObject.insert("error", "Requires dataset and host keys"); + return retObject; + } + + // Get the dataset / host + dataset = jsin.value("dataset").toString(); + host = jsin.value("host").toString(); + + // Make sure we have the dataset / host key(s) + if ( dataset.isEmpty() || host.isEmpty() ) { + retObject.insert("error", "Empty dataset or host keys "); + return retObject; + } + + QStringList output; + output = General::RunCommand("lpreserver replicate run " + dataset + " " + host).split("\n"); + + // Check for any errors + for ( int i = 0; i < output.size(); i++) + { + if ( output.at(i).indexOf("ERROR:") != -1 ) { + retObject.insert("error", output.at(i)); + return retObject; + } + } + + // Got to the end, return the good json + QJsonObject values; + values.insert("dataset", dataset); + values.insert("host", host); + + return values; +} + // Revert to a snapshot QJsonObject LifePreserver::revertSnapshot(QJsonObject jsin) { QJsonObject retObject; diff --git a/src/library/sysadm-lifepreserver.h b/src/library/sysadm-lifepreserver.h index ea431dd..4f9c0ba 100644 --- a/src/library/sysadm-lifepreserver.h +++ b/src/library/sysadm-lifepreserver.h @@ -22,6 +22,7 @@ public: static QJsonObject removeReplication(QJsonObject jsin); static QJsonObject removeSnapshot(QJsonObject jsin); static QJsonObject revertSnapshot(QJsonObject jsin); + static QJsonObject runReplication(QJsonObject jsin); static QJsonObject saveSettings(QJsonObject jsin); static QJsonObject scheduleSnapshot(QJsonObject jsin); static QJsonObject scheduleScrub(QJsonObject jsin); diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index a59e288..bfe70e8 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -217,6 +217,10 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmLifePreserverRequest(const Q ok = true; out->insert("revertsnap", sysadm::LifePreserver::revertSnapshot(in_args.toObject())); } + if(act=="runreplication"){ + ok = true; + out->insert("runreplication", sysadm::LifePreserver::runReplication(in_args.toObject())); + } if(act=="savesettings"){ ok = true; out->insert("savesettings", sysadm::LifePreserver::saveSettings(in_args.toObject()));