Ejemplo n.º 1
0
def main():

    fields = {
        "state": {
            "required":
            True,
            "choices":
            ['present', 'absent', 'create', 'online', 'offline', 'restore'],
            "type":
            "str"
        },
        "name": {
            "required": True,
            "type": "str"
        },
        "size": {
            "type": "int",
            "default": 100
        },
        "description": {
            "required": False,
            "type": "str",
            "default": None
        },
        "perf_policy": {
            "required": False,
            "type": "str",
            "default": None
        },
        "limit": {
            "required": False,
            "type": "int",
        },
        "online": {
            "required": False,
            "type": "bool",
            "default": True
        },
        "owned_by_group": {
            "required": False,
            "type": "str",
            "default": None
        },
        "multi_initiator": {
            "required": False,
            "type": "bool"
        },
        "iscsi_target_scope": {
            "required": False,
            "choices": ['volume', 'group'],
            "type": "str",
            "default": 'volume'
        },
        "pool": {
            "required": False,
            "type": "str",
            "default": None
        },
        "read_only": {
            "required": False,
            "type": "bool",
            "default": False
        },
        "block_size": {
            "required": False,
            "type": "int",
            "default": 4096
        },
        "clone": {
            "required": False,
            "type": "bool",
            "default": False
        },
        "agent_type": {
            "required": False,
            "choices": ['none', 'smis', 'vvol', 'openstack', 'openstackv2'],
            "type": "str",
            "default": 'none'
        },
        "destination": {
            "required": False,
            "type": "str",
            "default": None
        },
        "cache_pinned": {
            "required": False,
            "type": "bool",
            "default": False
        },
        "thinly_provisioned": {
            "required": False,
            "type": "bool",
            "default": True
        },
        "encryption_cipher": {
            "required": False,
            "choices": ['none', 'aes_256_xts'],
            "type": "str",
            "default": 'none'
        },
        "app_uuid": {
            "required": False,
            "type": "str"
        },
        "folder": {
            "required": False,
            "type": "str",
        },
        "dedupe": {
            "required": False,
            "type": "bool",
            "default": False
        },
        "limit_iops": {
            "required": False,
            "type": "int"
        },
        "limit_mbps": {
            "required": False,
            "type": "int"
        },
        "parent": {
            "required": False,
            "type": "str",
            "default": None
        },
        "snapshot": {
            "required": False,
            "type": "str",
            "default": None
        },
        "volcoll": {
            "required": False,
            "type": "str",
            "default": None
        },
        "metadata": {
            "required": False,
            "type": "dict",
            "default": None
        },
        "force": {
            "required": False,
            "type": "bool"
        },
        "caching": {
            "required": False,
            "type": "bool"
        },
        "force_vvol": {
            "required": False,
            "type": "bool"
        },
        "move": {
            "required": False,
            "type": "bool"
        }
    }
    default_fields = utils.basic_auth_arg_fields()
    fields.update(default_fields)
    required_if = [('state', 'restore', ['snapshot'])]

    module = AnsibleModule(argument_spec=fields, required_if=required_if)
    if client is None:
        module.fail_json(msg='the python nimble-sdk module is required.')

    state = module.params["state"]
    vol_name = module.params["name"]
    size = module.params["size"]
    description = module.params["description"]
    perf_policy = module.params["perf_policy"]
    limit = module.params["limit"]
    online = module.params["online"]
    owned_by_group = module.params["owned_by_group"]
    multi_initiator = module.params["multi_initiator"]
    iscsi_target_scope = module.params["iscsi_target_scope"]
    pool = module.params["pool"]
    read_only = module.params["read_only"]
    block_size = module.params["block_size"]
    clone = module.params["clone"]
    agent_type = module.params["agent_type"]
    dest_pool = module.params["destination"]
    cache_pinned = module.params["cache_pinned"]
    thinly_provisioned = module.params["thinly_provisioned"]
    encryption_cipher = module.params["encryption_cipher"]
    app_uuid = module.params["app_uuid"]
    folder = module.params["folder"]
    dedupe = module.params["dedupe"]
    limit_iops = module.params["limit_iops"]
    limit_mbps = module.params["limit_mbps"]
    parent = module.params["parent"]  # used for cloning
    snapshot = module.params["snapshot"]
    volcoll = module.params["volcoll"]
    metadata = module.params["metadata"]
    force = module.params["force"]
    caching = module.params["caching"]
    force_vvol = module.params["force_vvol"]
    move = module.params["move"]
    hostname = module.params["hostname"]
    username = module.params["username"]
    password = module.params["password"]

    if (username is None or password is None or hostname is None):
        module.fail_json(
            msg=
            "Volume creation failed. Storage system IP or username or password is null."
        )

    client_obj = client.NimOSClient(hostname, username, password)
    # defaults
    return_status = changed = False
    msg = "No Task to run."

    # States
    if move is True and state == "present":
        if utils.is_null_or_empty(dest_pool) is False:
            return_status, changed, msg, changed_attrs_dict = move_volume(
                client_obj, vol_name, dest_pool, force_vvol)
        else:
            module.fail_json(
                msg="Volume move failed as destination pool is null.")

    elif (move is None or move is False) and (state == "create"
                                              or state == "present"):
        if utils.is_null_or_empty(vol_name):
            return_status = changed = False
            msg = "Volume creation failed as volume name is null"

        # state create/present can be provided for creating a new volume or
        # creating a clone from source volume
        if parent is not None:
            return_status, changed, msg, changed_attrs_dict = clone_volume(
                client_obj, parent, state, vol_name, snapshot)
        else:
            vol_resp = client_obj.volumes.get(id=None, name=vol_name)
            if utils.is_null_or_empty(vol_resp) or state == "create":
                return_status, changed, msg, changed_attrs_dict = create_volume(
                    client_obj,
                    vol_name,
                    perfpolicy_id=utils.get_perfpolicy_id(
                        client_obj, perf_policy),
                    size=size,
                    description=description,
                    limit=limit,
                    online=online,
                    owned_by_group_id=utils.get_owned_by_group_id(
                        client_obj, owned_by_group),
                    multi_initiator=multi_initiator,
                    iscsi_target_scope=iscsi_target_scope,
                    pool_id=utils.get_pool_id(client_obj, pool),
                    read_only=read_only,
                    block_size=block_size,
                    clone=clone,
                    agent_type=agent_type,
                    dest_pool_id=utils.get_pool_id(client_obj, dest_pool),
                    cache_pinned=cache_pinned,
                    thinly_provisioned=thinly_provisioned,
                    encryption_cipher=encryption_cipher,
                    app_uuid=app_uuid,
                    folder_id=utils.get_folder_id(client_obj, folder),
                    metadata=metadata,
                    dedupe_enabled=dedupe,
                    limit_iops=limit_iops,
                    limit_mbps=limit_mbps)
            else:
                # if we are here it means volume is already present. hence issue update call
                return_status, changed, msg, changed_attrs_dict = update_volume(
                    client_obj,
                    vol_resp,
                    size=size,
                    description=description,
                    perfpolicy_id=utils.get_perfpolicy_id(
                        client_obj, perf_policy),
                    limit=limit,
                    online=online,
                    owned_by_group_id=utils.get_owned_by_group_id(
                        client_obj, owned_by_group),
                    multi_initiator=multi_initiator,
                    iscsi_target_scope=iscsi_target_scope,
                    read_only=read_only,
                    block_size=block_size,
                    volcoll_id=utils.get_volcoll_id(client_obj, volcoll),
                    agent_type=agent_type,
                    force=force,
                    cache_pinned=cache_pinned,
                    thinly_provisioned=thinly_provisioned,
                    app_uuid=app_uuid,
                    folder_id=utils.get_folder_id(client_obj, folder),
                    metadata=metadata,
                    caching_enabled=caching,
                    dedupe_enabled=dedupe,
                    limit_iops=limit_iops,
                    limit_mbps=limit_mbps)

    elif state == "offline":
        return_status, changed, msg, changed_attrs_dict = change_volume_state(
            client_obj, vol_name, False)

    elif state == "online":
        return_status, changed, msg, changed_attrs_dict = change_volume_state(
            client_obj, vol_name, True)

    elif state == "absent":
        return_status, changed, msg, changed_attrs_dict = delete_volume(
            client_obj, vol_name)

    elif state == "restore":
        return_status, changed, msg, changed_attrs_dict = restore_volume(
            client_obj, vol_name, snapshot)

    if return_status:
        if not utils.is_null_or_empty(
                changed_attrs_dict) and changed_attrs_dict.__len__() > 0:
            module.exit_json(return_status=return_status,
                             changed=changed,
                             message=msg,
                             modified_attrs=changed_attrs_dict)
        else:
            module.exit_json(return_status=return_status,
                             changed=changed,
                             message=msg)
    else:
        module.fail_json(return_status=return_status, changed=changed, msg=msg)
