Skip to content

Commit

Permalink
ipatests: test_installation: add install test scenarios
Browse files Browse the repository at this point in the history
test_hostname_parameter: Test for issue 2692 ipa-server-install ignores --hostname:
check whether hostname provided in `--hostname` parameter is being taken into account and set as new hostname without prompting for it again

test_ad_subpackage_dependency: Test for issue 4011 ipa-server-install crashes when AD subpackage is not installed:
test if ipa-server installation succeeds without `freeipa-ipa-server-trust-ad` installed

test_backup_of_cs_cfg_should_be_created: Test for issue 4166 Backup CS.cfg before modifying it:
test if ipa-server installer backs up CS.cfg before modifying it

test_installer_wizard_should_prompt_for_DNS: Test for issue 2575 [RFE] Installer wizard should prompt for DNS:
test if installer is asking for DNS setup details if not provided as parameter

Related: https://pagure.io/freeipa/issue/2692
Related: https://pagure.io/freeipa/issue/4011
Related: https://pagure.io/freeipa/issue/4166
Related: https://pagure.io/freeipa/issue/2575

Signed-off-by: Michal Polovka <mpolovka@redhat.com>
Reviewed-By: Michal Polovka <mpolovka@redhat.com>
Reviewed-By: Sergey Orlov <sorlov@redhat.com>
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
  • Loading branch information
miskopo committed May 7, 2021
1 parent 35198be commit a213110
Showing 1 changed file with 172 additions and 1 deletion.
173 changes: 172 additions & 1 deletion ipatests/test_integration/test_installation.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,17 @@ def wrapped(*args):
return wrapped


@pytest.fixture
def server_cleanup(request):
"""
Fixture to uninstall ipa server before and after the test
"""
host = request.cls.master
tasks.uninstall_master(host)
yield
tasks.uninstall_master(host)


class InstallTestBase1(IntegrationTest):

num_replicas = 3
Expand Down Expand Up @@ -662,7 +673,6 @@ def get_pki_tomcatd_pid(host):
break
return(pid)


def get_ipa_services_pids(host):
ipa_services_name = [
"krb5kdc", "kadmin", "named", "httpd", "ipa-custodia",
Expand Down Expand Up @@ -1119,6 +1129,113 @@ def run_request(url, expected_stdout=None, expected_stderr=None):
expected_stdout=f'href="https://{self.master.hostname}/'
)

def test_hostname_parameter(self, server_cleanup):
"""
Test that --hostname parameter is respected in interactive mode.
https://pagure.io/freeipa/issue/2692
"""
original_hostname = self.master.hostname
new_hostname = 'new.' + original_hostname
# New hostname is added into /etc/hosts as the installer
# is looking for it for resolution. Without it, an installation
# fails with `Unable to resolve host name, check /etc/hosts or DNS
# name resolution`.
hosts = self.master.get_file_contents(paths.HOSTS, encoding='utf-8')
new_hosts = hosts.replace(original_hostname, new_hostname)
self.master.put_file_contents(paths.HOSTS, new_hosts)
try:
cmd = ['ipa-server-install', '--hostname', new_hostname]
with self.master.spawn_expect(cmd) as e:
e.expect_exact('Do you want to configure integrated '
'DNS (BIND)? [no]: ')
e.sendline('no')
e.expect_exact('Please confirm the domain name [{}]: '.format(
original_hostname # DN is computed from new hostname
))
e.sendline(self.master.domain.name)
e.expect_exact('Please provide a realm name [{}]: '.format(
self.master.domain.realm
))
e.sendline(self.master.domain.realm)
e.expect_exact('Directory Manager password: ')
e.sendline(self.master.config.dirman_password)
e.expect_exact('Password (confirm): ')
e.sendline(self.master.config.dirman_password)
e.expect_exact('IPA admin password: ')
e.sendline(self.master.config.admin_password)
e.expect_exact('Password (confirm): ')
e.sendline(self.master.config.admin_password)
e.expect_exact('Do you want to configure chrony with '
'NTP server or pool address? [no]: ')
e.sendline('no')
e.expect_exact('Continue to configure the system '
'with these values? [no]: ')
e.sendline('yes')
e.expect_exit(ignore_remaining_output=True, timeout=720)
hostname = self.master.run_command([
'hostname', '-f']).stdout_text.strip()
assert hostname == new_hostname
finally:
# no need to restore the hostname as the installer
# does it during uninstallation
self.master.put_file_contents(paths.HOSTS, hosts)

