# Buggy code
def update_resources(module, p):
    """update_resources attempts to fetch any of the resources given
    by name using their unique field (identity)
    """
    params = p.copy()
    identity_map = {
        "user": "username",
        "team": "name",
        "target_team": "name",
        "inventory": "name",
        "job_template": "name",
        "credential": "name",
        "organization": "name",
        "project": "name",
    }
    for k, v in identity_map.items():
        try:
            if params[k]:
                key = "team" if k == "target_team" else k
                result = tower_cli.get_resource(key).get(**{v: params[k]})
                params[k] = result["id"]
        except exc.NotFound as excinfo:
            module.fail_json(
                msg="Failed to update role, {0} not found: {1}".format(k, excinfo),
                changed=False,
            )
    return params


# Traceback (tower_cli.exceptions.BadRequest)
TASK [tower-manage : Add user to team] *************************************************************************
task path: /home/ikanse/Ansible/ansible-tower-manage-playbook/roles/tower-manage/tasks/main.yml:24
Using module file /usr/lib/python2.7/site-packages/ansible/modules/web_infrastructure/ansible_tower/tower_role.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: ikanse
<localhost> EXEC /bin/sh -c 'echo ~ &amp;&amp; sleep 0'
<localhost> EXEC /bin/sh -c '( umask 77 &amp;&amp; mkdir -p "` echo /home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684 `" &amp;&amp; echo ansible-tmp-1520232438.17-217702889247684="` echo /home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684 `" ) &amp;&amp; sleep 0'
<localhost> PUT /tmp/tmpxkOOCO TO /home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684/tower_role.py
<localhost> EXEC /bin/sh -c 'chmod u+x /home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684/ /home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684/tower_role.py &amp;&amp; sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python /home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684/tower_role.py; rm -rf "/home/ikanse/.ansible/tmp/ansible-tmp-1520232438.17-217702889247684/" > /dev/null 2>&amp;1 &amp;&amp; sleep 0'
The full traceback is:
Traceback (most recent call last):
File "/tmp/ansible_9eTSgJ/ansible_module_tower_role.py", line 220, in <module>
main()
File "/tmp/ansible_9eTSgJ/ansible_module_tower_role.py", line 207, in main
result = role.grant(**params)
File "/usr/lib/python2.7/site-packages/tower_cli/resources/role.py", line 359, in grant
return self.role_write(fail_on_found=fail_on_found, **kwargs)
File "/usr/lib/python2.7/site-packages/tower_cli/resources/role.py", line 236, in role_write
fail_on_multiple_results=True, **data)
File "/usr/lib/python2.7/site-packages/tower_cli/models/base.py", line 286, in read
r = client.get(url, params=kwargs)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 521, in get
return self.request('GET', url, **kwargs)
File "/usr/lib/python2.7/site-packages/tower_cli/api.py", line 236, in request
kwargs.get('data', None), r.content.decode('utf8'))
tower_cli.exceptions.BadRequest: The Tower server claims it was sent a bad request.

GET https://13.126.199.60/api/v2/teams/1/object_roles/
Params: {'state': 'present', 'tower_verify_ssl': True, 'role_field': 'member_role'}
Data: None

Response: {"detail":"Role has no field named 'state'"}

fatal: [localhost]: FAILED! => {
"changed": false,
"module_stderr": "Traceback (most recent call last):\n  File \"/tmp/ansible_9eTSgJ/ansible_module_tower_role.py\", line 220, in <module>\n    main()\n  File \"/tmp/ansible_9eTSgJ/ansible_module_tower_role.py\", line 207, in main\n    result = role.grant(**params)\n  File \"/usr/lib/python2.7/site-packages/tower_cli/resources/role.py\", line 359, in grant\n    return self.role_write(fail_on_found=fail_on_found, **kwargs)\n  File \"/usr/lib/python2.7/site-packages/tower_cli/resources/role.py\", line 236, in role_write\n    fail_on_multiple_results=True, **data)\n  File \"/usr/lib/python2.7/site-packages/tower_cli/models/base.py\", line 286, in read\n    r = client.get(url, params=kwargs)\n  File \"/usr/lib/python2.7/site-packages/requests/sessions.py\", line 521, in get\n    return self.request('GET', url, **kwargs)\n  File \"/usr/lib/python2.7/site-packages/tower_cli/api.py\", line 236, in request\n    kwargs.get('data', None), r.content.decode('utf8'))\ntower_cli.exceptions.BadRequest: The Tower server claims it was sent a bad request.\n\nGET https://13.126.199.60/api/v2/teams/1/object_roles/\nParams: {'state': 'present', 'tower_verify_ssl': True, 'role_field': 'member_role'}\nData: None\n\nResponse: {\"detail\":\"Role has no field named 'state'\"}\n",
"module_stdout": "",
"msg": "MODULE FAILURE",
"rc": 0
}

# Fixed code
def update_resources(module, p):
    """update_resources attempts to fetch any of the resources given
    by name using their unique field (identity)
    """
    params = p.copy()
    for key in p:
        if key.startswith("tower_"):
            params.pop(key)
    params.pop("state", None)
    identity_map = {
        "user": "username",
        "team": "name",
        "target_team": "name",
        "inventory": "name",
        "job_template": "name",
        "credential": "name",
        "organization": "name",
        "project": "name",
    }
    for k, v in identity_map.items():
        try:
            if params[k]:
                key = "team" if k == "target_team" else k
                result = tower_cli.get_resource(key).get(**{v: params[k]})
                params[k] = result["id"]
        except exc.NotFound as excinfo:
            module.fail_json(
                msg="Failed to update role, {0} not found: {1}".format(k, excinfo),
                changed=False,
            )
    return params