]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/cephadm/nfs.py
4 from typing
import Dict
, Optional
6 from ceph
.deployment
.service_spec
import NFSServiceSpec
9 from orchestrator
import OrchestratorError
13 logger
= logging
.getLogger(__name__
)
15 class NFSGanesha(object):
20 # type: (cephadm.CephadmOrchestrator, str, NFSServiceSpec) -> None
22 self
.daemon_id
= daemon_id
25 def get_rados_user(self
):
27 return '%s.%s' % (self
.spec
.service_type
, self
.daemon_id
)
29 def get_rados_config_name(self
):
31 return 'conf-' + self
.get_rados_user()
33 def get_rados_config_url(self
):
35 url
= 'rados://' + self
.spec
.pool
+ '/'
36 if self
.spec
.namespace
:
37 url
+= self
.spec
.namespace
+ '/'
38 url
+= self
.get_rados_config_name()
41 def get_keyring_entity(self
):
43 return utils
.name_to_config_section(self
.get_rados_user())
45 def get_or_create_keyring(self
, entity
=None):
46 # type: (Optional[str]) -> str
48 entity
= self
.get_keyring_entity()
50 logger
.info('Create keyring: %s' % entity
)
51 ret
, keyring
, err
= self
.mgr
.mon_command({
52 'prefix': 'auth get-or-create',
57 raise OrchestratorError(
58 'Unable to create keyring %s: %s %s' \
62 def update_keyring_caps(self
, entity
=None):
63 # type: (Optional[str]) -> None
65 entity
= self
.get_keyring_entity()
67 osd_caps
='allow rw pool=%s' % (self
.spec
.pool
)
68 if self
.spec
.namespace
:
69 osd_caps
='%s namespace=%s' % (osd_caps
, self
.spec
.namespace
)
71 logger
.info('Updating keyring caps: %s' % entity
)
72 ret
, out
, err
= self
.mgr
.mon_command({
73 'prefix': 'auth caps',
75 'caps': ['mon', 'allow r',
81 raise OrchestratorError(
82 'Unable to update keyring caps %s: %s %s' \
85 def create_rados_config_obj(self
, clobber
=False):
86 # type: (Optional[bool]) -> None
87 obj
= self
.get_rados_config_name()
89 with self
.mgr
.rados
.open_ioctx(self
.spec
.pool
) as ioctx
:
90 if self
.spec
.namespace
:
91 ioctx
.set_namespace(self
.spec
.namespace
)
96 except rados
.ObjectNotFound
as e
:
99 if exists
and not clobber
:
100 # Assume an existing config
101 logger
.info('Rados config object exists: %s' % obj
)
103 # Create an empty config object
104 logger
.info('Creating rados config object: %s' % obj
)
105 ioctx
.write_full(obj
, ''.encode('utf-8'))
107 def get_ganesha_conf(self
):
109 return '''# generated by cephadm
116 '''.format(user
=self
.get_rados_user(),
117 url
=self
.get_rados_config_url())
119 def get_cephadm_config(self
):
121 config
= {'pool' : self
.spec
.pool
} # type: Dict
122 if self
.spec
.namespace
:
123 config
['namespace'] = self
.spec
.namespace
125 'ganesha.conf' : self
.get_ganesha_conf(),
127 logger
.debug('Generated cephadm config-json: %s' % config
)