Merge lp:~harlowja/cloud-init/group-dict-fix into lp:~cloud-init-dev/cloud-init/trunk

Proposed by Joshua Harlow
Status: Merged
Merged at revision: 707
Proposed branch: lp:~harlowja/cloud-init/group-dict-fix
Merge into: lp:~cloud-init-dev/cloud-init/trunk
Diff against target: 77 lines (+50/-4)
2 files modified
cloudinit/distros/__init__.py (+28/-4)
tests/unittests/test_distros/test_user_data_normalize.py (+22/-0)
To merge this branch: bzr merge lp:~harlowja/cloud-init/group-dict-fix
Reviewer Review Type Date Requested Status
cloud-init Commiters Pending
Review via email: mp+133768@code.launchpad.net
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 'cloudinit/distros/__init__.py'
2--- cloudinit/distros/__init__.py 2012-11-09 22:40:41 +0000
3+++ cloudinit/distros/__init__.py 2012-11-09 23:30:25 +0000
4@@ -425,12 +425,36 @@
5 # is the standard form used in the rest
6 # of cloud-init
7 def _normalize_groups(grp_cfg):
8- if isinstance(grp_cfg, (str, basestring, list)):
9+ if isinstance(grp_cfg, (str, basestring)):
10+ grp_cfg = grp_cfg.strip().split(",")
11+ if isinstance(grp_cfg, (list)):
12 c_grp_cfg = {}
13- for i in util.uniq_merge(grp_cfg):
14- c_grp_cfg[i] = []
15+ for i in grp_cfg:
16+ if isinstance(i, (dict)):
17+ for k, v in i.items():
18+ if k not in c_grp_cfg:
19+ if isinstance(v, (list)):
20+ c_grp_cfg[k] = list(v)
21+ elif isinstance(v, (basestring, str)):
22+ c_grp_cfg[k] = [v]
23+ else:
24+ raise TypeError("Bad group member type %s" %
25+ util.obj_name(v))
26+ else:
27+ if isinstance(v, (list)):
28+ c_grp_cfg[k].extend(v)
29+ elif isinstance(v, (basestring, str)):
30+ c_grp_cfg[k].append(v)
31+ else:
32+ raise TypeError("Bad group member type %s" %
33+ util.obj_name(v))
34+ elif isinstance(i, (str, basestring)):
35+ if i not in c_grp_cfg:
36+ c_grp_cfg[i] = []
37+ else:
38+ raise TypeError("Unknown group name type %s" %
39+ util.obj_name(i))
40 grp_cfg = c_grp_cfg
41-
42 groups = {}
43 if isinstance(grp_cfg, (dict)):
44 for (grp_name, grp_members) in grp_cfg.items():
45
46=== modified file 'tests/unittests/test_distros/test_user_data_normalize.py'
47--- tests/unittests/test_distros/test_user_data_normalize.py 2012-10-23 10:18:24 +0000
48+++ tests/unittests/test_distros/test_user_data_normalize.py 2012-11-09 23:30:25 +0000
49@@ -30,6 +30,28 @@
50 def _norm(self, cfg, distro):
51 return distros.normalize_users_groups(cfg, distro)
52
53+ def test_group_dict(self):
54+ distro = self._make_distro('ubuntu')
55+ g = {'groups': [
56+ {
57+ 'ubuntu': ['foo', 'bar'],
58+ 'bob': 'users',
59+ },
60+ 'cloud-users',
61+ {
62+ 'bob': 'users2',
63+ },
64+ ]
65+ }
66+ (users, groups) = self._norm(g, distro)
67+ self.assertIn('ubuntu', groups)
68+ ub_members = groups['ubuntu']
69+ self.assertEquals(sorted(['foo', 'bar']), sorted(ub_members))
70+ self.assertIn('bob', groups)
71+ b_members = groups['bob']
72+ self.assertEquals(sorted(['users', 'users2']),
73+ sorted(b_members))
74+
75 def test_basic_groups(self):
76 distro = self._make_distro('ubuntu')
77 ug_cfg = {