]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/services/orchestrator.py
import ceph nautilus 14.2.2
[ceph.git] / ceph / src / pybind / mgr / dashboard / services / orchestrator.py
index 4a19afef9d48e8ee704a76d215d003ea7c48f72b..366ff7de735c531e18661c07618e1469f3840427 100644 (file)
@@ -1,55 +1,38 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
 
-import time
-
+from orchestrator import OrchestratorClientMixin, raise_if_exception, OrchestratorError
 from .. import mgr, logger
 
 
-class NoOrchestratorConfiguredException(Exception):
-    pass
-
-
-class OrchClient(object):
-    _instance = None
-
-    @classmethod
-    def instance(cls):
-        if cls._instance is None:
-            cls._instance = OrchClient()
-        return cls._instance
-
-    def _call(self, method, *args, **kwargs):
-        _backend = mgr.get_module_option_ex("orchestrator_cli", "orchestrator")
-        if not _backend:
-            raise NoOrchestratorConfiguredException()
-        return mgr.remote(_backend, method, *args, **kwargs)
-
-    def _wait(self, completions):
-        while not self._call("wait", completions):
-            if any(c.should_wait for c in completions):
-                time.sleep(5)
-            else:
-                break
+# pylint: disable=abstract-method
+class OrchClient(OrchestratorClientMixin):
+    def __init__(self):
+        super(OrchClient, self).__init__()
+        self.set_mgr(mgr)
 
     def list_service_info(self, service_type):
-        completion = self._call("describe_service", service_type, None, None)
-        self._wait([completion])
+        # type: (str) -> list
+        completion = self.describe_service(service_type, None, None)
+        self._orchestrator_wait([completion])
+        raise_if_exception(completion)
         return completion.result
 
     def available(self):
-        _backend = mgr.get_module_option_ex("orchestrator_cli", "orchestrator")
-        if not _backend:
+        try:
+            status, desc = super(OrchClient, self).available()
+            logger.info("[ORCH] is orchestrator available: %s, %s", status, desc)
+            return status
+        except (RuntimeError, OrchestratorError, ImportError):
             return False
-        status, desc = self._call("available")
-        logger.info("[ORCH] is orchestrator available: %s, %s", status, desc)
-        return status
 
     def reload_service(self, service_type, service_ids):
         if not isinstance(service_ids, list):
             service_ids = [service_ids]
 
-        completion_list = [self._call("service_action", 'reload', service_type,
-                                      service_name, service_id)
+        completion_list = [self.service_action('reload', service_type,
+                                               service_name, service_id)
                            for service_name, service_id in service_ids]
-        self._wait(completion_list)
+        self._orchestrator_wait(completion_list)
+        for c in completion_list:
+            raise_if_exception(c)