]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Add VMware vSphere datastore list endpoint
authorMarcin Haba <marcin.haba@bacula.pl>
Tue, 21 Feb 2023 12:26:45 +0000 (13:26 +0100)
committerMarcin Haba <marcin.haba@bacula.pl>
Sun, 5 Mar 2023 06:06:30 +0000 (07:06 +0100)
gui/baculum/protected/API/Pages/API/PluginVSphereListDatastores.php [new file with mode: 0644]
gui/baculum/protected/API/Pages/API/endpoints.xml
gui/baculum/protected/API/openapi_baculum.json

diff --git a/gui/baculum/protected/API/Pages/API/PluginVSphereListDatastores.php b/gui/baculum/protected/API/Pages/API/PluginVSphereListDatastores.php
new file mode 100644 (file)
index 0000000..93ac01a
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+/*
+ * Bacula(R) - The Network Backup Solution
+ * Baculum   - Bacula web interface
+ *
+ * Copyright (C) 2013-2023 Kern Sibbald
+ *
+ * The main author of Baculum is Marcin Haba.
+ * The original author of Bacula is Kern Sibbald, with contributions
+ * from many others, a complete list can be found in the file AUTHORS.
+ *
+ * You may use this file and others of this release according to the
+ * license defined in the LICENSE file, which includes the Affero General
+ * Public License, v3.0 ("AGPLv3") and some additional permissions and
+ * terms pursuant to its AGPLv3 Section 7.
+ *
+ * This notice must be preserved when any source code is
+ * conveyed and/or propagated.
+ *
+ * Bacula(R) is a registered trademark of Kern Sibbald.
+ */
+
+use Baculum\API\Modules\ConsoleOutputPage;
+use Baculum\API\Modules\ConsoleOutputQueryPage;
+use Baculum\Common\Modules\Logging;
+use Baculum\Common\Modules\Errors\{BconsoleError,ClientError,PluginVSphereError};
+
+/**
+ * List vSphere plugin datastores.
+ *
+ * @author Marcin Haba <marcin.haba@bacula.pl>
+ * @category API
+ * @package Baculum API
+ */
+class PluginVSphereListDatastores extends ConsoleOutputQueryPage {
+
+       public function get() {
+               $client = null;
+               $clientid = $this->Request->contains('id') ? (int)$this->Request['id'] : 0;
+               $result = $this->getModule('bconsole')->bconsoleCommand(
+                       $this->director,
+                       ['.client'],
+                       null,
+                       true
+               );
+               if ($result->exitcode === 0) {
+                       $client_val = $this->getModule('client')->getClientById($clientid);
+                       if (is_object($client_val) && in_array($client_val->name, $result->output)) {
+                               $client = $client_val->name;
+                       } else {
+                               $this->output = ClientError::MSG_ERROR_CLIENT_DOES_NOT_EXISTS;
+                               $this->error = ClientError::ERROR_CLIENT_DOES_NOT_EXISTS;
+                               return;
+                       }
+               } else {
+                       $this->output = PluginVSphereError::MSG_ERROR_WRONG_EXITCODE;
+                       $this->error = PluginVSphereError::ERROR_WRONG_EXITCODE;
+                       return;
+               }
+
+               $out_format = ConsoleOutputPage::OUTPUT_FORMAT_RAW;
+               if ($this->Request->contains('output') && $this->isOutputFormatValid($this->Request['output'])) {
+                       $out_format = $this->Request['output'];
+               }
+
+               $plugin = 'vsphere: ';
+               $out = new \StdClass;
+               $out->output = [];
+               $params = ['client' => $client, 'plugin' => $plugin];
+               if ($out_format === ConsoleOutputPage::OUTPUT_FORMAT_RAW) {
+                       $out = $this->getRawOutput($params);
+               } elseif($out_format === ConsoleOutputPage::OUTPUT_FORMAT_JSON) {
+                       $out = $this->getJSONOutput($params);
+               }
+
+               if ($out->exitcode !== 0) {
+                       $out->error = PluginVSphereError::ERROR_EXECUTING_PLUGIN_QUERY_COMMAND;
+                       $out->output = PluginVSphereError::MSG_ERROR_EXECUTING_PLUGIN_QUERY_COMMAND . $out->output;
+                       $this->getModule('logging')->log(
+                               Logging::CATEGORY_EXECUTE,
+                               $out->output . ", Error={$out->error}"
+                       );
+               } else {
+                       $out->error = BconsoleError::ERROR_NO_ERRORS;
+               }
+               $this->output = $out->output;
+               $this->error = $out->error;
+       }
+
+       /**
+        * Get vSphere datastore list output from console in raw format.
+        *
+        * @param array $params command parameters
+        * @return StdClass object with output and exitcode
+        */
+       protected function getRawOutput($params = []) {
+               $ret = $this->getModule('bconsole')->bconsoleCommand(
+                       $this->director,
+                       [
+                               '.query',
+                               'plugin="' . $params['plugin'] . '"',
+                               'client="' . $params['client'] . '"',
+                               'parameter="datastore"'
+                       ]
+               );
+               if ($ret->exitcode != 0) {
+                       $this->getModule('logging')->log(
+                               Logging::CATEGORY_EXECUTE,
+                               'Wrong output from vSphere RAW datastore list: ' . implode(PHP_EOL, $ret->output)
+                       );
+                       $ret->output = []; // don't provide errors to output, only in logs
+               }
+               return $ret;
+       }
+
+       /**
+        * Get vSphere datastore list output from console in JSON format.
+        *
+        * @param array $params command parameters
+        * @return StdClass object with output and exitcode
+        */
+       protected function getJSONOutput($params = []) {
+               $result = $this->getRawOutput($params);
+               if ($result->exitcode === 0) {
+                       $rows = iterator_to_array($this->getHostRows($result->output));
+                       $result->output = $this->parseOutputKeyValue($rows);
+               }
+               return $result;
+       }
+
+       /**
+        * Filter rows with datastore items.
+        *
+        * @param array $output dot query command output
+        * @return none
+        */
+       private function getHostRows(array $output) {
+               for ($i = 0; $i < count($output); $i++) {
+                       if (preg_match('/^datastore=/', $output[$i]) === 1) {
+                               yield $output[$i];
+                       }
+               }
+       }
+}
index 1ce620a04a4ce272cd76df496b9c14e357182293..29136cc8acf9c6a592dfa0909a3e082d3c243399 100644 (file)
        <!-- vSphere Plugin -->
        <url ServiceParameter="PluginVSphereListServers" pattern="api/v2/plugins/vsphere/{id}/servers" parameters.id="\d+" />
        <url ServiceParameter="PluginVSphereListHosts" pattern="api/v2/plugins/vsphere/{id}/hosts" parameters.id="\d+" />
