CLICommandMeta
from . import remotes
+from .nfs import NFSGanesha
from .osd import RemoveUtil, OSDRemoval
keyring=None,
extra_args=None, extra_config=None,
reconfig=False,
- osd_uuid_map=None):
+ osd_uuid_map=None,
+ cephadm_config=None):
if not extra_args:
extra_args = []
name = '%s.%s' % (daemon_type, daemon_id)
start_time = datetime.datetime.utcnow()
deps = [] # type: List[str]
- cephadm_config = {} # type: Dict[str, Any]
+ if not cephadm_config:
+ cephadm_config = {}
if daemon_type == 'prometheus':
cephadm_config, deps = self._generate_prometheus_config()
extra_args.extend(['--config-json', '-'])
elif daemon_type == 'grafana':
cephadm_config, deps = self._generate_grafana_config()
extra_args.extend(['--config-json', '-'])
+ elif daemon_type == 'nfs':
+ cephadm_config.update(
+ self._get_config_and_keyring(
+ daemon_type, daemon_id,
+ keyring=keyring,
+ extra_config=extra_config))
+ extra_args.extend(['--config-json', '-'])
elif daemon_type == 'alertmanager':
cephadm_config, deps = self._generate_alertmanager_config()
extra_args.extend(['--config-json', '-'])
else:
+ # Ceph.daemons (mon, mgr, mds, osd, etc)
cephadm_config = self._get_config_and_keyring(
daemon_type, daemon_id,
keyring=keyring,
daemon_type, daemon_id, host))
if daemon_type == 'mon':
args.append((daemon_id, host, network)) # type: ignore
+ elif daemon_type == 'nfs':
+ args.append((daemon_id, host, spec)) # type: ignore
else:
args.append((daemon_id, host)) # type: ignore
def apply_rbd_mirror(self, spec):
return self._apply(spec)
+ def add_nfs(self, spec):
+ return self._add_daemon('nfs', spec, self._create_nfs)
+
+ def _create_nfs(self, daemon_id, host, spec):
+ nfs = NFSGanesha(self, daemon_id, spec.pool, namespace=spec.namespace)
+ keyring = nfs.create_keyring()
+ cephadm_config = nfs.get_cephadm_config()
+ return self._create_daemon('nfs', daemon_id, host,
+ keyring=keyring,
+ cephadm_config=cephadm_config)
+
def _generate_prometheus_config(self):
# type: () -> Tuple[Dict[str, Any], List[str]]
deps = [] # type: List[str]
--- /dev/null
+from typing import Dict, Optional
+
+import cephadm
+
+class NFSGanesha(object):
+ def __init__(self,
+ mgr,
+ daemon_id,
+ pool,
+ namespace=None):
+ # type: (cephadm.CephadmOrchestrator, str, str, Optional[str]) -> None
+ self.daemon_type = 'nfs'
+ self.daemon_id = daemon_id
+
+ self.mgr = mgr
+
+ # rados pool config
+ self.pool = pool
+ self.namespace = namespace
+
+ def get_daemon_name(self):
+ # type: () -> str
+ return '%s.%s' % (self.daemon_type, self.daemon_id)
+
+ def get_rados_user(self):
+ # type: () -> str
+ return 'admin' # TODO: 'nfs.' + self.daemon_id
+
+ def create_keyring(self):
+ # type: () -> str
+ ret, keyring, err = self.mgr.mon_command({
+ 'prefix': 'auth get',
+ 'entity': 'client.' + self.get_rados_user(),
+ })
+ return keyring
+
+ def get_cephadm_config(self):
+ # type: () -> Dict
+ config = {'pool' : self.pool} # type: Dict
+ if self.namespace:
+ config['namespace'] = self.namespace
+ config['files'] = {
+ 'ganesha.conf' : '', # TODO: add ganesha.conf
+ }
+ return config