From d56e90d55700bf94f45f7684aa2b136ddd08fb4f Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 29 Apr 2016 10:25:36 -0400 Subject: [PATCH] Add a new API call: rpc/dispatcher -> "action":"kill" This allows a user with full access to cancel pending/running jobs within the dispatcher system. Required arguments: "job_id" : or [, , etc..] REST Request: ------------------------------- PUT /rpc/dispatcher { "action" : "kill", "job_id" : "sysadm_pkg_install-{9c079421-ace9-4b6e-8870-d023b48f4c49}" } WebSocket Request: ------------------------------- { "args" : { "action" : "kill", "job_id" : "sysadm_pkg_install-{9c079421-ace9-4b6e-8870-d023b48f4c49}" }, "namespace" : "rpc", "name" : "dispatcher", "id" : "fooid" } Response: ------------------------------- { "args": { "killed": { "jobs": ["sysadm_pkg_install-{9c079421-ace9-4b6e-8870-d023b48f4c49}"] } }, "id": "fooid", "name": "response", "namespace": "rpc" } --- src/server/Dispatcher.cpp | 2 +- src/server/WebBackend.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/server/Dispatcher.cpp b/src/server/Dispatcher.cpp index 940b861..8653289 100644 --- a/src/server/Dispatcher.cpp +++ b/src/server/Dispatcher.cpp @@ -172,7 +172,7 @@ QJsonObject Dispatcher::killJobs(QStringList ids){ } } //end loop over queue types QJsonObject obj; - obj.insert("killed_jobs", QJsonArray::fromStringList(killed)); + obj.insert("jobs", QJsonArray::fromStringList(killed)); return obj; } diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index de9cd33..0f41f8b 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -290,6 +290,14 @@ RestOutputStruct::ExitCode WebSocket::EvaluateDispatcherRequest(bool allaccess, }else if(act=="list"){ QJsonObject info = DISPATCHER->listJobs(); out->insert("jobs", info); + }else if(act=="kill" && in_args.toObject().contains("job_id") ){ + if(!allaccess){ return RestOutputStruct::FORBIDDEN; } //this user does not have permission to modify jobs + QStringList ids; + QJsonValue val = in_args.toObject().value("job_id"); + if(val.isArray()){ ids = JsonArrayToStringList(val.toArray()); } + else if(val.isString()){ ids << val.toString(); } + else{ return RestOutputStruct::BADREQUEST; } + out->insert("killed", DISPATCHER->killJobs(ids)); }else{ return RestOutputStruct::BADREQUEST; }