+       <url ServiceParameter="PluginVSphereListDatastores" pattern="api/v2/plugins/vsphere/{id}/datastores" parameters.id="\d+" />
 
 
        <!-- OLD API v1 -->
index c1e2f488d6dbbbd762d1434fb9a541b4fc2f5b85..de36d1ca12c8cd5fc56424797716725456997530 100644 (file)
                                "parameters": [
                                        {
                                                "$ref": "#/components/parameters/ClientId"
+                                       },
+                                       {
+                                               "$ref": "#/components/parameters/Output"
                                        }
                                ]
                        }
                                "parameters": [
                                        {
                                                "$ref": "#/components/parameters/ClientId"
+                                       },
+                                       {
+                                               "$ref": "#/components/parameters/Output"
+                                       }
+                               ]
+                       }
+               },
+               "/api/v2/plugins/vsphere/{clientid}/datastores": {
+                       "get": {
+                               "tags": ["plugins"],
+                               "summary": "VMware vSphere datastore list",
+                               "description": "VMware vSphere datastore list.",
+                               "responses": {
+                                       "200": {
+                                               "description": "List of VMware vSphere datastores",
+                                               "content": {
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "type": "object",
+                                                                       "properties": {
+                                                                               "output": {
+                                                                                       "type": "array",
+                                                                                       "items": {
+                                                                                               "type": "object",
+                                                                                               "properties": {
+                                                                                                       "datastore": {
+                                                                                                               "description": "VMware vSphere datastores",
+                                                                                                               "type": "array",
+                                                                                                               "items": {
+                                                                                                                       "description": "VMware vSphere datastores",
+                                                                                                                       "type": "string"
+                                                                                                               }
+                                                                                                       }
+                                                                                               }
+                                                                                       }
+                                                                               },
+                                                                               "error": {
+                                                                                       "type": "integer",
+                                                                                       "description": "Error code",
+                                                                                       "enum": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 150, 1000]
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               },
+                               "parameters": [
+                                       {
+                                               "$ref": "#/components/parameters/ClientId"
+                                       },
+                                       {
+                                               "$ref": "#/components/parameters/Output"
                                        }
                                ]
                        }