summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/config/cc_users_groups.py29
-rw-r--r--cloudinit/distros/__init__.py80
-rw-r--r--tests/unittests/test_distros/test_user_data_normalize.py103
3 files changed, 122 insertions, 90 deletions
diff --git a/cloudinit/config/cc_users_groups.py b/cloudinit/config/cc_users_groups.py
index 13eb1102..464f55c3 100644
--- a/cloudinit/config/cc_users_groups.py
+++ b/cloudinit/config/cc_users_groups.py
@@ -25,35 +25,8 @@ frequency = PER_INSTANCE
def handle(name, cfg, cloud, log, _args):
- def_u = None
- def_u_gs = None
- try:
- def_u = cloud.distro.get_default_user()
- def_u_gs = cloud.distro.get_default_user_groups()
- except NotImplementedError:
- log.warn(("Distro has not implemented default user "
- "creation. No default user will be added."))
-
- ((users, default_user), groups) = distros.normalize_users_groups(cfg,
- def_u,
- def_u_gs)
+ (users, groups) = distros.normalize_users_groups(cfg, cloud.distro)
for (name, members) in groups.items():
cloud.distro.create_group(name, members)
-
- if default_user:
- user = default_user['name']
- config = default_user['config']
- def_base_config = {
- 'plain_text_passwd': user,
- 'home': "/home/%s" % user,
- 'shell': "/bin/bash",
- 'lock_passwd': True,
- 'gecos': "%s%s" % (user.title()),
- 'sudo': "ALL=(ALL) NOPASSWD:ALL",
- }
- u_config = util.mergemanydict([def_base_config, config])
- cloud.distro.create_user(user, **u_config)
- log.info("Added default '%s' user with passwordless sudo", user)
-
for (user, config) in users.items():
cloud.distro.create_user(user, **config)
diff --git a/cloudinit/distros/__init__.py b/cloudinit/distros/__init__.py
index b43d662e..7340fa84 100644
--- a/cloudinit/distros/__init__.py
+++ b/cloudinit/distros/__init__.py
@@ -175,12 +175,20 @@ class Distro(object):
return False
def get_default_user(self):
- return self.default_user
-
- def get_default_user_groups(self):
- if not self.default_user_groups:
- return []
- return _uniq_merge_sorted(self.default_user_groups)
+ if not self.default_user:
+ return None
+ user_cfg = {
+ 'name': self.default_user,
+ 'plain_text_passwd': self.default_user,
+ 'home': "/home/%s" % (self.default_user),
+ 'shell': "/bin/bash",
+ 'lock_passwd': True,
+ 'gecos': "%s" % (self.default_user.title()),
+ 'sudo': "ALL=(ALL) NOPASSWD:ALL",
+ }
+ if self.default_user_groups:
+ user_cfg['groups'] = _uniq_merge_sorted(self.default_user_groups)
+ return user_cfg
def create_user(self, name, **kwargs):
"""
@@ -428,7 +436,7 @@ def _normalize_groups(grp_cfg):
return groups
-def _normalize_users(u_cfg, def_user=None, def_user_groups=None):
+def _normalize_users(u_cfg, def_user_cfg=None):
if isinstance(u_cfg, (dict)):
ad_ucfg = []
for (k, v) in u_cfg.items():
@@ -480,35 +488,55 @@ def _normalize_users(u_cfg, def_user=None, def_user_groups=None):
users = c_users
# Fixup the default user into the real
- # default user name and extract it
- default_user = {}
+ # default user name and replace it...
if users and 'default' in users:
def_config = users.pop('default')
- def_groups = def_user_groups or []
- if def_user:
- u_config = users.pop(def_user, None) or {}
- u_groups = u_config.get('groups') or []
- u_groups = _uniq_merge_sorted(u_groups, def_groups)
- u_config['groups'] = ",".join(u_groups)
- default_user = {
- 'name': def_user,
- 'config': util.mergemanydict([def_config, u_config]),
- }
+ if def_user_cfg:
+ def_user = def_user_cfg.pop('name')
+ def_groups = def_user_cfg.pop('groups', [])
+ parsed_config = users.pop(def_user, {})
+ users_groups = _uniq_merge_sorted(parsed_config.get('groups', []),
+ def_groups)
+ parsed_config['groups'] = ",".join(users_groups)
+ users[def_user] = util.mergemanydict([def_user_cfg,
+ def_config,
+ parsed_config])
- return (default_user, users)
+ return users
-def normalize_users_groups(cfg, def_user=None, def_user_groups=None):
+def normalize_users_groups(cfg, distro):
users = {}
groups = {}
- default_user = {}
if 'groups' in cfg:
groups = _normalize_groups(cfg['groups'])
+ old_user = None
+ if 'user' in cfg:
+ old_user = str(cfg['user'])
if 'users' in cfg:
- (default_user, users) = _normalize_users(cfg['users'],
- def_user,
- def_user_groups)
- return ((users, default_user), groups)
+ default_user_config = None
+ try:
+ default_user_config = distro.get_default_user()
+ except NotImplementedError:
+ LOG.warn(("Distro has not implemented default user "
+ "access. No default user will be normalized."))
+ base_users = cfg['users']
+ if isinstance(base_users, (list)):
+ if len(base_users) and old_user:
+ # The old user replaces user[0]
+ base_users[0] = {'name': old_user}
+ elif not base_users and old_user:
+ base.append({'name': old_user})
+ elif isinstance(base_users, (dict)):
+ # Sorry order not possible
+ if old_user and old_user not in base_users:
+ base_users[old_user] = True
+ elif isinstance(base_users, (str, basestring)):
+ # Just append it on to be re-parsed later
+ if old_user:
+ base_users += ",%s" % (old_user)
+ users = _normalize_users(base_users, default_user_config)
+ return (users, groups)
def fetch(name):
diff --git a/tests/unittests/test_distros/test_user_data_normalize.py b/tests/unittests/test_distros/test_user_data_normalize.py
index 46733452..4a4e1a29 100644
--- a/tests/unittests/test_distros/test_user_data_normalize.py
+++ b/tests/unittests/test_distros/test_user_data_normalize.py
@@ -20,43 +20,38 @@ class TestUGNormalize(MockerTestCase):
return distro
def _norm(self, cfg, distro):
- def_u = distro.get_default_user()
- def_u_gs = distro.get_default_user_groups()
- return distros.normalize_users_groups(cfg, def_u, def_u_gs)
+ return distros.normalize_users_groups(cfg, distro)
def test_basic_groups(self):
distro = self._make_distro('ubuntu')
ug_cfg = {
'groups': ['bob'],
}
- ((users, def_user), groups) = self._norm(ug_cfg, distro)
+ (users, groups) = self._norm(ug_cfg, distro)
self.assertIn('bob', groups)
self.assertEquals({}, users)
- self.assertEquals({}, def_user)
def test_csv_groups(self):
distro = self._make_distro('ubuntu')
ug_cfg = {
'groups': 'bob,joe,steve',
}
- ((users, def_user), groups) = self._norm(ug_cfg, distro)
+ (users, groups) = self._norm(ug_cfg, distro)
self.assertIn('bob', groups)
self.assertIn('joe', groups)
self.assertIn('steve', groups)
self.assertEquals({}, users)
- self.assertEquals({}, def_user)
def test_more_groups(self):
distro = self._make_distro('ubuntu')
ug_cfg = {
'groups': ['bob', 'joe', 'steve',]
}
- ((users, def_user), groups) = self._norm(ug_cfg, distro)
+ (users, groups) = self._norm(ug_cfg, distro)
self.assertIn('bob', groups)
self.assertIn('joe', groups)
self.assertIn('steve', groups)
self.assertEquals({}, users)
- self.assertEquals({}, def_user)
def test_member_groups(self):
distro = self._make_distro('ubuntu')
@@ -67,14 +62,13 @@ class TestUGNormalize(MockerTestCase):
'steve': [],
}
}
- ((users, def_user), groups) = self._norm(ug_cfg, distro)
+ (users, groups) = self._norm(ug_cfg, distro)
self.assertIn('bob', groups)
self.assertEquals(['s'], groups['bob'])
self.assertEquals([], groups['joe'])
self.assertIn('joe', groups)
self.assertIn('steve', groups)
self.assertEquals({}, users)
- self.assertEquals({}, def_user)
def test_users_simple_dict(self):
distro = self._make_distro('ubuntu', 'bob')
@@ -83,22 +77,22 @@ class TestUGNormalize(MockerTestCase):
'default': True,
}
}
- ((_users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertEquals('bob', def_user['name'])
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
ug_cfg = {
'users': {
'default': 'yes',
}
}
- ((_users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertEquals('bob', def_user['name'])
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
ug_cfg = {
'users': {
'default': '1',
}
}
- ((_users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertEquals('bob', def_user['name'])
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
def test_users_simple_dict_no(self):
distro = self._make_distro('ubuntu', 'bob')
@@ -107,22 +101,22 @@ class TestUGNormalize(MockerTestCase):
'default': False,
}
}
- ((_users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertEquals({}, def_user)
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertEquals({}, users)
ug_cfg = {
'users': {
'default': 'no',
}
}
- ((_users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertEquals({}, def_user)
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertEquals({}, users)
def test_users_simple_csv(self):
distro = self._make_distro('ubuntu')
ug_cfg = {
'users': 'joe,bob',
}
- ((users, _def_user), _groups) = self._norm(ug_cfg, distro)
+ (users, _groups) = self._norm(ug_cfg, distro)
self.assertIn('joe', users)
self.assertIn('bob', users)
self.assertEquals({}, users['joe'])
@@ -136,12 +130,51 @@ class TestUGNormalize(MockerTestCase):
'bob'
],
}
- ((users, _def_user), _groups) = self._norm(ug_cfg, distro)
+ (users, _groups) = self._norm(ug_cfg, distro)
self.assertIn('joe', users)
self.assertIn('bob', users)
self.assertEquals({}, users['joe'])
self.assertEquals({}, users['bob'])
+ def test_users_old_user(self):
+ distro = self._make_distro('ubuntu', 'bob')
+ ug_cfg = {
+ 'user': 'zetta',
+ 'users': 'default'
+ }
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
+ self.assertIn('zetta', users)
+ self.assertNotIn('default', users)
+ ug_cfg = {
+ 'user': 'zetta',
+ 'users': 'default, joe'
+ }
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
+ self.assertIn('joe', users)
+ self.assertIn('zetta', users)
+ self.assertNotIn('default', users)
+ ug_cfg = {
+ 'user': 'zetta',
+ 'users': ['bob', 'joe']
+ }
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertNotIn('bob', users)
+ self.assertIn('joe', users)
+ self.assertIn('zetta', users)
+ ug_cfg = {
+ 'user': 'zetta',
+ 'users': {
+ 'bob': True,
+ 'joe': True,
+ }
+ }
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
+ self.assertIn('joe', users)
+ self.assertIn('zetta', users)
+
def test_users_dict_default_additional(self):
distro = self._make_distro('ubuntu', 'bob')
ug_cfg = {
@@ -149,13 +182,12 @@ class TestUGNormalize(MockerTestCase):
{'name': 'default', 'blah': True}
],
}
- ((users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertIn('bob', def_user['name'])
- self.assertEquals(",".join(distro.get_default_user_groups()),
- def_user['config']['groups'])
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
+ self.assertEquals(",".join(distro.get_default_user()['groups']),
+ users['bob']['groups'])
self.assertEquals(True,
- def_user['config']['blah'])
- self.assertNotIn('bob', users)
+ users['bob']['blah'])
def test_users_dict_default(self):
distro = self._make_distro('ubuntu', 'bob')
@@ -164,11 +196,10 @@ class TestUGNormalize(MockerTestCase):
'default',
],
}
- ((users, def_user), _groups) = self._norm(ug_cfg, distro)
- self.assertIn('bob', def_user['name'])
- self.assertEquals(",".join(distro.get_default_user_groups()),
- def_user['config']['groups'])
- self.assertNotIn('bob', users)
+ (users, _groups) = self._norm(ug_cfg, distro)
+ self.assertIn('bob', users)
+ self.assertEquals(",".join(distro.get_default_user()['groups']),
+ users['bob']['groups'])
def test_users_dict_trans(self):
distro = self._make_distro('ubuntu')
@@ -179,7 +210,7 @@ class TestUGNormalize(MockerTestCase):
{'name': 'bob'},
],
}
- ((users, _def_user), _groups) = self._norm(ug_cfg, distro)
+ (users, _groups) = self._norm(ug_cfg, distro)
self.assertIn('joe', users)
self.assertIn('bob', users)
self.assertEquals({'tr_me': True}, users['joe'])
@@ -193,7 +224,7 @@ class TestUGNormalize(MockerTestCase):
{'name': 'bob'},
],
}
- ((users, _def_user), _groups) = self._norm(ug_cfg, distro)
+ (users, _groups) = self._norm(ug_cfg, distro)
self.assertIn('joe', users)
self.assertIn('bob', users)
self.assertEquals({}, users['joe'])