Assign username from config if none is given

When hooks/keystone_utils.py:get_admin_passwd is called without the user
parameter, the parameter should default to config('admin-user')

Also changed the log, to use the parameter for consistency with facts.

Don't assume 'admin' is always the username for admin, when setting the
admin password.

Added unittests to check the various options, either specifying the
username via function arguments, or use setting from
config('admin-user').

Change-Id: I02726c07ee4ed1e78ea1bfaa93adc2564a1a8236
Closes-Bug: 1794893
This commit is contained in:
Wouter van Bommel 2018-09-28 13:45:10 +02:00
parent 59561fdda0
commit 78f2e5e049
2 changed files with 48 additions and 3 deletions

View File

@ -1176,12 +1176,14 @@ def get_admin_passwd(user=None):
if passwd and passwd.lower() != "none":
return passwd
if user is None:
user = config('admin-user')
_migrate_admin_password()
passwd = leader_get('{}_passwd'.format(user))
if not passwd and is_leader():
log("Generating new passwd for user: %s" %
config("admin-user"))
log("Generating new passwd for user: %s" % user)
cmd = ['pwgen', '-c', '16', '1']
passwd = str(subprocess.check_output(cmd).decode('UTF-8')).strip()
@ -1190,7 +1192,7 @@ def get_admin_passwd(user=None):
def set_admin_passwd(passwd, user=None):
if user is None:
user = 'admin'
user = config('admin-user')
leader_set({'{}_passwd'.format(user): passwd})

View File

@ -637,6 +637,49 @@ class TestKeystoneUtils(CharmTestCase):
self.test_config.set('admin-password', 'supersecret')
self.assertEqual(utils.get_admin_passwd(), 'supersecret')
@patch.object(utils, 'is_leader')
@patch.object(utils, 'leader_get')
def test_get_admin_passwd_leader_set(self, leader_get, is_leader):
is_leader.return_value = False
leader_get.return_value = 'admin'
self.assertEqual(utils.get_admin_passwd(), 'admin')
leader_get.assert_called_with('admin_passwd')
@patch.object(utils, 'is_leader')
@patch.object(utils, 'leader_get')
def test_get_admin_passwd_leader_set_user_specified(self, leader_get,
is_leader):
is_leader.return_value = False
leader_get.return_value = 'admin'
self.assertEqual(utils.get_admin_passwd(user='test'), 'admin')
leader_get.assert_called_with('test_passwd')
@patch.object(utils, 'is_leader')
@patch.object(utils, 'leader_get')
def test_get_admin_passwd_leader_set_user_config(self, leader_get,
is_leader):
is_leader.return_value = False
leader_get.return_value = 'admin'
self.test_config.set('admin-user', 'test')
self.assertEqual(utils.get_admin_passwd(), 'admin')
leader_get.assert_called_with('test_passwd')
@patch.object(utils, 'leader_set')
def test_set_admin_password(self, leader_set):
utils.set_admin_passwd('secret')
leader_set.assert_called_once_with({'admin_passwd': 'secret'})
@patch.object(utils, 'leader_set')
def test_set_admin_password_config_username(self, leader_set):
self.test_config.set('admin-user', 'username')
utils.set_admin_passwd('secret')
leader_set.assert_called_once_with({'username_passwd': 'secret'})
@patch.object(utils, 'leader_set')
def test_set_admin_password_username(self, leader_set):
utils.set_admin_passwd('secret', user='username')
leader_set.assert_called_once_with({'username_passwd': 'secret'})
@patch.object(utils, 'is_leader')
@patch.object(utils, 'leader_get')
@patch('os.path.isfile')