#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright 2018 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# 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.


# pylint: disable=unused-wildcard-import,wildcard-import,unused-import,redefined-builtin

''' os_service_catalog_facts '''

from ansible.module_utils.basic import AnsibleModule

try:
    import shade
    HAS_SHADE = True
except ImportError:
    HAS_SHADE = False

DOCUMENTATION = '''
---
module: os_service_catalog_facts
short_description: Retrieve OpenStack service catalog facts
description:
    - Retrieves all the available OpenStack services
notes:
    - This module creates a new top-level C(openstack_service_catalog) fact
      which contains a dictionary of OpenStack service endpoints like
      network and load-balancers.
author:
    - "<NAME> <<EMAIL>>"
'''

RETURN = '''
openstack_service_catalog:
    description: OpenStack available services.
    type: dict
    returned: always
    sample:
      alarming:
      - adminURL: http://172.16.0.9:8042
        id: 2c40b50da0bb44178db91c8a9a29a46e
        internalURL: http://172.16.0.9:8042
        publicURL: https://mycloud.org:13042
        region: regionOne
      cloudformation:
      - adminURL: http://172.16.0.9:8000/v1
        id: 46648eded04e463281a9cba7ddcc45cb
        internalURL: http://172.16.0.9:8000/v1
        publicURL: https://mycloud.org:13005/v1
        region: regionOne
      compute:
      - adminURL: http://172.16.0.9:8774/v2.1
        id: bff1bc5dd92842c281b2358a6d15c5bc
        internalURL: http://172.16.0.9:8774/v2.1
        publicURL: https://mycloud.org:13774/v2.1
        region: regionOne
      event:
      - adminURL: http://172.16.0.9:8779
        id: 608ac3666ef24f2e8f240785b8612efb
        internalURL: http://172.16.0.9:8779
        publicURL: https://mycloud.org:13779
        region: regionOne
      identity:
      - adminURL: https://mycloud.org:35357
        id: 4d07689ce46b4d51a01cc873bc772c80
        internalURL: http://172.16.0.9:5000
        publicURL: https://mycloud.org:13000
        region: regionOne
      image:
      - adminURL: http://172.16.0.9:9292
        id: 1850105115ea493eb65f3f704d421291
        internalURL: http://172.16.0.9:9292
        publicURL: https://mycloud.org:13292
        region: regionOne
      metering:
      - adminURL: http://172.16.0.9:8777
        id: 4cae4dcabe0a4914a6ec6dabd62490ba
        internalURL: http://172.16.0.9:8777
        publicURL: https://mycloud.org:13777
        region: regionOne
      metric:
      - adminURL: http://172.16.0.9:8041
        id: 29bcecf9a06f40f782f19dd7492af352
        internalURL: http://172.16.0.9:8041
        publicURL: https://mycloud.org:13041
        region: regionOne
      network:
      - adminURL: http://172.16.0.9:9696
        id: 5d5785c9b8174c21bfb19dc3b16c87fa
        internalURL: http://172.16.0.9:9696
        publicURL: https://mycloud.org:13696
        region: regionOne
      object-store:
      - adminURL: http://172.17.0.9:8080
        id: 031f1e342fdf4f25b6099d1f3b0847e3
        internalURL: http://172.17.0.9:8080/v1/AUTH_6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13808/v1/AUTH_6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      orchestration:
      - adminURL: http://172.16.0.9:8004/v1/6d2847d6a6414308a67644eefc7b98c7
        id: 1e6cecbd15b3413d9411052c52b9d433
        internalURL: http://172.16.0.9:8004/v1/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13004/v1/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      placement:
      - adminURL: http://172.16.0.9:8778/placement
        id: 1f2551e5450c4bd6a9f716f92e93a154
        internalURL: http://172.16.0.9:8778/placement
        publicURL: https://mycloud.org:13778/placement
        region: regionOne
      volume:
      - adminURL: http://172.16.0.9:8776/v1/6d2847d6a6414308a67644eefc7b98c7
        id: 38e369a0e17346fe8e37a20146e005ef
        internalURL: http://172.16.0.9:8776/v1/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13776/v1/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      volumev2:
      - adminURL: http://172.16.0.9:8776/v2/6d2847d6a6414308a67644eefc7b98c7
        id: <KEY>
        internalURL: http://172.16.0.9:8776/v2/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13776/v2/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      volumev3:
      - adminURL: http://172.16.0.9:8776/v3/6d2847d6a6414308a67644eefc7b98c7
        id: <KEY>
        internalURL: http://172.16.0.9:8776/v3/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13776/v3/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
'''


def main():
    ''' Main module function '''
    module = AnsibleModule(argument_spec={}, supports_check_mode=True)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to connect to the cloud')

    try:
        service_catalog = cloud.cloud_config.get_service_catalog()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve the service catalog')

    try:
        endpoints = service_catalog.get_endpoints()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve the service catalog '
                         'endpoints')

    module.exit_json(
        changed=False,
        ansible_facts={'openstack_service_catalog': endpoints})


if __name__ == '__main__':
    main()

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright 2018 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# 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.


