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:
'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
+ )