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