From: Marcin Haba Date: Mon, 15 Jan 2024 08:48:20 +0000 (+0100) Subject: baculum: Add cancel jobs running on storage endpoint X-Git-Tag: Beta-15.0.1~68 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=883de3d09d7c7d3d9c0ff8c227ef1893e7078454;p=thirdparty%2Fbacula.git baculum: Add cancel jobs running on storage endpoint --- diff --git a/gui/baculum/protected/API/Modules/Bconsole.php b/gui/baculum/protected/API/Modules/Bconsole.php index a1b6c80da..0f32e0400 100644 --- a/gui/baculum/protected/API/Modules/Bconsole.php +++ b/gui/baculum/protected/API/Modules/Bconsole.php @@ -170,7 +170,10 @@ class Bconsole extends APIModule { } private function prepareResult(array $output, $exitcode, $bconsole_command) { - array_pop($output); // deleted 'quit' bconsole command + $out_len = count($output); + if ($out_len > 0 && strpos($output[$out_len - 1], 'quit') !== false) { + array_pop($output); // deleted 'quit' bconsole command + } $out = $output; if (strpos($bconsole_command, PHP_EOL) !== false) { // for multiline commands take the first command line diff --git a/gui/baculum/protected/API/Pages/API/StorageJobsCancel.php b/gui/baculum/protected/API/Pages/API/StorageJobsCancel.php new file mode 100644 index 000000000..f77edb781 --- /dev/null +++ b/gui/baculum/protected/API/Pages/API/StorageJobsCancel.php @@ -0,0 +1,87 @@ + + * @category API + * @package Baculum API + */ +class StorageJobsCancel extends BaculumAPIServer { + + public function set($storageid, $params) { + $storage = null; + if ($storageid > 0) { + $storage = $this->getModule('storage')->getStorageById($storageid); + } + $result = $this->getModule('bconsole')->bconsoleCommand( + $this->director, + ['.storage'], + null, + true + ); + if ($result->exitcode === 0) { + if (is_object($storage) && in_array($storage->name, $result->output)) { + $result = $this->getModule('status_sd')->getStatus( + $this->director, + $storage->name, + StatusStorage::OUTPUT_TYPE_RUNNING + ); + if ($result['error'] === 0) { + $cb = function($job) { + return $job['jobid']; + }; + $jobids = array_map($cb, $result['output']); + $result = (object)[ + 'output' => [], + 'exitcode' => StorageError::ERROR_NO_ERRORS + ]; + if (count($jobids) > 0) { + $result = $this->getModule('bconsole')->bconsoleCommand( + $this->director, + [ + 'cancel', + 'jobid="' . implode(',', $jobids) . '"' + ] + ); + } + $this->output = $result->output; + $this->error = $result->exitcode; + } else { + $this->output = $result['output']; + $this->error = $result['error']; + } + } else { + $this->output = StorageError::MSG_ERROR_STORAGE_DOES_NOT_EXISTS; + $this->error = StorageError::ERROR_STORAGE_DOES_NOT_EXISTS; + } + } else { + $this->output = $result->output; + $this->error = $result->exitcode; + } + } +} diff --git a/gui/baculum/protected/API/Pages/API/endpoints.xml b/gui/baculum/protected/API/Pages/API/endpoints.xml index f3cef97c8..e65599133 100644 --- a/gui/baculum/protected/API/Pages/API/endpoints.xml +++ b/gui/baculum/protected/API/Pages/API/endpoints.xml @@ -37,6 +37,7 @@ + diff --git a/gui/baculum/protected/API/openapi_baculum.json b/gui/baculum/protected/API/openapi_baculum.json index 01dfd9499..32a75a718 100644 --- a/gui/baculum/protected/API/openapi_baculum.json +++ b/gui/baculum/protected/API/openapi_baculum.json @@ -3541,6 +3541,44 @@ ] } }, + "/api/v2/storages/{storageid}/jobs/cancel": { + "put": { + "tags": ["storages"], + "summary": "Cancel all jobs for given storage.", + "description": "Cancel all jobs for given storage.", + "responses": { + "200": { + "description": "Output from cancelling all jobs for given storage.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "output": { + "type": "array", + "items": { + "type": "string", + "description": "Cancel all jobs for storage output." + } + }, + "error": { + "type": "integer", + "description": "Error code", + "enum": [0, 1, 2, 3, 4, 5, 6, 7, 11, 20, 600, 601, 603, 1000] + } + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/StorageId" + } + ] + } + }, "/api/v2/storages/{storageid}/release": { "get": { "tags": ["storages"],