1#!/usr/local/bin/python3.8
2# Copyright 2016 Sam Yaple
3# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
4
5DOCUMENTATION = '''
6---
7module: catalog_service
8short_description: Manage OpenStack Identity services
9author: OpenStack Ansible SIG
10description:
11    - Create, update, or delete OpenStack Identity service. If a service
12      with the supplied name already exists, it will be updated with the
13      new description and enabled attributes.
14options:
15   name:
16     description:
17        - Name of the service
18     required: true
19     type: str
20   description:
21     description:
22        - Description of the service
23     type: str
24   enabled:
25     description:
26        - Is the service enabled
27     type: bool
28     default: 'yes'
29   service_type:
30     description:
31        - The type of service
32     required: true
33     type: str
34   state:
35     description:
36       - Should the resource be present or absent.
37     choices: [present, absent]
38     default: present
39     type: str
40requirements:
41    - "python >= 3.6"
42    - "openstacksdk"
43
44extends_documentation_fragment:
45- openstack.cloud.openstack
46'''
47
48EXAMPLES = '''
49# Create a service for glance
50- openstack.cloud.catalog_service:
51     cloud: mycloud
52     state: present
53     name: glance
54     service_type: image
55     description: OpenStack Image Service
56# Delete a service
57- openstack.cloud.catalog_service:
58     cloud: mycloud
59     state: absent
60     name: glance
61     service_type: image
62'''
63
64RETURN = '''
65service:
66    description: Dictionary describing the service.
67    returned: On success when I(state) is 'present'
68    type: complex
69    contains:
70        id:
71            description: Service ID.
72            type: str
73            sample: "3292f020780b4d5baf27ff7e1d224c44"
74        name:
75            description: Service name.
76            type: str
77            sample: "glance"
78        service_type:
79            description: Service type.
80            type: str
81            sample: "image"
82        description:
83            description: Service description.
84            type: str
85            sample: "OpenStack Image Service"
86        enabled:
87            description: Service status.
88            type: bool
89            sample: True
90id:
91    description: The service ID.
92    returned: On success when I(state) is 'present'
93    type: str
94    sample: "3292f020780b4d5baf27ff7e1d224c44"
95'''
96
97from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
98
99
100class IdentityCatalogServiceModule(OpenStackModule):
101    argument_spec = dict(
102        description=dict(default=None),
103        enabled=dict(default=True, type='bool'),
104        name=dict(required=True),
105        service_type=dict(required=True),
106        state=dict(default='present', choices=['absent', 'present']),
107    )
108
109    module_kwargs = dict(
110        supports_check_mode=True
111    )
112
113    def _needs_update(self, service):
114        if service.enabled != self.params['enabled']:
115            return True
116        if service.description is not None and \
117           service.description != self.params['description']:
118            return True
119        return False
120
121    def _system_state_change(self, service):
122        state = self.params['state']
123        if state == 'absent' and service:
124            return True
125
126        if state == 'present':
127            if service is None:
128                return True
129            return self._needs_update(service)
130
131        return False
132
133    def run(self):
134        description = self.params['description']
135        enabled = self.params['enabled']
136        name = self.params['name']
137        state = self.params['state']
138        service_type = self.params['service_type']
139
140        services = self.conn.search_services(
141            name_or_id=name, filters=dict(type=service_type))
142
143        if len(services) > 1:
144            self.fail_json(
145                msg='Service name %s and type %s are not unique'
146                % (name, service_type))
147        elif len(services) == 1:
148            service = services[0]
149        else:
150            service = None
151
152        if self.ansible.check_mode:
153            self.exit_json(changed=self._system_state_change(service))
154
155        if state == 'present':
156            if service is None:
157                service = self.conn.create_service(
158                    name=name, description=description, type=service_type, enabled=True)
159                changed = True
160            else:
161                if self._needs_update(service):
162                    service = self.conn.update_service(
163                        service.id, name=name, type=service_type, enabled=enabled,
164                        description=description)
165                    changed = True
166                else:
167                    changed = False
168            self.exit_json(changed=changed, service=service, id=service.id)
169
170        elif state == 'absent':
171            if service is None:
172                changed = False
173            else:
174                self.conn.delete_service(service.id)
175                changed = True
176            self.exit_json(changed=changed)
177
178
179def main():
180    module = IdentityCatalogServiceModule()
181    module()
182
183
184if __name__ == '__main__':
185    main()
186