from . import remotes
 from . import utils
 from .services.cephadmservice import MonService, MgrService, MdsService, RgwService, \
-    RbdMirrorService, CrashService
+    RbdMirrorService, CrashService, IscsiService
 from .services.nfs import NFSService
 from .services.osd import RemoveUtil, OSDRemoval, OSDService
 from .services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \
         self.prometheus_service = PrometheusService(self)
         self.node_exporter_service = NodeExporterService(self)
         self.crash_service = CrashService(self)
+        self.iscsi_servcie = IscsiService(self)
 
     def shutdown(self):
         self.log.debug('shutdown')
             'prometheus': self.prometheus_service.create,
             'node-exporter': self.node_exporter_service.create,
             'crash': self.crash_service.create,
-            'iscsi': self._create_iscsi,
+            'iscsi': self.iscsi_servcie.create,
         }
         config_fns = {
             'mds': self.mds_service.config,
             'rgw': self.rgw_service.config,
             'nfs': self.nfs_service.config,
-            'iscsi': self._config_iscsi,
+            'iscsi': self.iscsi_servcie.config,
         }
         create_func = create_fns.get(daemon_type, None)
         if not create_func:
 
     def add_iscsi(self, spec):
         # type: (ServiceSpec) -> orchestrator.Completion
-        return self._add_daemon('iscsi', spec, self._create_iscsi, self._config_iscsi)
-
-    def _config_iscsi(self, spec):
-        self._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.spec_store.save(spec)
-
-    def _create_iscsi(self, igw_id, host, spec):
-        ret, keyring, err = self.check_mon_command({
-            'prefix': 'auth get-or-create',
-            'entity': utils.name_to_config_section('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}'],
-        })
-
-        if spec.ssl_cert:
-            if isinstance(spec.ssl_cert, list):
-                cert_data = '\n'.join(spec.ssl_cert)
-            else:
-                cert_data = spec.ssl_cert
-            ret, out, err = self.mon_command({
-                'prefix': 'config-key set',
-                'key': f'iscsi/{utils.name_to_config_section("iscsi")}.{igw_id}/iscsi-gateway.crt',
-                'val': cert_data,
-            })
-
-        if spec.ssl_key:
-            if isinstance(spec.ssl_key, list):
-                key_data = '\n'.join(spec.ssl_key)
-            else:
-                key_data = spec.ssl_key
-            ret, out, err = self.mon_command({
-                'prefix': 'config-key set',
-                'key': f'iscsi/{utils.name_to_config_section("iscsi")}.{igw_id}/iscsi-gateway.key',
-                'val': key_data,
-            })
-
-        api_secure = 'false' if spec.api_secure is None else spec.api_secure
-        igw_conf = f"""
-# generated by cephadm
-[config]
-cluster_client_name = {utils.name_to_config_section('iscsi')}.{igw_id}
-pool = {spec.pool}
-trusted_ip_list = {spec.trusted_ip_list or ''}
-minimum_gateways = 1
-api_port = {spec.api_port or ''}
-api_user = {spec.api_user or ''}
-api_password = {spec.api_password or ''}
-api_secure = {api_secure}
-"""
-        extra_config = {'iscsi-gateway.cfg': igw_conf}
-        return self._create_daemon('iscsi', igw_id, host, keyring=keyring,
-                                   extra_config=extra_config)
+        return self._add_daemon('iscsi', spec, self.iscsi_servcie.create, self.iscsi_servcie.config)
 
     @trivial_completion
     def apply_iscsi(self, spec):
 
 import logging
 from typing import  TYPE_CHECKING
 
-from ceph.deployment.service_spec import ServiceSpec, RGWSpec
+from ceph.deployment.service_spec import ServiceSpec, RGWSpec, IscsiServiceSpec
 from orchestrator import OrchestratorError
 from cephadm import utils
 
                      'mgr', 'profile crash'],
         })
         return self.mgr._create_daemon('crash', daemon_id, host, keyring=keyring)
+
+
+class IscsiService(CephadmService):
+    def config(self, spec: IscsiServiceSpec):
+        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:
+        ret, keyring, err = self.mgr.check_mon_command({
+            'prefix': 'auth get-or-create',
+            'entity': utils.name_to_config_section('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}'],
+        })
+
+        if spec.ssl_cert:
+            if isinstance(spec.ssl_cert, list):
+                cert_data = '\n'.join(spec.ssl_cert)
+            else:
+                cert_data = spec.ssl_cert
+            ret, out, err = self.mgr.mon_command({
+                'prefix': 'config-key set',
+                'key': f'iscsi/{utils.name_to_config_section("iscsi")}.{igw_id}/iscsi-gateway.crt',
+                'val': cert_data,
+            })
+
+        if spec.ssl_key:
+            if isinstance(spec.ssl_key, list):
+                key_data = '\n'.join(spec.ssl_key)
+            else:
+                key_data = spec.ssl_key
+            ret, out, err = self.mgr.mon_command({
+                'prefix': 'config-key set',
+                'key': f'iscsi/{utils.name_to_config_section("iscsi")}.{igw_id}/iscsi-gateway.key',
+                'val': key_data,
+            })
+
+        api_secure = 'false' if spec.api_secure is None else spec.api_secure
+        igw_conf = f"""
+        # generated by cephadm
+        [config]
+        cluster_client_name = {utils.name_to_config_section('iscsi')}.{igw_id}
+        pool = {spec.pool}
+        trusted_ip_list = {spec.trusted_ip_list or ''}
+        minimum_gateways = 1
+        api_port = {spec.api_port or ''}
+        api_user = {spec.api_user or ''}
+        api_password = {spec.api_password or ''}
+        api_secure = {api_secure}
+        """
+        extra_config = {'iscsi-gateway.cfg': igw_conf}
+        return self.mgr._create_daemon('iscsi', igw_id, host, keyring=keyring,
+                                   extra_config=extra_config)