]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/cephadm/services/iscsi.py
3 from typing
import List
, cast
5 from mgr_module
import MonCommandFailed
6 from ceph
.deployment
.service_spec
import IscsiServiceSpec
8 from orchestrator
import DaemonDescription
, OrchestratorError
9 from .cephadmservice
import CephadmDaemonSpec
, CephService
12 logger
= logging
.getLogger(__name__
)
15 class IscsiService(CephService
):
18 def config(self
, spec
: IscsiServiceSpec
) -> None:
19 assert self
.TYPE
== spec
.service_type
20 self
.mgr
._check
_pool
_exists
(spec
.pool
, spec
.service_name())
22 logger
.info('Saving service %s spec with placement %s' % (
23 spec
.service_name(), spec
.placement
.pretty_str()))
24 self
.mgr
.spec_store
.save(spec
)
26 def prepare_create(self
, daemon_spec
: CephadmDaemonSpec
[IscsiServiceSpec
]) -> CephadmDaemonSpec
:
27 assert self
.TYPE
== daemon_spec
.daemon_type
28 assert daemon_spec
.spec
30 spec
= daemon_spec
.spec
31 igw_id
= daemon_spec
.daemon_id
33 ret
, keyring
, err
= self
.mgr
.check_mon_command({
34 'prefix': 'auth get-or-create',
35 'entity': self
.get_auth_entity(igw_id
),
36 'caps': ['mon', 'profile rbd, '
37 'allow command "osd blacklist", '
38 'allow command "config-key get" with "key" prefix "iscsi/"',
43 if isinstance(spec
.ssl_cert
, list):
44 cert_data
= '\n'.join(spec
.ssl_cert
)
46 cert_data
= spec
.ssl_cert
47 ret
, out
, err
= self
.mgr
.check_mon_command({
48 'prefix': 'config-key set',
49 'key': f
'iscsi/{utils.name_to_config_section("iscsi")}.{igw_id}/iscsi-gateway.crt',
54 if isinstance(spec
.ssl_key
, list):
55 key_data
= '\n'.join(spec
.ssl_key
)
57 key_data
= spec
.ssl_key
58 ret
, out
, err
= self
.mgr
.check_mon_command({
59 'prefix': 'config-key set',
60 'key': f
'iscsi/{utils.name_to_config_section("iscsi")}.{igw_id}/iscsi-gateway.key',
65 'client_name': '{}.{}'.format(utils
.name_to_config_section('iscsi'), igw_id
),
68 igw_conf
= self
.mgr
.template
.render('services/iscsi/iscsi-gateway.cfg.j2', context
)
70 daemon_spec
.keyring
= keyring
71 daemon_spec
.extra_files
= {'iscsi-gateway.cfg': igw_conf
}
75 def config_dashboard(self
, daemon_descrs
: List
[DaemonDescription
]) -> None:
76 def get_set_cmd_dicts(out
: str) -> List
[dict]:
77 gateways
= json
.loads(out
)['gateways']
79 for dd
in daemon_descrs
:
80 spec
= cast(IscsiServiceSpec
,
81 self
.mgr
.spec_store
.specs
.get(dd
.service_name(), None))
83 logger
.warning('No ServiceSpec found for %s', dd
)
85 if not all([spec
.api_user
, spec
.api_password
]):
86 reason
= 'api_user or api_password is not specified in ServiceSpec'
88 'Unable to add iSCSI gateway to the Dashboard for %s: %s', dd
, reason
)
90 host
= self
._inventory
_get
_addr
(dd
.hostname
)
91 service_url
= 'http://{}:{}@{}:{}'.format(
92 spec
.api_user
, spec
.api_password
, host
, spec
.api_port
or '5000')
93 gw
= gateways
.get(host
)
94 if not gw
or gw
['service_url'] != service_url
:
95 logger
.info('Adding iSCSI gateway %s to Dashboard', service_url
)
97 'prefix': 'dashboard iscsi-gateway-add',
98 'service_url': service_url
,
103 self
._check
_and
_set
_dashboard
(
104 service_name
='iSCSI',
105 get_cmd
='dashboard iscsi-gateway-list',
106 get_set_cmd_dicts
=get_set_cmd_dicts