From 53886ecc9b353983cb702e409c0ee0837cd48a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 3 Sep 2018 14:24:52 +0200 Subject: [PATCH] Add an Online servers fact --- lib/ansible/module_utils/online.py | 2 +- .../cloud/online/online_server_facts.py | 174 ++++++++++++++++++ .../modules/cloud/online/online_user_facts.py | 2 +- .../utils/module_docs_fragments/online.py | 2 +- test/legacy/online.yml | 1 + .../roles/online_server_facts/tasks/main.yml | 14 ++ 6 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 lib/ansible/modules/cloud/online/online_server_facts.py create mode 100644 test/legacy/roles/online_server_facts/tasks/main.yml diff --git a/lib/ansible/module_utils/online.py b/lib/ansible/module_utils/online.py index 0377affc07..464e454288 100644 --- a/lib/ansible/module_utils/online.py +++ b/lib/ansible/module_utils/online.py @@ -14,7 +14,7 @@ def online_argument_spec(): return dict( api_token=dict(required=True, fallback=(env_fallback, ['ONLINE_TOKEN', 'ONLINE_API_KEY', 'ONLINE_OAUTH_TOKEN', 'ONLINE_API_TOKEN']), no_log=True, aliases=['oauth_token']), - api_url=dict(fallback=(env_fallback, ['ONLINE_API_URL']), default='https://api.online.net/api/v1', aliases=['base_url']), + api_url=dict(fallback=(env_fallback, ['ONLINE_API_URL']), default='https://api.online.net', aliases=['base_url']), api_timeout=dict(type='int', default=30, aliases=['timeout']), validate_certs=dict(default=True, type='bool'), ) diff --git a/lib/ansible/modules/cloud/online/online_server_facts.py b/lib/ansible/modules/cloud/online/online_server_facts.py new file mode 100644 index 0000000000..bf2182339b --- /dev/null +++ b/lib/ansible/modules/cloud/online/online_server_facts.py @@ -0,0 +1,174 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# 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 = r''' +--- +module: online_server_facts +short_description: Gather facts about Online servers. +description: + - Gather facts about the servers. + - U(https://www.online.net/en/dedicated-server) +version_added: "2.8" +author: + - "Remy Leone (@sieben)" +extends_documentation_fragment: online +''' + +EXAMPLES = r''' +- name: Gather Online server facts + online_server_facts: + api_token: '0d1627e8-bbf0-44c5-a46f-5c4d3aef033f' +''' + +RETURN = r''' +--- +online_server_facts: + description: Response from Online API + returned: success + type: complex + contains: + "online_server_facts": [ + { + "abuse": "abuse@example.com", + "anti_ddos": false, + "bmc": { + "session_key": null + }, + "boot_mode": "normal", + "contacts": { + "owner": "foobar", + "tech": "foobar" + }, + "disks": [ + { + "$ref": "/api/v1/server/hardware/disk/68452" + }, + { + "$ref": "/api/v1/server/hardware/disk/68453" + } + ], + "drive_arrays": [ + { + "disks": [ + { + "$ref": "/api/v1/server/hardware/disk/68452" + }, + { + "$ref": "/api/v1/server/hardware/disk/68453" + } + ], + "raid_controller": { + "$ref": "/api/v1/server/hardware/raidController/9910" + }, + "raid_level": "RAID1" + } + ], + "hardware_watch": true, + "hostname": "sd-42", + "id": 42, + "ip": [ + { + "address": "195.154.172.149", + "mac": "28:92:4a:33:5e:c6", + "reverse": "195-154-172-149.rev.poneytelecom.eu.", + "switch_port_state": "up", + "type": "public" + }, + { + "address": "10.90.53.212", + "mac": "28:92:4a:33:5e:c7", + "reverse": null, + "switch_port_state": "up", + "type": "private" + } + ], + "last_reboot": "2018-08-23T08:32:03.000Z", + "location": { + "block": "A", + "datacenter": "DC3", + "position": 19, + "rack": "A23", + "room": "4 4-4" + }, + "network": { + "ip": [ + "195.154.172.149" + ], + "ipfo": [], + "private": [ + "10.90.53.212" + ] + }, + "offer": "Pro-1-S-SATA", + "os": { + "name": "FreeBSD", + "version": "11.1-RELEASE" + }, + "power": "ON", + "proactive_monitoring": false, + "raid_controllers": [ + { + "$ref": "/api/v1/server/hardware/raidController/9910" + } + ], + "support": "Basic service level" + } + ] +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.online import ( + Online, OnlineException, online_argument_spec +) + + +class OnlineServerFacts(Online): + + def __init__(self, module): + super(OnlineServerFacts, self).__init__(module) + self.name = 'api/v1/server' + + def _get_server_detail(self, server_path): + try: + return self.get(path=server_path).json + except OnlineException as exc: + self.module.fail_json(msg="A problem occurred while fetching: %s (%s)" % (server_path, exc)) + + def all_detailed_servers(self): + servers_api_path = self.get_resources() + + server_data = ( + self._get_server_detail(server_api_path) + for server_api_path in servers_api_path + ) + + return [s for s in server_data if s is not None] + + +def main(): + module = AnsibleModule( + argument_spec=online_argument_spec(), + supports_check_mode=True, + ) + + try: + servers_facts = OnlineServerFacts(module).all_detailed_servers() + module.exit_json( + ansible_facts={'online_server_facts': servers_facts} + ) + except OnlineException as exc: + module.fail_json(msg=exc.message) + + +if __name__ == '__main__': + main() diff --git a/lib/ansible/modules/cloud/online/online_user_facts.py b/lib/ansible/modules/cloud/online/online_user_facts.py index dfda412144..3a289414f0 100644 --- a/lib/ansible/modules/cloud/online/online_user_facts.py +++ b/lib/ansible/modules/cloud/online/online_user_facts.py @@ -54,7 +54,7 @@ class OnlineUserFacts(Online): def __init__(self, module): super(OnlineUserFacts, self).__init__(module) - self.name = 'user' + self.name = 'api/v1/user' def main(): diff --git a/lib/ansible/utils/module_docs_fragments/online.py b/lib/ansible/utils/module_docs_fragments/online.py index 32f7e35e67..b5303a2ef6 100644 --- a/lib/ansible/utils/module_docs_fragments/online.py +++ b/lib/ansible/utils/module_docs_fragments/online.py @@ -14,7 +14,7 @@ options: api_url: description: - Online API URL - default: 'https://api.online.net/api/v1' + default: 'https://api.online.net' aliases: ['base_url'] api_timeout: description: diff --git a/test/legacy/online.yml b/test/legacy/online.yml index 108663c269..4cfc419d08 100644 --- a/test/legacy/online.yml +++ b/test/legacy/online.yml @@ -4,4 +4,5 @@ connection: local roles: + - { role: online_server_facts, tags: test_online_server_facts } - { role: online_user_facts, tags: test_online_user_facts } diff --git a/test/legacy/roles/online_server_facts/tasks/main.yml b/test/legacy/roles/online_server_facts/tasks/main.yml new file mode 100644 index 0000000000..da203b641b --- /dev/null +++ b/test/legacy/roles/online_server_facts/tasks/main.yml @@ -0,0 +1,14 @@ +# ONLINE_TOKEN='XXX' ansible-playbook ./test/legacy/online.yml --tags test_online_server_facts + +- name: Get server information and register it in a variable + online_server_facts: + register: servers_facts + +- name: Display server variable + debug: + var: servers_facts + +- name: Ensure retrieval of servers facts is success + assert: + that: + - servers_facts is success