def main():

    fields = {
        "state": {
            "required": True,
            "choices": ['present',
                        'absent',
                        'create'
                        ],
            "type": "str"
        },
        "change_name": {
            "required": False,
            "type": "str",
            "no_log": False
        },
        "name": {
            "required": True,
            "type": "str",
            "no_log": False
        },
        "description": {
            "required": False,
            "type": "str",
            "no_log": False
        },
        "volcoll": {
            "required": True,
            "type": "str",
            "no_log": False
        },
        "is_external_trigger": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "vol_snap_attr_list": {
            "required": False,
            "type": "list",
            "elements": 'dict',
            "no_log": False
        },
        "replicate_to": {
            "required": False,
            "type": "str",
            "no_log": False
        },
        "start_online": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "allow_writes": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "disable_appsync": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "snap_verify": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "skip_db_consistency_check": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "invoke_on_upstream_partner": {
            "required": False,
            "type": "bool",
            "no_log": False
        },
        "agent_type": {
            "required": False,
            "type": "str",
            "no_log": False
        },
        "metadata": {
            "required": False,
            "type": "dict",
            "no_log": False
        },
        "expiry_after": {
            "required": False,
            "type": "int",
            "no_log": False
        },
        "force": {
            "required": False,
            "type": "bool",
            "no_log": False
        }
    }
    default_fields = utils.basic_auth_arg_fields()
    fields.update(default_fields)

    module = AnsibleModule(argument_spec=fields)
    if client is None:
        module.fail_json(msg='Python nimble-sdk could not be found.')

    hostname = module.params["host"]
    username = module.params["username"]
    password = module.params["password"]
    state = module.params["state"]
    snapcoll_name = module.params["name"]
    change_name = module.params["change_name"]
    description = module.params["description"]
    volcoll = module.params["volcoll"]
    is_external_trigger = module.params["is_external_trigger"]
    vol_snap_attr_list = module.params["vol_snap_attr_list"]
    replicate_to = module.params["replicate_to"]
    start_online = module.params["start_online"]
    allow_writes = module.params["allow_writes"]
    disable_appsync = module.params["disable_appsync"]
    snap_verify = module.params["snap_verify"]
    skip_db_consistency_check = module.params["skip_db_consistency_check"]
    invoke_on_upstream_partner = module.params["invoke_on_upstream_partner"]
    agent_type = module.params["agent_type"]
    metadata = module.params["metadata"]
    expiry_after = module.params["expiry_after"]
    force = module.params["force"]

    if (username is None or password is None or hostname is None or snapcoll_name is None):
        module.fail_json(
            msg="Missing variables: hostname, username, password and snapshot collection name is mandatory.")

    # defaults
    return_status = changed = False
    msg = "No task to run."
    resp = None
    try:
        client_obj = client.NimOSClient(
            hostname,
            username,
            password
        )

        # States
        if state == "create" or state == "present":
            snapcoll_resp = client_obj.snapshot_collections.get(id=None, name=snapcoll_name, volcoll_name=volcoll)
            if utils.is_null_or_empty(snapcoll_resp) or state == "create":
                return_status, changed, msg, changed_attrs_dict, resp = create_snapcoll(
                    client_obj,
                    snapcoll_name,
                    volcoll,
                    description=description,
                    volcoll_id=utils.get_volcoll_id(client_obj, volcoll),
                    is_external_trigger=is_external_trigger,
                    vol_snap_attr_list=vol_snap_attr_list,
                    replicate_to=replicate_to,
                    start_online=start_online,
                    allow_writes=allow_writes,
                    disable_appsync=disable_appsync,
                    snap_verify=snap_verify,
                    skip_db_consistency_check=skip_db_consistency_check,
                    invoke_on_upstream_partner=invoke_on_upstream_partner,
                    agent_type=agent_type,
                    metadata=metadata)
            else:
                # update op
                return_status, changed, msg, changed_attrs_dict, resp = update_snapcoll(
                    client_obj,
                    snapcoll_resp,
                    name=change_name,
                    description=description,
                    replicate_to=replicate_to,
                    expiry_after=expiry_after,
                    metadata=metadata,
                    force=force)

        elif state == "absent":
            return_status, changed, msg, changed_attrs_dict = delete_snapcoll(client_obj,
                                                                              snapcoll_name,
                                                                              volcoll)
    except Exception as ex:
        # failed for some reason.
        msg = str(ex)

    if return_status:
        if utils.is_null_or_empty(resp):
            module.exit_json(return_status=return_status, changed=changed, msg=msg)
        else:
            module.exit_json(return_status=return_status, changed=changed, msg=msg, attrs=resp)
    else:
        module.fail_json(return_status=return_status, changed=changed, msg=msg)