# pylint: disable=unused-wildcard-import,wildcard-import,unused-import,redefined-builtin

''' os_service_catalog_facts '''

from ansible.module_utils.basic import AnsibleModule

try:
    import shade
    HAS_SHADE = True
except ImportError:
    HAS_SHADE = False

DOCUMENTATION = '''
---
module: os_service_catalog_facts
short_description: Retrieve OpenStack service catalog facts
description:
    - Retrieves all the available OpenStack services
notes:
    - This module creates a new top-level C(openstack_service_catalog) fact
      which contains a dictionary of OpenStack service endpoints like
      network and load-balancers.
author:
    - "<NAME> <<EMAIL>>"
'''

RETURN = '''
openstack_service_catalog:
    description: OpenStack available services.
    type: dict
    returned: always
    sample:
      alarming:
      - adminURL: http://172.16.0.9:8042
        id: 2c40b50da0bb44178db91c8a9a29a46e
        internalURL: http://172.16.0.9:8042
        publicURL: https://mycloud.org:13042
        region: regionOne
      cloudformation:
      - adminURL: http://172.16.0.9:8000/v1
        id: 46648eded04e463281a9cba7ddcc45cb
        internalURL: http://172.16.0.9:8000/v1
        publicURL: https://mycloud.org:13005/v1
        region: regionOne
      compute:
      - adminURL: http://172.16.0.9:8774/v2.1
        id: bff1bc5dd92842c281b2358a6d15c5bc
        internalURL: http://172.16.0.9:8774/v2.1
        publicURL: https://mycloud.org:13774/v2.1
        region: regionOne
      event:
      - adminURL: http://172.16.0.9:8779
        id: 608ac3666ef24f2e8f240785b8612efb
        internalURL: http://172.16.0.9:8779
        publicURL: https://mycloud.org:13779
        region: regionOne
      identity:
      - adminURL: https://mycloud.org:35357
        id: 4d07689ce46b4d51a01cc873bc772c80
        internalURL: http://172.16.0.9:5000
        publicURL: https://mycloud.org:13000
        region: regionOne
      image:
      - adminURL: http://172.16.0.9:9292
        id: 1850105115ea493eb65f3f704d421291
        internalURL: http://172.16.0.9:9292
        publicURL: https://mycloud.org:13292
        region: regionOne
      metering:
      - adminURL: http://172.16.0.9:8777
        id: 4cae4dcabe0a4914a6ec6dabd62490ba
        internalURL: http://172.16.0.9:8777
        publicURL: https://mycloud.org:13777
        region: regionOne
      metric:
      - adminURL: http://172.16.0.9:8041
        id: 29bcecf9a06f40f782f19dd7492af352
        internalURL: http://172.16.0.9:8041
        publicURL: https://mycloud.org:13041
        region: regionOne
      network:
      - adminURL: http://172.16.0.9:9696
        id: 5d5785c9b8174c21bfb19dc3b16c87fa
        internalURL: http://172.16.0.9:9696
        publicURL: https://mycloud.org:13696
        region: regionOne
      object-store:
      - adminURL: http://172.17.0.9:8080
        id: 031f1e342fdf4f25b6099d1f3b0847e3
        internalURL: http://172.17.0.9:8080/v1/AUTH_6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13808/v1/AUTH_6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      orchestration:
      - adminURL: http://172.16.0.9:8004/v1/6d2847d6a6414308a67644eefc7b98c7
        id: 1e6cecbd15b3413d9411052c52b9d433
        internalURL: http://172.16.0.9:8004/v1/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13004/v1/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      placement:
      - adminURL: http://172.16.0.9:8778/placement
        id: 1f2551e5450c4bd6a9f716f92e93a154
        internalURL: http://172.16.0.9:8778/placement
        publicURL: https://mycloud.org:13778/placement
        region: regionOne
      volume:
      - adminURL: http://172.16.0.9:8776/v1/6d2847d6a6414308a67644eefc7b98c7
        id: 38e369a0e17346fe8e37a20146e005ef
        internalURL: http://172.16.0.9:8776/v1/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13776/v1/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      volumev2:
      - adminURL: http://172.16.0.9:8776/v2/6d2847d6a6414308a67644eefc7b98c7
        id: <KEY>
        internalURL: http://172.16.0.9:8776/v2/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13776/v2/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
      volumev3:
      - adminURL: http://172.16.0.9:8776/v3/6d2847d6a6414308a67644eefc7b98c7
        id: <KEY>
        internalURL: http://172.16.0.9:8776/v3/6d2847d6a6414308a67644eefc7b98c7
        publicURL: https://mycloud.org:13776/v3/6d2847d6a6414308a67644eefc7b98c7
        region: regionOne
'''


def main():
    ''' Main module function '''
    module = AnsibleModule(argument_spec={}, supports_check_mode=True)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to connect to the cloud')

    try:
        service_catalog = cloud.cloud_config.get_service_catalog()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve the service catalog')

    try:
        endpoints = service_catalog.get_endpoints()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve the service catalog '
                         'endpoints')

    module.exit_json(
        changed=False,
        ansible_facts={'openstack_service_catalog': endpoints})


