Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

qa/tasks/cephadm.py: Support already bootstrapped clusters #34900

Merged
merged 2 commits into from May 18, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
106 changes: 63 additions & 43 deletions qa/tasks/cephadm.py
Expand Up @@ -595,7 +595,10 @@ def ceph_osds(ctx, config):
devs = devs_by_remote[remote]
assert devs ## FIXME ##
dev = devs.pop()
short_dev = dev.replace('/dev/', '')
if all(_ in dev for _ in ('lv', 'vg')):
short_dev = dev.replace('/dev/', '')
else:
short_dev = dev
log.info('Deploying %s on %s with %s...' % (
osd, remote.shortname, dev))
_shell(ctx, cluster_name, remote, [
Expand Down Expand Up @@ -958,36 +961,23 @@ def crush_setup(ctx, config):
yield

@contextlib.contextmanager
def task(ctx, config):
if config is None:
config = {}

assert isinstance(config, dict), \
"task only supports a dictionary for configuration"

overrides = ctx.config.get('overrides', {})
teuthology.deep_merge(config, overrides.get('ceph', {}))
log.info('Config: ' + str(config))

testdir = teuthology.get_testdir(ctx)
def _bypass():
yield

# set up cluster context
first_ceph_cluster = False
if not hasattr(ctx, 'daemons'):
first_ceph_cluster = True
if not hasattr(ctx, 'ceph'):
ctx.ceph = {}
ctx.managers = {}
if 'cluster' not in config:
config['cluster'] = 'ceph'
@contextlib.contextmanager
def initialize_config(ctx, config):
cluster_name = config['cluster']
ctx.ceph[cluster_name] = argparse.Namespace()
testdir = teuthology.get_testdir(ctx)

ctx.ceph[cluster_name].thrashers = []
# fixme: setup watchdog, ala ceph.py

ctx.ceph[cluster_name].roleless = False # see below

first_ceph_cluster = False
if not hasattr(ctx, 'daemons'):
first_ceph_cluster = True

# cephadm mode?
if 'cephadm_mode' not in config:
config['cephadm_mode'] = 'root'
Expand All @@ -1002,21 +992,6 @@ def task(ctx, config):
ctx.daemons = DaemonGroup(
use_cephadm=ctx.cephadm)

# image
ctx.ceph[cluster_name].image = config.get('image')
ref = None
if not ctx.ceph[cluster_name].image:
sha1 = config.get('sha1')
if sha1:
ctx.ceph[cluster_name].image = 'quay.io/ceph-ci/ceph:%s' % sha1
ref = sha1
else:
# hmm, fall back to branch?
branch = config.get('branch', 'master')
ref = branch
ctx.ceph[cluster_name].image = 'quay.io/ceph-ci/ceph:%s' % branch
log.info('Cluster image is %s' % ctx.ceph[cluster_name].image)

# uuid
fsid = str(uuid.uuid1())
log.info('Cluster fsid is %s' % fsid)
Expand All @@ -1031,7 +1006,6 @@ def task(ctx, config):

if config.get('roleless', False):
# mons will be named after hosts
n = len(roles)
roles = []
first_mon = None
for remote, _ in remotes_and_roles:
Expand All @@ -1040,7 +1014,7 @@ def task(ctx, config):
first_mon = remote.shortname
bootstrap_remote = remote
log.info('No roles; fabricating mons %s' % roles)

ctx.ceph[cluster_name].mons = get_mons(
roles, ips, cluster_name,
mon_bind_msgr2=config.get('mon_bind_msgr2', True),
Expand Down Expand Up @@ -1071,15 +1045,61 @@ def task(ctx, config):
_, _, first_mgr = teuthology.split_role(mgrs[0])
log.info('First mgr is %s' % (first_mgr))
ctx.ceph[cluster_name].first_mgr = first_mgr

yield

@contextlib.contextmanager
def task(ctx, config):
if config is None:
config = {}

assert isinstance(config, dict), \
"task only supports a dictionary for configuration"

overrides = ctx.config.get('overrides', {})
teuthology.deep_merge(config, overrides.get('ceph', {}))
log.info('Config: ' + str(config))

testdir = teuthology.get_testdir(ctx)

# set up cluster context
if not hasattr(ctx, 'ceph'):
ctx.ceph = {}
ctx.managers = {}
if 'cluster' not in config:
config['cluster'] = 'ceph'
cluster_name = config['cluster']
if cluster_name not in ctx.ceph:
ctx.ceph[cluster_name] = argparse.Namespace()
ctx.ceph[cluster_name].bootstrapped = False

# image
ctx.ceph[cluster_name].image = config.get('image')
ref = None
if not ctx.ceph[cluster_name].image:
sha1 = config.get('sha1')
if sha1:
ctx.ceph[cluster_name].image = 'quay.io/ceph-ci/ceph:%s' % sha1
ref = sha1
else:
# hmm, fall back to branch?
branch = config.get('branch', 'master')
ref = branch
ctx.ceph[cluster_name].image = 'quay.io/ceph-ci/ceph:%s' % branch
log.info('Cluster image is %s' % ctx.ceph[cluster_name].image)


with contextutil.nested(
#if the cluster is already bootstrapped bypass corresponding methods
lambda: _bypass() if (ctx.ceph[cluster_name].bootstrapped)\
else initialize_config(ctx=ctx, config=config),
lambda: ceph_initial(),
lambda: normalize_hostnames(ctx=ctx),
lambda: download_cephadm(ctx=ctx, config=config, ref=ref),
lambda: _bypass() if (ctx.ceph[cluster_name].bootstrapped)\
else download_cephadm(ctx=ctx, config=config, ref=ref),
lambda: ceph_log(ctx=ctx, config=config),
lambda: ceph_crash(ctx=ctx, config=config),
lambda: ceph_bootstrap(ctx=ctx, config=config),
lambda: _bypass() if (ctx.ceph[cluster_name].bootstrapped)\
else ceph_bootstrap(ctx=ctx, config=config),
lambda: crush_setup(ctx=ctx, config=config),
lambda: ceph_mons(ctx=ctx, config=config),
lambda: distribute_config_and_admin_keyring(ctx=ctx, config=config),
Expand Down