Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rjeffman: idempotence playground. #1190

Draft
wants to merge 16 commits into
base: master
Choose a base branch
from

ipagroup: Fix idempotence issues due to capitalization

c174a36
Select commit
Loading
Failed to load commit list.
Draft

rjeffman: idempotence playground. #1190

ipagroup: Fix idempotence issues due to capitalization
c174a36
Select commit
Loading
Failed to load commit list.
Azure Pipelines / CheckPR failed Dec 29, 2023 in 4h 44m 46s

Build #20231229.2 had test failures

Details

Tests

  • Failed: 80 (7.80%)
  • Passed: 945 (92.20%)
  • Other: 0 (0.00%)
  • Total: 1,025

Annotations

Check failure on line 1693 in Build log

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

Build log #L1693

Bash exited with code '1'.

Check failure on line 1715 in Build log

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

Build log #L1715

Bash exited with code '1'.

Check failure on line 1714 in Build log

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

Build log #L1714

Bash exited with code '1'.

Check failure on line 1693 in Build log

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

Build log #L1693

Bash exited with code '1'.

Check failure on line 1 in test_idoverrideuser_client_context

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

test_idoverrideuser_client_context

AssertionError: ns)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1577, in execute
    raise e
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1574, in execute
    self._exc_wrapper(keys, options, ldap.update_entry)(update)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
    return func(*call_args, **call_kwargs)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1216, in exc_func
    self, keys, options, e, call_func, *args, **kwargs)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1619, in exc_callback
    raise exc
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
    return func(*call_args, **call_kwargs)
  File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1896, in update_entry
    super(LDAPCache, self).update_entry(entry)
  File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1700, in update_entry
    raise errors.EmptyModlist()
fatal: [c8s]: FAILED! => {
    "changed": false,
    "failed_when_result": true,
    "invocation": {
        "module_args": {
            "action": "idoverrideuser",
            "anchor": [
                "test_user1"
            ],
            "certificate": null,
            "delete_continue": null,
            "description": null,
            "fallback_to_ldap": null,
            "gecos": null,
            "gidnumber": null,
            "homedir": null,
            "idview": "test_idview",
            "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "ipaadmin_principal": "admin",
            "ipaapi_context": null,
            "ipaapi_ldap_cache": true,
            "name": null,
            "nomembers": null,
            "shell": null,
            "sshpubkey": null,
            "state": "present",
            "uid": "20001"
        }
    },
    "msg": "idoverrideuser_mod: test_idview: no modifications to be performed"
}

PLAY RECAP *********************************************************************
c8s                        : ok=25   changed=13   unreachable=0    failed=1    skipped=3    rescued=0    ignored=0   


------------------------------ Captured stderr ------------------------------
[WARNING]: Could not match supplied host pattern, ignoring: ipaclients

------------------------------ Playbook Return Code ------------------------------
ansible-playbook return code: 2
Raw output
self = <test_playbook_runs.idoverrideuser testMethod=test_idoverrideuser_client_context>
test_path = '/home/vsts/work/1/s/tests/idoverrideuser/test_idoverrideuser_client_context.yml'
test_name = 'test_idoverrideuser_client_context'

    @pytest.mark.playbook
    @prepare_test(test_name, test_path)
    def method(self, test_path, test_name):
>       run_playbook(test_path)

tests/test_playbook_runs.py:73: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

playbook = '/home/vsts/work/1/s/tests/idoverrideuser/test_idoverrideuser_client_context.yml'
allow_failures = False

    def run_playbook(playbook, allow_failures=False):
        """
        Run an Ansible playbook and assert the return code.
    
        Call ansible (using _run_playbook function) and assert the result of
        the execution.
    
        In case of failure the tail of the error message will be displayed
        as an assertion message.
    
        The full log of the execution will be available in the directory
        `tests/logs/`.
        """
        result = _run_playbook(playbook)
    
        if allow_failures:
            return result
    
        status_code_msg = "ansible-playbook return code: {0}".format(
            result.returncode
        )
        assert_msg = "\n".join(
            [
                "",
                "-" * 30 + " Captured stdout " + "-" * 30,
                result.stdout.decode("utf8"),
                "-" * 30 + " Captured stderr " + "-" * 30,
                result.stderr.decode("utf8"),
                "-" * 30 + " Playbook Return Code " + "-" * 30,
                status_code_msg,
            ]
        )
    
        # Need to get the last bytes of msg otherwise Azure
        #   will cut it out.
