summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Partridge <41302157+syncpak@users.noreply.github.com>2018-11-30 12:13:48 -0800
committerJohn R Barker <john@johnrbarker.com>2018-11-30 20:13:48 +0000
commit19035dbcb226fb163c94260df9013d5d71c1f9df (patch)
tree3f83e6e60633409726a9d3e4836443666bbcf2fb
parent837818018d700e3c2d348a5ad4c3c500abdaa7bf (diff)
downloadansible-19035dbcb226fb163c94260df9013d5d71c1f9df.tar.gz
CPM plugcontrol for WTI Power Devices (#47683)
* Add WTI OOB and PDU Device status, control and configuration module * removed accidental file inclusions * removed accidental file * remove unneeded legacy files * Added the new module cpm_plugcontrol to control the plugs on WTI Power devices
-rw-r--r--lib/ansible/modules/remote_management/cpm/cpm_plugcontrol.py226
1 files changed, 226 insertions, 0 deletions
diff --git a/lib/ansible/modules/remote_management/cpm/cpm_plugcontrol.py b/lib/ansible/modules/remote_management/cpm/cpm_plugcontrol.py
new file mode 100644
index 0000000000..e3f5c63b7f
--- /dev/null
+++ b/lib/ansible/modules/remote_management/cpm/cpm_plugcontrol.py
@@ -0,0 +1,226 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# (C) 2018 Red Hat Inc.
+# Copyright (C) 2018 Western Telematic Inc. <kenp@wti.com>
+#
+# GNU General Public License v3.0+
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# Module to execute WTI Plug Commands on WTI OOB and PDU devices.
+# WTI remote_management
+#
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ 'metadata_version': '1.1',
+ 'status': ['preview'],
+ 'supported_by': 'community'
+}
+
+DOCUMENTATION = """
+---
+module: cpm_plugcontrol
+version_added: "2.8"
+author: "Western Telematic Inc. (@wtinetworkgear)"
+short_description: Get and Set Plug actions on WTI OOB and PDU power devices
+description:
+ - "Get and Set Plug actions on WTI OOB and PDU devices"
+options:
+ cpm_action:
+ description:
+ - This is the Action to send the module.
+ required: true
+ choices: [ "getplugcontrol", "setplugcontrol" ]
+ cpm_url:
+ description:
+ - This is the URL of the WTI device to send the module.
+ required: true
+ cpm_username:
+ description:
+ - This is the Username of the WTI device to send the module.
+ cpm_password:
+ description:
+ - This is the Password of the WTI device to send the module.
+ use_https:
+ description:
+ - Designates to use an https connection or http connection.
+ required: false
+ type: bool
+ default: true
+ validate_certs:
+ description:
+ - If false, SSL certificates will not be validated. This should only be used
+ - on personally controlled sites using self-signed certificates.
+ required: false
+ type: bool
+ default: true
+ use_proxy:
+ description: Flag to control if the lookup will observe HTTP proxy environment variables when present.
+ required: false
+ type: bool
+ default: false
+ plug_id:
+ description:
+ - This is the plug number or the plug name that is to be manipulated
+ For the plugget command, the plug_id 'all' will return the status of all the plugs the
+ user has rights to access.
+ required: true
+ plug_state:
+ description:
+ - This is what action to take on the plug.
+ required: false
+ choices: [ "on", "off", "boot", "default" ]
+"""
+
+EXAMPLES = """
+# Get Plug status for all ports
+- name: Get the Plug status for ALL ports of a WTI device
+ cpm_plugcontrol:
+ cpm_action: "getplugcontrol"
+ cpm_url: "rest.wti.com"
+ cpm_username: "restpower"
+ cpm_password: "restfulpowerpass12"
+ use_https: true
+ validate_certs: true
+ plug_id: "all"
+
+# Get Plug status for port 2
+- name: Get the Plug status for the given port of a WTI device
+ cpm_plugcontrol:
+ cpm_action: "getplugcontrol"
+ cpm_url: "rest.wti.com"
+ cpm_username: "restpower"
+ cpm_password: "restfulpowerpass12"
+ use_https: true
+ validate_certs: false
+ plug_id: "2"
+
+# Reboot plug 5
+- name: Reboot Plug 5 on a given WTI device
+ cpm_plugcontrol:
+ cpm_action: "setplugcontrol"
+ cpm_url: "rest.wti.com"
+ cpm_username: "restpower"
+ cpm_password: "restfulpowerpass12"
+ use_https: true
+ plug_id: "5"
+ plug_state: "boot"
+"""
+
+RETURN = """
+data:
+ description: The output JSON returned from the commands sent
+ returned: always
+ type: str
+"""
+
+import base64
+import json
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils._text import to_text, to_bytes, to_native
+from ansible.module_utils.six.moves.urllib.error import HTTPError, URLError
+from ansible.module_utils.urls import open_url, ConnectionError, SSLValidationError
+
+
+def assemble_json(cpmmodule, cpmresult):
+ json_load = ""
+ plugspassed = cpmmodule.params["plug_id"].split(",")
+
+ for val in plugspassed:
+ if (val.isdigit() is True):
+ json_load = '%s{"plug": "%s"' % (json_load, to_native(val))
+ else:
+ json_load = '%s{"plugname": "%s"' % (json_load, to_native(val))
+
+ if cpmmodule.params["plug_state"] is not None:
+ json_load = '%s,"state": "%s"' % (json_load, to_native(cpmmodule.params["plug_state"]))
+
+ json_load = '%s}' % (json_load)
+
+ return json_load
+
+
+def run_module():
+
+ # define the available arguments/parameters that a user can pass to
+ # the module
+ module_args = dict(
+ cpm_action=dict(choices=['getplugcontrol', 'setplugcontrol'], required=True),
+ cpm_url=dict(type='str', required=True),
+ cpm_username=dict(type='str', required=True),
+ cpm_password=dict(type='str', required=True, no_log=True),
+ plug_id=dict(type='str', required=True),
+ plug_state=dict(choices=['on', 'off', 'boot', 'default'], required=False),
+ use_https=dict(type='bool', default=True),
+ validate_certs=dict(type='bool', default=True),
+ use_proxy=dict(type='bool', default=False)
+ )
+
+ result = dict(
+ changed=False,
+ data=''
+ )
+
+ module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)
+
+ if module.check_mode:
+ return result
+
+ auth = to_text(base64.b64encode(to_bytes('{0}:{1}'.format(to_native(module.params['cpm_username']), to_native(module.params['cpm_password'])),
+ errors='surrogate_or_strict')))
+
+ if module.params['use_https'] is True:
+ protocol = "https://"
+ else:
+ protocol = "http://"
+
+ Payload = None
+ if (module.params['cpm_action'] == 'getplugcontrol'):
+ fullurl = ("%s%s/api/v2/config/powerplug" % (protocol, to_native(module.params['cpm_url'])))
+ if (module.params['plug_id'].lower() != 'all'):
+ fullurl = '%s?plug=%s' % (fullurl, to_native(module.params['plug_id']))
+ method = 'GET'
+ elif (module.params['cpm_action'] == 'setplugcontrol'):
+ Payload = assemble_json(module, result)
+ fullurl = ("%s%s/api/v2/config/powerplug" % (protocol, to_native(module.params['cpm_url'])))
+ method = 'POST'
+
+ try:
+ response = open_url(fullurl, data=Payload, method=method, validate_certs=module.params['validate_certs'], use_proxy=module.params['use_proxy'],
+ headers={'Content-Type': 'application/json', 'Authorization': "Basic %s" % auth})
+ if (method != 'GET'):
+ result['changed'] = True
+
+ except HTTPError as e:
+ fail_json = dict(msg='Received HTTP error for {0} : {1}'.format(fullurl, to_native(e)), changed=False)
+ module.fail_json(**fail_json)
+ except URLError as e:
+ fail_json = dict(msg='Failed lookup url for {0} : {1}'.format(fullurl, to_native(e)), changed=False)
+ module.fail_json(**fail_json)
+ except SSLValidationError as e:
+ fail_json = dict(msg='Error validating the server''s certificate for {0} : {1}'.format(fullurl, to_native(e)), changed=False)
+ module.fail_json(**fail_json)
+ except ConnectionError as e:
+ fail_json = dict(msg='Error connecting to for {0} : {1}'.format(fullurl, to_native(e)), changed=False)
+ module.fail_json(**fail_json)
+
+ result['data'] = json.loads(response.read())
+
+ module.exit_json(**result)
+
+
+def main():
+ run_module()
+
+
+if __name__ == '__main__':
+ main()