Merge lp:~james-page/charm-helpers/folsom-ceph-support into lp:charm-helpers

Proposed by James Page
Status: Merged
Merged at revision: 94
Proposed branch: lp:~james-page/charm-helpers/folsom-ceph-support
Merge into: lp:charm-helpers
Diff against target: 123 lines (+72/-5)
2 files modified
charmhelpers/contrib/storage/linux/ceph.py (+27/-3)
tests/contrib/storage/test_linux_ceph.py (+45/-2)
To merge this branch: bzr merge lp:~james-page/charm-helpers/folsom-ceph-support
Reviewer Review Type Date Requested Status
Charm Helper Maintainers Pending
Review via email: mp+192557@code.launchpad.net

Description of the change

Add support for older versions of ceph.

Argonaut does not support ceph osd ls; detect and default to a sane
pgnum size (200) if this version is detected.

This can be manually changed in ceph afterwards if need be

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmhelpers/contrib/storage/linux/ceph.py'
2--- charmhelpers/contrib/storage/linux/ceph.py 2013-10-20 16:29:28 +0000
3+++ charmhelpers/contrib/storage/linux/ceph.py 2013-10-24 18:02:04 +0000
4@@ -102,8 +102,12 @@
5 Return a list of all Ceph Object Storage Daemons
6 currently in the cluster
7 '''
8- return json.loads(check_output(['ceph', '--id', service,
9- 'osd', 'ls', '--format=json']))
10+ version = ceph_version()
11+ if version and version >= '0.56':
12+ return json.loads(check_output(['ceph', '--id', service,
13+ 'osd', 'ls', '--format=json']))
14+ else:
15+ return None
16
17
18 def create_pool(service, name, replicas=2):
19@@ -114,7 +118,13 @@
20 return
21 # Calculate the number of placement groups based
22 # on upstream recommended best practices.
23- pgnum = (len(get_osds(service)) * 100 / replicas)
24+ osds = get_osds(service)
25+ if osds:
26+ pgnum = (len(osds) * 100 / replicas)
27+ else:
28+ # NOTE(james-page): Default to 200 for older ceph versions
29+ # which don't support OSD query from cli
30+ pgnum = 200
31 cmd = [
32 'ceph', '--id', service,
33 'osd', 'pool', 'create',
34@@ -357,3 +367,17 @@
35 if user and group:
36 check_call(['chown', '%s.%s' % (user, group), keyring])
37 return True
38+
39+
40+def ceph_version():
41+ ''' Retrieve the local version of ceph '''
42+ if os.path.exists('/usr/bin/ceph'):
43+ cmd = ['ceph', '-v']
44+ output = check_output(cmd)
45+ output = output.split()
46+ if len(output) > 3:
47+ return output[2]
48+ else:
49+ return None
50+ else:
51+ return None
52
53=== modified file 'tests/contrib/storage/test_linux_ceph.py'
54--- tests/contrib/storage/test_linux_ceph.py 2013-10-20 16:29:28 +0000
55+++ tests/contrib/storage/test_linux_ceph.py 2013-10-24 18:02:04 +0000
56@@ -90,11 +90,20 @@
57 _mkdir.assert_called_with('/etc/ceph')
58 _install.assert_called_with('ceph-common', fatal=True)
59
60- def test_get_osds(self):
61+ @patch.object(ceph_utils, 'ceph_version')
62+ def test_get_osds(self, version):
63+ version.return_value = '0.56.2'
64 self.check_output.return_value = json.dumps([1, 2, 3])
65 self.assertEquals(ceph_utils.get_osds('test'), [1, 2, 3])
66
67- def test_get_osds_none(self):
68+ @patch.object(ceph_utils, 'ceph_version')
69+ def test_get_osds_argonaut(self, version):
70+ version.return_value = '0.48.3'
71+ self.assertEquals(ceph_utils.get_osds('test'), None)
72+
73+ @patch.object(ceph_utils, 'ceph_version')
74+ def test_get_osds_none(self, version):
75+ version.return_value = '0.56.2'
76 self.check_output.return_value = json.dumps(None)
77 self.assertEquals(ceph_utils.get_osds('test'), None)
78
79@@ -126,6 +135,20 @@
80 'foo', 'size', '3'])
81 ])
82
83+ @patch.object(ceph_utils, 'get_osds')
84+ @patch.object(ceph_utils, 'pool_exists')
85+ def test_create_pool_argonaut(self, _exists, _get_osds):
86+ '''It creates rados pool correctly with 3 replicas'''
87+ _exists.return_value = False
88+ _get_osds.return_value = None
89+ ceph_utils.create_pool(service='cinder', name='foo')
90+ self.check_call.assert_has_calls([
91+ call(['ceph', '--id', 'cinder', 'osd', 'pool',
92+ 'create', 'foo', '200']),
93+ call(['ceph', '--id', 'cinder', 'osd', 'pool', 'set',
94+ 'foo', 'size', '2'])
95+ ])
96+
97 def test_create_pool_already_exists(self):
98 self._patch('pool_exists')
99 self.pool_exists.return_value = True
100@@ -500,3 +523,23 @@
101 'adam.users',
102 '/etc/ceph/client.foo.keyring'
103 ])
104+
105+ @patch('os.path.exists')
106+ def test_ceph_version_not_installed(self, path):
107+ path.return_value = False
108+ self.assertEquals(ceph_utils.ceph_version(), None)
109+
110+ @patch.object(ceph_utils, 'check_output')
111+ @patch('os.path.exists')
112+ def test_ceph_version_error(self, path, output):
113+ path.return_value = True
114+ output.return_value = ''
115+ self.assertEquals(ceph_utils.ceph_version(), None)
116+
117+ @patch.object(ceph_utils, 'check_output')
118+ @patch('os.path.exists')
119+ def test_ceph_version_ok(self, path, output):
120+ path.return_value = True
121+ output.return_value = 'ceph version 0.67.4'\
122+ ' (ad85b8bfafea6232d64cb7ba76a8b6e8252fa0c7)'
123+ self.assertEquals(ceph_utils.ceph_version(), '0.67.4')

Subscribers

People subscribed via source and target branches