]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/cephadm/nfs.py
1c0a45200ec73ca0b5517e95371a7290b8d7a9ed
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
21 assert spec
.service_id
and daemon_id
.startswith(spec
.service_id
)
23 self
.daemon_id
= daemon_id
26 def get_daemon_name(self
):
28 return '%s.%s' % (self
.spec
.service_type
, self
.daemon_id
)
30 def get_rados_user(self
):
32 return '%s.%s' % (self
.spec
.service_type
, self
.daemon_id
)
34 def get_keyring_entity(self
):
36 return utils
.name_to_config_section(self
.get_rados_user())
38 def get_or_create_keyring(self
, entity
=None):
39 # type: (Optional[str]) -> str
41 entity
= self
.get_keyring_entity()
43 logger
.info('Create keyring: %s' % entity
)
44 ret
, keyring
, err
= self
.mgr
.mon_command({
45 'prefix': 'auth get-or-create',
50 raise OrchestratorError(
51 'Unable to create keyring %s: %s %s' \
55 def update_keyring_caps(self
, entity
=None):
56 # type: (Optional[str]) -> None
58 entity
= self
.get_keyring_entity()
60 osd_caps
='allow rw pool=%s' % (self
.spec
.pool
)
61 if self
.spec
.namespace
:
62 osd_caps
='%s namespace=%s' % (osd_caps
, self
.spec
.namespace
)
64 logger
.info('Updating keyring caps: %s' % entity
)
65 ret
, out
, err
= self
.mgr
.mon_command({
66 'prefix': 'auth caps',
68 'caps': ['mon', 'allow r',
74 raise OrchestratorError(
75 'Unable to update keyring caps %s: %s %s' \
78 def create_rados_config_obj(self
, clobber
=False):
79 # type: (Optional[bool]) -> None
80 obj
= self
.spec
.rados_config_name()
82 with self
.mgr
.rados
.open_ioctx(self
.spec
.pool
) as ioctx
:
83 if self
.spec
.namespace
:
84 ioctx
.set_namespace(self
.spec
.namespace
)
89 except rados
.ObjectNotFound
as e
:
92 if exists
and not clobber
:
93 # Assume an existing config
94 logger
.info('Rados config object exists: %s' % obj
)
96 # Create an empty config object
97 logger
.info('Creating rados config object: %s' % obj
)
98 ioctx
.write_full(obj
, ''.encode('utf-8'))
100 def get_ganesha_conf(self
):
102 return '''# generated by cephadm
105 Enable_RQUOTA = false;
116 Attr_Expiration_Time = 0;
121 RecoveryBackend = 'rados_cluster';
122 Minor_Versions = 1, 2;
129 namespace = "{namespace}";
138 '''.format(user
=self
.get_rados_user(),
139 nodeid
=self
.get_daemon_name(),
141 namespace
=self
.spec
.namespace
if self
.spec
.namespace
else '',
142 url
=self
.spec
.rados_config_location())
144 def get_cephadm_config(self
):
146 config
= {'pool' : self
.spec
.pool
} # type: Dict
147 if self
.spec
.namespace
:
148 config
['namespace'] = self
.spec
.namespace
149 config
['userid'] = self
.get_rados_user()
150 config
['extra_args'] = ['-N', 'NIV_EVENT']
152 'ganesha.conf' : self
.get_ganesha_conf(),
154 logger
.debug('Generated cephadm config-json: %s' % config
)