Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / tasks / util / rados.py
1 import logging
2
3 from teuthology import misc as teuthology
4
5 log = logging.getLogger(__name__)
6
7 def rados(ctx, remote, cmd, wait=True, check_status=False):
8     testdir = teuthology.get_testdir(ctx)
9     log.info("rados %s" % ' '.join(cmd))
10     pre = [
11         'adjust-ulimits',
12         'ceph-coverage',
13         '{tdir}/archive/coverage'.format(tdir=testdir),
14         'rados',
15         ];
16     pre.extend(cmd)
17     proc = remote.run(
18         args=pre,
19         check_status=check_status,
20         wait=wait,
21         )
22     if wait:
23         return proc.exitstatus
24     else:
25         return proc
26
27 def create_ec_pool(remote, name, profile_name, pgnum, profile={}, cluster_name="ceph", application=None):
28     remote.run(args=['sudo', 'ceph'] +
29                cmd_erasure_code_profile(profile_name, profile) + ['--cluster', cluster_name])
30     remote.run(args=[
31         'sudo', 'ceph', 'osd', 'pool', 'create', name,
32         str(pgnum), str(pgnum), 'erasure', profile_name, '--cluster', cluster_name
33         ])
34     if application:
35         remote.run(args=[
36             'sudo', 'ceph', 'osd', 'pool', 'application', 'enable', name, application, '--cluster', cluster_name
37         ], check_status=False) # may fail as EINVAL when run in jewel upgrade test
38
39 def create_replicated_pool(remote, name, pgnum, cluster_name="ceph", application=None):
40     remote.run(args=[
41         'sudo', 'ceph', 'osd', 'pool', 'create', name, str(pgnum), str(pgnum), '--cluster', cluster_name
42         ])
43     if application:
44         remote.run(args=[
45             'sudo', 'ceph', 'osd', 'pool', 'application', 'enable', name, application, '--cluster', cluster_name
46         ], check_status=False)
47
48 def create_cache_pool(remote, base_name, cache_name, pgnum, size, cluster_name="ceph"):
49     remote.run(args=[
50         'sudo', 'ceph', 'osd', 'pool', 'create', cache_name, str(pgnum), '--cluster', cluster_name
51     ])
52     remote.run(args=[
53         'sudo', 'ceph', 'osd', 'tier', 'add-cache', base_name, cache_name,
54         str(size), '--cluster', cluster_name
55     ])
56
57 def cmd_erasure_code_profile(profile_name, profile):
58     """
59     Return the shell command to run to create the erasure code profile
60     described by the profile parameter.
61     
62     :param profile_name: a string matching [A-Za-z0-9-_.]+
63     :param profile: a map whose semantic depends on the erasure code plugin
64     :returns: a shell command as an array suitable for Remote.run
65
66     If profile is {}, it is replaced with 
67
68       { 'k': '2', 'm': '1', 'crush-failure-domain': 'osd'}
69
70     for backward compatibility. In previous versions of teuthology,
71     these values were hardcoded as function arguments and some yaml
72     files were designed with these implicit values. The teuthology
73     code should not know anything about the erasure code profile
74     content or semantic. The valid values and parameters are outside
75     its scope.
76     """
77
78     if profile == {}:
79         profile = {
80             'k': '2',
81             'm': '1',
82             'crush-failure-domain': 'osd'
83         }
84     return [
85         'osd', 'erasure-code-profile', 'set',
86         profile_name
87         ] + [ str(key) + '=' + str(value) for key, value in profile.iteritems() ]