]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: create/update keyring during nfs config
authorMichael Fritch <mfritch@suse.com>
Mon, 16 Mar 2020 18:05:56 +0000 (12:05 -0600)
committerSage Weil <sage@redhat.com>
Thu, 26 Mar 2020 01:57:02 +0000 (20:57 -0500)
the keyring might already exist from a prior config/reconfig/redeploy.

attempt to get_or_create the keyring first and than update the keyring
caps afterward

Signed-off-by: Michael Fritch <mfritch@suse.com>
(cherry picked from commit 084fd4a91ae781ab7bed9e06ceca17b1a5ca5be2)

src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/nfs.py

index 0d6e3000854cbdd999f07e484349a68d72c51771..15e2218ad1992fad08fb64f84bdf85ad732a1d06 100644 (file)
@@ -2236,11 +2236,6 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
         elif daemon_type == 'nfs':
             cephadm_config, deps = \
                     self._generate_nfs_config(daemon_type, daemon_id, host)
-            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()
@@ -2788,9 +2783,26 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
             # cast to keep mypy happy
             spec = cast(NFSServiceSpec, specs[0])
 
-        # generate the cephadm config
         nfs = NFSGanesha(self, daemon_id, spec)
-        return nfs.get_cephadm_config(), deps
+
+        # create the keyring
+        entity = nfs.get_keyring_entity()
+        keyring = nfs.get_or_create_keyring(entity=entity)
+
+        # update the caps after get-or-create, the keyring might already exist!
+        nfs.update_keyring_caps(entity=entity)
+
+        # create the rados config object
+        nfs.create_rados_config_obj()
+
+        # generate the cephadm config
+        cephadm_config = nfs.get_cephadm_config()
+        cephadm_config.update(
+                self._get_config_and_keyring(
+                    daemon_type, daemon_id,
+                    keyring=keyring))
+
+        return cephadm_config, deps
 
     def add_nfs(self, spec):
         return self._add_daemon('nfs', spec, self._create_nfs, self._config_nfs)
@@ -2801,10 +2813,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
         self.spec_store.save(spec)
 
     def _create_nfs(self, daemon_id, host, spec):
-        nfs = NFSGanesha(self, daemon_id, spec)
-        keyring = nfs.create_keyring()
-        nfs.create_rados_config_obj()
-        return self._create_daemon('nfs', daemon_id, host, keyring=keyring)
+        return self._create_daemon('nfs', daemon_id, host)
 
     @trivial_completion
     def apply_nfs(self, spec):
index 319d8ed3de6458da91a762a1663d491fa05a3155..d30b09b2e03f959c0b7d2398e10c38d0c1c05f02 100644 (file)
@@ -39,27 +39,49 @@ class NFSGanesha(object):
         url += self.get_rados_config_name()
         return url
 
-    def create_keyring(self):
+    def get_keyring_entity(self):
         # type: () -> str
-        entity = cephadm.name_to_config_section(self.get_rados_user())
+        return cephadm.name_to_config_section(self.get_rados_user())
 
-        osd_caps='allow rw pool=%s' % (self.spec.pool)
-        if self.spec.namespace:
-            osd_caps='%s namespace=%s' % (osd_caps, self.spec.namespace)
+    def get_or_create_keyring(self, entity=None):
+        # type: (Optional[str]) -> str
+        if not entity:
+            entity = self.get_keyring_entity()
 
         logger.info('Create keyring: %s' % entity)
         ret, keyring, err = self.mgr.mon_command({
             'prefix': 'auth get-or-create',
             'entity': entity,
+        })
+
+        if ret != 0:
+            raise OrchestratorError(
+                    'Unable to create keyring %s: %s %s' \
+                            % (entity, ret, err))
+        return keyring
+
+    def update_keyring_caps(self, entity=None):
+        # type: (Optional[str]) -> None
+        if not entity:
+            entity = self.get_keyring_entity()
+
+        osd_caps='allow rw pool=%s' % (self.spec.pool)
+        if self.spec.namespace:
+            osd_caps='%s namespace=%s' % (osd_caps, self.spec.namespace)
+
+        logger.info('Updating keyring caps: %s' % entity)
+        ret, out, err = self.mgr.mon_command({
+            'prefix': 'auth caps',
+            'entity': entity,
             'caps': ['mon', 'allow r',
                      'osd', osd_caps,
                      'mds', 'allow rw'],
         })
 
         if ret != 0:
-            raise OrchestratorError('Unable to create keyring: %s' % (entity))
-
-        return keyring
+            raise OrchestratorError(
+                    'Unable to update keyring caps %s: %s %s' \
+                            % (entity, ret, err))
 
     def create_rados_config_obj(self):
         # type: () -> None