mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
ipatests: add installer framework testing
Reviewed-By: Rob Crittenden <rcritten@redhat.com> Reviewed-By: Christian Heimes <cheimes@redhat.com> Reviewed-By: Tibor Dudlak <tdudlak@redhat.com>
This commit is contained in:
parent
59ef5371e1
commit
d473278621
@ -303,7 +303,11 @@ class ConfigureTool(admintool.AdminTool):
|
|||||||
elif not no_file:
|
elif not no_file:
|
||||||
logger.debug('Not logging to a file')
|
logger.debug('Not logging to a file')
|
||||||
|
|
||||||
def run(self):
|
def init_configurator(self):
|
||||||
|
"""Executes transformation, getting a flattened Installer object
|
||||||
|
|
||||||
|
:returns: common.installer.Installer object
|
||||||
|
"""
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
|
|
||||||
transformed_cls = self._transform(self.configurable_class)
|
transformed_cls = self._transform(self.configurable_class)
|
||||||
@ -318,7 +322,7 @@ class ConfigureTool(admintool.AdminTool):
|
|||||||
kwargs['interactive'] = True
|
kwargs['interactive'] = True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cfgr = transformed_cls(**kwargs)
|
return transformed_cls(**kwargs)
|
||||||
except core.KnobValueError as e:
|
except core.KnobValueError as e:
|
||||||
knob_cls = knob_classes[e.name]
|
knob_cls = knob_classes[e.name]
|
||||||
try:
|
try:
|
||||||
@ -332,6 +336,9 @@ class ConfigureTool(admintool.AdminTool):
|
|||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
self.option_parser.error(str(e))
|
self.option_parser.error(str(e))
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
cfgr = self.init_configurator()
|
||||||
|
|
||||||
signal.signal(signal.SIGTERM, self.__signal_handler)
|
signal.signal(signal.SIGTERM, self.__signal_handler)
|
||||||
|
|
||||||
if self.use_private_ccache:
|
if self.use_private_ccache:
|
||||||
|
176
ipatests/test_ipaserver/test_install/test_installer.py
Normal file
176
ipatests/test_ipaserver/test_install/test_installer.py
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2018 FreeIPA Contributors. See COPYING for license
|
||||||
|
#
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
|
from abc import ABCMeta, abstractproperty
|
||||||
|
from collections import namedtuple
|
||||||
|
import itertools
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
from ipatests.util import assert_equal
|
||||||
|
from ipaserver.install.ipa_replica_install import ReplicaInstall
|
||||||
|
|
||||||
|
Keyval = namedtuple('Keyval', ['option', 'value'])
|
||||||
|
|
||||||
|
|
||||||
|
class InstallerTestBase(six.with_metaclass(ABCMeta, object)):
|
||||||
|
OPTS_DICT = {}
|
||||||
|
|
||||||
|
# don't allow creating classes with tested_cls unspecified
|
||||||
|
@abstractproperty
|
||||||
|
def tested_cls(self):
|
||||||
|
return None
|
||||||
|
|
||||||
|
def setup_class(self):
|
||||||
|
"""Initializes the tested class so that it can be used later on
|
||||||
|
"""
|
||||||
|
self.tested_cls.make_parser()
|
||||||
|
assert \
|
||||||
|
getattr(self.tested_cls, 'option_parser', False), \
|
||||||
|
("Unable to generate option parser for {}"
|
||||||
|
.format(self.tested_cls.__name__))
|
||||||
|
|
||||||
|
self._populate_opts_dict()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _populate_opts_dict(cls):
|
||||||
|
"""Populate the class-owned OPTS_DICT with available options
|
||||||
|
"""
|
||||||
|
if not getattr(cls.tested_cls, 'option_parser', False):
|
||||||
|
raise RuntimeError("You need to create the parser of the tested "
|
||||||
|
"class first.")
|
||||||
|
|
||||||
|
# add all options from the option groups
|
||||||
|
# pylint: disable=no-member
|
||||||
|
for opt_group in cls.tested_cls.option_parser.option_groups:
|
||||||
|
for opt in opt_group.option_list:
|
||||||
|
cls.OPTS_DICT[opt.dest] = opt._short_opts + opt._long_opts
|
||||||
|
# add options outside groups
|
||||||
|
for opt in cls.tested_cls.option_parser.option_list:
|
||||||
|
cls.OPTS_DICT[opt.dest] = opt._short_opts + opt._long_opts
|
||||||
|
|
||||||
|
def parse_cli_args(self, args):
|
||||||
|
"""Parses the CLI-like arguments and returns them in python objects
|
||||||
|
|
||||||
|
:param args: A string representing the CLI arguments
|
||||||
|
|
||||||
|
:returns: dictionary and a list of parsed options and arguments
|
||||||
|
"""
|
||||||
|
return self.tested_cls.option_parser.parse_args(args.split())
|
||||||
|
|
||||||
|
def get_installer_instance(self, args):
|
||||||
|
"""Get instance of the configuring class
|
||||||
|
"""
|
||||||
|
parsed_opts = self.parse_cli_args(args)
|
||||||
|
cls = self.tested_cls.get_command_class(*parsed_opts)
|
||||||
|
command_instance = cls(*parsed_opts)
|
||||||
|
return command_instance.init_configurator()
|
||||||
|
|
||||||
|
def combine_options(self, *args):
|
||||||
|
return ' '.join(args)
|
||||||
|
|
||||||
|
def all_option_permutations(self, *key_val):
|
||||||
|
"""Gets all short-option/long-option permutations
|
||||||
|
|
||||||
|
:param key_val: Keyval tuples specifying the options to grab from
|
||||||
|
OPTS_DICT along with the values to assign to them
|
||||||
|
|
||||||
|
:returns: list or list of lists of all permutations
|
||||||
|
"""
|
||||||
|
if len(key_val) == 0:
|
||||||
|
return []
|
||||||
|
elif len(key_val) == 1:
|
||||||
|
val = key_val[0].value
|
||||||
|
return ['{opt} {val}'.format(opt=opt, val=val)
|
||||||
|
for opt in self.OPTS_DICT[key_val[0].option]]
|
||||||
|
|
||||||
|
permutation_lists = [self.OPTS_DICT[k.option] for k in key_val]
|
||||||
|
permutation = itertools.product(*permutation_lists)
|
||||||
|
|
||||||
|
ret = []
|
||||||
|
for p in permutation:
|
||||||
|
opt_vals = []
|
||||||
|
for i, kv in enumerate(key_val):
|
||||||
|
opt_vals.append(
|
||||||
|
'{opt} {val}'.format(
|
||||||
|
opt=p[i], val=kv.value))
|
||||||
|
ret.append(opt_vals)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
class TestReplicaInstaller(InstallerTestBase):
|
||||||
|
tested_cls = ReplicaInstall
|
||||||
|
|
||||||
|
PASSWORD = Keyval("auto_password",
|
||||||
|
"c3ca2246bcf309d1b636581ce429da3522a8aec4")
|
||||||
|
ADMIN_PASSWORD = Keyval("admin_password", "milan_je_buh123")
|
||||||
|
PRINCIPAL = Keyval("principal", "ubercool_guy")
|
||||||
|
|
||||||
|
def test_password_option_DL1(self):
|
||||||
|
# OTP enrollment
|
||||||
|
for passwd_opt in self.all_option_permutations(self.PASSWORD):
|
||||||
|
ic = self.get_installer_instance(passwd_opt)
|
||||||
|
assert_equal(ic.password, self.PASSWORD.value)
|
||||||
|
|
||||||
|
# admin principal enrollment
|
||||||
|
for adm_password_opt in (
|
||||||
|
self.all_option_permutations(self.ADMIN_PASSWORD)
|
||||||
|
):
|
||||||
|
ic = self.get_installer_instance(adm_password_opt)
|
||||||
|
assert_equal(ic.password, None)
|
||||||
|
assert_equal(ic.admin_password, self.ADMIN_PASSWORD.value)
|
||||||
|
|
||||||
|
# if principal is set, we interpret --password as that principal's
|
||||||
|
for passwd_opt, principal_opt in (
|
||||||
|
self.all_option_permutations(self.PASSWORD, self.PRINCIPAL)
|
||||||
|
):
|
||||||
|
ic = self.get_installer_instance(
|
||||||
|
self.combine_options(passwd_opt, principal_opt))
|
||||||
|
assert_equal(ic.password, None)
|
||||||
|
assert_equal(ic.principal, self.PRINCIPAL.value)
|
||||||
|
assert_equal(ic.admin_password, self.PASSWORD.value)
|
||||||
|
|
||||||
|
# if principal is set, we interpret --password as that principal's
|
||||||
|
# unless admin-password is also specified, in which case it's once
|
||||||
|
# again an OTP
|
||||||
|
for adm_password_opt, passwd_opt, principal_opt in (
|
||||||
|
self.all_option_permutations(
|
||||||
|
self.ADMIN_PASSWORD, self.PASSWORD, self.PRINCIPAL)
|
||||||
|
):
|
||||||
|
ic = self.get_installer_instance(
|
||||||
|
self.combine_options(
|
||||||
|
adm_password_opt, passwd_opt, principal_opt))
|
||||||
|
assert_equal(ic.password, self.PASSWORD.value)
|
||||||
|
assert_equal(ic.principal, self.PRINCIPAL.value)
|
||||||
|
assert_equal(ic.admin_password, self.ADMIN_PASSWORD.value)
|
||||||
|
|
||||||
|
def test_password_option_DL0(self):
|
||||||
|
with tempfile.NamedTemporaryFile() as repl_file:
|
||||||
|
REPLICA_FILE_PATH = repl_file.name
|
||||||
|
# when --password is set in DL0 installation, it sets both
|
||||||
|
# password and dm_password attributes
|
||||||
|
for passwd_opt in self.all_option_permutations(self.PASSWORD):
|
||||||
|
ic = self.get_installer_instance(
|
||||||
|
self.combine_options(passwd_opt, REPLICA_FILE_PATH)
|
||||||
|
)
|
||||||
|
assert_equal(ic.password, self.PASSWORD.value)
|
||||||
|
assert_equal(ic.dm_password, self.PASSWORD.value)
|
||||||
|
assert_equal(ic.admin_password, None)
|
||||||
|
assert_equal(ic.principal, None)
|
||||||
|
|
||||||
|
# try adding admin_password just to see it is set correctly
|
||||||
|
for passwd_opt, adm_password_opt in (
|
||||||
|
self.all_option_permutations(
|
||||||
|
self.PASSWORD, self.ADMIN_PASSWORD)
|
||||||
|
):
|
||||||
|
ic = self.get_installer_instance(
|
||||||
|
self.combine_options(passwd_opt, adm_password_opt,
|
||||||
|
REPLICA_FILE_PATH)
|
||||||
|
)
|
||||||
|
assert_equal(ic.password, self.PASSWORD.value)
|
||||||
|
assert_equal(ic.admin_password, self.ADMIN_PASSWORD.value)
|
||||||
|
assert_equal(ic.dm_password, self.PASSWORD.value)
|
||||||
|
assert_equal(ic.principal, None)
|
Loading…
Reference in New Issue
Block a user