def test_ad_subpackage_dependency(self, server_cleanup):
"""
Test if the installer is not dependant on trust-ad package and
succeeds even when AD subpackage is not installed
https://pagure.io/freeipa/issue/4011
"""
if osinfo.id == 'fedora':
package_name = 'freeipa-server-trust-ad'
else:
package_name = 'ipa-server-trust-ad'
reinstall = False
if tasks.is_package_installed(self.master, package_name):
tasks.uninstall_packages(self.master, [package_name])
reinstall = True
try:
tasks.install_master(self.master)
finally:
if reinstall:
tasks.install_packages(self.master, [package_name])

def test_backup_of_cs_cfg_is_created(self, server_cleanup):
"""
Test that the installer backs up CS.cfg configuration before it's
being modified.
https://pagure.io/freeipa/issue/4166
"""
bcp_location = paths.CA_CS_CFG_PATH + '.ipabkp'
original_cfg_content = None
if self.master.transport.file_exists(paths.CA_CS_CFG_PATH):
original_cfg_content = self.master.get_file_contents(
paths.CA_CS_CFG_PATH, encoding='utf-8')

time_before_install = int(self.master.run_command(
['date', '+%s']).stdout_text.strip())
tasks.install_master(self.master)
ipaserver_install_log = self.master.get_file_contents(
paths.IPASERVER_INSTALL_LOG, encoding='utf-8')
assert 'backing up CS.cfg' in ipaserver_install_log
assert self.master.transport.file_exists(bcp_location)

cfg_mod_time = int(self.master.run_command(
['stat', '-c', '%Y', paths.CA_CS_CFG_PATH]).stdout_text.strip())
bcp_mod_time = int(self.master.run_command(
['stat', '-c', '%Y', bcp_location]).stdout_text.strip())

# check if the backup file was modified/created during the installation
# and before the original file was modified
assert time_before_install <= bcp_mod_time <= cfg_mod_time
bcp_cfg_content = self.master.get_file_contents(
paths.CA_CS_CFG_PATH + '.ipabkp', encoding='utf-8')
if original_cfg_content is not None:
assert original_cfg_content == bcp_cfg_content


class TestInstallMasterKRA(IntegrationTest):

Expand Down Expand Up @@ -1216,6 +1333,60 @@ def test_server_install_lock_bind_recursion(self):
def test_install_kra(self):
tasks.install_kra(self.master, first_instance=True)

def test_installer_wizard_prompts_for_DNS(self, server_cleanup):
"""
Installer wizard should prompt for DNS even if --setup-dns is not
provided as an argument.
https://pagure.io/freeipa/issue/2575
"""
cmd = ['ipa-server-install']
with self.master.spawn_expect(cmd) as e:
e.expect_exact('Do you want to configure integrated '
'DNS (BIND)? [no]: ')
e.sendline('yes')
e.expect_exact('Server host name [{}]: '.format(
self.master.hostname))
e.sendline(self.master.hostname)
e.expect_exact('Please confirm the domain name [{}]: '.format(
self.master.domain.name))
e.sendline(self.master.domain.name)
e.expect_exact('Please provide a realm name [{}]: '.format(
self.master.domain.realm
))
e.sendline(self.master.domain.realm)

e.expect_exact('Directory Manager password: ')
e.sendline(self.master.config.dirman_password)
e.expect_exact('Password (confirm): ')
e.sendline(self.master.config.dirman_password)

e.expect_exact('IPA admin password: ')
e.sendline(self.master.config.admin_password)
e.expect_exact('Password (confirm): ')
e.sendline(self.master.config.admin_password)

e.expect_exact(
'Do you want to configure DNS forwarders? [yes]: ')
e.sendline('no') # irrelevant for this test
e.expect_exact('Do you want to search for missing reverse '
'zones? [yes]: ')
e.sendline('no') # irrelevant for this test
e.expect_exact('Do you want to configure chrony with NTP '
'server or pool address? [no]: ')
e.sendline('no') # irrelevant for this test
e.expect_exact('Continue to configure the system with these '
'values? [no]: ')
e.sendline('yes')
e.expect_exit(ignore_remaining_output=True, timeout=720)

tasks.kinit_admin(self.master)
result = self.master.run_command(
['ipa', 'dnszone-show', self.master.domain.name]
).stdout_text

assert 'Active zone: TRUE' in result


class TestInstallMasterDNSRepeatedly(IntegrationTest):
""" Test that a repeated installation of the primary with DNS enabled
Expand Down

0 comments on commit a213110

Please sign in to comment.