]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-volume lvm.prepare consume the value from --cluster-fsid if available
authorAlfredo Deza <adeza@redhat.com>
Wed, 3 Oct 2018 17:32:05 +0000 (13:32 -0400)
committerAlfredo Deza <adeza@redhat.com>
Thu, 15 Nov 2018 12:28:50 +0000 (07:28 -0500)
Signed-off-by: Alfredo Deza <adeza@redhat.com>
(cherry picked from commit a92883e60f3f2206a11b43762b3afcb84b05f07e)

src/ceph-volume/ceph_volume/devices/lvm/prepare.py

index e33d737c9c8f42132bf8c6a40fa66bad1b1cd805..d2cd3547d1d228490fc5c16cd57c635c9fadfcc8 100644 (file)
@@ -205,42 +205,58 @@ class Prepare(object):
 
         raise RuntimeError('no data logical volume found with: %s' % arg)
 
-    def safe_prepare(self, args):
+    def safe_prepare(self, args=None):
         """
         An intermediate step between `main()` and `prepare()` so that we can
         capture the `self.osd_id` in case we need to rollback
+
+        :param args: Injected args, usually from `lvm create` which compounds
+                     both `prepare` and `create`
         """
+        if args is not None:
+            self.args = args
         try:
-            self.prepare(args)
+            self.prepare()
         except Exception:
             logger.exception('lvm prepare was unable to complete')
             logger.info('will rollback OSD ID creation')
-            rollback_osd(args, self.osd_id)
+            rollback_osd(self.args, self.osd_id)
             raise
-        terminal.success("ceph-volume lvm prepare successful for: %s" % args.data)
+        terminal.success("ceph-volume lvm prepare successful for: %s" % self.args.data)
+
+    def get_cluster_fsid(self):
+        """
+        Allows using --cluster-fsid as an argument, but can fallback to reading
+        from ceph.conf if that is unset (the default behavior).
+        """
+        if self.args.cluster_fsid:
+            return self.args.cluster_fsid
+        else:
+            return conf.ceph.get('global', 'fsid')
 
     @decorators.needs_root
-    def prepare(self, args):
+    def prepare(self):
         # FIXME we don't allow re-using a keyring, we always generate one for the
         # OSD, this needs to be fixed. This could either be a file (!) or a string
         # (!!) or some flags that we would need to compound into a dict so that we
         # can convert to JSON (!!!)
         secrets = {'cephx_secret': prepare_utils.create_key()}
         cephx_lockbox_secret = ''
-        encrypted = 1 if args.dmcrypt else 0
+        encrypted = 1 if self.args.dmcrypt else 0
         cephx_lockbox_secret = '' if not encrypted else prepare_utils.create_key()
 
         if encrypted:
             secrets['dmcrypt_key'] = encryption_utils.create_dmcrypt_key()
             secrets['cephx_lockbox_secret'] = cephx_lockbox_secret
 
-        cluster_fsid = conf.ceph.get('global', 'fsid')
-        osd_fsid = args.osd_fsid or system.generate_uuid()
-        crush_device_class = args.crush_device_class
+        cluster_fsid = self.get_cluster_fsid()
+
+        osd_fsid = self.args.osd_fsid or system.generate_uuid()
+        crush_device_class = self.args.crush_device_class
         if crush_device_class:
             secrets['crush_device_class'] = crush_device_class
         # reuse a given ID if it exists, otherwise create a new ID
-        self.osd_id = prepare_utils.create_id(osd_fsid, json.dumps(secrets), osd_id=args.osd_id)
+        self.osd_id = prepare_utils.create_id(osd_fsid, json.dumps(secrets), osd_id=self.args.osd_id)
         tags = {
             'ceph.osd_fsid': osd_fsid,
             'ceph.osd_id': self.osd_id,
@@ -248,13 +264,13 @@ class Prepare(object):
             'ceph.cluster_name': conf.cluster,
             'ceph.crush_device_class': crush_device_class,
         }
-        if args.filestore:
-            if not args.journal:
+        if self.args.filestore:
+            if not self.args.journal:
                 raise RuntimeError('--journal is required when using --filestore')
 
-            data_lv = self.get_lv(args.data)
+            data_lv = self.get_lv(self.args.data)
             if not data_lv:
-                data_lv = self.prepare_device(args.data, 'data', cluster_fsid, osd_fsid)
+                data_lv = self.prepare_device(self.args.data, 'data', cluster_fsid, osd_fsid)
 
             tags['ceph.data_device'] = data_lv.lv_path
             tags['ceph.data_uuid'] = data_lv.lv_uuid
@@ -262,7 +278,9 @@ class Prepare(object):
             tags['ceph.encrypted'] = encrypted
             tags['ceph.vdo'] = api.is_vdo(data_lv.lv_path)
 
-            journal_device, journal_uuid, tags = self.setup_device('journal', args.journal, tags)
+            journal_device, journal_uuid, tags = self.setup_device(
+                'journal', self.args.journal, tags
+            )
 
             tags['ceph.type'] = 'data'
             data_lv.set_tags(tags)
@@ -275,10 +293,10 @@ class Prepare(object):
                 self.osd_id,
                 osd_fsid,
             )
-        elif args.bluestore:
-            block_lv = self.get_lv(args.data)
+        elif self.args.bluestore:
+            block_lv = self.get_lv(self.args.data)
             if not block_lv:
-                block_lv = self.prepare_device(args.data, 'block', cluster_fsid, osd_fsid)
+                block_lv = self.prepare_device(self.args.data, 'block', cluster_fsid, osd_fsid)
 
             tags['ceph.block_device'] = block_lv.lv_path
             tags['ceph.block_uuid'] = block_lv.lv_uuid
@@ -286,8 +304,8 @@ class Prepare(object):
             tags['ceph.encrypted'] = encrypted
             tags['ceph.vdo'] = api.is_vdo(block_lv.lv_path)
 
-            wal_device, wal_uuid, tags = self.setup_device('wal', args.block_wal, tags)
-            db_device, db_uuid, tags = self.setup_device('db', args.block_db, tags)
+            wal_device, wal_uuid, tags = self.setup_device('wal', self.args.block_wal, tags)
+            db_device, db_uuid, tags = self.setup_device('db', self.args.block_db, tags)
 
             tags['ceph.type'] = 'block'
             block_lv.set_tags(tags)
@@ -334,14 +352,14 @@ class Prepare(object):
             print(sub_command_help)
             return
         exclude_group_options(parser, argv=self.argv, groups=['filestore', 'bluestore'])
-        args = parser.parse_args(self.argv)
+        self.args = parser.parse_args(self.argv)
         # the unfortunate mix of one superset for both filestore and bluestore
         # makes this validation cumbersome
-        if args.filestore:
-            if not args.journal:
+        if self.args.filestore:
+            if not self.args.journal:
                 raise SystemExit('--journal is required when using --filestore')
         # Default to bluestore here since defaulting it in add_argument may
         # cause both to be True
-        if not args.bluestore and not args.filestore:
-            args.bluestore = True
-        self.safe_prepare(args)
+        if not self.args.bluestore and not self.args.filestore:
+            self.args.bluestore = True
+        self.safe_prepare(self.args)