From 3601c34a0b6b2f7d5eefa04518760fa6bff5c4fb Mon Sep 17 00:00:00 2001
From: Kaleemullah Siddiqui <ksiddiqu@redhat.com>
Date: Mon, 20 May 2019 13:03:12 +0530
Subject: [PATCH] Tests for autounmembership feature

New feature of autounmembership added in 389-ds-base
https://pagure.io/389-ds-base/issue/50077

Signed-off-by: Kaleemullah Siddiqui <ksiddiqu@redhat.com>
---
 ipatests/prci_definitions/nightly_f28.yaml    |  12 +
 ipatests/prci_definitions/nightly_master.yaml |  12 +
 .../prci_definitions/nightly_rawhide.yaml     |  12 +
 ipatests/test_integration/test_automember.py  | 338 ++++++++++++++++++
 4 files changed, 374 insertions(+)
 create mode 100644 ipatests/test_integration/test_automember.py

diff --git a/ipatests/prci_definitions/nightly_f28.yaml b/ipatests/prci_definitions/nightly_f28.yaml
index 036765a1c2..02c7159a88 100644
--- a/ipatests/prci_definitions/nightly_f28.yaml
+++ b/ipatests/prci_definitions/nightly_f28.yaml
@@ -1216,3 +1216,15 @@ jobs:
         template: *ci-master-f28
         timeout: 3600
         topology: *ipaserver
+
+  fedora-28/automember:
+    requires: [fedora-28/build]
+    priority: 50
+    job:
+      class: RunPytest
+      args:
+        build_url: '{fedora-28/build_url}'
+        test_suite: test_integration/test_automember.py
+        template: *ci-master-f28
+        timeout: 3600
+        topology: *ipaserver
diff --git a/ipatests/prci_definitions/nightly_master.yaml b/ipatests/prci_definitions/nightly_master.yaml
index 2303b1be88..ddb1cd2933 100644
--- a/ipatests/prci_definitions/nightly_master.yaml
+++ b/ipatests/prci_definitions/nightly_master.yaml
@@ -1228,3 +1228,15 @@ jobs:
         template: *ci-master-f29
         timeout: 3600
         topology: *ipaserver
+
+  fedora-29/automember:
+    requires: [fedora-29/build]
+    priority: 50
+    job:
+      class: RunPytest
+      args:
+        build_url: '{fedora-29/build_url}'
+        test_suite: test_integration/test_automember.py
+        template: *ci-master-f29
+        timeout: 3600
+        topology: *ipaserver
diff --git a/ipatests/prci_definitions/nightly_rawhide.yaml b/ipatests/prci_definitions/nightly_rawhide.yaml
index 53178cda68..665c384273 100644
--- a/ipatests/prci_definitions/nightly_rawhide.yaml
+++ b/ipatests/prci_definitions/nightly_rawhide.yaml
@@ -1228,3 +1228,15 @@ jobs:
         template: *ci-master-frawhide
         timeout: 9000
         topology: *master_3repl_1client
