]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/cephadm/services/iscsi.py
import 15.2.5
[ceph.git] / ceph / src / pybind / mgr / cephadm / services / iscsi.py
index 9b10d0a1652663fdb55669a60fae2fe710b869dc..aecf1417835943cc302ccc0b6ad27c0d1361cddd 100644 (file)
@@ -5,29 +5,38 @@ from typing import List, cast
 from mgr_module import MonCommandFailed
 from ceph.deployment.service_spec import IscsiServiceSpec
 
-from orchestrator import DaemonDescription
-from .cephadmservice import CephadmService
+from orchestrator import DaemonDescription, OrchestratorError
+from .cephadmservice import CephadmService, CephadmDaemonSpec
 from .. import utils
 
 logger = logging.getLogger(__name__)
 
 
 class IscsiService(CephadmService):
-    def config(self, spec: IscsiServiceSpec):
+    TYPE = 'iscsi'
+
+    def config(self, spec: IscsiServiceSpec) -> None:
+        assert self.TYPE == spec.service_type
         self.mgr._check_pool_exists(spec.pool, spec.service_name())
 
         logger.info('Saving service %s spec with placement %s' % (
             spec.service_name(), spec.placement.pretty_str()))
         self.mgr.spec_store.save(spec)
 
-    def create(self, igw_id, host, spec) -> str:
+    def create(self, daemon_spec: CephadmDaemonSpec[IscsiServiceSpec]) -> str:
+        assert self.TYPE == daemon_spec.daemon_type
+        assert daemon_spec.spec
+
+        spec = daemon_spec.spec
+        igw_id = daemon_spec.daemon_id
+
         ret, keyring, err = self.mgr.check_mon_command({
             'prefix': 'auth get-or-create',
-            'entity': utils.name_to_auth_entity('iscsi') + '.' + igw_id,
+            'entity': utils.name_to_auth_entity('iscsi', igw_id),
             'caps': ['mon', 'profile rbd, '
                             'allow command "osd blacklist", '
                             'allow command "config-key get" with "key" prefix "iscsi/"',
-                     'osd', f'allow rwx pool={spec.pool}'],
+                     'osd', 'allow rwx'],
         })
 
         if spec.ssl_cert:
@@ -57,43 +66,42 @@ class IscsiService(CephadmService):
             'spec': spec
         }
         igw_conf = self.mgr.template.render('services/iscsi/iscsi-gateway.cfg.j2', context)
-        extra_config = {'iscsi-gateway.cfg': igw_conf}
-        return self.mgr._create_daemon('iscsi', igw_id, host, keyring=keyring,
-                                       extra_config=extra_config)
-
-    def daemon_check_post(self, daemon_descrs: List[DaemonDescription]):
-        try:
-            _, out, _ = self.mgr.check_mon_command({
-                'prefix': 'dashboard iscsi-gateway-list'
-            })
-        except MonCommandFailed as e:
-            logger.warning('Failed to get existing iSCSI gateways from the Dashboard: %s', e)
-            return
-
-        gateways = json.loads(out)['gateways']
-        for dd in daemon_descrs:
-            spec = cast(IscsiServiceSpec,
-                        self.mgr.spec_store.specs.get(dd.service_name(), None))
-            if not spec:
-                logger.warning('No ServiceSpec found for %s', dd)
-                continue
-            if not all([spec.api_user, spec.api_password]):
-                reason = 'api_user or api_password is not specified in ServiceSpec'
-                logger.warning(
-                    'Unable to add iSCSI gateway to the Dashboard for %s: %s', dd, reason)
-                continue
-            host = self._inventory_get_addr(dd.hostname)
-            service_url = 'http://{}:{}@{}:{}'.format(
-                spec.api_user, spec.api_password, host, spec.api_port or '5000')
-            gw = gateways.get(dd.hostname)
-            if not gw or gw['service_url'] != service_url:
-                try:
+
+        daemon_spec.keyring = keyring
+        daemon_spec.extra_config = {'iscsi-gateway.cfg': igw_conf}
+
+        return self.mgr._create_daemon(daemon_spec)
+
+    def config_dashboard(self, daemon_descrs: List[DaemonDescription]):
+        def get_set_cmd_dicts(out: str) -> List[dict]:
+            gateways = json.loads(out)['gateways']
+            cmd_dicts = []
+            for dd in daemon_descrs:
+                spec = cast(IscsiServiceSpec,
+                            self.mgr.spec_store.specs.get(dd.service_name(), None))
+                if not spec:
+                    logger.warning('No ServiceSpec found for %s', dd)
+                    continue
+                if not all([spec.api_user, spec.api_password]):
+                    reason = 'api_user or api_password is not specified in ServiceSpec'
+                    logger.warning(
+                        'Unable to add iSCSI gateway to the Dashboard for %s: %s', dd, reason)
+                    continue
+                host = self._inventory_get_addr(dd.hostname)
+                service_url = 'http://{}:{}@{}:{}'.format(
+                    spec.api_user, spec.api_password, host, spec.api_port or '5000')
+                gw = gateways.get(host)
+                if not gw or gw['service_url'] != service_url:
                     logger.info('Adding iSCSI gateway %s to Dashboard', service_url)
-                    _, out, _ = self.mgr.check_mon_command({
+                    cmd_dicts.append({
                         'prefix': 'dashboard iscsi-gateway-add',
                         'service_url': service_url,
-                        'name': dd.hostname
+                        'name': host
                     })
-                except MonCommandFailed as e:
-                    logger.warning(
-                        'Failed to add iSCSI gateway %s to the Dashboard: %s', service_url, e)
+            return cmd_dicts
+
+        self._check_and_set_dashboard(
+            service_name='iSCSI',
+            get_cmd='dashboard iscsi-gateway-list',
+            get_set_cmd_dicts=get_set_cmd_dicts
+        )