summaryrefslogtreecommitdiffstats
path: root/awx_collection/plugins/modules/project_update.py
blob: 9d5a8841a7c5dfa3aa8e78ebe9a70b746a3ec6ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/python
# coding: utf-8 -*-

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

from __future__ import absolute_import, division, print_function

__metaclass__ = type

ANSIBLE_METADATA = {'metadata_version': '1.0', 'status': ['preview'], 'supported_by': 'community'}

DOCUMENTATION = '''
---
module: project_update
author: "Sean Sullivan (@sean-m-sullivan)"
short_description: Update a Project in Automation Platform Controller
description:
    - Update a Automation Platform Controller Project. See
      U(https://www.ansible.com/tower) for an overview.
options:
    name:
      description:
        - The name or id of the project to update.
      required: True
      type: str
      aliases:
        - project
    organization:
      description:
        - Organization the project exists in.
        - Used to help lookup the object, cannot be modified using this module.
        - If not provided, will lookup by name only, which does not work with duplicates.
      type: str
    wait:
      description:
        - Wait for the project to update.
        - If scm revision has not changed module will return not changed.
      default: True
      type: bool
    interval:
      description:
        - The interval to request an update from the controller.
      required: False
      default: 2
      type: float
    timeout:
      description:
        - If waiting for the project to update this will abort after this
          amount of seconds
      type: int
extends_documentation_fragment: awx.awx.auth
'''

RETURN = '''
id:
    description: project id of the updated project
    returned: success
    type: int
    sample: 86
status:
    description: status of the updated project
    returned: success
    type: str
    sample: pending
'''


EXAMPLES = '''
- name: Launch a project with a timeout of 10 seconds
  project_update:
    project: "Networking Project"
    timeout: 10

- name: Launch a Project with extra_vars without waiting
  project_update:
    project: "Networking Project"
    wait: False
'''

from ..module_utils.controller_api import ControllerAPIModule


def main():
    # Any additional arguments that are not fields of the item can be added here
    argument_spec = dict(
        name=dict(required=True, aliases=['project']),
        organization=dict(),
        wait=dict(default=True, type='bool'),
        interval=dict(default=2.0, type='float'),
        timeout=dict(type='int'),
    )

    # Create a module for ourselves
    module = ControllerAPIModule(argument_spec=argument_spec)

    # Extract our parameters
    name = module.params.get('name')
    organization = module.params.get('organization')
    wait = module.params.get('wait')
    interval = module.params.get('interval')
    timeout = module.params.get('timeout')

    # Attempt to look up project based on the provided name or id
    lookup_data = {}
    if organization:
        lookup_data['organization'] = module.resolve_name_to_id('organizations', organization)
    project = module.get_one('projects', name_or_id=name, data=lookup_data)
    if project is None:
        module.fail_json(msg="Unable to find project")

    if wait:
        scm_revision_original = project['scm_revision']

    # Update the project
    result = module.post_endpoint(project['related']['update'])

    if result['status_code'] == 405:
        module.fail_json(
            msg="Unable to trigger a project update because the project scm_type ({0}) does not support it.".format(project['scm_type']), response=result
        )
    elif result['status_code'] != 202:
        module.fail_json(msg="Failed to update project, see response for details", response=result)

    module.json_output['changed'] = True
    module.json_output['id'] = result['json']['id']
    module.json_output['status'] = result['json']['status']

    if not wait:
        module.exit_json(**module.json_output)

    # Invoke wait function
    result = module.wait_on_url(
        url=result['json']['url'], object_name=module.get_item_name(project), object_type='Project Update', timeout=timeout, interval=interval
    )
    scm_revision_new = result['json']['scm_revision']
    if scm_revision_new == scm_revision_original:
        module.json_output['changed'] = False

    module.exit_json(**module.json_output)


if __name__ == '__main__':
    main()