summaryrefslogtreecommitdiffstats
path: root/awx_collection/plugins/modules/tower_project_update.py
blob: c2ebf2e422f567e1b67e17e6fc53c494136ee062 (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
144
#!/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: tower_project_update
author: "Sean Sullivan (@sean-m-sullivan)"
short_description: Update a Project in Ansible Tower
description:
    - Update a Ansible Tower 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.
      default: True
      type: bool
    interval:
      description:
        - The interval to request an update from Tower.
      required: False
      default: 1
      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
  tower_project_update:
    project: "Networking Project"
    timeout: 10

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

from ..module_utils.tower_api import TowerAPIModule
import json
import time


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=1.0, type='float'),
        timeout=dict(default=None, type='int'),
    )

    # Create a module for ourselves
    module = TowerAPIModule(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")

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

    if 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)

    # Grab our start time to compare against for the timeout
    start = time.time()

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

    # Invoke wait function
    module.wait_on_url(
        url=result['json']['url'],
        object_name=module.get_item_name(project),
        object_type='Project Update',
        timeout=timeout, interval=interval
    )

    module.exit_json(**module.json_output)


if __name__ == '__main__':
    main()