← Back to team overview

cloud-init-dev team mailing list archive

[Merge] lp:~harlowja/cloud-init/group-dict-fix into lp:cloud-init

 

Joshua Harlow has proposed merging lp:~harlowja/cloud-init/group-dict-fix into lp:cloud-init.

Requested reviews:
  cloud init development team (cloud-init-dev)
Related bugs:
  Bug #1077245 in cloud-init: "Group configuration not allowing members"
  https://bugs.launchpad.net/cloud-init/+bug/1077245

For more details, see:
https://code.launchpad.net/~harlowja/cloud-init/group-dict-fix/+merge/133768
-- 
https://code.launchpad.net/~harlowja/cloud-init/group-dict-fix/+merge/133768
Your team cloud init development team is requested to review the proposed merge of lp:~harlowja/cloud-init/group-dict-fix into lp:cloud-init.
=== modified file 'cloudinit/distros/__init__.py'
--- cloudinit/distros/__init__.py	2012-11-09 22:40:41 +0000
+++ cloudinit/distros/__init__.py	2012-11-09 23:30:25 +0000
@@ -425,12 +425,36 @@
 # is the standard form used in the rest
 # of cloud-init
 def _normalize_groups(grp_cfg):
-    if isinstance(grp_cfg, (str, basestring, list)):
+    if isinstance(grp_cfg, (str, basestring)):
+        grp_cfg = grp_cfg.strip().split(",")
+    if isinstance(grp_cfg, (list)):
         c_grp_cfg = {}
-        for i in util.uniq_merge(grp_cfg):
-            c_grp_cfg[i] = []
+        for i in grp_cfg:
+            if isinstance(i, (dict)):
+                for k, v in i.items():
+                    if k not in c_grp_cfg:
+                        if isinstance(v, (list)):
+                            c_grp_cfg[k] = list(v)
+                        elif isinstance(v, (basestring, str)):
+                            c_grp_cfg[k] = [v]
+                        else:
+                            raise TypeError("Bad group member type %s" %
+                                            util.obj_name(v))
+                    else:
+                        if isinstance(v, (list)):
+                            c_grp_cfg[k].extend(v)
+                        elif isinstance(v, (basestring, str)):
+                            c_grp_cfg[k].append(v)
+                        else:
+                            raise TypeError("Bad group member type %s" %
+                                            util.obj_name(v))
+            elif isinstance(i, (str, basestring)):
+                if i not in c_grp_cfg:
+                    c_grp_cfg[i] = []
+            else:
+                raise TypeError("Unknown group name type %s" %
+                                util.obj_name(i))
         grp_cfg = c_grp_cfg
-
     groups = {}
     if isinstance(grp_cfg, (dict)):
         for (grp_name, grp_members) in grp_cfg.items():

=== modified file 'tests/unittests/test_distros/test_user_data_normalize.py'
--- tests/unittests/test_distros/test_user_data_normalize.py	2012-10-23 10:18:24 +0000
+++ tests/unittests/test_distros/test_user_data_normalize.py	2012-11-09 23:30:25 +0000
@@ -30,6 +30,28 @@
     def _norm(self, cfg, distro):
         return distros.normalize_users_groups(cfg, distro)
 
+    def test_group_dict(self):
+        distro = self._make_distro('ubuntu')
+        g = {'groups': [
+                {
+                    'ubuntu': ['foo', 'bar'],
+                    'bob': 'users',
+                },
+                'cloud-users',
+                {
+                    'bob': 'users2',
+                },
+            ]
+        }
+        (users, groups) = self._norm(g, distro)
+        self.assertIn('ubuntu', groups)
+        ub_members = groups['ubuntu']
+        self.assertEquals(sorted(['foo', 'bar']), sorted(ub_members))
+        self.assertIn('bob', groups)
+        b_members = groups['bob']
+        self.assertEquals(sorted(['users', 'users2']), 
+                          sorted(b_members))
+
     def test_basic_groups(self):
         distro = self._make_distro('ubuntu')
         ug_cfg = {


Follow ups