mirror of
https://github.com/ceph/ceph
synced 2025-02-19 08:57:27 +00:00
ceph-volume simple.activate initial take on activation
Signed-off-by: Alfredo Deza <adeza@redhat.com>
This commit is contained in:
parent
285e5bdd28
commit
5a97374605
137
src/ceph-volume/ceph_volume/devices/simple/activate.py
Normal file
137
src/ceph-volume/ceph_volume/devices/simple/activate.py
Normal file
@ -0,0 +1,137 @@
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from textwrap import dedent
|
||||
from ceph_volume import process, decorators, terminal
|
||||
from ceph_volume.util import system, disk
|
||||
from ceph_volume.systemd import systemctl
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Activate(object):
|
||||
|
||||
help = 'Enable systemd units to mount configured devices and start a Ceph OSD'
|
||||
|
||||
def __init__(self, argv, systemd=False):
|
||||
self.argv = argv
|
||||
self.systemd = systemd
|
||||
|
||||
@decorators.needs_root
|
||||
def activate(self, args):
|
||||
osd_id = args.osd_id
|
||||
osd_fsid = args.osd_fsid
|
||||
with open(args.json_config, 'r') as fp:
|
||||
osd_metadata = json.load(fp)
|
||||
|
||||
cluster_name = osd_metadata.get('cluster_name', 'ceph')
|
||||
osd_dir = '/var/lib/ceph/osd/%s-%s' % (cluster_name, osd_id)
|
||||
data_uuid = osd_metadata.get('data', {}).get('uuid')
|
||||
if not data_uuid:
|
||||
raise RuntimeError(
|
||||
'Unable to activate OSD %s - no "uuid" key found for data' % args.osd_id
|
||||
)
|
||||
data_device = disk.get_device_from_partuuid(data_uuid)
|
||||
journal_device = disk.get_device_from_partuuid(osd_metadata.get('journal', {}).get('uuid'))
|
||||
block_device = disk.get_device_from_partuuid(osd_metadata.get('block', {}).get('uuid'))
|
||||
block_db_device = disk.get_device_from_partuuid(osd_metadata.get('block.db', {}).get('uuid'))
|
||||
block_wal_device = disk.get_device_from_partuuid(
|
||||
osd_metadata.get('block.wal', {}).get('uuid')
|
||||
)
|
||||
|
||||
if not system.device_is_mounted(data_device, destination=osd_dir):
|
||||
process.run(['sudo', 'mount', '-v', data_device, osd_dir])
|
||||
|
||||
device_map = {
|
||||
'journal': journal_device,
|
||||
'block': block_device,
|
||||
'block.db': block_db_device,
|
||||
'block.wal': block_wal_device
|
||||
}
|
||||
|
||||
for name, device in device_map.items():
|
||||
if not device:
|
||||
continue
|
||||
# always re-do the symlink regardless if it exists, so that the journal
|
||||
# device path that may have changed can be mapped correctly every time
|
||||
destination = os.path.join(osd_dir, name)
|
||||
process.run(['sudo', 'ln', '-snf', device, destination])
|
||||
|
||||
# make sure that the journal has proper permissions
|
||||
system.chown(device)
|
||||
|
||||
if not self.systemd:
|
||||
# enable the ceph-volume unit for this OSD
|
||||
systemctl.enable_volume(osd_id, osd_fsid, 'simple')
|
||||
|
||||
# disable any/all ceph-disk units
|
||||
systemctl.mask_ceph_disk()
|
||||
|
||||
# start the OSD
|
||||
systemctl.start_osd(osd_id)
|
||||
|
||||
if not self.systemd:
|
||||
terminal.success('Successfully activated OSD %s with FSID %s' % (osd_id, osd_fsid))
|
||||
terminal.warning(
|
||||
('All ceph-disk systemd units have been disabled to '
|
||||
'prevent OSD %s getting triggered by UDEV events')
|
||||
)
|
||||
|
||||
def main(self):
|
||||
sub_command_help = dedent("""
|
||||
Activate OSDs by mounting devices previously configured to their
|
||||
appropriate destination:
|
||||
|
||||
ceph-volume simple activate {ID} {FSID}
|
||||
|
||||
The OSD must have been "scanned" previously (see ``ceph-volume simple
|
||||
scan``), so that all needed OSD device information and metadata exist.
|
||||
|
||||
A previously scanned OSD would exist like::
|
||||
|
||||
/etc/ceph/osd/{ID}-{FSID}.json
|
||||
|
||||
|
||||
Environment variables supported:
|
||||
|
||||
CEPH_VOLUME_SIMPLE_JSON_DIR: Directory location for scanned OSD JSON configs
|
||||
""")
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='ceph-volume simple activate',
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
description=sub_command_help,
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'osd_id',
|
||||
metavar='ID',
|
||||
nargs='?',
|
||||
help='The ID of the OSD, usually an integer, like 0'
|
||||
)
|
||||
parser.add_argument(
|
||||
'osd_fsid',
|
||||
metavar='FSID',
|
||||
nargs='?',
|
||||
help='The FSID of the OSD, similar to a SHA1'
|
||||
)
|
||||
if len(self.argv) == 0:
|
||||
print(sub_command_help)
|
||||
return
|
||||
args = parser.parse_args(self.argv)
|
||||
if not args.osd_id and not args.osd_fsid:
|
||||
terminal.error('ID and FSID are required to find the right OSD to activate')
|
||||
terminal.error('from a scanned OSD location in /etc/ceph/osd/')
|
||||
raise RuntimeError('Unable to activate without both ID and FSID')
|
||||
# don't allow a CLI flag to specify the JSON dir, because that might
|
||||
# implicitly indicate that it would be possible to activate a json file
|
||||
# at a non-default location which would not work at boot time if the
|
||||
# custom location is not exposed through an ENV var
|
||||
json_dir = os.environ.get('CEPH_VOLUME_SIMPLE_JSON_DIR', '/etc/ceph/osd/')
|
||||
json_config = os.path.join(json_dir, '%s-%s.json' % (args.osd_id, args.osd_fsid))
|
||||
if not os.path.exists(json_config):
|
||||
raise RuntimeError('Expected JSON config path not found: %s' % json_config)
|
||||
args.json_config = json_config
|
||||
self.activate(args)
|
Loading…
Reference in New Issue
Block a user