HEX
Server: LiteSpeed
System: Linux kapuas.iixcp.rumahweb.net 5.14.0-427.42.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Nov 1 14:58:02 EDT 2024 x86_64
User: mirz4654 (1666)
PHP: 8.1.33
Disabled: system,exec,escapeshellarg,escapeshellcmd,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,popen,pclose,dl,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setsid,posix_setuid,posix_setpgid,ini_alter,show_source,define_syslog_variables,symlink,syslog,openlog,openlog,closelog,ocinumcols,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dll,ftp,myshellexec,socket_bind,mail,posix_getwpuid
Upload Files
File: //lib/python3.9/site-packages/ansible_collections/purestorage/fusion/plugins/modules/fusion_pp.py
# -*- coding: utf-8 -*-

# (c) 2022, Simon Dodsley ([email protected])
# GNU General Public License v3.0+ (see COPYING.GPLv3 or https://www.gnu.org/licenses/gpl-3.0.txt)

from __future__ import absolute_import, division, print_function

__metaclass__ = type

DOCUMENTATION = r"""
---
module: fusion_pp
version_added: '1.0.0'
short_description:  Manage protection policies in Pure Storage Fusion
description:
- Manage protection policies in Pure Storage Fusion.
author:
- Pure Storage Ansible Team (@sdodsley) <[email protected]>
notes:
- Supports C(check mode).
options:
  name:
    description:
    - The name of the protection policy.
    type: str
    required: true
  state:
    description:
    - Define whether the protection policy should exist or not.
    default: present
    choices: [ present, absent ]
    type: str
  display_name:
    description:
    - The human name of the protection policy.
    - If not provided, defaults to I(name).
    type: str
  local_rpo:
    description:
    - Recovery Point Objective for snapshots.
    - Value should be specified in minutes.
    - Minimum value is 10 minutes.
    type: str
  local_retention:
    description:
    - Retention Duration for periodic snapshots.
    - Minimum value is 10 minutes.
    - Value can be provided as m(inutes), h(ours),
      d(ays), w(eeks), or y(ears).
    - If no unit is provided, minutes are assumed.
    type: str
extends_documentation_fragment:
- purestorage.fusion.purestorage.fusion
"""

EXAMPLES = r"""
- name: Create new protection policy foo
  purestorage.fusion.fusion_pp:
    name: foo
    local_rpo: 10
    local_retention: 4d
    display_name: "foo pp"
    issuer_id: key_name
    private_key_file: "az-admin-private-key.pem"

- name: Delete protection policy foo
  purestorage.fusion.fusion_pp:
    name: foo
    state: absent
    issuer_id: key_name
    private_key_file: "az-admin-private-key.pem"
"""

RETURN = r"""
"""

try:
    import fusion as purefusion
except ImportError:
    pass

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.purestorage.fusion.plugins.module_utils.fusion import (
    fusion_argument_spec,
)

from ansible_collections.purestorage.fusion.plugins.module_utils.parsing import (
    parse_minutes,
)

from ansible_collections.purestorage.fusion.plugins.module_utils.startup import (
    setup_fusion,
)
from ansible_collections.purestorage.fusion.plugins.module_utils.operations import (
    await_operation,
)


def get_pp(module, fusion):
    """Return Protection Policy or None"""
    pp_api_instance = purefusion.ProtectionPoliciesApi(fusion)
    try:
        return pp_api_instance.get_protection_policy(
            protection_policy_name=module.params["name"]
        )
    except purefusion.rest.ApiException:
        return None


def create_pp(module, fusion):
    """Create Protection Policy"""

    pp_api_instance = purefusion.ProtectionPoliciesApi(fusion)
    local_rpo = parse_minutes(module, module.params["local_rpo"])
    local_retention = parse_minutes(module, module.params["local_retention"])
    if local_retention < 1:
        module.fail_json(msg="Local Retention must be a minimum of 1 minutes")
    if local_rpo < 10:
        module.fail_json(msg="Local RPO must be a minimum of 10 minutes")
    changed = True
    if not module.check_mode:
        if not module.params["display_name"]:
            display_name = module.params["name"]
        else:
            display_name = module.params["display_name"]
        op = pp_api_instance.create_protection_policy(
            purefusion.ProtectionPolicyPost(
                name=module.params["name"],
                display_name=display_name,
                objectives=[
                    purefusion.RPO(type="RPO", rpo="PT" + str(local_rpo) + "M"),
                    purefusion.Retention(
                        type="Retention", after="PT" + str(local_retention) + "M"
                    ),
                ],
            )
        )
        await_operation(fusion, op)

    module.exit_json(changed=changed)


def delete_pp(module, fusion):
    """Delete Protection Policy"""
    pp_api_instance = purefusion.ProtectionPoliciesApi(fusion)
    changed = True
    if not module.check_mode:
        op = pp_api_instance.delete_protection_policy(
            protection_policy_name=module.params["name"],
        )
        await_operation(fusion, op)

    module.exit_json(changed=changed)


def main():
    """Main code"""
    argument_spec = fusion_argument_spec()
    argument_spec.update(
        dict(
            name=dict(type="str", required=True),
            display_name=dict(type="str"),
            local_rpo=dict(type="str"),
            local_retention=dict(type="str"),
            state=dict(type="str", default="present", choices=["present", "absent"]),
        )
    )
    module = AnsibleModule(argument_spec, supports_check_mode=True)
    fusion = setup_fusion(module)

    state = module.params["state"]
    policy = get_pp(module, fusion)

    if not policy and state == "present":
        module.fail_on_missing_params(["local_rpo", "local_retention"])
        create_pp(module, fusion)
    elif policy and state == "absent":
        delete_pp(module, fusion)
    else:
        module.exit_json(changed=False)

    module.exit_json(changed=False)


if __name__ == "__main__":
    main()