+
+  fedora-rawhide/automember:
+    requires: [fedora-rawhide/build]
+    priority: 50
+    job:
+      class: RunPytest
+      args:
+        build_url: '{fedora-rawhide/build_url}'
+        test_suite: test_integration/test_automember.py
+        template: *ci-master-frawhide
+        timeout: 3600
+        topology: *ipaserver
diff --git a/ipatests/test_integration/test_automember.py b/ipatests/test_integration/test_automember.py
new file mode 100644
index 0000000000..68dc0f6da4
--- /dev/null
+++ b/ipatests/test_integration/test_automember.py
@@ -0,0 +1,338 @@
+#
+# Copyright (C) 2019  FreeIPA Contributors see COPYING for license
+#
+"""This covers tests for automember feature
+"""
+from __future__ import absolute_import
+
+import base64
+import re
+import os
+import logging
+import paramiko
+import pytest
+import textwrap
+
+from tempfile import NamedTemporaryFile
+from ipaplatform.paths import paths
+
+from ipatests.test_integration.base import IntegrationTest
+from ipatests.pytest_ipa.integration import tasks
+
+logger = logging.getLogger(__name__)
+
+
+class TestAutomember(IntegrationTest):
+    """
+    Tests of Automember feature.
+    Covers unmembering feature described in
+    https://pagure.io/389-ds-base/issue/50077
+    """
+    topology = 'line'
+
+
+    def test_modify_user_entry_unmembership(self):
+        # https://pagure.io/389-ds-base/issue/50077
+        tasks.kinit_admin(self.master)
+        master = self.master
+        search_cmd = [
+            'ldapsearch', '-x',
+            '-D', 'cn=directory manager',
+            '-w', master.config.dirman_password,
+            '-b', 'cn=Auto Membership Plugin,cn=plugins,cn=config']
+        result = self.master.run_command(
+            search_cmd,
+            raiseonerr=False
+        )
+        assert result.returncode == 0
+        assert "automemberprocessmodifyops: on" in result.stdout_text
+
+        #testcase setup
+        cmdlist = [['ipa', 'group-add', '--desc="Dallas"', 'DallasUsers'],
+                   ['ipa', 'automember-add', '--type=group', 'DallasUsers'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=destinationindicator', '--type=group',
+                    '--inclusive-regex=Dallas', 'DallasUsers'],
+                   ['ipa', 'user-add', '--first=first', '--last=user',
+                    'user1', '--setattr=destinationindicator=Dallas'],
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'DallasUsers'],
+        )
+        assert "user1" in result.stdout_text
+
+        #Modifying the user group so that it becomes part of new group
+        cmdlist = [['ipa', 'group-add', '--desc="Houston"', 'HoustonUsers'],
+                   ['ipa', 'automember-add', '--type=group', 'HoustonUsers'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=destinationindicator', '--type=group',
+                    '--inclusive-regex=Houston', 'HoustonUsers'],
+                   ['ipa', 'user-mod', 'user1',
+                    '--setattr=destinationindicator=Houston'],
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'HoustonUsers'],
+        )
+        assert "user1" in result.stdout_text
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'DallasUsers'],
+        )
+        assert not "user1" in result.stdout_text
+
+        #Deleting the user entry and checking its not part of group anymore
+        self.master.run_command(['ipa', 'user-del', 'user1'])
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'HoustonUsers'],
+        )
+        assert not "user1" in result.stdout_text
+
+        #testcase cleanup
+        cmdlist = [['ipa', 'automember-del', '--type=group', 'DallasUsers'],
+                   ['ipa', 'automember-del', '--type=group', 'HoustonUsers'],
+                   ['ipa', 'group-del', 'DallasUsers'],
+                   ['ipa', 'group-del', 'HoustonUsers']
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+    def test_modify_host_entry_unmembership(self):
+        # https://pagure.io/389-ds-base/issue/50077
+
+        #testcase setup
+        cmdlist = [['ipa', 'hostgroup-add', '--desc="Brno"', 'Brno'],
+                   ['ipa', 'automember-add', '--type=hostgroup', 'Brno'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=nshostlocation', '--type=hostgroup',
+                    '--inclusive-regex=Brno', 'Brno'],
+                   ['ipa', 'host-add', 'host1.example.com',
+                    '--location=Brno', '--force'],
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Brno'],
+        )
+        assert "host1" in result.stdout_text
+
+        #Modifying the user group so that it becomes part of new group
+        cmdlist = [['ipa', 'hostgroup-add', '--desc="Boston"', 'Boston'],
+                   ['ipa', 'automember-add', '--type=hostgroup', 'Boston'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=nshostlocation', '--type=hostgroup',
+                    '--inclusive-regex=Boston', 'Boston'],
+                   ['ipa', 'host-mod', 'host1.example.com',
+                    '--location=Boston'],
+                  ]  
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Boston'],
+        )
+        assert "host1" in result.stdout_text
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Brno'],
+        )
+        assert not "host1" in result.stdout_text
+
+        #Deleting the user entry and checking its not part of group anymore
+
+        self.master.run_command(['ipa', 'host-del', 'host1.example.com'])
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Boston'],
+        )
+        assert not "host1" in result.stdout_text
+
+        #testcase cleanup
+        cmdlist = [['ipa', 'automember-del', '--type=hostgroup', 'Boston'],
+                   ['ipa', 'automember-del', '--type=hostgroup', 'Brno'],
+                   ['ipa', 'hostgroup-del', 'Brno'],
+                   ['ipa', 'hostgroup-del', 'Boston']
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+    def test_modify_user_entry_unmembership_disabled(self):
+        # https://pagure.io/389-ds-base/issue/50077
+        # disabling autounmembership feature in plugin
+        master = self.master
+        tf = NamedTemporaryFile()
+        ldif_file = tf.name
+
+        entry_ldif = textwrap.dedent("""
+            dn: cn=Auto Membership Plugin,cn=plugins,cn=config
+            changetype: modify
+            replace: automemberprocessmodifyops
+            automemberprocessmodifyops: off""")
+
+        master.put_file_contents(ldif_file, entry_ldif)
+
+        arg = ['ldapmodify',
+               '-h', master.hostname,
+               '-p', '389', '-D',
+               str(master.config.dirman_dn),   # pylint: disable=no-member
+               '-w', master.config.dirman_password,
+               '-f', ldif_file]
+
+        master.run_command(arg)
+        master.run_command(['ipactl', 'restart'])
+        search_cmd = [
+            'ldapsearch', '-x',
+            '-D', 'cn=directory manager',
+            '-w', master.config.dirman_password,
+            '-b', 'cn=Auto Membership Plugin,cn=plugins,cn=config']
+
+        result = self.master.run_command(
+            search_cmd,
+            raiseonerr=False
+        )
+        assert result.returncode == 0
+        assert "automemberprocessmodifyops: off" in result.stdout_text
+
+        #testcase setup
+        cmdlist = [['ipa', 'group-add', '--desc="Dallas"', 'DallasUsers'],
+                   ['ipa', 'automember-add', '--type=group', 'DallasUsers'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=destinationindicator', '--type=group',
+                    '--inclusive-regex=Dallas', 'DallasUsers'],
+                   ['ipa', 'user-add', '--first=first', '--last=user',
+                    'user2', '--setattr=destinationindicator=Dallas'],
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'DallasUsers'],
+        )
+        assert "user2" in result.stdout_text
+
+        #Modifying the user group so that it becomes part of new group
+        cmdlist = [['ipa', 'group-add', '--desc="Houston"', 'HoustonUsers'],
+                   ['ipa', 'automember-add', '--type=group', 'HoustonUsers'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=destinationindicator', '--type=group',
+                    '--inclusive-regex=Houston', 'HoustonUsers'],
+                   ['ipa', 'user-mod', 'user2',
+                    '--setattr=destinationindicator=Houston'],
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'HoustonUsers'],
+        )
+        assert not "user2" in result.stdout_text
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'DallasUsers'],
+        )
+        assert "user2" in result.stdout_text
+
+        #Running the automember-build so that user is part of correct group
+
+        self.master.run_command(['ipa', 'automember-rebuild', '--users=user2'])
+
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'HoustonUsers'],
+        )
+        assert "user2" in result.stdout_text
+        result = self.master.run_command(
+            ['ipa', 'group-show', 'DallasUsers'],
+        )
+        assert not "user2" in result.stdout_text
+
+        #testcase cleanup
+        cmdlist = [['ipa', 'user-del', 'user2'],
+                   ['ipa', 'automember-del', '--type=group', 'DallasUsers'],
+                   ['ipa', 'automember-del', '--type=group', 'HoustonUsers'],
+                   ['ipa', 'group-del', 'DallasUsers'],
+                   ['ipa', 'group-del', 'HoustonUsers']
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+    def test_modify_host_entry_unmembership_disabled(self):
+        # https://pagure.io/389-ds-base/issue/50077
+
+        #testcase setup
+        cmdlist = [['ipa', 'hostgroup-add', '--desc="Brno"', 'Brno'],
+                   ['ipa', 'automember-add', '--type=hostgroup', 'Brno'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=nshostlocation', '--type=hostgroup',
+                    '--inclusive-regex=Brno', 'Brno'],
+                   ['ipa', 'host-add', 'host2.example.com',
+                    '--location=Brno', '--force'],
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Brno'],
+        )
+        assert "host2" in result.stdout_text
+
+        #Modifying the user group so that it becomes part of new group
+        cmdlist = [['ipa', 'hostgroup-add', '--desc="Boston"', 'Boston'],
+                   ['ipa', 'automember-add', '--type=hostgroup', 'Boston'],
+                   ['ipa', 'automember-add-condition', 
+                    '--key=nshostlocation', '--type=hostgroup',
+                    '--inclusive-regex=Boston', 'Boston'],
+                   ['ipa', 'host-mod', 'host2.example.com',
+                    '--location=Boston'],
+                  ]  
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Boston'],
+        )
+        assert not "host2" in result.stdout_text
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Brno'],
+        )
+        assert "host2" in result.stdout_text
+
+        #Running the automember-build so that host is part of correct hostgroup
+
+        self.master.run_command(['ipa', 'automember-rebuild', '--hosts=host2.example.com'])
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Boston'],
+        )
+        assert "host2" in result.stdout_text
+
+        result = self.master.run_command(
+            ['ipa', 'hostgroup-show', 'Brno'],
+        )
+        assert not "host2" in result.stdout_text
+
+
+        #testcase cleanup
+        cmdlist = [['ipa', 'host-del', 'host2.example.com'],
+                   ['ipa', 'automember-del', '--type=hostgroup', 'Boston'],
+                   ['ipa', 'automember-del', '--type=hostgroup', 'Brno'],
+                   ['ipa', 'hostgroup-del', 'Brno'],
+                   ['ipa', 'hostgroup-del', 'Boston']
+                  ] 
+
+        for cmd in cmdlist:
+            self.master.run_command(cmd,)
