#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright (c) 2023, Sergei Antipov (UnderGreen) # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later from __future__ import (absolute_import, division, print_function) __metaclass__ = type DOCUMENTATION = r""" --- module: proxmox_pool short_description: Pool management for Proxmox VE cluster description: - Create or delete a pool for Proxmox VE clusters. - For pool members management please consult M(community.general.proxmox_pool_member) module. version_added: 7.1.0 author: "Sergei Antipov (@UnderGreen) " attributes: check_mode: support: full diff_mode: support: none action_group: version_added: 9.0.0 options: poolid: description: - The pool ID. type: str aliases: [ "name" ] required: true state: description: - Indicate desired state of the pool. - The pool must be empty prior deleting it with O(state=absent). choices: ['present', 'absent'] default: present type: str comment: description: - Specify the description for the pool. - Parameter is ignored when pool already exists or O(state=absent). type: str extends_documentation_fragment: - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes """ EXAMPLES = """ - name: Create new Proxmox VE pool community.general.proxmox_pool: api_host: node1 api_user: root@pam api_password: password poolid: test comment: 'New pool' - name: Delete the Proxmox VE pool community.general.proxmox_pool: api_host: node1 api_user: root@pam api_password: password poolid: test state: absent """ RETURN = """ poolid: description: The pool ID. returned: success type: str sample: test msg: description: A short message on what the module did. returned: always type: str sample: "Pool test successfully created" """ from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.general.plugins.module_utils.proxmox import (proxmox_auth_argument_spec, ProxmoxAnsible) class ProxmoxPoolAnsible(ProxmoxAnsible): def is_pool_existing(self, poolid): """Check whether pool already exist :param poolid: str - name of the pool :return: bool - is pool exists? """ try: pools = self.proxmox_api.pools.get() for pool in pools: if pool['poolid'] == poolid: return True return False except Exception as e: self.module.fail_json(msg="Unable to retrieve pools: {0}".format(e)) def is_pool_empty(self, poolid): """Check whether pool has members :param poolid: str - name of the pool :return: bool - is pool empty? """ return True if not self.get_pool(poolid)['members'] else False def create_pool(self, poolid, comment=None): """Create Proxmox VE pool :param poolid: str - name of the pool :param comment: str, optional - Description of a pool :return: None """ if self.is_pool_existing(poolid): self.module.exit_json(changed=False, poolid=poolid, msg="Pool {0} already exists".format(poolid)) if self.module.check_mode: return try: self.proxmox_api.pools.post(poolid=poolid, comment=comment) except Exception as e: self.module.fail_json(msg="Failed to create pool with ID {0}: {1}".format(poolid, e)) def delete_pool(self, poolid): """Delete Proxmox VE pool :param poolid: str - name of the pool :return: None """ if not self.is_pool_existing(poolid): self.module.exit_json(changed=False, poolid=poolid, msg="Pool {0} doesn't exist".format(poolid)) if self.is_pool_empty(poolid): if self.module.check_mode: return try: self.proxmox_api.pools(poolid).delete() except Exception as e: self.module.fail_json(msg="Failed to delete pool with ID {0}: {1}".format(poolid, e)) else: self.module.fail_json(msg="Can't delete pool {0} with members. Please remove members from pool first.".format(poolid)) def main(): module_args = proxmox_auth_argument_spec() pools_args = dict( poolid=dict(type="str", aliases=["name"], required=True), comment=dict(type="str"), state=dict(default="present", choices=["present", "absent"]), ) module_args.update(pools_args) module = AnsibleModule( argument_spec=module_args, required_together=[("api_token_id", "api_token_secret")], required_one_of=[("api_password", "api_token_id")], supports_check_mode=True ) poolid = module.params["poolid"] comment = module.params["comment"] state = module.params["state"] proxmox = ProxmoxPoolAnsible(module) if state == "present": proxmox.create_pool(poolid, comment) module.exit_json(changed=True, poolid=poolid, msg="Pool {0} successfully created".format(poolid)) else: proxmox.delete_pool(poolid) module.exit_json(changed=True, poolid=poolid, msg="Pool {0} successfully deleted".format(poolid)) if __name__ == "__main__": main()