ceph/tasks/tgt.py

178 lines
4.9 KiB
Python

"""
Task to handle tgt
Assumptions made:
The ceph-extras tgt package may need to get installed.
The open-iscsi package needs to get installed.
"""
import logging
import contextlib
from teuthology import misc as teuthology
from teuthology import contextutil
log = logging.getLogger(__name__)
@contextlib.contextmanager
def start_tgt_remotes(ctx, start_tgtd):
"""
This subtask starts up a tgtd on the clients specified
"""
remotes = ctx.cluster.only(teuthology.is_type('client')).remotes
tgtd_list = []
for rem, roles in remotes.iteritems():
for _id in roles:
if _id in start_tgtd:
if not rem in tgtd_list:
tgtd_list.append(rem)
size = ctx.config.get('image_size', 10240)
rem.run(
args=[
'rbd',
'create',
'iscsi-image',
'--size',
str(size),
])
rem.run(
args=[
'sudo',
'tgtadm',
'--lld',
'iscsi',
'--mode',
'target',
'--op',
'new',
'--tid',
'1',
'--targetname',
'rbd',
])
rem.run(
args=[
'sudo',
'tgtadm',
'--lld',
'iscsi',
'--mode',
'logicalunit',
'--op',
'new',
'--tid',
'1',
'--lun',
'1',
'--backing-store',
'iscsi-image',
'--bstype',
'rbd',
])
rem.run(
args=[
'sudo',
'tgtadm',
'--lld',
'iscsi',
'--op',
'bind',
'--mode',
'target',
'--tid',
'1',
'-I',
'ALL',
])
try:
yield
finally:
for rem in tgtd_list:
rem.run(
args=[
'sudo',
'tgtadm',
'--lld',
'iscsi',
'--mode',
'target',
'--op',
'delete',
'--force',
'--tid',
'1',
])
rem.run(
args=[
'rbd',
'snap',
'purge',
'iscsi-image',
])
rem.run(
args=[
'sudo',
'rbd',
'rm',
'iscsi-image',
])
@contextlib.contextmanager
def task(ctx, config):
"""
Start up tgt.
To start on on all clients::
tasks:
- ceph:
- tgt:
To start on certain clients::
tasks:
- ceph:
- tgt: [client.0, client.3]
or
tasks:
- ceph:
- tgt:
client.0:
client.3:
An image blocksize size can also be specified::
tasks:
- ceph:
- tgt:
image_size = 20480
The general flow of things here is:
1. Find clients on which tgt is supposed to run (start_tgtd)
2. Remotely start up tgt daemon
On cleanup:
3. Stop tgt daemon
The iscsi administration is handled by the iscsi task.
"""
if config:
config = {key : val for key, val in config.items()
if key.startswith('client')}
# config at this point should only contain keys starting with 'client'
start_tgtd = []
remotes = ctx.cluster.only(teuthology.is_type('client')).remotes
log.info(remotes)
if not config:
start_tgtd = ['client.{id}'.format(id=id_)
for id_ in teuthology.all_roles_of_type(ctx.cluster, 'client')]
else:
start_tgtd = config
log.info(start_tgtd)
with contextutil.nested(
lambda: start_tgt_remotes(ctx=ctx, start_tgtd=start_tgtd),):
yield