Merge ~hopem/ua-reviewkit:juju-storage-checks into ua-reviewkit:master

Proposed by Edward Hope-Morley
Status: Merged
Approved by: Amad Ali
Approved revision: d211cacfac964e6a8ccbe9334dfd5325ff20be1b
Merged at revision: 989f8b507f68f5a06fb11285883a57fba8f1a35a
Proposed branch: ~hopem/ua-reviewkit:juju-storage-checks
Merge into: ua-reviewkit:master
Diff against target: 80 lines (+51/-0)
2 files modified
juju/checks/openstack.yaml (+5/-0)
juju/ua-bundle-check.py (+46/-0)
Reviewer Review Type Date Requested Status
UA Reviewers Pending
Review via email: mp+384417@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Amad Ali (amad) wrote :

lgtm. Have testing it against a few deployments

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/juju/checks/openstack.yaml b/juju/checks/openstack.yaml
2index e8fd4a9..501bae6 100644
3--- a/juju/checks/openstack.yaml
4+++ b/juju/checks/openstack.yaml
5@@ -140,6 +140,11 @@ checks:
6 isset:
7 scope: config
8 source: bundle
9+ ephemeral-device:
10+ exclusive_backing_dev:
11+ description: "ensure that nova instances path (if using bcache) is not backed by same physical disk as rootfs"
12+ scope: config
13+ source: bucketsconfig
14 octavia:
15 charm: "cs:.*octavia[-]?[0-9]*$"
16 assertions:
17diff --git a/juju/ua-bundle-check.py b/juju/ua-bundle-check.py
18index ec21bc1..dbb6a96 100755
19--- a/juju/ua-bundle-check.py
20+++ b/juju/ua-bundle-check.py
21@@ -213,6 +213,45 @@ class AssertionHelpers(object):
22
23 return ret
24
25+ def _find_disklabel_users(self, disks, label):
26+ devs = []
27+ for disk in disks:
28+ if disk['type'] == "bcache":
29+ backing_dev = disk['backing_device']
30+ disklabel = re.compile("([a-z0-9]+)-.+").match(backing_dev)
31+ if disklabel and disklabel[1] == label:
32+ devs.append(disk.get('name', "unknown"))
33+
34+ return devs
35+
36+ def exclusive_backing_dev(self, app, opt, value):
37+ current = app.get('options', [])[opt]
38+ ret = CheckResult(0, opt=opt, reason="value={}".format(current))
39+
40+ with open(value) as fd:
41+ y = yaml.safe_load(fd)
42+ disks = y.get('configs',
43+ {}).get('hyperconverged',
44+ {}).get('disks', {})
45+
46+ disklabel = None
47+ for disk in disks:
48+ if disk.get('name') == os.path.basename(current):
49+ if disk['type'] == "bcache":
50+ backing_dev = disk['backing_device']
51+ diskprefix = (re.compile("([a-z0-9]+)-.+")
52+ .match(backing_dev))
53+ break
54+
55+ if diskprefix:
56+ devs = self._find_disklabel_users(disks, diskprefix[1])
57+ if len(devs) > 1:
58+ ret.reason = ("bcaches sharing same backing disk: {}"
59+ .format(devs))
60+ ret.rc = 1
61+
62+ return ret
63+
64
65 class UABundleChecker(object):
66
67@@ -331,6 +370,13 @@ class UABundleChecker(object):
68 format(master, assertion['value']))
69 self.add_result(CheckResult(2, opt=opt, reason=reason))
70 return
71+ elif assertion["source"] == "bucketsconfig": # bucketsconfig.yaml
72+ if not self.fce_config:
73+ reason = "fce config not available - skipping"
74+ self.add_result(CheckResult(1, opt=opt, reason=reason))
75+ return
76+
77+ value = os.path.join(self.fce_config, "bucketsconfig.yaml")
78 elif assertion["source"] == "bundle":
79 # value is ignored, ensure that settings is non-null
80 # only supported by isset() currently

Subscribers

People subscribed via source and target branches