summaryrefslogtreecommitdiff
path: root/cloud/ovirt
diff options
context:
space:
mode:
authorOndra Machacek <machacek.ondra@gmail.com>2016-11-18 15:15:32 +0100
committerRyan Brown <sb@ryansb.com>2016-11-18 09:15:32 -0500
commitc884bf060618f77cc96c3a902bc6a20e171a0a3e (patch)
treec41b807e4e7e9eddd663987ac6226f145101d103 /cloud/ovirt
parent8d879e7727bf797a855332bebaff9bb3098b22a2 (diff)
downloadansible-modules-extras-c884bf060618f77cc96c3a902bc6a20e171a0a3e.tar.gz
Add oVirt ovirt_host_pm module (#3253)
Diffstat (limited to 'cloud/ovirt')
-rw-r--r--cloud/ovirt/ovirt_host_pm.py232
1 files changed, 232 insertions, 0 deletions
diff --git a/cloud/ovirt/ovirt_host_pm.py b/cloud/ovirt/ovirt_host_pm.py
new file mode 100644
index 00000000..17bf5ee9
--- /dev/null
+++ b/cloud/ovirt/ovirt_host_pm.py
@@ -0,0 +1,232 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2016 Red Hat, Inc.
+#
+# This file is part of Ansible
+#
+# Ansible is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
+#
+
+try:
+ import ovirtsdk4 as sdk
+ import ovirtsdk4.types as otypes
+except ImportError:
+ pass
+
+from ansible.module_utils.ovirt import *
+
+
+DOCUMENTATION = '''
+---
+module: ovirt_host_pm
+short_description: Module to manage power management of hosts in oVirt
+version_added: "2.3"
+author: "Ondra Machacek (@machacekondra)"
+description:
+ - "Module to manage power management of hosts in oVirt."
+options:
+ name:
+ description:
+ - "Name of the the host to manage."
+ required: true
+ aliases: ['host']
+ state:
+ description:
+ - "Should the host be present/absent."
+ choices: ['present', 'absent']
+ default: present
+ address:
+ description:
+ - "Address of the power management interface."
+ username:
+ description:
+ - "Username to be used to connect to power management interface."
+ password:
+ description:
+ - "Password of the user specified in C(username) parameter."
+ type:
+ description:
+ - "Type of the power management. oVirt predefined values are I(drac5), I(ipmilan), I(rsa),
+ I(bladecenter), I(alom), I(apc), I(apc_snmp), I(eps), I(wti), I(rsb), I(cisco_ucs),
+ I(drac7), I(hpblade), I(ilo), I(ilo2), I(ilo3), I(ilo4), I(ilo_ssh),
+ but user can have defined custom type."
+ port:
+ description:
+ - "Power management interface port."
+ slot:
+ description:
+ - "Power management slot."
+ options:
+ description:
+ - "Dictionary of additional fence agent options."
+ - "Additional information about options can be found at U(https://fedorahosted.org/cluster/wiki/FenceArguments)."
+ encrypt_options:
+ description:
+ - "If (true) options will be encrypted when send to agent."
+ aliases: ['encrypt']
+ order:
+ description:
+ - "Integer value specifying, by default it's added at the end."
+extends_documentation_fragment: ovirt
+'''
+
+EXAMPLES = '''
+# Examples don't contain auth parameter for simplicity,
+# look at ovirt_auth module to see how to reuse authentication:
+
+# Add fence agent to host 'myhost'
+- ovirt_host_pm:
+ name: myhost
+ address: 1.2.3.4
+ options:
+ myoption1: x
+ myoption2: y
+ username: admin
+ password: admin
+ port: 3333
+ type: ipmilan
+
+# Remove ipmilan fence agent with address 1.2.3.4 on host 'myhost'
+- ovirt_host_pm:
+ state: absent
+ name: myhost
+ address: 1.2.3.4
+ type: ipmilan
+'''
+
+RETURN = '''
+id:
+ description: ID of the agent which is managed
+ returned: On success if agent is found.
+ type: str
+ sample: 7de90f31-222c-436c-a1ca-7e655bd5b60c
+agent:
+ description: "Dictionary of all the agent attributes. Agent attributes can be found on your oVirt instance
+ at following url: https://ovirt.example.com/ovirt-engine/api/model#types/agent."
+ returned: On success if agent is found.
+'''
+
+
+class HostModule(BaseModule):
+ def build_entity(self):
+ return otypes.Host(
+ power_management=otypes.PowerManagement(
+ enabled=True,
+ ),
+ )
+
+ def update_check(self, entity):
+ return equal(True, entity.power_management.enabled)
+
+
+class HostPmModule(BaseModule):
+
+ def build_entity(self):
+ return otypes.Agent(
+ address=self._module.params['address'],
+ encrypt_options=self._module.params['encrypt_options'],
+ options=[
+ otypes.Option(
+ name=name,
+ value=value,
+ ) for name, value in self._module.params['options'].items()
+ ] if self._module.params['options'] else None,
+ password=self._module.params['password'],
+ port=self._module.params['port'],
+ type=self._module.params['type'],
+ username=self._module.params['username'],
+ order=self._module.params.get('order', 100),
+ )
+
+ def update_check(self, entity):
+ return (
+ equal(self._module.params.get('address'), entity.address) and
+ equal(self._module.params.get('encrypt_options'), entity.encrypt_options) and
+ equal(self._module.params.get('password'), entity.password) and
+ equal(self._module.params.get('username'), entity.username) and
+ equal(self._module.params.get('port'), entity.port) and
+ equal(self._module.params.get('type'), entity.type)
+ )
+
+
+def main():
+ argument_spec = ovirt_full_argument_spec(
+ state=dict(
+ choices=['present', 'absent'],
+ default='present',
+ ),
+ name=dict(default=None, required=True, aliases=['host']),
+ address=dict(default=None),
+ username=dict(default=None),
+ password=dict(default=None),
+ type=dict(default=None),
+ port=dict(default=None, type='int'),
+ slot=dict(default=None),
+ options=dict(default=None, type='dict'),
+ encrypt_options=dict(default=None, type='bool', aliases=['encrypt']),
+ )
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ )
+ check_sdk(module)
+
+ try:
+ connection = create_connection(module.params.pop('auth'))
+ hosts_service = connection.system_service().hosts_service()
+ host = search_by_name(hosts_service, module.params['name'])
+ fence_agents_service = hosts_service.host_service(host.id).fence_agents_service()
+
+ host_pm_module = HostPmModule(
+ connection=connection,
+ module=module,
+ service=fence_agents_service,
+ )
+ host_module = HostModule(
+ connection=connection,
+ module=module,
+ service=hosts_service,
+ )
+
+ state = module.params['state']
+ if state == 'present':
+ agent = host_pm_module.search_entity(
+ search_params={
+ 'address': module.params['address'],
+ 'type': module.params['type'],
+ }
+ )
+ ret = host_pm_module.create(entity=agent)
+
+ # Enable Power Management, if it's not enabled:
+ host_module.create(entity=host)
+ elif state == 'absent':
+ agent = host_pm_module.search_entity(
+ search_params={
+ 'address': module.params['address'],
+ 'type': module.params['type'],
+ }
+ )
+ ret = host_pm_module.remove(entity=agent)
+
+ module.exit_json(**ret)
+ except Exception as e:
+ module.fail_json(msg=str(e))
+ finally:
+ connection.close(logout=False)
+
+from ansible.module_utils.basic import *
+if __name__ == "__main__":
+ main()