diff options
author | Filip Skola <fskola@redhat.com> | 2016-04-11 16:59:00 +0200 |
---|---|---|
committer | Martin Basti <mbasti@redhat.com> | 2016-04-19 10:35:13 +0200 |
commit | 5dfaeca7cedec4e692a51b653e0c303e3bcb981d (patch) | |
tree | 9671c5f84efc28066d2ca8cd3ff5f3e0dbd168f7 /ipatests/test_xmlrpc/test_automember_plugin.py | |
parent | 2a20c746336f85c4a9bd095db242de11f0015903 (diff) | |
download | freeipa-5dfaeca7cedec4e692a51b653e0c303e3bcb981d.tar.gz freeipa-5dfaeca7cedec4e692a51b653e0c303e3bcb981d.tar.xz freeipa-5dfaeca7cedec4e692a51b653e0c303e3bcb981d.zip |
Refactor test_automember_plugin, create AutomemberTracker
Reviewed-By: Ales 'alich' Marecek <amarecek@redhat.com>
Diffstat (limited to 'ipatests/test_xmlrpc/test_automember_plugin.py')
-rw-r--r-- | ipatests/test_xmlrpc/test_automember_plugin.py | 2163 |
1 files changed, 607 insertions, 1556 deletions
diff --git a/ipatests/test_xmlrpc/test_automember_plugin.py b/ipatests/test_xmlrpc/test_automember_plugin.py index be0f73905..2078b1fcb 100644 --- a/ipatests/test_xmlrpc/test_automember_plugin.py +++ b/ipatests/test_xmlrpc/test_automember_plugin.py @@ -21,43 +21,20 @@ Test the `ipalib/plugins/automember.py` module. """ +from ipatests.test_xmlrpc.tracker.user_plugin import UserTracker +from ipatests.test_xmlrpc.tracker.host_plugin import HostTracker +from ipatests.test_xmlrpc.tracker.group_plugin import GroupTracker +from ipatests.test_xmlrpc.tracker.hostgroup_plugin import HostGroupTracker +from ipatests.test_xmlrpc.tracker.automember_plugin import AutomemberTracker from ipalib import api, errors from ipapython.dn import DN -from ipatests.test_xmlrpc import objectclasses -from ipatests.test_xmlrpc.xmlrpc_test import ( - Declarative, fuzzy_digits, fuzzy_uuid, fuzzy_automember_dn, - fuzzy_automember_message) -from ipatests.test_xmlrpc.test_user_plugin import get_user_result +from ipatests.test_xmlrpc.xmlrpc_test import XMLRPC_test, raises_exact +from ipatests.util import assert_deepequal import pytest -user1 = u'tuser1' user_does_not_exist = u'does_not_exist' -manager1 = u'mscott' -fqdn1 = u'web1.%s' % api.env.domain -short1 = u'web1' -fqdn2 = u'dev1.%s' % api.env.domain -short2 = u'dev1' -fqdn3 = u'web5.%s' % api.env.domain -short3 = u'web5' -fqdn4 = u'www5.%s' % api.env.domain -short4 = u'www5' -fqdn5 = u'webserver5.%s' % api.env.domain -short5 = u'webserver5' fqdn_does_not_exist = u'does_not_exist.%s' % api.env.domain - -group1 = u'group1' -group1_dn = DN(('cn', group1), ('cn', 'groups'), - ('cn', 'accounts'), api.env.basedn) -defaultgroup1 = u'defaultgroup1' -hostgroup1 = u'hostgroup1' -hostgroup1_dn = DN(('cn', hostgroup1), ('cn', 'hostgroups'), - ('cn', 'accounts'), api.env.basedn) -hostgroup2 = u'hostgroup2' -hostgroup3 = u'hostgroup3' -hostgroup4 = u'hostgroup4' -defaulthostgroup1 = u'defaulthostgroup1' - group_include_regex = u'mscott' hostgroup_include_regex = u'^web[1-9]' hostgroup_include_regex2 = u'^www[1-9]' @@ -67,1600 +44,674 @@ hostgroup_exclude_regex2 = u'^www5' hostgroup_exclude_regex3 = u'^webserver5' -@pytest.mark.tier1 -class test_automember(Declarative): - - cleanup_commands = [ - ('user_del', [user1, manager1], {}), - ('group_del', [group1, defaultgroup1], {}), - ('host_del', [fqdn1, fqdn2, fqdn3, fqdn4, fqdn5], {}), - ('hostgroup_del', [hostgroup1, hostgroup2, hostgroup3, hostgroup4, defaulthostgroup1], {}), - ('automember_del', [group1], {'type': u'group'}), - ('automember_del', [hostgroup1], {'type': u'hostgroup'}), - ('automember_del', [hostgroup2], {'type': u'hostgroup'}), - ('automember_del', [hostgroup3], {'type': u'hostgroup'}), - ('automember_del', [hostgroup4], {'type': u'hostgroup'}), - ('automember_default_group_remove', [], {'type': u'hostgroup'}), - ('automember_default_group_remove', [], {'type': u'group'}), - - ] - - tests = [ - - dict( - desc='Try to retrieve non-existent group rule %r' % group1, - command=('automember_add', [group1], - dict(description=u'Test desc', type=u'group')), - expected=errors.NotFound(reason=u'group "%s" not found' % group1), - ), - - dict( - desc='Try to update non-existent group rule %r' % group1, - command=('automember_add', [group1], dict(type=u'group')), - expected=errors.NotFound(reason=u'group "%s" not found' % group1), - ), - - dict( - desc='Try to delete non-existent group rule %r' % group1, - command=('automember_del', [group1], dict(type=u'group')), - expected=errors.NotFound(reason=u': Automember rule not found'), - ), - - - dict( - desc='Try to retrieve non-existent hostgroup rule %r' % hostgroup1, - command=('automember_add', [hostgroup1], - dict(description=u'Test desc', type=u'hostgroup')), - expected=errors.NotFound( - reason=u'hostgroup "%s" not found' % hostgroup1), - ), - - dict( - desc='Try to update non-existent hostgroup rule %r' % hostgroup1, - command=('automember_add', [hostgroup1], dict(type=u'hostgroup')), - expected=errors.NotFound( - reason=u'hostgroup "%s" not found' % hostgroup1), - ), - - dict( - desc='Try to delete non-existent hostgroup rule %r' % hostgroup1, - command=('automember_del', [hostgroup1], dict(type=u'hostgroup')), - expected=errors.NotFound(reason=u': Automember rule not found'), - ), - - # Automember rebuild membership tests - dict( - desc='Create hostgroup: %r' % hostgroup1, - command=( - 'hostgroup_add', [hostgroup1], dict(description=u'Test desc') - ), - expected=dict( - value=hostgroup1, - summary=u'Added hostgroup "%s"' % hostgroup1, - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - objectclass=objectclasses.hostgroup, - ipauniqueid=[fuzzy_uuid], - mepmanagedentry=[DN(('cn', hostgroup1), ('cn', 'ng'), - ('cn', 'alt'), api.env.basedn)], - dn=hostgroup1_dn - ), - ), - ), - - dict( - desc='Create host: %r' % fqdn1, - command=( - 'host_add', - [fqdn1], - dict( - description=u'Test host 1', - l=u'Undisclosed location 1', - force=True, - ), - ), - expected=dict( - value=fqdn1, - summary=u'Added host "%s"' % fqdn1, - result=dict( - dn=DN(('fqdn', fqdn1), ('cn', 'computers'), - ('cn', 'accounts'), api.env.basedn), - fqdn=[fqdn1], - description=[u'Test host 1'], - l=[u'Undisclosed location 1'], - krbprincipalname=[u'host/%s@%s' % (fqdn1, api.env.realm)], - has_keytab=False, - has_password=False, - objectclass=objectclasses.host, - ipauniqueid=[fuzzy_uuid], - managedby_host=[fqdn1], - ), - ), - ), +@pytest.fixture(scope='class') +def manager1(request): + """ User tracker used as a manager account """ + tracker = UserTracker(name=u'mscott', sn=u'Manager1', + givenname=u'Automember test manager user1') + return tracker.make_fixture(request) - dict( - desc='Create automember rule: %r' % hostgroup1, - command=( - 'automember_add', [hostgroup1], dict( - description=u'Test desc', type=u'hostgroup', - ) - ), - expected=dict( - value=hostgroup1, - summary=u'Added automember rule "%s"' % hostgroup1, - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - automembertargetgroup=[hostgroup1_dn], - objectclass=objectclasses.automember, - dn=DN(('cn', hostgroup1), ('cn', 'hostgroup'), - ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), - - dict( - desc='Create automember condition: %r' % hostgroup1, - command=( - 'automember_add_condition', [hostgroup1], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_include_regex], - ) - ), - expected=dict( - value=hostgroup1, - summary=u'Added condition(s) to "%s"' % hostgroup1, - completed=1, - failed=dict( - failed=dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - automemberinclusiveregex=[ - u'fqdn=%s' % hostgroup_include_regex - ], - automembertargetgroup=[hostgroup1_dn], - ), - ), - ), - dict( - desc='Retrieve hostgroup: %r' % hostgroup1, - command=('hostgroup_show', [hostgroup1], dict()), - expected=dict( - value=hostgroup1, - summary=None, - result=dict( - dn=hostgroup1_dn, - cn=[hostgroup1], - description=[u'Test desc'], - ), - ), - ), - - dict( - desc='Rebuild membership for hostgroups', - command=('automember_rebuild', [], dict(type=u'hostgroup')), - expected=dict( - value=None, - summary=fuzzy_automember_message, - result=dict() - ), - ), - - dict( - desc='Rebuild membership for hostgroups asynchronously', - command=('automember_rebuild', [], dict(type=u'hostgroup',no_wait=True)), - expected=dict( - value=None, - summary=u'Automember rebuild membership task started', - result=dict( - dn=fuzzy_automember_dn - ), - ), - ), +@pytest.fixture(scope='class') +def user1(request, manager1): + """ User tracker with assigned manager """ + tracker = UserTracker(name=u'tuser1', sn=u'User1', manager=manager1.name, + givenname=u'Automember test user1') + return tracker.make_fixture(request) - dict( - desc='Retrieve hostgroup: %r' % hostgroup1, - command=('hostgroup_show', [hostgroup1], dict()), - expected=dict( - value=hostgroup1, - summary=None, - result=dict( - dn=hostgroup1_dn, - member_host=[u'%s' % fqdn1], - cn=[hostgroup1], - description=[u'Test desc'], - ), - ), - ), - - dict( - desc='Remove host %r from hostgroup %r' % (fqdn1, hostgroup1), - command=( - 'hostgroup_remove_member', - [hostgroup1], - dict(host=fqdn1) - ), - expected=dict( - failed=dict( - member=dict( - host=tuple(), - hostgroup=tuple(), - ), - ), - completed=1, - result=dict( - dn=hostgroup1_dn, - cn=[hostgroup1], - description=[u'Test desc'], - ), - ), - ), - dict( - desc='Retrieve hostgroup: %r' % hostgroup1, - command=('hostgroup_show', [hostgroup1], dict()), - expected=dict( - value=hostgroup1, - summary=None, - result=dict( - dn=hostgroup1_dn, - cn=[hostgroup1], - description=[u'Test desc'], - ), - ), - ), - - dict( - desc='Try to rebuild membership (no options)', - command=('automember_rebuild', [], dict()), - expected=errors.MutuallyExclusiveError( - reason=(u'at least one of options: type, users, hosts must be ' - 'specified') - ) - ), - - dict( - desc='Try to rebuild membership (--users and --hosts together)', - command=( - 'automember_rebuild', - [], - dict(users=user1, hosts=fqdn1) - ), - expected=errors.MutuallyExclusiveError( - reason=u'users and hosts cannot both be set' - ) - ), - - dict( - desc='Try to rebuild membership (--users and --type=hostgroup)', - command=( - 'automember_rebuild', - [], - dict(users=user1, type=u'hostgroup') - ), - expected=errors.MutuallyExclusiveError( - reason="users cannot be set when type is 'hostgroup'" - ) - ), - - dict( - desc='Try to rebuild membership (--hosts and --type=group)', - command=( - 'automember_rebuild', - [], - dict(hosts=fqdn1, type=u'group') - ), - expected=errors.MutuallyExclusiveError( - reason=u"hosts cannot be set when type is 'group'" - ) - ), - - dict( - desc='Rebuild membership for host: %s' % fqdn1, - command=('automember_rebuild', [], dict(hosts=fqdn1)), - expected=dict( - value=None, - summary=fuzzy_automember_message, - result=dict() - ), - ), - - dict( - desc='Rebuild membership for host: %s asynchronously' % fqdn1, - command=('automember_rebuild', [], dict(hosts=fqdn1, no_wait=True)), - expected=dict( - value=None, - summary=u'Automember rebuild membership task started', - result=dict( - dn=fuzzy_automember_dn - ), - ), - ), +@pytest.fixture(scope='class') +def group1(request): + tracker = GroupTracker(name=u'tgroup1', + description=u'Automember test group1') + return tracker.make_fixture(request) - dict( - desc='Retrieve hostgroup: %r' % hostgroup1, - command=('hostgroup_show', [hostgroup1], dict()), - expected=dict( - value=hostgroup1, - summary=None, - result=dict( - dn=hostgroup1_dn, - member_host=[u'%s' % fqdn1], - cn=[hostgroup1], - description=[u'Test desc'], - ), - ), - ), - - dict( - desc='Delete host: %r' % fqdn1, - command=('host_del', [fqdn1], dict()), - expected=dict( - value=[fqdn1], - summary=u'Deleted host "%s"' % fqdn1, - result=dict(failed=[]), - ), - ), - - dict( - desc='Delete hostgroup: %r' % hostgroup1, - command=('hostgroup_del', [hostgroup1], dict()), - expected=dict( - value=[hostgroup1], - summary=u'Deleted hostgroup "%s"' % hostgroup1, - result=dict(failed=[]), - ), - ), - - dict( - desc='Delete automember rule: %r' % hostgroup1, - command=('automember_del', [hostgroup1], dict(type=u'hostgroup')), - expected=dict( - value=[hostgroup1], - summary=u'Deleted automember rule "%s"' % hostgroup1, - result=dict(failed=[]), - ), - ), - dict( - desc='Create group: %r' % group1, - command=( - 'group_add', [group1], dict(description=u'Test desc') - ), - expected=dict( - value=group1, - summary=u'Added group "%s"' % group1, - result=dict( - cn=[group1], - description=[u'Test desc'], - objectclass=objectclasses.group + [u'posixgroup'], - ipauniqueid=[fuzzy_uuid], - gidnumber=[fuzzy_digits], - dn=group1_dn - ), - ), - ), +@pytest.fixture(scope='class') +def defaultgroup1(request): + tracker = GroupTracker(name=u'defaultgroup1', + description=u'Automember test defaultgroup1') + return tracker.make_fixture(request) - dict( - desc='Create user: %r' % manager1, - command=( - 'user_add', [manager1], dict(givenname=u'Michael', sn=u'Scott') - ), - expected=dict( - value=manager1, - summary=u'Added user "mscott"', - result=get_user_result(manager1, u'Michael', u'Scott', 'add'), - ), - ), - - dict( - desc='Create user: %r' % user1, - command=( - 'user_add', - [user1], - dict(givenname=u'Test', sn=u'User1', manager=manager1) - ), - expected=dict( - value=user1, - summary=u'Added user "tuser1"', - result=get_user_result( - user1, u'Test', u'User1', 'add', - manager=[DN(('uid', 'mscott'), ('cn', 'users'), - ('cn', 'accounts'), api.env.basedn)] - ) - ), - ), +@pytest.fixture(scope='class') +def hostgroup1(request): + tracker = HostGroupTracker(name=u'thostgroup1', + description=u'Automember test hostgroup1') + return tracker.make_fixture(request) - dict( - desc='Create automember rule: %r' % group1, - command=( - 'automember_add', [group1], dict( - description=u'Test desc', type=u'group', - ) - ), - expected=dict( - value=group1, - summary=u'Added automember rule "%s"' % group1, - result=dict( - cn=[group1], - description=[u'Test desc'], - automembertargetgroup=[group1_dn], - objectclass=objectclasses.automember, - dn=DN(('cn', group1), ('cn', 'group'), - ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), - - dict( - desc='Create automember condition: %r' % group1, - command=( - 'automember_add_condition', [group1], dict( - key=u'manager', type=u'group', - automemberinclusiveregex=[group_include_regex], - ) - ), - expected=dict( - value=group1, - summary=u'Added condition(s) to "%s"' % group1, - completed=1, - failed=dict( - failed=dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[group1], - description=[u'Test desc'], - automemberinclusiveregex=[ - u'manager=%s' % group_include_regex - ], - automembertargetgroup=[group1_dn], - ), - ), - ), - dict( - desc='Retrieve group: %r' % group1, - command=('group_show', [group1], dict()), - expected=dict( - value=group1, - summary=None, - result=dict( - dn=group1_dn, - cn=[group1], - description=[u'Test desc'], - gidnumber=[fuzzy_digits], - ), - ), - ), - - dict( - desc='Rebuild membership for groups', - command=('automember_rebuild', [], dict(type=u'group')), - expected=dict( - value=None, - summary=fuzzy_automember_message, - result=dict() - ), - ), - - dict( - desc='Rebuild membership for groups asynchronously', - command=('automember_rebuild', [], dict(type=u'group', no_wait=True)), - expected=dict( - value=None, - summary=u'Automember rebuild membership task started', - result=dict( - dn=fuzzy_automember_dn - ), - ), - ), +@pytest.fixture(scope='class') +def hostgroup2(request): + tracker = HostGroupTracker(name=u'thostgroup2', + description=u'Automember test hostgroup2') + return tracker.make_fixture(request) - dict( - desc='Retrieve group: %r' % group1, - command=('group_show', [group1], dict()), - expected=dict( - value=group1, - summary=None, - result=dict( - dn=group1_dn, - member_user=[u'%s' % user1], - cn=[group1], - description=[u'Test desc'], - gidnumber=[fuzzy_digits], - ), - ), - ), - - dict( - desc='Remove user %r from group %r' % (fqdn1, hostgroup1), - command=( - 'group_remove_member', - [group1], - dict(user=user1) - ), - expected=dict( - failed=dict( - member=dict( - user=tuple(), - group=tuple(), - ), - ), - completed=1, - result=dict( - dn=group1_dn, - cn=[group1], - description=[u'Test desc'], - gidnumber=[fuzzy_digits], - ), - ), - ), - dict( - desc='Retrieve group: %r' % group1, - command=('group_show', [group1], dict()), - expected=dict( - value=group1, - summary=None, - result=dict( - dn=group1_dn, - cn=[group1], - description=[u'Test desc'], - gidnumber=[fuzzy_digits], - ), - ), - ), - - dict( - desc='Rebuild membership for user: %s' % user1, - command=('automember_rebuild', [], dict(users=user1)), - expected=dict( - value=None, - summary=fuzzy_automember_message, - result=dict() - ), - ), - - dict( - desc='Rebuild membership for user: %s asynchronously' % user1, - command=('automember_rebuild', [], dict(users=user1, no_wait=True)), - expected=dict( - value=None, - summary=u'Automember rebuild membership task started', - result=dict( - dn=fuzzy_automember_dn - ), - ), - ), +@pytest.fixture(scope='class') +def hostgroup3(request): + tracker = HostGroupTracker(name=u'thostgroup3', + description=u'Automember test hostgroup3') + return tracker.make_fixture(request) - dict( - desc='Retrieve group: %r' % group1, - command=('group_show', [group1], dict()), - expected=dict( - value=group1, - summary=None, - result=dict( - dn=group1_dn, - member_user=[u'%s' % user1], - cn=[group1], - description=[u'Test desc'], - gidnumber=[fuzzy_digits], - ), - ), - ), - - dict( - desc='Delete user: %r' % user1, - command=('user_del', [user1], dict()), - expected=dict( - value=[user1], - summary=u'Deleted user "%s"' % user1, - result=dict(failed=[]), - ), - ), - - dict( - desc='Delete user: %r' % manager1, - command=('user_del', [manager1], dict()), - expected=dict( - value=[manager1], - summary=u'Deleted user "%s"' % manager1, - result=dict(failed=[]), - ), - ), - - dict( - desc='Delete group: %r' % group1, - command=('group_del', [group1], dict()), - expected=dict( - value=[group1], - summary=u'Deleted group "%s"' % group1, - result=dict(failed=[]), - ), - ), - - dict( - desc='Delete automember rule: %r' % group1, - command=('automember_del', [group1], dict(type=u'group')), - expected=dict( - value=[group1], - summary=u'Deleted automember rule "%s"' % group1, - result=dict(failed=[]), - ), - ), - # End of automember rebuild membership tests +@pytest.fixture(scope='class') +def hostgroup4(request): + tracker = HostGroupTracker(name=u'thostgroup4', + description=u'Automember test hostgroup4') + return tracker.make_fixture(request) - dict( - desc='Create %r' % group1, - command=( - 'group_add', [group1], dict(description=u'Test desc') - ), - expected=dict( - value=group1, - summary=u'Added group "%s"' % group1, - result=dict( - cn=[group1], - description=[u'Test desc'], - gidnumber=[fuzzy_digits], - objectclass=objectclasses.group + [u'posixgroup'], - ipauniqueid=[fuzzy_uuid], - dn=DN(('cn', group1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def defaulthostgroup1(request): + tracker = HostGroupTracker(name=u'defaulthostgroup1', + description=u'Automember test' + 'defaulthostgroup1') + return tracker.make_fixture(request) - dict( - desc='Create %r' % hostgroup1, - command=( - 'hostgroup_add', [hostgroup1], dict(description=u'Test desc') - ), - expected=dict( - value=hostgroup1, - summary=u'Added hostgroup "%s"' % hostgroup1, - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - objectclass=objectclasses.hostgroup, - ipauniqueid=[fuzzy_uuid], - mepmanagedentry=[DN(('cn', hostgroup1), ('cn', 'ng'), ('cn', 'alt'), api.env.basedn)], - dn=DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def host1(request): + tracker = HostTracker(u'web1') + return tracker.make_fixture(request) - dict( - desc='Create %r' % hostgroup2, - command=( - 'hostgroup_add', [hostgroup2], dict(description=u'Test desc') - ), - expected=dict( - value=hostgroup2, - summary=u'Added hostgroup "%s"' % hostgroup2, - result=dict( - cn=[hostgroup2], - description=[u'Test desc'], - objectclass=objectclasses.hostgroup, - ipauniqueid=[fuzzy_uuid], - mepmanagedentry=[DN(('cn', hostgroup2), ('cn', 'ng'), ('cn', 'alt'), api.env.basedn)], - dn=DN(('cn', hostgroup2), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def host2(request): + tracker = HostTracker(u'dev1') + return tracker.make_fixture(request) - dict( - desc='Create %r' % hostgroup3, - command=( - 'hostgroup_add', [hostgroup3], dict(description=u'Test desc') - ), - expected=dict( - value=hostgroup3, - summary=u'Added hostgroup "%s"' % hostgroup3, - result=dict( - cn=[hostgroup3], - description=[u'Test desc'], - objectclass=objectclasses.hostgroup, - ipauniqueid=[fuzzy_uuid], - mepmanagedentry=[DN(('cn', hostgroup3), ('cn', 'ng'), ('cn', 'alt'), api.env.basedn)], - dn=DN(('cn', hostgroup3), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def host3(request): + tracker = HostTracker(u'web5') + return tracker.make_fixture(request) - dict( - desc='Create %r' % hostgroup4, - command=( - 'hostgroup_add', [hostgroup4], dict(description=u'Test desc') - ), - expected=dict( - value=hostgroup4, - summary=u'Added hostgroup "%s"' % hostgroup4, - result=dict( - cn=[hostgroup4], - description=[u'Test desc'], - objectclass=objectclasses.hostgroup, - ipauniqueid=[fuzzy_uuid], - mepmanagedentry=[DN(('cn', hostgroup4), ('cn', 'ng'), ('cn', 'alt'), api.env.basedn)], - dn=DN(('cn', hostgroup4), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def host4(request): + tracker = HostTracker(u'www5') + return tracker.make_fixture(request) - dict( - desc='Create %r' % defaultgroup1, - command=( - 'group_add', [defaultgroup1], dict(description=u'Default test desc') - ), - expected=dict( - value=defaultgroup1, - summary=u'Added group "%s"' % defaultgroup1, - result=dict( - cn=[defaultgroup1], - description=[u'Default test desc'], - gidnumber=[fuzzy_digits], - objectclass=objectclasses.group + [u'posixgroup'], - ipauniqueid=[fuzzy_uuid], - dn=DN(('cn', defaultgroup1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def host5(request): + tracker = HostTracker(u'webserver5') + return tracker.make_fixture(request) - dict( - desc='Create %r' % defaulthostgroup1, - command=( - 'hostgroup_add', [defaulthostgroup1], dict(description=u'Default test desc') - ), - expected=dict( - value=defaulthostgroup1, - summary=u'Added hostgroup "%s"' % defaulthostgroup1, - result=dict( - cn=[defaulthostgroup1], - description=[u'Default test desc'], - objectclass=objectclasses.hostgroup, - ipauniqueid=[fuzzy_uuid], - mepmanagedentry=[DN(('cn', defaulthostgroup1), ('cn', 'ng'), ('cn', 'alt'), api.env.basedn)], - dn=DN(('cn', defaulthostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def automember_group(request, group1): + tracker = AutomemberTracker(groupname=group1.cn, + description=u'Automember group tracker', + membertype=u'group') + return tracker.make_fixture(request) - dict( - desc='Create automember %r' % group1, - command=( - 'automember_add', [group1], dict(description=u'Test desc', type=u'group') - ), - expected=dict( - value=group1, - summary=u'Added automember rule "%s"' % group1, - result=dict( - cn=[group1], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', group1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], - objectclass=objectclasses.automember, - dn=DN(('cn', group1), ('cn', 'group'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def automember_hostgroup(request, hostgroup1): + tracker = AutomemberTracker(groupname=hostgroup1.cn, + description=u'Automember hostgroup tracker', + membertype=u'hostgroup') + return tracker.make_fixture(request) - dict( - desc='Create automember condition %r' % group1, - command=( - 'automember_add_condition', [group1], dict( - key=u'manager', type=u'group', - automemberinclusiveregex=[group_include_regex], - ) - ), - expected=dict( - value=group1, - summary=u'Added condition(s) to "%s"' % group1, - completed=1, - failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[group1], - description=[u'Test desc'], - automemberinclusiveregex=[u'manager=%s' % group_include_regex], - automembertargetgroup=[DN(('cn', group1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], - ), - ), - ), +@pytest.fixture(scope='class') +def automember_hostgroup2(request, hostgroup2): + tracker = AutomemberTracker(groupname=hostgroup2.cn, + description=u'Automember hostgroup tracker 2', + membertype=u'hostgroup') + return tracker.make_fixture(request) - dict( - desc='Create automember %r' % hostgroup1, - command=( - 'automember_add', [hostgroup1], dict( - description=u'Test desc', type=u'hostgroup', - ) - ), - expected=dict( - value=hostgroup1, - summary=u'Added automember rule "%s"' % hostgroup1, - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - objectclass=objectclasses.automember, - dn=DN(('cn', hostgroup1), ('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), +@pytest.fixture(scope='class') +def automember_hostgroup3(request, hostgroup3): + tracker = AutomemberTracker(groupname=hostgroup3.cn, + description=u'Automember hostgroup tracker 3', + membertype=u'hostgroup') - dict( - desc='Create automember condition %r' % hostgroup1, - command=( - 'automember_add_condition', [hostgroup1], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_include_regex], - ) - ), - expected=dict( - value=hostgroup1, - summary=u'Added condition(s) to "%s"' % hostgroup1, - completed=1, - failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex], - automembertargetgroup=[DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - ), - ), - ), + return tracker.make_fixture(request) - dict( - desc='Create duplicate automember condition %r' % hostgroup1, - command=( - 'automember_add_condition', [hostgroup1], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_include_regex], - ) - ), - expected=dict( - value=hostgroup1, - summary=u'Added condition(s) to "%s"' % hostgroup1, - completed=0, - failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex], - ), - ), - ), +@pytest.fixture(scope='class') +def automember_hostgroup4(request, hostgroup4): + tracker = AutomemberTracker(groupname=hostgroup4.cn, + description=u'Automember hostgroup tracker 4', + membertype=u'hostgroup') + return tracker.make_fixture(request) - dict( - desc='Create additional automember conditions %r' % hostgroup1, - command=( - 'automember_add_condition', [hostgroup1], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_include_regex2, hostgroup_include_regex3], - automemberexclusiveregex=[hostgroup_exclude_regex, hostgroup_exclude_regex2, hostgroup_exclude_regex3], - ) - ), - expected=dict( - value=hostgroup1, - summary=u'Added condition(s) to "%s"' % hostgroup1, - completed=5, - failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex, - u'fqdn=%s' % hostgroup_include_regex3, - u'fqdn=%s' % hostgroup_include_regex2, - ], - automemberexclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex2, - u'fqdn=%s' % hostgroup_exclude_regex3, - u'fqdn=%s' % hostgroup_exclude_regex, - ], - ), - ), - ), - - - dict( - desc='Create automember %r' % hostgroup2, - command=( - 'automember_add', [hostgroup2], dict( - description=u'Test desc', type=u'hostgroup', - ) - ), - expected=dict( - value=hostgroup2, - summary=u'Added automember rule "%s"' % hostgroup2, - result=dict( - cn=[hostgroup2], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup2), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - objectclass=objectclasses.automember, - dn=DN(('cn', hostgroup2), ('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), +@pytest.mark.tier1 +class TestNonexistentAutomember(XMLRPC_test): + def test_create_with_nonexistent_group(self, automember_group, group1): + """ Try to add a rule with non-existent group """ + group1.ensure_missing() + command = automember_group.make_create_command() + with raises_exact(errors.NotFound( + reason=u'group "%s" not found' % group1.cn)): + command() + + def test_delete_with_nonexistent_group(self, automember_group, group1): + """ Try to delete a rule with non-existent group """ + group1.ensure_missing() + command = automember_group.make_delete_command() + with raises_exact(errors.NotFound( + reason=u': Automember rule not found')): + command() + + def test_create_with_nonexistent_hostgroup(self, automember_hostgroup, + hostgroup1): + """ Try to add a rule with non-existent group """ + hostgroup1.ensure_missing() + command = automember_hostgroup.make_create_command() + with raises_exact(errors.NotFound( + reason=u'hostgroup "%s" not found' % hostgroup1.cn)): + command() + + def test_delete_with_nonexistent_hostgroup(self, automember_hostgroup, + hostgroup1): + """ Try to delete a rule with non-existent group """ + hostgroup1.ensure_missing() + command = automember_hostgroup.make_delete_command() + with raises_exact(errors.NotFound( + reason=u': Automember rule not found')): + command() - dict( - desc='Create automember condition %r' % hostgroup2, - command=( - 'automember_add_condition', [hostgroup2], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_exclude_regex], - ) - ), - expected=dict( - value=hostgroup2, - summary=u'Added condition(s) to "%s"' % hostgroup2, - completed=1, - failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[hostgroup2], - description=[u'Test desc'], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex], - automembertargetgroup=[DN(('cn', hostgroup2), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - ), - ), - ), +@pytest.mark.tier1 +class TestCRUDFOnAutomember(XMLRPC_test): + def test_basic_ops_on_group_automember(self, automember_group, group1): + """ Test create, retrieve, find, update, + and delete operations on a group automember """ + group1.create() + automember_group.create() + automember_group.retrieve() + automember_group.find() + automember_group.update(dict(description=u'New description')) + automember_group.delete() + + def test_basic_ops_on_hostgroup_automember(self, automember_hostgroup, + hostgroup1): + """ Test create, retrieve, find, update, + and delete operations on a hostgroup automember """ + hostgroup1.create() + automember_hostgroup.create() + automember_hostgroup.retrieve() + automember_hostgroup.find() + automember_hostgroup.update(dict(description=u'New description')) + automember_hostgroup.delete() - dict( - desc='Create automember %r' % hostgroup3, - command=( - 'automember_add', [hostgroup3], dict( - description=u'Test desc', type=u'hostgroup', - ) - ), - expected=dict( - value=hostgroup3, - summary=u'Added automember rule "%s"' % hostgroup3, - result=dict( - cn=[hostgroup3], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup3), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - objectclass=objectclasses.automember, - dn=DN(('cn', hostgroup3), ('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), +@pytest.mark.tier1 +class TestAutomemberRebuildHostMembership(XMLRPC_test): + def test_create_deps_for_rebuilding_hostgroups(self, hostgroup1, host1, + automember_hostgroup): + """ Create host, hostgroup, and automember tracker for this class + of tests """ + hostgroup1.ensure_exists() + host1.ensure_exists() + automember_hostgroup.ensure_exists() + automember_hostgroup.add_condition( + key=u'fqdn', type=u'hostgroup', + inclusiveregex=[hostgroup_include_regex] + ) + hostgroup1.retrieve() + + def test_rebuild_membership_hostgroups(self, automember_hostgroup, + hostgroup1, host1): + """ Rebuild automember membership for hosts, both synchonously and + asynchronously. Check the host has been added to the hostgroup. """ + automember_hostgroup.rebuild() + automember_hostgroup.rebuild(no_wait=True) + hostgroup1.attrs.update(member_host=[host1.fqdn]) + hostgroup1.retrieve() + hostgroup1.remove_member(dict(host=host1.fqdn)) + hostgroup1.retrieve() + + def test_rebuild_membership_for_host(self, host1, automember_hostgroup, + hostgroup1): + """ Rebuild automember membership for one host, both synchronously and + asynchronously. Check the host has been added to the hostgroup. """ + command = automember_hostgroup.make_rebuild_command(hosts=host1.fqdn) + result = command() + automember_hostgroup.check_rebuild(result) + + command = automember_hostgroup.make_rebuild_command(hosts=host1.fqdn, + no_wait=True) + result = command() + automember_hostgroup.check_rebuild(result, no_wait=True) + + hostgroup1.attrs.update(member_host=[host1.fqdn]) + hostgroup1.retrieve() + + def test_delete_deps_for_rebuilding_hostgroups(self, host1, hostgroup1, + automember_hostgroup): + """ Delete dependences for this class of tests in desired order """ + host1.delete() + hostgroup1.delete() + automember_hostgroup.delete() - dict( - desc='Create automember condition %r' % hostgroup3, - command=( - 'automember_add_condition', [hostgroup3], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_exclude_regex2], - ) - ), - expected=dict( - value=hostgroup3, - summary=u'Added condition(s) to "%s"' % hostgroup3, - completed=1, - failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[hostgroup3], - description=[u'Test desc'], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex2], - automembertargetgroup=[DN(('cn', hostgroup3), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - ), - ), - ), +@pytest.mark.tier1 +class TestAutomemberRebuildGroupMembership(XMLRPC_test): + def test_create_deps_for_rebuilding_groups(self, group1, manager1, user1, + automember_group): + """ Create users, groups, and automember tracker for this class + of tests """ + group1.ensure_exists() + manager1.ensure_exists() + user1.ensure_exists() + automember_group.ensure_exists() + automember_group.add_condition( + key=u'manager', type=u'group', inclusiveregex=[group_include_regex] + ) + group1.retrieve() + + def test_rebuild_membership_groups(self, automember_group, group1, user1): + """ Rebuild automember membership for groups, both synchonously and + asynchronously. Check the user has been added to the group. """ + automember_group.rebuild() + automember_group.rebuild(no_wait=True) + group1.attrs.update(member_user=[user1.name]) + group1.retrieve() + group1.remove_member(dict(user=user1.name)) + group1.retrieve() + + def test_rebuild_membership_for_user(self, user1, automember_group, + group1): + """ Rebuild automember membership for one user, both synchronously and + asynchronously. Check the user has been added to the group. """ + command = automember_group.make_rebuild_command(users=user1.name) + result = command() + automember_group.check_rebuild(result) + command = automember_group.make_rebuild_command(users=user1.name, + no_wait=True) + result = command() + automember_group.check_rebuild(result, no_wait=True) + group1.attrs.update(member_user=[user1.name]) + group1.retrieve() + + def test_delete_deps_for_rebuilding_groups(self, user1, manager1, group1, + automember_group): + """ Delete dependences for this class of tests in desired order """ + user1.delete() + manager1.delete() + group1.delete() + automember_group.delete() - dict( - desc='Create automember %r' % hostgroup4, - command=( - 'automember_add', [hostgroup4], dict( - description=u'Test desc', type=u'hostgroup', - ) - ), - expected=dict( - value=hostgroup4, - summary=u'Added automember rule "%s"' % hostgroup4, - result=dict( - cn=[hostgroup4], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup4), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - objectclass=objectclasses.automember, - dn=DN(('cn', hostgroup4), ('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ), - ), +@pytest.mark.tier1 +class TestAutomemberRebuildMembershipIncorrectly(XMLRPC_test): + def test_rebuild_membership_hosts_incorrectly(self, automember_hostgroup): + """ Try to issue rebuild automember command without 'type' parameter + """ + command = automember_hostgroup.make_rebuild_command() + with raises_exact(errors.MutuallyExclusiveError( + reason=u'at least one of options: ' + 'type, users, hosts must be specified')): + command() + + def test_rebuild_membership_user_hosts(self, automember_hostgroup, user1, + host1): + """ Try to issue rebuild membership command with --users and --hosts + together """ + command = automember_hostgroup.make_rebuild_command(users=user1.name, + hosts=host1.fqdn) + with raises_exact(errors.MutuallyExclusiveError( + reason=u'users and hosts cannot both be set')): + command() + + def test_rebuild_membership_users_hostgroup(self, automember_hostgroup, + user1): + """ Try to issue rebuild membership command with type --hosts and + users specified """ + command = automember_hostgroup.make_rebuild_command(users=user1.name, + type=u'hostgroup') + with raises_exact(errors.MutuallyExclusiveError( + reason=u"users cannot be set when type is 'hostgroup'")): + command() + + def test_rebuild_membership_hosts_group(self, automember_hostgroup, user1, + host1): + """ Try to issue rebuild membership command with type --users and + hosts specified """ + command = automember_hostgroup.make_rebuild_command(hosts=host1.fqdn, + type=u'group') + with raises_exact(errors.MutuallyExclusiveError( + reason=u"hosts cannot be set when type is 'group'")): + command() - dict( - desc='Create automember condition %r' % hostgroup4, - command=( - 'automember_add_condition', [hostgroup4], dict( - key=u'fqdn', type=u'hostgroup', - automemberinclusiveregex=[hostgroup_exclude_regex3], - ) - ), - expected=dict( - value=hostgroup4, - summary=u'Added condition(s) to "%s"' % hostgroup4, - completed=1, +@pytest.mark.tier1 +class TestMultipleAutomemberConditions(XMLRPC_test): + def test_create_deps_for_multiple_conditions( + self, group1, hostgroup1, hostgroup2, hostgroup3, hostgroup4, + defaultgroup1, defaulthostgroup1, + automember_group, automember_hostgroup + ): + """ Create groups, hostgroups, and automember conditions + for this class of tests """ + group1.ensure_exists() + hostgroup1.ensure_exists() + hostgroup2.ensure_exists() + hostgroup3.ensure_exists() + hostgroup4.ensure_exists() + defaultgroup1.ensure_exists() + defaulthostgroup1.ensure_exists() + + automember_group.ensure_exists() + automember_group.add_condition(key=u'manager', type=u'group', + inclusiveregex=[group_include_regex]) + automember_hostgroup.ensure_exists() + automember_hostgroup.add_condition( + key=u'fqdn', type=u'hostgroup', + inclusiveregex=[hostgroup_include_regex] + ) + + def test_create_duplicate_automember_condition(self, automember_hostgroup, + hostgroup1): + """ Try to create a duplicate automember condition """ + command = automember_hostgroup.make_add_condition_command( + key=u'fqdn', type=u'hostgroup', + automemberinclusiveregex=[hostgroup_include_regex] + ) + result = command() + automember_hostgroup.check_add_condition_negative(result) + + def test_create_additional_automember_conditions(self, + automember_hostgroup): + """ Add additional automember conditions to existing one, with both + inclusive and exclusive regular expressions the condition """ + command = automember_hostgroup.make_add_condition_command( + key=u'fqdn', type=u'hostgroup', + automemberinclusiveregex=[hostgroup_include_regex2, + hostgroup_include_regex3], + automemberexclusiveregex=[hostgroup_exclude_regex, + hostgroup_exclude_regex2, + hostgroup_exclude_regex3] + ) + result = command() + + expected = dict( + value=automember_hostgroup.cn, + summary=u'Added condition(s) to "%s"' % automember_hostgroup.cn, + completed=5, + failed=dict( failed=dict( - failed = dict( - automemberinclusiveregex=tuple(), - automemberexclusiveregex=tuple(), - ) - ), - result=dict( - cn=[hostgroup4], - description=[u'Test desc'], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex3], - automembertargetgroup=[DN(('cn', hostgroup4), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - ), - ), - ), - - - dict( - desc="Retrieve automember rule for group %s" % group1, - command=('automember_show', [group1], dict( - type=u'group', - ) - ), - expected=dict( - value=group1, - result=dict( - cn=[group1], - description=[u'Test desc'], - automemberinclusiveregex=[u'manager=%s' % group_include_regex], - automembertargetgroup=[DN(('cn', group1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], - dn=DN(('cn', group1), ('cn', 'group'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - summary=None, - ), - ), - - - dict( - desc='Search for %r' % group1, - command=('automember_find', [group1], dict( - type=u'group' - ) - ), - expected=dict( - count=1, - truncated=False, - result=[ - dict( - cn=[group1], - description=[u'Test desc'], - automemberinclusiveregex=[u'manager=%s' % group_include_regex], - automembertargetgroup=[DN(('cn', group1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], - dn=DN(('cn', group1), ('cn', 'group'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ], - summary=u'1 rules matched', - ), - ), - - - dict( - desc='Updated automember rule %r' % group1, - command=( - 'automember_mod', [group1], dict( - type=u'group', - description=u'New desc 1', - ) - ), - expected=dict( - result=dict( - cn=[group1], - description=[u'New desc 1'], - automemberinclusiveregex=[u'manager=%s' % group_include_regex], - automembertargetgroup=[DN(('cn', group1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], - ), - summary=u'Modified automember rule "%s"' % group1, - value=group1, - ), - ), - - - dict( - desc="Retrieve automember rule for hostgroup %s" % hostgroup1, - command=('automember_show', [hostgroup1], dict( - type=u'hostgroup', - ) - ), - expected=dict( - value=hostgroup1, - result=dict( - cn=[hostgroup1], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex, - u'fqdn=%s' % hostgroup_include_regex3, - u'fqdn=%s' % hostgroup_include_regex2, - ], - automemberexclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex2, - u'fqdn=%s' % hostgroup_exclude_regex3, - u'fqdn=%s' % hostgroup_exclude_regex, - ], - dn=DN(('cn', hostgroup1), ('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - summary=None, - ), - ), - - - dict( - desc='Search for %r' % hostgroup1, - command=('automember_find', [hostgroup1], dict( - type=u'hostgroup' + automemberinclusiveregex=tuple(), + automemberexclusiveregex=tuple(), ) ), - expected=dict( - count=1, - truncated=False, - result=[ - dict( - cn=[hostgroup1], - description=[u'Test desc'], - automembertargetgroup=[DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex, - u'fqdn=%s' % hostgroup_include_regex3, - u'fqdn=%s' % hostgroup_include_regex2, - ], - automemberexclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex2, - u'fqdn=%s' % hostgroup_exclude_regex3, - u'fqdn=%s' % hostgroup_exclude_regex, - ], - dn=DN(('cn', hostgroup1), ('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - ), - ], - summary=u'1 rules matched', - ), - ), - - - dict( - desc='Updated automember rule %r' % hostgroup1, - command=( - 'automember_mod', [hostgroup1], dict( - type=u'hostgroup', - description=u'New desc 1', - ) - ), - expected=dict( - result=dict( - cn=[hostgroup1], - description=[u'New desc 1'], - automembertargetgroup=[DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex, - u'fqdn=%s' % hostgroup_include_regex3, - u'fqdn=%s' % hostgroup_include_regex2, - ], - automemberexclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex2, - u'fqdn=%s' % hostgroup_exclude_regex3, - u'fqdn=%s' % hostgroup_exclude_regex, - ], - ), - summary=u'Modified automember rule "%s"' % hostgroup1, - value=hostgroup1, - ), - ), - - - dict( - desc='Set default automember group for groups', - command=( - 'automember_default_group_set', [], dict( - type=u'group', - automemberdefaultgroup=defaultgroup1 - ) - ), - expected=dict( + result=dict( + cn=[automember_hostgroup.cn], + description=[automember_hostgroup.description], + automembertargetgroup=[automember_hostgroup.attrs + ['automembertargetgroup'][0]], + automemberinclusiveregex=[u'fqdn=%s' % + hostgroup_include_regex, + u'fqdn=%s' % + hostgroup_include_regex3, + u'fqdn=%s' % + hostgroup_include_regex2, + ], + automemberexclusiveregex=[u'fqdn=%s' % + hostgroup_exclude_regex2, + u'fqdn=%s' % + hostgroup_exclude_regex3, + u'fqdn=%s' % + hostgroup_exclude_regex, + ], + ), + ) + assert_deepequal(expected, result) + + automember_hostgroup.attrs.update( + automemberinclusiveregex=[u'fqdn=%s' % hostgroup_include_regex, + u'fqdn=%s' % hostgroup_include_regex3, + u'fqdn=%s' % hostgroup_include_regex2, + ], + automemberexclusiveregex=[u'fqdn=%s' % hostgroup_exclude_regex2, + u'fqdn=%s' % hostgroup_exclude_regex3, + u'fqdn=%s' % hostgroup_exclude_regex, + ] + ) # modify automember_hostgroup tracker for next tests + + def test_create_set_of_hostgroup_automembers(self, automember_hostgroup2, + automember_hostgroup3, + automember_hostgroup4): + """ Create three more hostgroup automembers """ + automember_hostgroup2.ensure_exists() + automember_hostgroup2.add_condition( + key=u'fqdn', type=u'hostgroup', + inclusiveregex=[hostgroup_exclude_regex] + ) + automember_hostgroup3.ensure_exists() + automember_hostgroup3.add_condition( + key=u'fqdn', type=u'hostgroup', + inclusiveregex=[hostgroup_exclude_regex2] + ) + automember_hostgroup4.ensure_exists() + automember_hostgroup4.add_condition( + key=u'fqdn', type=u'hostgroup', + inclusiveregex=[hostgroup_exclude_regex3] + ) + + def test_set_default_group_for_automembers(self, defaultgroup1): + """ Set new default group for group automembers """ + result = api.Command['automember_default_group_set']( + type=u'group', + automemberdefaultgroup=defaultgroup1.cn + ) + + assert_deepequal( + dict( result=dict( cn=[u'Group'], - automemberdefaultgroup=[DN(('cn', defaultgroup1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], + automemberdefaultgroup=[DN(('cn', defaultgroup1.cn), + ('cn', 'groups'), + ('cn', 'accounts'), + api.env.basedn)], ), value=u'group', - summary=u'Set default (fallback) group for automember "group"', - ), - ), - - - dict( - desc='Retrieve default automember group for groups', - command=( - 'automember_default_group_show', [], dict(type=u'group') - ), - expected=dict( - result=dict( - dn=DN(('cn', 'group'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - cn=[u'Group'], - automemberdefaultgroup=[DN(('cn', defaultgroup1), ('cn', 'groups'), ('cn', 'accounts'), api.env.basedn)], - ), + summary=u'Set default (fallback) group for automember "group"' + ), + result) + + result = api.Command['automember_default_group_show']( + type=u'group', + ) + + assert_deepequal( + dict( + result=dict(dn=DN(('cn', 'group'), + ('cn', 'automember'), + ('cn', 'etc'), api.env.basedn), + cn=[u'Group'], + automemberdefaultgroup=[ + DN(('cn', defaultgroup1.cn), + ('cn', 'groups'), + ('cn', 'accounts'), + api.env.basedn) + ], + ), value=u'group', summary=None, ), - ), + result) + def test_set_default_hostgroup_for_automembers(self, defaulthostgroup1): + """ Set new default hostgroup for hostgroup automembers """ + result = api.Command['automember_default_group_set']( + type=u'hostgroup', + automemberdefaultgroup=defaulthostgroup1.cn + ) - dict( - desc='Set default (fallback) automember group for hostgroups', - command=( - 'automember_default_group_set', [], dict( - type=u'hostgroup', - automemberdefaultgroup=defaulthostgroup1, - ) - ), - expected=dict( + assert_deepequal( + dict( result=dict( cn=[u'Hostgroup'], - automemberdefaultgroup=[DN(('cn', defaulthostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - ), + automemberdefaultgroup=[DN(('cn', defaulthostgroup1.cn), + ('cn', 'hostgroups'), + ('cn', 'accounts'), + api.env.basedn)], + ), value=u'hostgroup', - summary=u'Set default (fallback) group for automember "hostgroup"', - ), - ), - - - dict( - desc='Retrieve default automember group for hostgroups', - command=( - 'automember_default_group_show', [], dict( - type=u'hostgroup', - ) - ), - expected=dict( - result=dict( - dn=DN(('cn', 'hostgroup'), ('cn', 'automember'), ('cn', 'etc'), api.env.basedn), - cn=[u'Hostgroup'], - automemberdefaultgroup=[DN(('cn', defaulthostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn)], - ), + summary=u'Set default (fallback) group for ' + 'automember "hostgroup"'), + result) + + result = api.Command['automember_default_group_show']( + type=u'hostgroup', + ) + + assert_deepequal( + dict( + result=dict(dn=DN(('cn', 'hostgroup'), + ('cn', 'automember'), + ('cn', 'etc'), api.env.basedn), + cn=[u'Hostgroup'], + automemberdefaultgroup=[ + DN(('cn', defaulthostgroup1.cn), + ('cn', 'hostgroups'), + ('cn', 'accounts'), + api.env.basedn)], + ), value=u'hostgroup', summary=None, ), - ), - - - dict( - desc='Create %r' % manager1, - command=( - 'user_add', [manager1], dict(givenname=u'Michael', sn=u'Scott') - ), - expected=dict( - value=manager1, - summary=u'Added user "mscott"', - result=get_user_result( - manager1, u'Michael', u'Scott', 'add', - memberof_group=[defaultgroup1, u'ipausers']), - ), - ), - - - dict( - desc='Create %r' % user1, - command=( - 'user_add', [user1], dict(givenname=u'Test', sn=u'User1', manager=manager1) - ), - expected=dict( - value=user1, - summary=u'Added user "tuser1"', - result=get_user_result( - user1, u'Test', u'User1', 'add', - memberof_group=[group1, u'ipausers'], - manager=[DN(('uid', 'mscott'), ('cn', 'users'), - ('cn', 'accounts'), api.env.basedn)] - ), - ), - ), - - - dict( - desc='Create %r' % fqdn1, - command=('host_add', [fqdn1], - dict( - description=u'Test host 1', - l=u'Undisclosed location 1', - force=True, - ), - ), - expected=dict( - value=fqdn1, - summary=u'Added host "%s"' % fqdn1, - result=dict( - dn=DN(('fqdn', fqdn1), ('cn', 'computers'), ('cn', 'accounts'), api.env.basedn), - fqdn=[fqdn1], - description=[u'Test host 1'], - l=[u'Undisclosed location 1'], - krbprincipalname=[u'host/%s@%s' % (fqdn1, api.env.realm)], - has_keytab=False, - has_password=False, - objectclass=objectclasses.host, - ipauniqueid=[fuzzy_uuid], - managedby_host=[fqdn1], - memberof_hostgroup=[hostgroup1], - memberofindirect_netgroup=[hostgroup1], - ), - ), - ), - - - dict( - desc='Create %r' % fqdn2, - command=('host_add', [fqdn2], - dict( - description=u'Test host 2', - l=u'Undisclosed location 1', - force=True, - ), - ), - expected=dict( - value=fqdn2, - summary=u'Added host "%s"' % fqdn2, - result=dict( - dn=DN(('fqdn', fqdn2), ('cn', 'computers'), ('cn', 'accounts'), api.env.basedn), - fqdn=[fqdn2], - description=[u'Test host 2'], - l=[u'Undisclosed location 1'], - krbprincipalname=[u'host/%s@%s' % (fqdn2, api.env.realm)], - has_keytab=False, - has_password=False, - objectclass=objectclasses.host, - ipauniqueid=[fuzzy_uuid], - managedby_host=[fqdn2], - memberof_hostgroup=[defaulthostgroup1], - memberofindirect_netgroup=[defaulthostgroup1], - ), - ), - ), - - - dict( - desc='Create %r' % fqdn3, - command=('host_add', [fqdn3], - dict( - description=u'Test host 3', - l=u'Undisclosed location 1', - force=True, - ), - ), - expected=dict( - value=fqdn3, - summary=u'Added host "%s"' % fqdn3, - result=dict( - dn=DN(('fqdn', fqdn3), ('cn', 'computers'), ('cn', 'accounts'), api.env.basedn), - fqdn=[fqdn3], - description=[u'Test host 3'], - l=[u'Undisclosed location 1'], - krbprincipalname=[u'host/%s@%s' % (fqdn3, api.env.realm)], - has_keytab=False, - has_password=False, - objectclass=objectclasses.host, - ipauniqueid=[fuzzy_uuid], - managedby_host=[fqdn3], - memberof_hostgroup=[hostgroup2], - memberofindirect_netgroup=[hostgroup2], - ), - ), - ), - - - dict( - desc='Create %r' % fqdn4, - command=('host_add', [fqdn4], - dict( - description=u'Test host 4', - l=u'Undisclosed location 1', - force=True, - ), - ), - expected=dict( - value=fqdn4, - summary=u'Added host "%s"' % fqdn4, - result=dict( - dn=DN(('fqdn', fqdn4), ('cn', 'computers'), ('cn', 'accounts'), api.env.basedn), - fqdn=[fqdn4], - description=[u'Test host 4'], - l=[u'Undisclosed location 1'], - krbprincipalname=[u'host/%s@%s' % (fqdn4, api.env.realm)], - has_keytab=False, - has_password=False, - objectclass=objectclasses.host, - ipauniqueid=[fuzzy_uuid], - managedby_host=[fqdn4], - memberof_hostgroup=[hostgroup3], - memberofindirect_netgroup=[hostgroup3], - ), - ), - ), + result) + + def test_create_deps_under_new_conditions( + self, manager1, user1, host1, host2, host3, host4, host5, + hostgroup1, hostgroup2, hostgroup3, hostgroup4, + defaulthostgroup1, defaultgroup1, group1 + ): + """ Create users and hosts under previously defined + automember conditions """ + defaulthostgroup1.retrieve() + defaultgroup1.retrieve() + manager1.ensure_missing() + user1.ensure_missing() + + manager1.track_create() + manager1.attrs.update(memberof_group=[defaultgroup1.cn, u'ipausers']) + command = manager1.make_create_command() + result = command() + manager1.check_create(result) + + user1.track_create() + user1.attrs.update(memberof_group=[group1.cn, u'ipausers']) + command = user1.make_create_command() + result = command() + user1.check_create(result) + + host1.track_create() + host1.attrs.update(memberofindirect_netgroup=[hostgroup1.cn], + memberof_hostgroup=[hostgroup1.cn]) + command = host1.make_create_command() + result = command() + hostgroup1.attrs.update(member_host=[host1.fqdn]) + + host2.track_create() + host2.attrs.update(memberof_hostgroup=[defaulthostgroup1.cn], + memberofindirect_netgroup=[defaulthostgroup1.cn]) + command = host2.make_create_command() + result = command() + defaulthostgroup1.attrs.update(member_host=[host2.fqdn]) + + host3.track_create() + host3.attrs.update(memberofindirect_netgroup=[hostgroup2.cn], + memberof_hostgroup=[hostgroup2.cn]) + command = host3.make_create_command() + result = command() + hostgroup2.attrs.update(member_host=[host3.fqdn]) + + host4.track_create() + host4.attrs.update(memberofindirect_netgroup=[hostgroup3.cn], + memberof_hostgroup=[hostgroup3.cn]) + command = host4.make_create_command() + result = command() + hostgroup3.attrs.update(member_host=[host4.fqdn]) + + host5.track_create() + host5.attrs.update(memberofindirect_netgroup=[hostgroup4.cn], + memberof_hostgroup=[hostgroup4.cn]) + command = host5.make_create_command() + result = command() + hostgroup4.attrs.update(member_host=[host5.fqdn]) + + hostgroup1.retrieve() + hostgroup2.retrieve() + hostgroup3.retrieve() + hostgroup4.retrieve() + + def test_rebuild_membership_for_one_host(self, automember_hostgroup, + host1): + """ Rebuild hostgroup automember membership for one host """ + command = automember_hostgroup.make_rebuild_command(type=u'hostgroup', + hosts=host1.fqdn) + result = command() + automember_hostgroup.check_rebuild(result) + + def test_rebuild_membership_for_one_user(self, automember_group, user1): + """ Rebuild group automember membership for one user """ + command = automember_group.make_rebuild_command(type=u'group', + users=user1.name) + result = command() + automember_group.check_rebuild(result) + + def test_rebuild_membership_with_invalid_hosts_in_hosts( + self, automember_hostgroup): + """ Try to rebuild membership with invalid host in --hosts """ + command = automember_hostgroup.make_rebuild_command( + hosts=fqdn_does_not_exist) + with raises_exact(errors.NotFound( + reason=u'%s: host not found' % fqdn_does_not_exist)): + command() + + def test_rebuild_membership_with_invalid_user_in_users(self, + automember_group): + """ Try to rebuild membership with invalid user in --users """ + command = automember_group.make_rebuild_command( + users=user_does_not_exist) + with raises_exact(errors.NotFound( + reason=u'%s: user not found' % user_does_not_exist)): + command() + + def test_reset_automember_default_groups(self, defaultgroup1, user1, + defaulthostgroup1, manager1): + """ Reset automember group defaults """ + manager1.delete() + user1.delete() + result = api.Command['automember_default_group_remove']( + type=u'group', + ) + + assert_deepequal( + dict( + result=dict( + automemberdefaultgroup=u'No default (fallback) group set', + cn=([u'Group']) + ), + value=u'group', + summary=u'Removed default (fallback) group' + ' for automember "group"'), + result) + result = api.Command['automember_default_group_remove']( + type=u'hostgroup', + ) - dict( - desc='Create %r' % fqdn5, - command=('host_add', [fqdn5], - dict( - description=u'Test host 5', - l=u'Undisclosed location 1', - force=True, - ), - ), - expected=dict( - value=fqdn5, - summary=u'Added host "%s"' % fqdn5, + assert_deepequal( + dict( result=dict( - dn=DN(('fqdn', fqdn5), ('cn', 'computers'), ('cn', 'accounts'), api.env.basedn), - fqdn=[fqdn5], - description=[u'Test host 5'], - l=[u'Undisclosed location 1'], - krbprincipalname=[u'host/%s@%s' % (fqdn5, api.env.realm)], - has_keytab=False, - has_password=False, - objectclass=objectclasses.host, - ipauniqueid=[fuzzy_uuid], - managedby_host=[fqdn5], - memberof_hostgroup=[hostgroup4], - memberofindirect_netgroup=[hostgroup4], - ), - ), - ), - - - dict( - desc='Retrieve %r' % hostgroup1, - command=('hostgroup_show', [hostgroup1], {}), - expected=dict( - value=hostgroup1, - summary=None, - result={ - 'dn': DN(('cn', hostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - 'member_host': [u'%s' % fqdn1], - 'cn': [hostgroup1], - 'description': [u'Test desc'], - }, - ), - ), - - - dict( - desc='Retrieve %r' % defaulthostgroup1, - command=('hostgroup_show', [defaulthostgroup1], {}), - expected=dict( - value=defaulthostgroup1, - summary=None, - result={ - 'dn': DN(('cn', defaulthostgroup1), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - 'member_host': [u'%s' % fqdn2], - 'cn': [defaulthostgroup1], - 'description': [u'Default test desc'], - }, - ), - ), - - - dict( - desc='Retrieve %r' % hostgroup2, - command=('hostgroup_show', [hostgroup2], {}), - expected=dict( - value=hostgroup2, - summary=None, - result={ - 'dn': DN(('cn', hostgroup2), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - 'member_host': [u'%s' % fqdn3], - 'cn': [hostgroup2], - 'description': [u'Test desc'], - }, - ), - ), - - - dict( - desc='Retrieve %r' % hostgroup3, - command=('hostgroup_show', [hostgroup3], {}), - expected=dict( - value=hostgroup3, - summary=None, - result={ - 'dn': DN(('cn', hostgroup3), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - 'member_host': [u'%s' % fqdn4], - 'cn': [hostgroup3], - 'description': [u'Test desc'], - }, - ), - ), - + automemberdefaultgroup=u'No default (fallback) group set', + cn=([u'Hostgroup']) + ), + value=u'hostgroup', + summary=u'Removed default (fallback) group' + ' for automember "hostgroup"'), + result) - dict( - desc='Retrieve %r' % hostgroup4, - command=('hostgroup_show', [hostgroup4], {}), - expected=dict( - value=hostgroup4, - summary=None, - result={ - 'dn': DN(('cn', hostgroup4), ('cn', 'hostgroups'), ('cn', 'accounts'), api.env.basedn), - 'member_host': [u'%s' % fqdn5], - 'cn': [hostgroup4], - 'description': [u'Test desc'], - }, - ), - ), - - dict( - desc='Rebuild membership with type hostgroup and --hosts', - command=('automember_rebuild', [], {u'type': u'hostgroup', u'hosts': fqdn1}), - expected=dict( - value=None, - summary=u'Automember rebuild task finished. Processed (1) entries.', - result={ - } - ), - ), - - dict( - desc='Rebuild membership with type group and --users', - command=('automember_rebuild', [], {u'type': u'group', u'users': user1}), - expected=dict( - value=None, - summary=u'Automember rebuild task finished. Processed (1) entries.', - result={ - } - ), - ), - - dict( - desc='Try to rebuild membership with invalid host in --hosts', - command=('automember_rebuild', [], {u'type': u'hostgroup', u'hosts': fqdn_does_not_exist}), - expected=errors.NotFound(reason='%s: host not found' % fqdn_does_not_exist), - ), - - dict( - desc='Try to rebuild membership with invalid user in --users', - command=('automember_rebuild', [], {u'type': u'group', u'users': user_does_not_exist}), - expected=errors.NotFound(reason='%s: user not found' % user_does_not_exist), - ), - ] + defaultgroup1.ensure_missing() + defaulthostgroup1.ensure_missing() |