summaryrefslogtreecommitdiffstats
path: root/deploy/adapters/ansible/ansible_modules/keystone_endpoint.py
diff options
context:
space:
mode:
authorliyuenan <liyuenan@huawei.com>2017-01-18 18:05:27 +0800
committerliyuenan <liyuenan@huawei.com>2017-01-25 12:37:20 +0800
commit7173757a6190f4528d36053d82467c74dbf16b3f (patch)
treebfed2b845188bf51891f6397b3fbd3afbd566fea /deploy/adapters/ansible/ansible_modules/keystone_endpoint.py
parentd001a27936a5d55cda2d8ca0849f30a8bd1c0b3d (diff)
Ansible Module substitute for Shell Commands
JIRA: COMPASS-520 After update ansible version to v3, keystone_user module only support v2 API. So we use Shell Commands now, but it will failed with high probability. Those Shell Commands should be instead by ansible modules to manage Identity users, projects or some other work like crate networks. Change-Id: I63d38b4a811a9c063ac4404da72787f594411b53 Signed-off-by: liyuenan <liyuenan@huawei.com>
Diffstat (limited to 'deploy/adapters/ansible/ansible_modules/keystone_endpoint.py')
-rwxr-xr-xdeploy/adapters/ansible/ansible_modules/keystone_endpoint.py227
1 files changed, 227 insertions, 0 deletions
diff --git a/deploy/adapters/ansible/ansible_modules/keystone_endpoint.py b/deploy/adapters/ansible/ansible_modules/keystone_endpoint.py
new file mode 100755
index 00000000..0201dd26
--- /dev/null
+++ b/deploy/adapters/ansible/ansible_modules/keystone_endpoint.py
@@ -0,0 +1,227 @@
+#!/usr/bin/python
+#
+# Copyright 2017 Huawei Technologies Co. Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+try:
+ import shade
+ HAS_SHADE = True
+except ImportError:
+ HAS_SHADE = False
+
+from distutils.version import StrictVersion
+from ansible.module_utils.basic import * # noqa: F403
+from ansible.module_utils.openstack import * # noqa: F403
+
+ANSIBLE_METADATA = {'status': ['preview'],
+ 'supported_by': 'community',
+ 'version': '1.0'}
+
+DOCUMENTATION = '''
+---
+module: keystone_endpoint
+short_description: Manage OpenStack endpoint
+extends_documentation_fragment: openstack
+author: "Yuenan Li"
+version_added: "2.2"
+description:
+ - Create, update, or delete OpenStack endpoint.
+options:
+ name:
+ description:
+ - Name of the endpoint
+ required: true
+ service_type:
+ description:
+ - The type of service
+ required: true
+ enabled:
+ description:
+ - Is the endpoint enabled
+ required: false
+ default: True
+ interface:
+ description:
+ - Interface type of the endpoint
+ required: false
+ url:
+ description:
+ - URL of the endpoint
+ required: true
+ region:
+ description:
+ - Endpoint region
+ state:
+ description:
+ - Should the resource be present or absent
+ choices: [present, absent]
+ default: present
+requirements:
+ - "python >= 2.6"
+ - "shade"
+'''
+
+EXAMPLES = '''
+# Create a endpoint for glance
+- keystone_endpoint:
+ cloud: mycloud
+ state: present
+ name: glance
+ admin_url: http://172.16.1.222:9292
+ internal_url: http://172.16.1.222:9292
+ public_url: http://172.16.1.222:9292
+'''
+
+RETURN = '''
+endpoint:
+ description: Dictionary describing the endpoint.
+ returned: On success when state is 'present'
+ type: dictionary
+ contains:
+ id:
+ description: endpoint ID.
+ type: string
+ sample: "3292f020780b4d5baf27ff7e1d224c44"
+ name:
+ description: endpoint name.
+ type: string
+ sample: "glance"
+ interface:
+ description: Interface type.
+ type: string
+ sample: "admin"
+ url:
+ description: URL.
+ type: string
+ sample: "http://172.16.1.222:9292"
+id:
+ description: The endpoint ID.
+ returned: On success when state is 'present'
+ type: string
+ sample: "3292f020780b4d5baf27ff7e1d224c44"
+'''
+
+
+def _needs_update(module, endpoint):
+ if endpoint.url != module.params['url'] and \
+ endpoint.interface == module.params['interface']:
+ return True
+ return False
+
+
+def _system_state_change(module, endpoint):
+ state = module.params['state']
+ if state == 'absent' and endpoint:
+ return True
+
+ if state == 'present':
+ if endpoint is None:
+ return True
+ return _needs_update(module, endpoint)
+
+ return False
+
+
+def main():
+ argument_spec = openstack_full_argument_spec( # noqa: F405
+ enabled=dict(default=True, type='bool'),
+ name=dict(required=True),
+ service_type=dict(required=True),
+ state=dict(default='present', choices=['absent', 'present']),
+ region=dict(default=None, required=False),
+ interface=dict(default=None,
+ choices=['admin', 'internal', 'public']),
+ url=dict(default=None, required=False),
+ )
+
+ module_kwargs = openstack_module_kwargs() # noqa: F405
+ module = AnsibleModule(argument_spec, # noqa: F405
+ supports_check_mode=True,
+ **module_kwargs)
+
+ if not HAS_SHADE:
+ module.fail_json(msg='shade is required for this module')
+ if StrictVersion(shade.__version__) < StrictVersion('1.6.0'):
+ module.fail_json(msg="To utilize this module, the installed version of"
+ "the shade library MUST be >=1.6.0")
+
+ enabled = module.params['enabled'] # noqa: F841
+ name = module.params['name']
+ service_type = module.params['service_type']
+ state = module.params['state']
+ region = module.params['region']
+ interface = module.params['interface']
+ url = module.params['url']
+
+ try:
+ cloud = shade.operator_cloud(**module.params)
+
+ services = cloud.search_services(name_or_id=name,
+ filters=dict(type=service_type))
+
+ if len(services) > 1:
+ module.fail_json(msg='Service name %s and type %s are not unique' %
+ (name, service_type))
+ elif len(services) == 0:
+ module.fail_json(msg="No services with name %s" % name)
+ else:
+ service = services[0]
+
+ endpoints = [x for x in cloud.list_endpoints()
+ if (x.service_id == service.id and
+ x.interface == interface)]
+
+ count = len(endpoints)
+ if count > 1:
+ module.fail_json(msg='%d endpoints with service name %s' %
+ (count, name))
+ elif count == 0:
+ endpoint = None
+ else:
+ endpoint = endpoints[0]
+
+ if module.check_mode:
+ module.exit_json(changed=_system_state_change(module, endpoint))
+
+ if state == 'present':
+ if endpoint is None:
+ endpoint = cloud.create_endpoint(
+ service_name_or_id=service.id, enabled=enabled,
+ region=region, interface=interface, url=url)
+ changed = True
+ else:
+ if _needs_update(module, endpoint):
+ endpoint = cloud.update_endpoint(
+ endpoint_id=endpoint.id, enabled=enabled,
+ service_name_or_id=service.id, region=region,
+ interface=interface, url=url)
+ changed = True
+ else:
+ changed = False
+ module.exit_json(changed=changed, endpoint=endpoint)
+
+ elif state == 'absent':
+ if endpoint is None:
+ changed = False
+ else:
+ cloud.delete_endpoint(endpoint.id)
+ changed = True
+ module.exit_json(changed=changed)
+
+ except shade.OpenStackCloudException as e:
+ module.fail_json(msg=str(e))
+
+
+if __name__ == '__main__':
+ main()