URL: https://github.com/SSSD/sssd/pull/5899 Author: sidecontrol Title: #5899: Adding multidomain test cases for bz2013297 and bz2018432 Action: synchronized
To pull the PR as Git branch: git remote add ghsssd https://github.com/SSSD/sssd git fetch ghsssd pull/5899/head:pr5899 git checkout pr5899
From 79d9b980d9a07335456c7d0df03fb658cb069732 Mon Sep 17 00:00:00 2001 From: Dan Lavu <dl...@redhat.com> Date: Fri, 3 Dec 2021 06:29:34 -0500 Subject: [PATCH] Adding multidomain test cases for bz2013297 and bz2018432 Add multidomain pytest suite - bz2013297 and bz2018432 - this tset suite will provision 5 AD servers, parent, 2 childs, tree another forest Signed-off-by: Dan Lavu <dl...@redhat.com> --- src/tests/multihost/admultidomain/conftest.py | 165 +++++++++++++++++ src/tests/multihost/admultidomain/mhc.yaml | 62 +++++++ src/tests/multihost/admultidomain/pytest.ini | 6 + src/tests/multihost/admultidomain/readme.rst | 45 +++++ .../admultidomain/test_multidomain.py | 174 ++++++++++++++++++ .../multihost/sssd/testlib/common/qe_class.py | 14 +- 6 files changed, 464 insertions(+), 2 deletions(-) create mode 100644 src/tests/multihost/admultidomain/conftest.py create mode 100644 src/tests/multihost/admultidomain/mhc.yaml create mode 100644 src/tests/multihost/admultidomain/pytest.ini create mode 100644 src/tests/multihost/admultidomain/readme.rst create mode 100644 src/tests/multihost/admultidomain/test_multidomain.py diff --git a/src/tests/multihost/admultidomain/conftest.py b/src/tests/multihost/admultidomain/conftest.py new file mode 100644 index 0000000000..9af075ac51 --- /dev/null +++ b/src/tests/multihost/admultidomain/conftest.py @@ -0,0 +1,165 @@ + +""" Common AD Fixtures """ +from __future__ import print_function +import random +import subprocess +import time +import pytest +import ldap +import os +import posixpath +import pathlib +# pylint: disable=unused-import +from sssd.testlib.common.paths import SSSD_DEFAULT_CONF, NSSWITCH_DEFAULT_CONF +from sssd.testlib.common.qe_class import session_multihost +from sssd.testlib.common.qe_class import create_testdir +from sssd.testlib.common.exceptions import SSSDException +from sssd.testlib.common.utils import ADOperations +from sssd.testlib.common.exceptions import LdapException +from sssd.testlib.common.samba import sambaTools +from sssd.testlib.common.utils import sssdTools + + +def pytest_configure(): + """ Namespace hook, Adds below dict to pytest namespace """ + pytest.num_masters = 0 + pytest.num_ad = 4 + pytest.num_atomic = 0 + pytest.num_replicas = 0 + pytest.num_clients = 1 + pytest.num_others = 0 + + +# ######## Function scoped Fixtures #################### +@pytest.fixture(scope="function") +def adjoin(session_multihost, request): + """ Join to AD using net ads command """ + ad_realm = session_multihost.ad[0].realm + ad_ip = session_multihost.ad[0].ip + ad_host = session_multihost.ad[0].sys_hostname + client_ad = sssdTools(session_multihost.client[0], session_multihost.ad[0]) + client_ad.update_resolv_conf(session_multihost.ad[0]) + client_ad.clear_sssd_cache() + client_ad.systemsssdauth(ad_realm, ad_host) + client_ad.disjoin_ad() + client_ad.create_kdcinfo(ad_realm, ad_ip) + kinit = f'kinit Administrator@{ad_realm}' + ad_password = session_multihost.ad[0].ssh_password + try: + session_multihost.client[0].run_command(kinit, stdin_text=ad_password) + except subprocess.CalledProcessError: + pytest.fail("kinit failed") + + def _join(membersw=None): + """ Join AD """ + if membersw == 'samba': + client_ad.join_ad(ad_realm, ad_password, mem_sw='samba') + else: + client_ad.join_ad(ad_realm, ad_password) + + def adleave(): + """ Disjoin AD """ + client_ad.disjoin_ad() + remove_keytab = 'rm -f /etc/krb5.keytab' + kdestroy_cmd = 'kdestroy -A' + session_multihost.client[0].run_command(kdestroy_cmd) + session_multihost.client[0].run_command(remove_keytab) + request.addfinalizer(adleave) + return _join + + +@pytest.fixture(scope="function") +def adchildjoin(session_multihost, request): + """ Join to AD using net ads command """ + ad_realm = session_multihost.ad[1].realm + ad_ip = session_multihost.ad[1].ip + client_ad = sssdTools(session_multihost.client[0], session_multihost.ad[1]) + client_ad.disjoin_ad() + client_ad.create_kdcinfo(ad_realm, ad_ip) + kinit = "kinit Administrator@%s" % ad_realm + ad_password = session_multihost.ad[1].ssh_password + try: + session_multihost.client[0].run_command(kinit, stdin_text=ad_password) + except subprocess.CalledProcessError: + pytest.fail("kinit failed") + + def _join(membersw=None): + """ Join AD """ + if membersw == 'samba': + client_ad.join_ad(ad_realm, ad_password, mem_sw='samba') + else: + client_ad.join_ad(ad_realm, ad_password) + + def adleave(): + """ Disjoin AD """ + client_ad.disjoin_ad() + remove_keytab = 'rm -f /etc/krb5.keytab' + kdestroy_cmd = 'kdestroy -A' + session_multihost.client[0].run_command(kdestroy_cmd) + session_multihost.client[0].run_command(remove_keytab) + request.addfinalizer(adleave) + return _join + + +@pytest.fixture(scope='function') +def backupsssdconf(session_multihost, request): + """ Backup and restore sssd.conf """ + bkup = 'cp -f %s %s.orig' % (SSSD_DEFAULT_CONF, + SSSD_DEFAULT_CONF) + session_multihost.client[0].run_command(bkup) + session_multihost.client[0].service_sssd('stop') + + def restoresssdconf(): + """ Restore sssd.conf """ + restore = 'cp -f %s.orig %s' % (SSSD_DEFAULT_CONF, SSSD_DEFAULT_CONF) + session_multihost.client[0].run_command(restore) + request.addfinalizer(restoresssdconf) + + +# ############## class scoped Fixtures ############################## +@pytest.fixture(scope="class") +def multihost(session_multihost, request): + """ Multihost fixture to be used by tests + :param obj session_multihost: multihost object + :return obj session_multihost: return multihost object + :Exceptions: None + """ + if hasattr(request.cls(), 'class_setup'): + request.cls().class_setup(session_multihost) + request.addfinalizer( + lambda: request.cls().class_teardown(session_multihost)) + return session_multihost + + +@pytest.fixture(scope="class") +def clear_sssd_cache(session_multihost): + """ Clear sssd cache """ + client = sssdTools(session_multihost.client[0]) + client.clear_sssd_cache() + + +# ################### Session scoped fixtures ######################### +@pytest.fixture(scope="session", autouse=True) +def setup_session(request, session_multihost): + """ Setup Session """ + client = sssdTools(session_multihost.client[0]) + realm = session_multihost.ad[1].realm + ad_host = session_multihost.ad[1].sys_hostname + try: + master = sssdTools(session_multihost.master[0]) + except IndexError: + pass + else: + master.server_install_pkgs() + master.update_resolv_conf(session_multihost.ad[1].ip) + client.client_install_pkgs() + client.update_resolv_conf(session_multihost.ad[1].ip) + client.clear_sssd_cache() + client.systemsssdauth(realm, ad_host) + + def teardown_session(): + """ Teardown session """ + session_multihost.client[0].service_sssd('stop') + remove_sssd_conf = 'rm -f /etc/sssd/sssd.conf' + session_multihost.client[0].run_command(remove_sssd_conf) + request.addfinalizer(teardown_session) diff --git a/src/tests/multihost/admultidomain/mhc.yaml b/src/tests/multihost/admultidomain/mhc.yaml new file mode 100644 index 0000000000..97597332a7 --- /dev/null +++ b/src/tests/multihost/admultidomain/mhc.yaml @@ -0,0 +1,62 @@ +ad_admin_name: Administrator +ad_admin_password: Secret123 +ad_hostname: ad1-wr53 +ad_ip: 10.0.107.55 +ad_sub_domain: child1-wr53.domain-wr53.com +ad_sub_hostname: ad3-wr53 +ad_sub_ip: 10.0.104.122 +ad_top_domain: domain-wr53.com +admin_name: admin +admin_password: Secret.123 +dirman_dn: cn=Directory Manager +dirman_password: Secret.123 +dns_forwarder: 10.11.5.19 +domains: +- hosts: + - external_hostname: ci-vm-10-0-106-255.hosted.upshift.rdu2.redhat.com + ip: 10.0.106.255 + name: hostname1 + role: client + name: domain.com + type: sssd +- hosts: + - external_hostname: ci-vm-10-0-107-55.hosted.upshift.rdu2.redhat.com + host_type: windows + ip: 10.0.107.55 + name: ad1-wr53 + password: Secret123 + role: ad + username: Administrator + name: domain-wr53.com + type: ad +- hosts: + - external_hostname: ci-vm-10-0-104-122.hosted.upshift.rdu2.redhat.com + host_type: windows + ip: 10.0.104.122 + name: ad2-wr53 + password: Secret123 + role: ad + username: Administrator + name: child-wr53.domain-wr53.com + type: ad +- hosts: + - external_hostname: ci-vm-10-0-104-82.hosted.upshift.rdu2.redhat.com + host_type: windows + ip: 10.0.104.82 + name: ad3-wr53 + password: Secret123 + role: ad + username: Administrator + name: child1-wr53.domain-wr53.com + type: ad +- hosts: + - external_hostname: ci-vm-10-0-105-168.hosted.upshift.rdu2.redhat.com + host_type: windows + ip: 10.0.105.168 + name: ad4-wr53 + password: Secret123 + role: ad + username: Administrator + name: tdomain-wr53.com + type: ad +ssh_key_filename: ~/.ssh/idmci_rsa diff --git a/src/tests/multihost/admultidomain/pytest.ini b/src/tests/multihost/admultidomain/pytest.ini new file mode 100644 index 0000000000..704a0b1400 --- /dev/null +++ b/src/tests/multihost/admultidomain/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +markers = + admultidomain: Multidomain tests with multiple domains + tier1: All tier1 test cases + tier2: All tier2 test cases + tier3: All tier3 test cases diff --git a/src/tests/multihost/admultidomain/readme.rst b/src/tests/multihost/admultidomain/readme.rst new file mode 100644 index 0000000000..819f52b13c --- /dev/null +++ b/src/tests/multihost/admultidomain/readme.rst @@ -0,0 +1,45 @@ +AD Multidomain Provider Test Suite +====================== + +This directory contains automation for SSSD AD Provider +Multi-domain tests. + +Fixtures +======== + + +session +******* + +* setup_session: This fixtures does the following tasks: + + + * Install common required packages like + * Updated /etc/resolv.conf with Windows IP Address + * Clear sssd cache + * Configure system to use sssd authentication + + +* teardown_session: This is not a fixtures but a teardown of ``setup_session`` + + * Restores resolv.conf + * Stop sssd service + * remove sssd.conf + + +class +***** + +* multihost: This fixture returns multihost object. Also using builtin request + fixture we pass ``class_setup`` and ``class_teardown``. If the test suite defines + class_setup and class_teardown functions, multihost object will be available + to execute any remote functions. + +* clear_sssd_cache: Stops sssd service. Removes cache files from + ``/var/lib/sss/db`` and starts sssd service. Sleeps for 10 seconds. + +* joinad: Join the system to Windows AD using realm with membercli-software + being adcli. + +* joinad: Join the system to Windows AD using realm with membercli-software + being adcli. diff --git a/src/tests/multihost/admultidomain/test_multidomain.py b/src/tests/multihost/admultidomain/test_multidomain.py new file mode 100644 index 0000000000..b93cb10bfe --- /dev/null +++ b/src/tests/multihost/admultidomain/test_multidomain.py @@ -0,0 +1,174 @@ +""" AD-Provider AD Parameters tests ported from bash + +:requirement: ad_parameters +:casecomponent: sssd +:subsystemteam: sst_idm_sssd +:upstream: yes +""" +import tempfile +import pytest + +from sssd.testlib.common.utils import sssdTools +from sssd.testlib.common.utils import SSSDException +from sssd.testlib.common.utils import ADOperations + + +@pytest.fixture(scope="class") +def change_client_hostname(session_multihost, request): + """ Change client hostname to a truncated version in the AD domain""" + cmd = session_multihost.client[0].run_command( + 'hostname', raiseonerr=False) + old_hostname = cmd.stdout_text.rstrip() + ad_domain = session_multihost.ad[0].domainname + session_multihost.client[0].run_command( + f'hostname client.{ad_domain}', raiseonerr=False) + + def restore(): + """ Restore hostname """ + session_multihost.client[0].run_command( + f'hostname {old_hostname}', + raiseonerr=False + ) + request.addfinalizer(restore) + + +@pytest.mark.tier1 +@pytest.mark.admultidomain +@pytest.mark.usefixtures("change_client_hostname") +class TestADMultiDomain(object): + + @staticmethod + def test_0001_bz2013297(multihost, adchildjoin): + """ + :title: IDM-SSSD-TC: ad_provider: forests: disabled root ad domain + causes subdomains to be marked offline + :id: + :setup: + 1. Configure parent and child domain + 2. Join client to child domain + 3. ad_enabled_domains is not configured + 4. ad_enabled_domains to contain only the child domain + :steps: + 1. Lookup user from child domain + 2. Lookup user from parent domain + 3. Change ad_enabled_domains parameter + 4. Lookup user from child domain + 5. Lookup user from parent domain + :expectedresults: + 1. Parent user is found + 2. Child user is found + 3. Parent user is not found + 4. Child user is found + :customerscenario: True + """ + adchildjoin(membersw='adcli') + ad_domain = multihost.ad[0].domainname + ad_child_domain = multihost.ad[1].domainname + + # Configure sssd + multihost.client[0].service_sssd('stop') + client = sssdTools(multihost.client[0], multihost.ad[1]) + client.backup_sssd_conf() + dom_section = f'domain/{client.get_domain_section_name()}' + sssd_params = { + 'ad_domain': ad_child_domain, + 'debug_level': '9', + 'use_fully_qualified_names': 'True', + 'cache_credentials': 'True', + } + client.sssd_conf(dom_section, sssd_params) + client.clear_sssd_cache() + + # Search for the user in root domain + parent_cmd = multihost.client[0].run_command( + f'getent passwd user1@{ad_domain}', + raiseonerr=False + ) + # Search for the user in child domain + child_cmd = multihost.client[0].run_command( + f'getent passwd child_user1@{ad_child_domain}', + raiseonerr=False + ) + + client.restore_sssd_conf() + client.clear_sssd_cache() + + # Evaluate test results + assert parent_cmd.returncode == 0 + assert child_cmd.returncode == 0 + + dom_section = f'domain/{client.get_domain_section_name()}' + sssd_params = { + 'ad_domain': ad_child_domain, + 'debug_level': '9', + 'use_fully_qualified_names': 'True', + 'cache_credentials': 'True', + 'ad_enabled_domains': ad_child_domain + } + client.sssd_conf(dom_section, sssd_params) + client.clear_sssd_cache() + + # Search for the user in root domain + parent_cmd = multihost.client[0].run_command( + f'getent passwd user1@{ad_domain}', + raiseonerr=False + ) + # Search for the user in child domain + child_cmd = multihost.client[0].run_command( + f'getent passwd child_user1@{ad_child_domain}', + raiseonerr=False + ) + + client.restore_sssd_conf() + client.clear_sssd_cache() + + # Evaluate test results + assert parent_cmd.returncode == 2 + assert child_cmd.returncode == 0 + + @staticmethod + def test_0002_bz2018432(multihost, adjoin): + """ + :title: IDM-SSSD-TC: ad_provider: forests: based SSSD adds more AD + domains than it should based on the configuration file + :id: + :setup: + 1. Configure several domains, this suite contains 4 trusted domains + 2. Join client to parent domain + :steps: + 1. Perform sssctl domain-list + :expectedresults: + 1. Only trusted domains listed + :customerscenario: True + """ + adjoin(membersw='adcli') + ad_domain = multihost.ad[0].domainname + ad_child_domain = multihost.ad[1].domainname + ad_child1_domain = multihost.ad[2].domainname + ad_tree_domain = multihost.ad[3].domainname + + # Configure sssd + multihost.client[0].service_sssd('stop') + client = sssdTools(multihost.client[0], multihost.ad[0]) + client.backup_sssd_conf() + dom_section = f'domain/{client.get_domain_section_name()}' + sssd_params = { + 'ad_domain': ad_domain, + 'debug_level': '9', + 'use_fully_qualified_names': 'True', + 'cache_credentials': 'True' + } + client.sssd_conf(dom_section, sssd_params) + client.clear_sssd_cache() + # List domains + domain_list_cmd = multihost.client[0].run_command( + 'sssctl domain-list', raiseonerr=False) + ad_count = len(multihost.ad) + + assert str(ad_domain) \ + and str(ad_child_domain) \ + and str(ad_child1_domain) \ + and str(ad_tree_domain) \ + in domain_list_cmd.stdout_text + + assert len(domain_list_cmd.stdout_text.split('\n'))-2 == ad_count diff --git a/src/tests/multihost/sssd/testlib/common/qe_class.py b/src/tests/multihost/sssd/testlib/common/qe_class.py index 61df8eba3c..813301886d 100644 --- a/src/tests/multihost/sssd/testlib/common/qe_class.py +++ b/src/tests/multihost/sssd/testlib/common/qe_class.py @@ -54,6 +54,13 @@ def get_logger(self, name): log.addHandler(handler) return log + def filter(self, descriptions): + """ + Override default behavior to not filter hosts, so that it can work + with dynamic topologies. + """ + return + class QeBaseHost(pytest_multihost.host.BaseHost): """QeBaseHost subclass of multihost plugin BaseHost class.""" @@ -338,8 +345,11 @@ def session_multihost(request): mh.others = mh.domain.hosts_by_role('other') if pytest.num_ad > 0: - mh.domain_ad = mh.config.domains[1] - mh.ad = mh.domain_ad.hosts_by_role('ad') + mh.ad = [] + for i in range(1, pytest.num_ad+1): + print(i) + print(mh.config.domains[i].hosts_by_role('ad')) + mh.ad.extend(mh.config.domains[i].hosts_by_role('ad')) yield mh
_______________________________________________ sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedorahosted.org/archives/list/sssd-devel@lists.fedorahosted.org Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure