summaryrefslogtreecommitdiffstats
path: root/awx_collection/plugins/modules/instance.py
blob: a20b6c831cb9462f867925020ca05f9c1cbacf6a (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
145
146
147
148
#!/usr/bin/python
# coding: utf-8 -*-


# (c) 2022 Red Hat, Inc.
# 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.1', 'status': ['preview'], 'supported_by': 'community'}

DOCUMENTATION = '''
---
module: instance
author: "Rick Elrod (@relrod)"
version_added: "4.3.0"
short_description: create, update, or destroy Automation Platform Controller instances.
description:
    - Create, update, or destroy Automation Platform Controller instances. See
      U(https://www.ansible.com/tower) for an overview.
options:
    hostname:
      description:
        - Hostname of this instance.
      required: True
      type: str
    capacity_adjustment:
      description:
        - Capacity adjustment (0 <= capacity_adjustment <= 1)
      required: False
      type: float
    enabled:
      description:
        - If true, the instance will be enabled and used.
      required: False
      type: bool
      default: True
    managed_by_policy:
      description:
        - Managed by policy
      required: False
      default: True
      type: bool
    node_type:
      description:
        - Role that this node plays in the mesh.
      choices:
        - control
        - execution
        - hybrid
        - hop
      required: False
      type: str
      default: execution
    node_state:
      description:
        - Indicates the current life cycle stage of this instance.
      choices:
        - provisioning
        - provision-fail
        - installed
        - ready
        - unavailable
        - deprovisioning
        - deprovision-fail
      required: False
      default: installed
      type: str
    listener_port:
      description:
        - Port that Receptor will listen for incoming connections on.
      required: False
      default: 27199
      type: int
extends_documentation_fragment: awx.awx.auth
'''

EXAMPLES = '''
- name: Create an instance
  awx.awx.instance:
    hostname: my-instance.prod.example.com
    capacity_adjustment: 0.4
    listener_port: 31337

- name: Deprovision the instance
  awx.awx.instance:
    hostname: my-instance.prod.example.com
    node_state: deprovisioning
'''

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(
        hostname=dict(required=True),
        capacity_adjustment=dict(type='float'),
        enabled=dict(type='bool'),
        managed_by_policy=dict(type='bool'),
        node_type=dict(type='str', choices=['control', 'execution', 'hybrid', 'hop']),
        node_state=dict(type='str', choices=['provisioning', 'provision-fail', 'installed', 'ready', 'unavailable', 'deprovisioning', 'deprovision-fail']),
        listener_port=dict(type='int'),
    )

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

    # Extract our parameters
    hostname = module.params.get('hostname')
    capacity_adjustment = module.params.get('capacity_adjustment')
    enabled = module.params.get('enabled')
    managed_by_policy = module.params.get('managed_by_policy')
    node_type = module.params.get('node_type')
    node_state = module.params.get('node_state')
    listener_port = module.params.get('listener_port')

    # Attempt to look up an existing item based on the provided data
    existing_item = module.get_one('instances', name_or_id=hostname)

    # Create the data that gets sent for create and update
    new_fields = {'hostname': hostname}
    if capacity_adjustment is not None:
        new_fields['capacity_adjustment'] = capacity_adjustment
    if enabled is not None:
        new_fields['enabled'] = enabled
    if managed_by_policy is not None:
        new_fields['managed_by_policy'] = managed_by_policy
    if node_type is not None:
        new_fields['node_type'] = node_type
    if node_state is not None:
        new_fields['node_state'] = node_state
    if listener_port is not None:
        new_fields['listener_port'] = listener_port

    module.create_or_update_if_needed(
        existing_item,
        new_fields,
        endpoint='instances',
        item_type='instance',
    )


if __name__ == '__main__':
    main()