>       assert result.returncode == 0, assert_msg[-2500:]
E       AssertionError: ns)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1577, in execute
E           raise e
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1574, in execute
E           self._exc_wrapper(keys, options, ldap.update_entry)(update)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
E           return func(*call_args, **call_kwargs)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1216, in exc_func
E           self, keys, options, e, call_func, *args, **kwargs)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1619, in exc_callback
E           raise exc
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
E           return func(*call_args, **call_kwargs)
E         File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1896, in update_entry
E           super(LDAPCache, self).update_entry(entry)
E         File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1700, in update_entry
E           raise errors.EmptyModlist()
E       fatal: [c8s]: FAILED! => {
E           "changed": false,
E           "failed_when_result": true,
E           "invocation": {
E               "module_args": {
E                   "action": "idoverrideuser",
E                   "anchor": [
E                       "test_user1"
E                   ],
E                   "certificate": null,
E                   "delete_continue": null,
E                   "description": null,
E                   "fallback_to_ldap": null,
E                   "gecos": null,
E                   "gidnumber": null,
E                   "homedir": null,
E                   "idview": "test_idview",
E                   "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
E                   "ipaadmin_principal": "admin",
E                   "ipaapi_context": null,
E                   "ipaapi_ldap_cache": true,
E                   "name": null,
E                   "nomembers": null,
E                

Check failure on line 1 in test_idoverrideuser

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

test_idoverrideuser

AssertionError: b/frontend.py", line 816, in run
    return self.execute(*args, **options)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1577, in execute
    raise e
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1574, in execute
    self._exc_wrapper(keys, options, ldap.update_entry)(update)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
    return func(*call_args, **call_kwargs)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1216, in exc_func
    self, keys, options, e, call_func, *args, **kwargs)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1619, in exc_callback
    raise exc
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
    return func(*call_args, **call_kwargs)
  File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1896, in update_entry
    super(LDAPCache, self).update_entry(entry)
  File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1700, in update_entry
    raise errors.EmptyModlist()
fatal: [c8s]: FAILED! => {
    "changed": false,
    "failed_when_result": true,
    "invocation": {
        "module_args": {
            "action": "idoverrideuser",
            "anchor": [
                "test_user1"
            ],
            "certificate": null,
            "delete_continue": null,
            "description": null,
            "fallback_to_ldap": null,
            "gecos": null,
            "gidnumber": null,
            "homedir": null,
            "idview": "test_idview",
            "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "ipaadmin_principal": "admin",
            "ipaapi_context": null,
            "ipaapi_ldap_cache": true,
            "name": null,
            "nomembers": null,
            "shell": null,
            "sshpubkey": null,
            "state": "present",
            "uid": "20001"
        }
    },
    "msg": "idoverrideuser_mod: test_idview: no modifications to be performed"
}

PLAY RECAP *********************************************************************
c8s                        : ok=21   changed=13   unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   


------------------------------ Captured stderr ------------------------------

------------------------------ Playbook Return Code ------------------------------
ansible-playbook return code: 2
Raw output
self = <test_playbook_runs.idoverrideuser testMethod=test_idoverrideuser>
test_path = '/home/vsts/work/1/s/tests/idoverrideuser/test_idoverrideuser.yml'
test_name = 'test_idoverrideuser'

    @pytest.mark.playbook
    @prepare_test(test_name, test_path)
    def method(self, test_path, test_name):
>       run_playbook(test_path)

tests/test_playbook_runs.py:73: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

playbook = '/home/vsts/work/1/s/tests/idoverrideuser/test_idoverrideuser.yml'
allow_failures = False

    def run_playbook(playbook, allow_failures=False):
        """
        Run an Ansible playbook and assert the return code.
    
        Call ansible (using _run_playbook function) and assert the result of
        the execution.
    
        In case of failure the tail of the error message will be displayed
        as an assertion message.
    
        The full log of the execution will be available in the directory
        `tests/logs/`.
        """
        result = _run_playbook(playbook)
    
        if allow_failures:
            return result
    
        status_code_msg = "ansible-playbook return code: {0}".format(
            result.returncode
        )
        assert_msg = "\n".join(
            [
                "",
                "-" * 30 + " Captured stdout " + "-" * 30,
                result.stdout.decode("utf8"),
                "-" * 30 + " Captured stderr " + "-" * 30,
                result.stderr.decode("utf8"),
                "-" * 30 + " Playbook Return Code " + "-" * 30,
                status_code_msg,
            ]
        )
    
        # Need to get the last bytes of msg otherwise Azure
        #   will cut it out.
>       assert result.returncode == 0, assert_msg[-2500:]
E       AssertionError: b/frontend.py", line 816, in run
E           return self.execute(*args, **options)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1577, in execute
E           raise e
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1574, in execute
E           self._exc_wrapper(keys, options, ldap.update_entry)(update)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
E           return func(*call_args, **call_kwargs)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1216, in exc_func
E           self, keys, options, e, call_func, *args, **kwargs)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1619, in exc_callback
E           raise exc
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
E           return func(*call_args, **call_kwargs)
E         File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1896, in update_entry
E           super(LDAPCache, self).update_entry(entry)
E         File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1700, in update_entry
E           raise errors.EmptyModlist()
E       fatal: [c8s]: FAILED! => {
E           "changed": false,
E           "failed_when_result": true,
E           "invocation": {
E               "module_args": {
E                   "action": "idoverrideuser",
E                   "anchor": [
E                       "test_user1"
E                   ],
E                   "certificate": null,
E                   "delete_continue": null,
E                   "description": null,
E                   "fallback_to_ldap": null,
E                   "gecos": null,
E                   "gidnumber": null,
E                   "homedir": null,
E                   "idview": "test_idview",
E                   "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
E                   "ipaadmin_principal": "admin",
E                   "ipaapi_context": null,
E                   "ipaapi_ldap_cache": true,
E                   "name": null,
E                   "nomembers": null

Check failure on line 1 in test_sudorule

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

test_sudorule

AssertionError: server/plugins/baseldap.py", line 1574, in execute
    self._exc_wrapper(keys, options, ldap.update_entry)(update)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
    return func(*call_args, **call_kwargs)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1216, in exc_func
    self, keys, options, e, call_func, *args, **kwargs)
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1619, in exc_callback
    raise exc
  File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
    return func(*call_args, **call_kwargs)
  File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1896, in update_entry
    super(LDAPCache, self).update_entry(entry)
  File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1700, in update_entry
    raise errors.EmptyModlist()
fatal: [c8s]: FAILED! => {
    "changed": false,
    "failed_when_result": true,
    "invocation": {
        "module_args": {
            "action": "sudorule",
            "allow_sudocmd": null,
            "allow_sudocmdgroup": null,
            "cmdcategory": null,
            "deny_sudocmd": null,
            "deny_sudocmdgroup": null,
            "description": null,
            "group": null,
            "host": null,
            "hostcategory": null,
            "hostgroup": null,
            "hostmask": null,
            "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "ipaadmin_principal": "admin",
            "ipaapi_context": null,
            "ipaapi_ldap_cache": true,
            "name": [
                "testrule1"
            ],
            "nomembers": null,
            "order": 1,
            "runasgroup": null,
            "runasgroupcategory": null,
            "runasuser": null,
            "runasusercategory": null,
            "state": "present",
            "sudooption": null,
            "user": null,
            "usercategory": null
        }
    },
    "msg": "sudorule_mod: testrule1: no modifications to be performed"
}

PLAY RECAP *********************************************************************
c8s                        : ok=49   changed=28   unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   


------------------------------ Captured stderr ------------------------------

------------------------------ Playbook Return Code ------------------------------
ansible-playbook return code: 2
Raw output
self = <test_playbook_runs.sudorule testMethod=test_sudorule>
test_path = '/home/vsts/work/1/s/tests/sudorule/test_sudorule.yml'
test_name = 'test_sudorule'

    @pytest.mark.playbook
    @prepare_test(test_name, test_path)
    def method(self, test_path, test_name):
>       run_playbook(test_path)

tests/test_playbook_runs.py:73: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

playbook = '/home/vsts/work/1/s/tests/sudorule/test_sudorule.yml'
allow_failures = False

    def run_playbook(playbook, allow_failures=False):
        """
        Run an Ansible playbook and assert the return code.
    
        Call ansible (using _run_playbook function) and assert the result of
        the execution.
    
        In case of failure the tail of the error message will be displayed
        as an assertion message.
    
        The full log of the execution will be available in the directory
        `tests/logs/`.
        """
        result = _run_playbook(playbook)
    
        if allow_failures:
            return result
    
        status_code_msg = "ansible-playbook return code: {0}".format(
            result.returncode
        )
        assert_msg = "\n".join(
            [
                "",
                "-" * 30 + " Captured stdout " + "-" * 30,
                result.stdout.decode("utf8"),
                "-" * 30 + " Captured stderr " + "-" * 30,
                result.stderr.decode("utf8"),
                "-" * 30 + " Playbook Return Code " + "-" * 30,
                status_code_msg,
            ]
        )
    
        # Need to get the last bytes of msg otherwise Azure
        #   will cut it out.
>       assert result.returncode == 0, assert_msg[-2500:]
E       AssertionError: server/plugins/baseldap.py", line 1574, in execute
E           self._exc_wrapper(keys, options, ldap.update_entry)(update)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
E           return func(*call_args, **call_kwargs)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1216, in exc_func
E           self, keys, options, e, call_func, *args, **kwargs)
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1619, in exc_callback
E           raise exc
E         File "/usr/lib/python3.6/site-packages/ipaserver/plugins/baseldap.py", line 1207, in wrapped
E           return func(*call_args, **call_kwargs)
E         File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1896, in update_entry
E           super(LDAPCache, self).update_entry(entry)
E         File "/usr/lib/python3.6/site-packages/ipapython/ipaldap.py", line 1700, in update_entry
E           raise errors.EmptyModlist()
E       fatal: [c8s]: FAILED! => {
E           "changed": false,
E           "failed_when_result": true,
E           "invocation": {
E               "module_args": {
E                   "action": "sudorule",
E                   "allow_sudocmd": null,
E                   "allow_sudocmdgroup": null,
E                   "cmdcategory": null,
E                   "deny_sudocmd": null,
E                   "deny_sudocmdgroup": null,
E                   "description": null,
E                   "group": null,
E                   "host": null,
E                   "hostcategory": null,
E                   "hostgroup": null,
E                   "hostmask": null,
E                   "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
E                   "ipaadmin_principal": "admin",
E                   "ipaapi_context": null,
E                   "ipaapi_ldap_cache": true,
E                   "name": [
E                       "testrule1"
E                   ],
E                   "nomembers": null,
E                   "order": 1,
E                   "runasgroup": null,
E                   "runasgroupcategory": null,
E                   "runasuser": null,
E                   "runasusercategory": null,
E             

Check failure on line 1 in test_sudorule_client_context

See this annotation in the file changed.

@azure-pipelines azure-pipelines / CheckPR

test_sudorule_client_context

AssertionError: urn self.__do_call(*args, **options)
  File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 499, in __do_call
    ret = self.run(*args, **options)
  File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 817, in run
    return self.forward(*args, **options)
  File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 840, in forward
    *args, **kw)
  File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1146, in forward
    return self._call_command(command, params)
  File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1122, in _call_command
    return command(*params)
  File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1276, in _call
    return self.__request(name, args)
  File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1270, in __request
    raise error_class(**kw)
fatal: [c8s]: FAILED! => {
    "changed": false,
    "failed_when_result": true,
    "invocation": {
        "module_args": {
            "action": "sudorule",
            "allow_sudocmd": null,
            "allow_sudocmdgroup": null,
            "cmdcategory": null,
            "deny_sudocmd": null,
            "deny_sudocmdgroup": null,
            "description": null,
            "group": null,
            "host": null,
            "hostcategory": null,
            "hostgroup": null,
            "hostmask": null,
            "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "ipaadmin_principal": "admin",
            "ipaapi_context": "client",
            "ipaapi_ldap_cache": true,
            "name": [
                "testrule1"
            ],
            "nomembers": null,
            "order": 1,
            "runasgroup": null,
            "runasgroupcategory": null,
            "runasuser": null,
            "runasusercategory": null,
            "state": "present",
            "sudooption": null,
            "user": null,
            "usercategory": null
        }
    },
    "msg": "sudorule_mod: testrule1: no modifications to be performed"
}

PLAY RECAP *********************************************************************
c8s                        : ok=53   changed=30   unreachable=0    failed=1    skipped=3    rescued=0    ignored=0   


------------------------------ Captured stderr ------------------------------
[WARNING]: Could not match supplied host pattern, ignoring: ipaclients

------------------------------ Playbook Return Code ------------------------------
ansible-playbook return code: 2
Raw output
self = <test_playbook_runs.sudorule testMethod=test_sudorule_client_context>
test_path = '/home/vsts/work/1/s/tests/sudorule/test_sudorule_client_context.yml'
test_name = 'test_sudorule_client_context'

    @pytest.mark.playbook
    @prepare_test(test_name, test_path)
    def method(self, test_path, test_name):
>       run_playbook(test_path)

tests/test_playbook_runs.py:73: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

playbook = '/home/vsts/work/1/s/tests/sudorule/test_sudorule_client_context.yml'
allow_failures = False

    def run_playbook(playbook, allow_failures=False):
        """
        Run an Ansible playbook and assert the return code.
    
        Call ansible (using _run_playbook function) and assert the result of
        the execution.
    
        In case of failure the tail of the error message will be displayed
        as an assertion message.
    
        The full log of the execution will be available in the directory
        `tests/logs/`.
        """
        result = _run_playbook(playbook)
    
        if allow_failures:
            return result
    
        status_code_msg = "ansible-playbook return code: {0}".format(
            result.returncode
        )
        assert_msg = "\n".join(
            [
                "",
                "-" * 30 + " Captured stdout " + "-" * 30,
                result.stdout.decode("utf8"),
                "-" * 30 + " Captured stderr " + "-" * 30,
                result.stderr.decode("utf8"),
                "-" * 30 + " Playbook Return Code " + "-" * 30,
                status_code_msg,
            ]
        )
    
        # Need to get the last bytes of msg otherwise Azure
        #   will cut it out.
>       assert result.returncode == 0, assert_msg[-2500:]
E       AssertionError: urn self.__do_call(*args, **options)
E         File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 499, in __do_call
E           ret = self.run(*args, **options)
E         File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 817, in run
E           return self.forward(*args, **options)
E         File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 840, in forward
E           *args, **kw)
E         File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1146, in forward
E           return self._call_command(command, params)
E         File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1122, in _call_command
E           return command(*params)
E         File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1276, in _call
E           return self.__request(name, args)
E         File "/usr/lib/python3.6/site-packages/ipalib/rpc.py", line 1270, in __request
E           raise error_class(**kw)
E       fatal: [c8s]: FAILED! => {
E           "changed": false,
E           "failed_when_result": true,
E           "invocation": {
E               "module_args": {
E                   "action": "sudorule",
E                   "allow_sudocmd": null,
E                   "allow_sudocmdgroup": null,
E                   "cmdcategory": null,
E                   "deny_sudocmd": null,
E                   "deny_sudocmdgroup": null,
E                   "description": null,
E                   "group": null,
E                   "host": null,
E                   "hostcategory": null,
E                   "hostgroup": null,
E                   "hostmask": null,
E                   "ipaadmin_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
E                   "ipaadmin_principal": "admin",
E                   "ipaapi_context": "client",
E                   "ipaapi_ldap_cache": true,
E                   "name": [
E                       "testrule1"
E                   ],
E                   "nomembers": null,
E                   "order": 1,
E                   "runasgroup": null,
E                   "runasgroupcategory": null,
E                   "runasuser": null,
E                   "runasusercategory": null,
E