mirror of
https://github.com/ceph/ceph
synced 2024-12-27 22:13:28 +00:00
79dfe2cbef
Python modules are not allowed to contain hyphens in the name. Using hyphens only works here because we're using low level __import__. Change run_tasks to replace '-' with '_' when reading configs, and rename the task modules to have valid python module names. Aside from general hygiene, the motivation to do this is to allow one task to build on code in another task by importing it. Signed-off-by: John Spray <john.spray@inktank.com>
184 lines
5.7 KiB
Python
184 lines
5.7 KiB
Python
"""
|
|
Rest Api
|
|
"""
|
|
import logging
|
|
import contextlib
|
|
import time
|
|
|
|
from teuthology import misc as teuthology
|
|
from teuthology import contextutil
|
|
from ..orchestra import run
|
|
from teuthology.task.ceph import CephState
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def run_rest_api_daemon(ctx, api_clients):
|
|
"""
|
|
Wrapper starts the rest api daemons
|
|
"""
|
|
if not hasattr(ctx, 'daemons'):
|
|
ctx.daemons = CephState()
|
|
remotes = ctx.cluster.only(teuthology.is_type('client')).remotes
|
|
for rems, roles in remotes.iteritems():
|
|
for whole_id_ in roles:
|
|
if whole_id_ in api_clients:
|
|
id_ = whole_id_[len('clients'):]
|
|
run_cmd = [
|
|
'sudo',
|
|
'daemon-helper',
|
|
'kill',
|
|
'ceph-rest-api',
|
|
'-n',
|
|
'client.rest{id}'.format(id=id_), ]
|
|
cl_rest_id = 'client.rest{id}'.format(id=id_)
|
|
ctx.daemons.add_daemon(rems, 'restapi',
|
|
cl_rest_id,
|
|
args=run_cmd,
|
|
logger=log.getChild(cl_rest_id),
|
|
stdin=run.PIPE,
|
|
wait=False,
|
|
)
|
|
for i in range(1, 12):
|
|
log.info('testing for ceph-rest-api try {0}'.format(i))
|
|
run_cmd = [
|
|
'wget',
|
|
'-O',
|
|
'/dev/null',
|
|
'-q',
|
|
'http://localhost:5000/api/v0.1/status'
|
|
]
|
|
proc = rems.run(
|
|
args=run_cmd,
|
|
check_status=False
|
|
)
|
|
if proc.exitstatus == 0:
|
|
break
|
|
time.sleep(5)
|
|
if proc.exitstatus != 0:
|
|
raise RuntimeError('Cannot contact ceph-rest-api')
|
|
try:
|
|
yield
|
|
|
|
finally:
|
|
"""
|
|
TO DO: destroy daemons started -- modify iter_daemons_of_role
|
|
"""
|
|
teuthology.stop_daemons_of_type(ctx, 'restapi')
|
|
|
|
@contextlib.contextmanager
|
|
def task(ctx, config):
|
|
"""
|
|
Start up rest-api.
|
|
|
|
To start on on all clients::
|
|
|
|
tasks:
|
|
- ceph:
|
|
- rest-api:
|
|
|
|
To only run on certain clients::
|
|
|
|
tasks:
|
|
- ceph:
|
|
- rest-api: [client.0, client.3]
|
|
|
|
or
|
|
|
|
tasks:
|
|
- ceph:
|
|
- rest-api:
|
|
client.0:
|
|
client.3:
|
|
|
|
The general flow of things here is:
|
|
1. Find clients on which rest-api is supposed to run (api_clients)
|
|
2. Generate keyring values
|
|
3. Start up ceph-rest-api daemons
|
|
On cleanup:
|
|
4. Stop the daemons
|
|
5. Delete keyring value files.
|
|
"""
|
|
api_clients = []
|
|
remotes = ctx.cluster.only(teuthology.is_type('client')).remotes
|
|
log.info(remotes)
|
|
if config == None:
|
|
api_clients = ['client.{id}'.format(id=id_)
|
|
for id_ in teuthology.all_roles_of_type(ctx.cluster, 'client')]
|
|
else:
|
|
api_clients = config
|
|
log.info(api_clients)
|
|
testdir = teuthology.get_testdir(ctx)
|
|
coverage_dir = '{tdir}/archive/coverage'.format(tdir=testdir)
|
|
for rems, roles in remotes.iteritems():
|
|
for whole_id_ in roles:
|
|
if whole_id_ in api_clients:
|
|
id_ = whole_id_[len('client.'):]
|
|
keyring = '/etc/ceph/ceph.client.rest{id}.keyring'.format(
|
|
id=id_)
|
|
rems.run(
|
|
args=[
|
|
'sudo',
|
|
'adjust-ulimits',
|
|
'ceph-coverage',
|
|
coverage_dir,
|
|
'ceph-authtool',
|
|
'--create-keyring',
|
|
'--gen-key',
|
|
'--name=client.rest{id}'.format(id=id_),
|
|
'--set-uid=0',
|
|
'--cap', 'mon', 'allow *',
|
|
'--cap', 'osd', 'allow *',
|
|
'--cap', 'mds', 'allow',
|
|
keyring,
|
|
run.Raw('&&'),
|
|
'sudo',
|
|
'chmod',
|
|
'0644',
|
|
keyring,
|
|
],
|
|
)
|
|
rems.run(
|
|
args=[
|
|
'sudo',
|
|
'sh',
|
|
'-c',
|
|
run.Raw("'"),
|
|
"echo",
|
|
'[client.rest{id}]'.format(id=id_),
|
|
run.Raw('>>'),
|
|
"/etc/ceph/ceph.conf",
|
|
run.Raw("'")
|
|
]
|
|
)
|
|
rems.run(
|
|
args=[
|
|
'sudo',
|
|
'sh',
|
|
'-c',
|
|
run.Raw("'"),
|
|
'echo',
|
|
'restapi',
|
|
'keyring',
|
|
'=',
|
|
'/etc/ceph/ceph.client.rest{id}.keyring'.format(id=id_),
|
|
run.Raw('>>'),
|
|
'/etc/ceph/ceph.conf',
|
|
run.Raw("'"),
|
|
]
|
|
)
|
|
rems.run(
|
|
args=[
|
|
'ceph',
|
|
'auth',
|
|
'import',
|
|
'-i',
|
|
'/etc/ceph/ceph.client.rest{id}.keyring'.format(id=id_),
|
|
]
|
|
)
|
|
with contextutil.nested(
|
|
lambda: run_rest_api_daemon(ctx=ctx, api_clients=api_clients),):
|
|
yield
|
|
|