Fix the merging of group configuration
when that group configuration is a dict => members.
This commit is contained in:
@@ -425,12 +425,36 @@ def _get_arch_package_mirror_info(package_mirrors, arch):
|
||||
# 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():
|
||||
|
||||
@@ -30,6 +30,28 @@ class TestUGNormalize(MockerTestCase):
|
||||
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 = {
|
||||
|
||||
Reference in New Issue
Block a user