2020-03-09 10:11:07 +01:00
|
|
|
#!/usr/bin/python
|
2021-08-08 10:40:22 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
2020-03-09 10:11:07 +01:00
|
|
|
|
2022-08-05 13:17:19 +02:00
|
|
|
# Copyright (c) 2018, Ansible Project
|
|
|
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2020-03-09 10:11:07 +01:00
|
|
|
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
|
|
__metaclass__ = type
|
|
|
|
|
|
|
|
DOCUMENTATION = '''
|
|
|
|
---
|
|
|
|
module: heroku_collaborator
|
|
|
|
short_description: "Add or delete app collaborators on Heroku"
|
|
|
|
description:
|
|
|
|
- Manages collaborators for Heroku apps.
|
|
|
|
- If set to C(present) and heroku user is already collaborator, then do nothing.
|
|
|
|
- If set to C(present) and heroku user is not collaborator, then add user to app.
|
|
|
|
- If set to C(absent) and heroku user is collaborator, then delete user from app.
|
|
|
|
author:
|
|
|
|
- Marcel Arns (@marns93)
|
|
|
|
requirements:
|
|
|
|
- heroku3
|
|
|
|
options:
|
|
|
|
api_key:
|
2020-11-23 09:22:30 +01:00
|
|
|
type: str
|
2020-03-09 10:11:07 +01:00
|
|
|
description:
|
|
|
|
- Heroku API key
|
|
|
|
apps:
|
2020-11-23 09:22:30 +01:00
|
|
|
type: list
|
2021-03-08 08:35:09 +01:00
|
|
|
elements: str
|
2020-03-09 10:11:07 +01:00
|
|
|
description:
|
|
|
|
- List of Heroku App names
|
|
|
|
required: true
|
|
|
|
suppress_invitation:
|
|
|
|
description:
|
|
|
|
- Suppress email invitation when creating collaborator
|
|
|
|
type: bool
|
2022-08-24 20:22:10 +02:00
|
|
|
default: false
|
2020-03-09 10:11:07 +01:00
|
|
|
user:
|
2020-11-23 09:22:30 +01:00
|
|
|
type: str
|
2020-03-09 10:11:07 +01:00
|
|
|
description:
|
|
|
|
- User ID or e-mail
|
|
|
|
required: true
|
|
|
|
state:
|
2020-11-23 09:22:30 +01:00
|
|
|
type: str
|
2020-03-09 10:11:07 +01:00
|
|
|
description:
|
|
|
|
- Create or remove the heroku collaborator
|
|
|
|
choices: ["present", "absent"]
|
|
|
|
default: "present"
|
|
|
|
notes:
|
|
|
|
- C(HEROKU_API_KEY) and C(TF_VAR_HEROKU_API_KEY) env variable can be used instead setting C(api_key).
|
|
|
|
- If you use I(--check), you can also pass the I(-v) flag to see affected apps in C(msg), e.g. ["heroku-example-app"].
|
|
|
|
'''
|
|
|
|
|
|
|
|
EXAMPLES = '''
|
2020-05-15 12:13:45 +02:00
|
|
|
- name: Create a heroku collaborator
|
2020-07-13 21:50:31 +02:00
|
|
|
community.general.heroku_collaborator:
|
2020-03-09 10:11:07 +01:00
|
|
|
api_key: YOUR_API_KEY
|
|
|
|
user: max.mustermann@example.com
|
|
|
|
apps: heroku-example-app
|
|
|
|
state: present
|
|
|
|
|
2020-05-15 12:13:45 +02:00
|
|
|
- name: An example of using the module in loop
|
2020-07-13 21:50:31 +02:00
|
|
|
community.general.heroku_collaborator:
|
2020-03-09 10:11:07 +01:00
|
|
|
api_key: YOUR_API_KEY
|
|
|
|
user: '{{ item.user }}'
|
|
|
|
apps: '{{ item.apps | default(apps) }}'
|
|
|
|
suppress_invitation: '{{ item.suppress_invitation | default(suppress_invitation) }}'
|
|
|
|
state: '{{ item.state | default("present") }}'
|
|
|
|
with_items:
|
|
|
|
- { user: 'a.b@example.com' }
|
|
|
|
- { state: 'absent', user: 'b.c@example.com', suppress_invitation: false }
|
|
|
|
- { user: 'x.y@example.com', apps: ["heroku-example-app"] }
|
|
|
|
'''
|
|
|
|
|
|
|
|
RETURN = ''' # '''
|
|
|
|
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
from ansible_collections.community.general.plugins.module_utils.heroku import HerokuHelper
|
|
|
|
|
|
|
|
|
|
|
|
def add_or_delete_heroku_collaborator(module, client):
|
|
|
|
user = module.params['user']
|
|
|
|
state = module.params['state']
|
|
|
|
affected_apps = []
|
|
|
|
result_state = False
|
|
|
|
|
|
|
|
for app in module.params['apps']:
|
|
|
|
if app not in client.apps():
|
|
|
|
module.fail_json(msg='App {0} does not exist'.format(app))
|
|
|
|
|
|
|
|
heroku_app = client.apps()[app]
|
|
|
|
|
|
|
|
heroku_collaborator_list = [collaborator.user.email for collaborator in heroku_app.collaborators()]
|
|
|
|
|
|
|
|
if state == 'absent' and user in heroku_collaborator_list:
|
|
|
|
if not module.check_mode:
|
|
|
|
heroku_app.remove_collaborator(user)
|
|
|
|
affected_apps += [app]
|
|
|
|
result_state = True
|
|
|
|
elif state == 'present' and user not in heroku_collaborator_list:
|
|
|
|
if not module.check_mode:
|
|
|
|
heroku_app.add_collaborator(user_id_or_email=user, silent=module.params['suppress_invitation'])
|
|
|
|
affected_apps += [app]
|
|
|
|
result_state = True
|
|
|
|
|
|
|
|
return result_state, affected_apps
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
argument_spec = HerokuHelper.heroku_argument_spec()
|
|
|
|
argument_spec.update(
|
|
|
|
user=dict(required=True, type='str'),
|
2021-03-08 08:35:09 +01:00
|
|
|
apps=dict(required=True, type='list', elements='str'),
|
2020-03-09 10:11:07 +01:00
|
|
|
suppress_invitation=dict(default=False, type='bool'),
|
|
|
|
state=dict(default='present', type='str', choices=['present', 'absent']),
|
|
|
|
)
|
|
|
|
module = AnsibleModule(
|
|
|
|
argument_spec=argument_spec,
|
|
|
|
supports_check_mode=True
|
|
|
|
)
|
|
|
|
|
|
|
|
client = HerokuHelper(module).get_heroku_client()
|
|
|
|
|
|
|
|
has_changed, msg = add_or_delete_heroku_collaborator(module, client)
|
|
|
|
module.exit_json(changed=has_changed, msg=msg)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|