if __name__ == '__main__':
    main()

#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright 2018 Red Hat, Inc. and/or its affiliates # and other contributors as indicated by the @author tags. # # 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. # pylint: disable=unused-wildcard-import,wildcard-import,unused-import,redefined-builtin os_service_catalog_facts --- module: os_service_catalog_facts short_description: Retrieve OpenStack service catalog facts description:     - Retrieves all the available OpenStack services notes:     - This module creates a new top-level C(openstack_service_catalog) fact       which contains a dictionary of OpenStack service endpoints like       network and load-balancers. author:     - "<NAME> <<EMAIL>>" openstack_service_catalog:     description: OpenStack available services.     type: dict     returned: always     sample:       alarming:       - adminURL: http://172.16.0.9:8042         id: 2c40b50da0bb44178db91c8a9a29a46e         internalURL: http://172.16.0.9:8042         publicURL: https://mycloud.org:13042         region: regionOne       cloudformation:       - adminURL: http://172.16.0.9:8000/v1         id: 46648eded04e463281a9cba7ddcc45cb         internalURL: http://172.16.0.9:8000/v1         publicURL: https://mycloud.org:13005/v1         region: regionOne       compute:       - adminURL: http://172.16.0.9:8774/v2.1         id: bff1bc5dd92842c281b2358a6d15c5bc         internalURL: http://172.16.0.9:8774/v2.1         publicURL: https://mycloud.org:13774/v2.1         region: regionOne       event:       - adminURL: http://172.16.0.9:8779         id: 608ac3666ef24f2e8f240785b8612efb         internalURL: http://172.16.0.9:8779         publicURL: https://mycloud.org:13779         region: regionOne       identity:       - adminURL: https://mycloud.org:35357         id: 4d07689ce46b4d51a01cc873bc772c80         internalURL: http://172.16.0.9:5000         publicURL: https://mycloud.org:13000         region: regionOne       image:       - adminURL: http://172.16.0.9:9292         id: 1850105115ea493eb65f3f704d421291         internalURL: http://172.16.0.9:9292         publicURL: https://mycloud.org:13292         region: regionOne       metering:       - adminURL: http://172.16.0.9:8777         id: 4cae4dcabe0a4914a6ec6dabd62490ba         internalURL: http://172.16.0.9:8777         publicURL: https://mycloud.org:13777         region: regionOne       metric:       - adminURL: http://172.16.0.9:8041         id: 29bcecf9a06f40f782f19dd7492af352         internalURL: http://172.16.0.9:8041         publicURL: https://mycloud.org:13041         region: regionOne       network:       - adminURL: http://172.16.0.9:9696         id: 5d5785c9b8174c21bfb19dc3b16c87fa         internalURL: http://172.16.0.9:9696         publicURL: https://mycloud.org:13696         region: regionOne       object-store:       - adminURL: http://172.17.0.9:8080         id: 031f1e342fdf4f25b6099d1f3b0847e3         internalURL: http://172.17.0.9:8080/v1/AUTH_6d2847d6a6414308a67644eefc7b98c7         publicURL: https://mycloud.org:13808/v1/AUTH_6d2847d6a6414308a67644eefc7b98c7         region: regionOne       orchestration:       - adminURL: http://172.16.0.9:8004/v1/6d2847d6a6414308a67644eefc7b98c7         id: 1e6cecbd15b3413d9411052c52b9d433         internalURL: http://172.16.0.9:8004/v1/6d2847d6a6414308a67644eefc7b98c7         publicURL: https://mycloud.org:13004/v1/6d2847d6a6414308a67644eefc7b98c7         region: regionOne       placement:       - adminURL: http://172.16.0.9:8778/placement         id: 1f2551e5450c4bd6a9f716f92e93a154         internalURL: http://172.16.0.9:8778/placement         publicURL: https://mycloud.org:13778/placement         region: regionOne       volume:       - adminURL: http://172.16.0.9:8776/v1/6d2847d6a6414308a67644eefc7b98c7         id: 38e369a0e17346fe8e37a20146e005ef         internalURL: http://172.16.0.9:8776/v1/6d2847d6a6414308a67644eefc7b98c7         publicURL: https://mycloud.org:13776/v1/6d2847d6a6414308a67644eefc7b98c7         region: regionOne       volumev2:       - adminURL: http://172.16.0.9:8776/v2/6d2847d6a6414308a67644eefc7b98c7         id: <KEY>         internalURL: http://172.16.0.9:8776/v2/6d2847d6a6414308a67644eefc7b98c7         publicURL: https://mycloud.org:13776/v2/6d2847d6a6414308a67644eefc7b98c7         region: regionOne       volumev3:       - adminURL: http://172.16.0.9:8776/v3/6d2847d6a6414308a67644eefc7b98c7         id: <KEY>         internalURL: http://172.16.0.9:8776/v3/6d2847d6a6414308a67644eefc7b98c7         publicURL: https://mycloud.org:13776/v3/6d2847d6a6414308a67644eefc7b98c7         region: regionOne Main module function # pylint: disable=broad-except # pylint: disable=broad-except # pylint: disable=broad-except