def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(name=dict(required=False, type='str'),
             ssid=dict(required=False, type='str'),
             current_password=dict(required=False, no_log=True),
             new_password=dict(required=True, no_log=True),
             set_admin=dict(required=True, type='bool'),
             api_url=dict(required=True),
             api_username=dict(required=False),
             api_password=dict(required=False, no_log=True)))
    module = AnsibleModule(argument_spec=argument_spec,
                           mutually_exclusive=[['name', 'ssid']],
                           required_one_of=[['name', 'ssid']])

    name = module.params['name']
    ssid = module.params['ssid']
    current_password = module.params['current_password']
    new_password = module.params['new_password']
    set_admin = module.params['set_admin']
    user = module.params['api_username']
    pwd = module.params['api_password']
    api_url = module.params['api_url']
    module.validate_certs = module.params['validate_certs']

    if not api_url.endswith('/'):
        api_url += '/'

    if name:
        ssid = get_ssid(module, name, api_url, user, pwd)

    ro_pwd, admin_pwd = get_pwd_status(module, ssid, api_url, user, pwd)

    if admin_pwd and not current_password:
        module.fail_json(
            msg="Admin account has a password set. " +
            "You must supply current_password in order to update the RO or Admin passwords"
        )

    if len(new_password) > 30:
        module.fail_json(
            msg="Passwords must not be greater than 30 characters in length")

    result = set_password(module,
                          ssid,
                          api_url,
                          user,
                          pwd,
                          current_password=current_password,
                          new_password=new_password,
                          set_admin=set_admin)

    module.exit_json(changed=True,
                     msg="Password Updated Successfully",
                     password_set=result['passwordSet'],
                     password_status=result['passwordStatus'])
Esempio n. 2
0
def eseries_host_argument_spec():
    """Retrieve a base argument specification common to all NetApp E-Series modules"""
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(api_username=dict(type='str', required=True),
             api_password=dict(type='str', required=True, no_log=True),
             api_url=dict(type='str', required=True),
             ssid=dict(type='str', required=False, default='1'),
             validate_certs=dict(type='bool', required=False, default=True)))
    return argument_spec
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(
            snapshot_group=dict(required=True, type='str'),
            ssid=dict(required=True, type='str'),
            api_url=dict(required=True),
            api_username=dict(required=False),
            api_password=dict(required=False, no_log=True),
            validate_certs=dict(required=False, default=True),
            state=dict(required=True, choices=['create', 'remove'],
                       type='str'),
        ))
    module = AnsibleModule(argument_spec)

    p = module.params

    ssid = p.pop('ssid')
    api_url = p.pop('api_url')
    user = p.pop('api_username')
    pwd = p.pop('api_password')
    snapshot_group = p.pop('snapshot_group')
    desired_state = p.pop('state')

    if not api_url.endswith('/'):
        api_url += '/'

    if desired_state == 'create':
        created_status, snapshot_id = create_image(module, ssid, api_url, pwd,
                                                   user, p, snapshot_group)

        if created_status:
            module.exit_json(changed=True,
                             msg='Created snapshot image',
                             image_id=snapshot_id)
        else:
            module.fail_json(
                msg=
                "Could not create snapshot image on system %s, in snapshot group %s"
                % (ssid, snapshot_group))
    else:
        deleted, error_msg = delete_image(module, ssid, api_url, pwd, user,
                                          snapshot_group)

        if deleted:
            module.exit_json(
                changed=True,
                msg='Deleted snapshot image for snapshot group [%s]' %
                (snapshot_group))
        else:
            module.fail_json(
                msg=
                "Could not create snapshot image on system %s, in snapshot group %s --- %s"
                % (ssid, snapshot_group, error_msg))
Esempio n. 4
0
    def __init__(self):

        argument_spec = basic_auth_argument_spec()
        argument_spec.update(
            api_username=dict(type='str', required=True),
            api_password=dict(type='str', required=True, no_log=True),
            api_url=dict(type='str', required=True),
            state=dict(required=True, choices=['present', 'absent']),
            base_volume_name=dict(required=True),
            name=dict(required=True),
            repo_pct=dict(default=20, type='int'),
            warning_threshold=dict(default=80, type='int'),
            delete_limit=dict(default=30, type='int'),
            full_policy=dict(default='purgepit',
                             choices=['unknown', 'failbasewrites',
                                      'purgepit']),
            rollback_priority=dict(
                default='medium',
                choices=['highest', 'high', 'medium', 'low', 'lowest']),
            storage_pool_name=dict(type='str'),
            ssid=dict(required=True),
        )

        self.module = AnsibleModule(argument_spec=argument_spec)

        self.post_data = dict()
        self.warning_threshold = self.module.params['warning_threshold']
        self.base_volume_name = self.module.params['base_volume_name']
        self.name = self.module.params['name']
        self.repo_pct = self.module.params['repo_pct']
        self.delete_limit = self.module.params['delete_limit']
        self.full_policy = self.module.params['full_policy']
        self.rollback_priority = self.module.params['rollback_priority']
        self.storage_pool_name = self.module.params['storage_pool_name']
        self.state = self.module.params['state']

        self.url = self.module.params['api_url']
        self.user = self.module.params['api_username']
        self.pwd = self.module.params['api_password']
        self.certs = self.module.params['validate_certs']
        self.ssid = self.module.params['ssid']

        if not self.url.endswith('/'):
            self.url += '/'

        self.changed = False
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(api_token=dict(type='str', required=True,
                                        no_log=True),
                         project=dict(type='str', required=True),
                         purge=dict(type='bool', required=False,
                                    default=False),
                         vars=dict(type='dict',
                                   required=False,
                                   default=dict(),
                                   no_log=True),
                         state=dict(type='str',
                                    default="present",
                                    choices=["absent", "present"]))

    module = AnsibleModule(argument_spec=argument_spec,
                           mutually_exclusive=[
                               ['api_username', 'api_token'],
                               ['api_password', 'api_token'],
                           ],
                           required_together=[
                               ['api_username', 'api_password'],
                           ],
                           required_one_of=[['api_username', 'api_token']],
                           supports_check_mode=True)

    purge = module.params['purge']
    var_list = module.params['vars']
    state = module.params['state']

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg=missing_required_lib("python-gitlab"),
                         exception=GITLAB_IMP_ERR)

    gitlab_instance = gitlabAuthentication(module)

    this_gitlab = GitlabProjectVariables(module=module,
                                         gitlab_instance=gitlab_instance)

    change, return_value = native_python_main(this_gitlab, purge, var_list,
                                              state)

    module.exit_json(changed=change, project_variable=return_value)
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(
            name=dict(required=True, type='str'),
            role=dict(required=True, choices=['primary', 'secondary']),
            noSync=dict(required=False, type='bool', default=False),
            force=dict(required=False, type='bool', default=False),
            ssid=dict(required=True, type='str'),
            api_url=dict(required=True),
            api_username=dict(required=False),
            api_password=dict(required=False, no_log=True),
        ))

    module = AnsibleModule(argument_spec=argument_spec)

    p = module.params

    ssid = p.pop('ssid')
    api_url = p.pop('api_url')
    user = p.pop('api_username')
    pwd = p.pop('api_password')
    name = p.pop('name')

    if not api_url.endswith('/'):
        api_url += '/'

    agm_exists, has_desired_role, async_id, amg_data = has_match(
        module, ssid, api_url, pwd, user, p, name)

    if not agm_exists:
        module.fail_json(
            msg="No Async Mirror Group with the name: '%s' was found" % name)
    elif has_desired_role:
        module.exit_json(changed=False, **amg_data)

    else:
        amg_data = update_amg(module, ssid, api_url, user, pwd, p, async_id)
        if amg_data:
            module.exit_json(changed=True, **amg_data)
        else:
            module.exit_json(changed=True, msg="AMG role changed.")
    def __init__(self):
        argument_spec = basic_auth_argument_spec()
        argument_spec.update(
            dict(api_username=dict(type='str', required=True),
                 api_password=dict(type='str', required=True, no_log=True),
                 api_url=dict(type='str', required=True),
                 ssid=dict(type='str', required=True),
                 snapshot_image_id=dict(type='str', required=True),
                 full_threshold=dict(type='int', default=85),
                 name=dict(type='str', required=True),
                 view_mode=dict(type='str',
                                default='readOnly',
                                choices=[
                                    'readOnly', 'readWrite', 'modeUnknown',
                                    '__Undefined'
                                ]),
                 repo_percentage=dict(type='int', default=20),
                 storage_pool_name=dict(type='str', required=True),
                 state=dict(type='str',
                            required=True,
                            choices=['absent', 'present'])))

        self.module = AnsibleModule(argument_spec=argument_spec)
        args = self.module.params
        self.state = args['state']
        self.ssid = args['ssid']
        self.snapshot_image_id = args['snapshot_image_id']
        self.full_threshold = args['full_threshold']
        self.name = args['name']
        self.view_mode = args['view_mode']
        self.repo_percentage = args['repo_percentage']
        self.storage_pool_name = args['storage_pool_name']
        self.url = args['api_url']
        self.user = args['api_username']
        self.pwd = args['api_password']
        self.certs = args['validate_certs']

        if not self.url.endswith('/'):
            self.url += '/'
Esempio n. 8
0
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(dict(
        api_token=dict(type='str', no_log=True),
        state=dict(type='str', default="present", choices=["absent", "present"]),
        project=dict(type='str', required=True),
        hook_url=dict(type='str', required=True),
        push_events=dict(type='bool', default=True),
        push_events_branch_filter=dict(type='str', default=''),
        issues_events=dict(type='bool', default=False),
        merge_requests_events=dict(type='bool', default=False),
        tag_push_events=dict(type='bool', default=False),
        note_events=dict(type='bool', default=False),
        job_events=dict(type='bool', default=False),
        pipeline_events=dict(type='bool', default=False),
        wiki_page_events=dict(type='bool', default=False),
        hook_validate_certs=dict(type='bool', default=False, aliases=['enable_ssl_verification']),
        token=dict(type='str', no_log=True),
    ))

    module = AnsibleModule(
        argument_spec=argument_spec,
        mutually_exclusive=[
            ['api_username', 'api_token'],
            ['api_password', 'api_token']
        ],
        required_together=[
            ['api_username', 'api_password']
        ],
        required_one_of=[
            ['api_username', 'api_token']
        ],
        supports_check_mode=True,
    )

    state = module.params['state']
    project_identifier = module.params['project']
    hook_url = module.params['hook_url']
    push_events = module.params['push_events']
    push_events_branch_filter = module.params['push_events_branch_filter']
    issues_events = module.params['issues_events']
    merge_requests_events = module.params['merge_requests_events']
    tag_push_events = module.params['tag_push_events']
    note_events = module.params['note_events']
    job_events = module.params['job_events']
    pipeline_events = module.params['pipeline_events']
    wiki_page_events = module.params['wiki_page_events']
    enable_ssl_verification = module.params['hook_validate_certs']
    hook_token = module.params['token']

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg=missing_required_lib("python-gitlab"), exception=GITLAB_IMP_ERR)

    gitlab_instance = gitlabAuthentication(module)

    gitlab_hook = GitLabHook(module, gitlab_instance)

    project = findProject(gitlab_instance, project_identifier)

    if project is None:
        module.fail_json(msg="Failed to create hook: project %s doesn't exists" % project_identifier)

    hook_exists = gitlab_hook.existsHook(project, hook_url)

    if state == 'absent':
        if hook_exists:
            gitlab_hook.deleteHook()
            module.exit_json(changed=True, msg="Successfully deleted hook %s" % hook_url)
        else:
            module.exit_json(changed=False, msg="Hook deleted or does not exists")

    if state == 'present':
        if gitlab_hook.createOrUpdateHook(project, hook_url, {
                                          "push_events": push_events,
                                          "push_events_branch_filter": push_events_branch_filter,
                                          "issues_events": issues_events,
                                          "merge_requests_events": merge_requests_events,
                                          "tag_push_events": tag_push_events,
                                          "note_events": note_events,
                                          "job_events": job_events,
                                          "pipeline_events": pipeline_events,
                                          "wiki_page_events": wiki_page_events,
                                          "enable_ssl_verification": enable_ssl_verification,
                                          "token": hook_token}):

            module.exit_json(changed=True, msg="Successfully created or updated the hook %s" % hook_url, hook=gitlab_hook.hookObject._attrs)
        else:
            module.exit_json(changed=False, msg="No need to update the hook %s" % hook_url, hook=gitlab_hook.hookObject._attrs)
Esempio n. 9
0
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(
            api_token=dict(type='str', no_log=True),
            description=dict(type='str', required=True, aliases=["name"]),
            active=dict(type='bool', default=True),
            tag_list=dict(type='list', default=[]),
            run_untagged=dict(type='bool', default=True),
            locked=dict(type='bool', default=False),
            access_level=dict(type='str',
                              default='ref_protected',
                              choices=["not_protected", "ref_protected"]),
            maximum_timeout=dict(type='int', default=3600),
            registration_token=dict(type='str', required=True),
            state=dict(type='str',
                       default="present",
                       choices=["absent", "present"]),
        ))

    module = AnsibleModule(
        argument_spec=argument_spec,
        mutually_exclusive=[
            ['api_username', 'api_token'],
            ['api_password', 'api_token'],
        ],
        required_together=[
            ['api_username', 'api_password'],
        ],
        required_one_of=[
            ['api_username', 'api_token'],
        ],
        supports_check_mode=True,
    )

    state = module.params['state']
    runner_description = module.params['description']
    runner_active = module.params['active']
    tag_list = module.params['tag_list']
    run_untagged = module.params['run_untagged']
    runner_locked = module.params['locked']
    access_level = module.params['access_level']
    maximum_timeout = module.params['maximum_timeout']
    registration_token = module.params['registration_token']

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg=missing_required_lib("python-gitlab"),
                         exception=GITLAB_IMP_ERR)

    gitlab_instance = gitlabAuthentication(module)

    gitlab_runner = GitLabRunner(module, gitlab_instance)
    runner_exists = gitlab_runner.existsRunner(runner_description)

    if state == 'absent':
        if runner_exists:
            gitlab_runner.deleteRunner()
            module.exit_json(changed=True,
                             msg="Successfully deleted runner %s" %
                             runner_description)
        else:
            module.exit_json(changed=False,
                             msg="Runner deleted or does not exists")

    if state == 'present':
        if gitlab_runner.createOrUpdateRunner(
                runner_description, {
                    "active": runner_active,
                    "tag_list": tag_list,
                    "run_untagged": run_untagged,
                    "locked": runner_locked,
                    "access_level": access_level,
                    "maximum_timeout": maximum_timeout,
                    "registration_token": registration_token
                }):
            module.exit_json(
                changed=True,
                runner=gitlab_runner.runnerObject._attrs,
                msg="Successfully created or updated the runner %s" %
                runner_description)
        else:
            module.exit_json(changed=False,
                             runner=gitlab_runner.runnerObject._attrs,
                             msg="No need to update the runner %s" %
                             runner_description)
Esempio n. 10
0
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(api_token=dict(type='str', no_log=True),
             state=dict(type='str',
                        default="present",
                        choices=["absent", "present"]),
             project=dict(type='str', required=True),
             key=dict(type='str', required=True),
             can_push=dict(type='bool', default=False),
             title=dict(type='str', required=True)))

    module = AnsibleModule(
        argument_spec=argument_spec,
        mutually_exclusive=[['api_username', 'api_token'],
                            ['api_password', 'api_token']],
        required_together=[['api_username', 'api_password']],
        required_one_of=[['api_username', 'api_token']],
        supports_check_mode=True,
    )

    state = module.params['state']
    project_identifier = module.params['project']
    key_title = module.params['title']
    key_keyfile = module.params['key']
    key_can_push = module.params['can_push']

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg=missing_required_lib("python-gitlab"),
                         exception=GITLAB_IMP_ERR)

    gitlab_instance = gitlabAuthentication(module)

    gitlab_deploy_key = GitLabDeployKey(module, gitlab_instance)

    project = findProject(gitlab_instance, project_identifier)

    if project is None:
        module.fail_json(
            msg="Failed to create deploy key: project %s doesn't exists" %
            project_identifier)

    deployKey_exists = gitlab_deploy_key.existsDeployKey(project, key_title)

    if state == 'absent':
        if deployKey_exists:
            gitlab_deploy_key.deleteDeployKey()
            module.exit_json(changed=True,
                             msg="Successfully deleted deploy key %s" %
                             key_title)
        else:
            module.exit_json(changed=False,
                             msg="Deploy key deleted or does not exists")

    if state == 'present':
        if gitlab_deploy_key.createOrUpdateDeployKey(
                project, key_title, key_keyfile, {'can_push': key_can_push}):

            module.exit_json(
                changed=True,
                msg="Successfully created or updated the deploy key %s" %
                key_title,
                deploy_key=gitlab_deploy_key.deployKeyObject._attrs)
        else:
            module.exit_json(
                changed=False,
                msg="No need to update the deploy key %s" % key_title,
                deploy_key=gitlab_deploy_key.deployKeyObject._attrs)
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(
            api_token=dict(type='str', no_log=True),
            group=dict(type='str'),
            name=dict(type='str', required=True),
            path=dict(type='str'),
            description=dict(type='str'),
            issues_enabled=dict(type='bool', default=True),
            merge_requests_enabled=dict(type='bool', default=True),
            wiki_enabled=dict(type='bool', default=True),
            snippets_enabled=dict(default=True, type='bool'),
            visibility=dict(type='str',
                            default="private",
                            choices=["internal", "private", "public"],
                            aliases=["visibility_level"]),
            import_url=dict(type='str'),
            state=dict(type='str',
                       default="present",
                       choices=["absent", "present"]),
        ))

    module = AnsibleModule(
        argument_spec=argument_spec,
        mutually_exclusive=[
            ['api_username', 'api_token'],
            ['api_password', 'api_token'],
        ],
        required_together=[
            ['api_username', 'api_password'],
        ],
        required_one_of=[['api_username', 'api_token']],
        supports_check_mode=True,
    )

    group_identifier = module.params['group']
    project_name = module.params['name']
    project_path = module.params['path']
    project_description = module.params['description']
    issues_enabled = module.params['issues_enabled']
    merge_requests_enabled = module.params['merge_requests_enabled']
    wiki_enabled = module.params['wiki_enabled']
    snippets_enabled = module.params['snippets_enabled']
    visibility = module.params['visibility']
    import_url = module.params['import_url']
    state = module.params['state']

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg=missing_required_lib("python-gitlab"),
                         exception=GITLAB_IMP_ERR)

    gitlab_instance = gitlabAuthentication(module)

    # Set project_path to project_name if it is empty.
    if project_path is None:
        project_path = project_name.replace(" ", "_")

    gitlab_project = GitLabProject(module, gitlab_instance)

    if group_identifier:
        group = findGroup(gitlab_instance, group_identifier)
        if group is None:
            module.fail_json(
                msg="Failed to create project: group %s doesn't exists" %
                group_identifier)

        namespace = gitlab_instance.namespaces.get(group.id)
        project_exists = gitlab_project.existsProject(namespace, project_path)
    else:
        user = gitlab_instance.users.list(
            username=gitlab_instance.user.username)[0]
        namespace = gitlab_instance.namespaces.get(user.id)
        project_exists = gitlab_project.existsProject(namespace, project_path)

    if state == 'absent':
        if project_exists:
            gitlab_project.deleteProject()
            module.exit_json(changed=True,
                             msg="Successfully deleted project %s" %
                             project_name)
        else:
            module.exit_json(changed=False,
                             msg="Project deleted or does not exists")

    if state == 'present':
        if gitlab_project.createOrUpdateProject(
                project_name, namespace, {
                    "path": project_path,
                    "description": project_description,
                    "issues_enabled": issues_enabled,
                    "merge_requests_enabled": merge_requests_enabled,
                    "wiki_enabled": wiki_enabled,
                    "snippets_enabled": snippets_enabled,
                    "visibility": visibility,
                    "import_url": import_url
                }):

            module.exit_json(
                changed=True,
                msg="Successfully created or updated the project %s" %
                project_name,
                project=gitlab_project.projectObject._attrs)
        else:
            module.exit_json(changed=False,
                             msg="No need to update the project %s" %
                             project_name,
                             project=gitlab_project.projectObject._attrs)
Esempio n. 12
0
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(
        dict(
            api_token=dict(type='str', no_log=True),
            name=dict(type='str'),
            state=dict(type='str',
                       default="present",
                       choices=["absent", "present"]),
            username=dict(type='str', required=True),
            password=dict(type='str', no_log=True),
            email=dict(type='str'),
            sshkey_name=dict(type='str'),
            sshkey_file=dict(type='str'),
            group=dict(type='str'),
            access_level=dict(type='str',
                              default="guest",
                              choices=[
                                  "developer", "guest", "maintainer", "master",
                                  "owner", "reporter"
                              ]),
            confirm=dict(type='bool', default=True),
            isadmin=dict(type='bool', default=False),
            external=dict(type='bool', default=False),
        ))

    module = AnsibleModule(argument_spec=argument_spec,
                           mutually_exclusive=[
                               ['api_username', 'api_token'],
                               ['api_password', 'api_token'],
                           ],
                           required_together=[
                               ['api_username', 'api_password'],
                           ],
                           required_one_of=[['api_username', 'api_token']],
                           supports_check_mode=True,
                           required_if=(('state', 'present',
                                         ['name', 'email', 'password']), ))

    user_name = module.params['name']
    state = module.params['state']
    user_username = module.params['username'].lower()
    user_password = module.params['password']
    user_email = module.params['email']
    user_sshkey_name = module.params['sshkey_name']
    user_sshkey_file = module.params['sshkey_file']
    group_path = module.params['group']
    access_level = module.params['access_level']
    confirm = module.params['confirm']
    user_isadmin = module.params['isadmin']
    user_external = module.params['external']

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg=missing_required_lib("python-gitlab"),
                         exception=GITLAB_IMP_ERR)

    gitlab_instance = gitlabAuthentication(module)

    gitlab_user = GitLabUser(module, gitlab_instance)
    user_exists = gitlab_user.existsUser(user_username)

    if state == 'absent':
        if user_exists:
            gitlab_user.deleteUser()
            module.exit_json(changed=True,
                             msg="Successfully deleted user %s" %
                             user_username)
        else:
            module.exit_json(changed=False,
                             msg="User deleted or does not exists")

    if state == 'present':
        if gitlab_user.createOrUpdateUser(
                user_username, {
                    "name": user_name,
                    "password": user_password,
                    "email": user_email,
                    "sshkey_name": user_sshkey_name,
                    "sshkey_file": user_sshkey_file,
                    "group_path": group_path,
                    "access_level": access_level,
                    "confirm": confirm,
                    "isadmin": user_isadmin,
                    "external": user_external
                }):
            module.exit_json(
                changed=True,
                msg="Successfully created or updated the user %s" %
                user_username,
                user=gitlab_user.userObject._attrs)
        else:
            module.exit_json(changed=False,
                             msg="No need to update the user %s" %
                             user_username,
                             user=gitlab_user.userObject._attrs)
Esempio n. 13
0
def main():
    argument_spec = basic_auth_argument_spec()
    argument_spec.update(dict(
        state=dict(required=True, choices=['present', 'absent']),
        ssid=dict(required=True, type='str'),
        controller_addresses=dict(type='list'),
        array_wwn=dict(required=False, type='str'),
        array_password=dict(required=False, type='str', no_log=True),
        array_status_timeout_sec=dict(default=60, type='int'),
        enable_trace=dict(default=False, type='bool'),
        meta_tags=dict(type='list')
    ))
    module = AnsibleModule(
        argument_spec=argument_spec,
        supports_check_mode=True,
        mutually_exclusive=[['controller_addresses', 'array_wwn']],
        required_if=[('state', 'present', ['controller_addresses'])]
    )

    p = module.params

    state = p['state']
    ssid = p['ssid']
    controller_addresses = p['controller_addresses']
    array_wwn = p['array_wwn']
    array_password = p['array_password']
    array_status_timeout_sec = p['array_status_timeout_sec']
    validate_certs = p['validate_certs']
    meta_tags = p['meta_tags']
    enable_trace = p['enable_trace']

    api_usr = p['api_username']
    api_pwd = p['api_password']
    api_url = p['api_url']

    changed = False
    array_exists = False

    try:
        (rc, resp) = request(api_url + "/storage-systems/%s" % ssid, headers=dict(Accept="application/json"),
                             url_username=api_usr, url_password=api_pwd, validate_certs=validate_certs,
                             ignore_errors=True)
    except Exception as err:
        module.fail_json(msg="Error accessing storage-system with id [%s]. Error [%s]" % (ssid, to_native(err)))

    array_exists = True
    array_detail = resp

    if rc == 200:
        if state == 'absent':
            changed = True
            array_exists = False
        elif state == 'present':
            current_addresses = frozenset(i for i in (array_detail['ip1'], array_detail['ip2']) if i)
            if set(controller_addresses) != current_addresses:
                changed = True
            if array_detail['wwn'] != array_wwn and array_wwn is not None:
                module.fail_json(
                    msg='It seems you may have specified a bad WWN. The storage system ID you specified, %s, currently has the WWN of %s' %
                        (ssid, array_detail['wwn'])
                )
    elif rc == 404:
        if state == 'present':
            changed = True
            array_exists = False
        else:
            changed = False
            module.exit_json(changed=changed, msg="Storage system was not present.")

    if changed and not module.check_mode:
        if state == 'present':
            if not array_exists:
                # add the array
                array_add_req = dict(
                    id=ssid,
                    controllerAddresses=controller_addresses,
                    metaTags=meta_tags,
                    enableTrace=enable_trace
                )

                if array_wwn:
                    array_add_req['wwn'] = array_wwn

                if array_password:
                    array_add_req['password'] = array_password

                post_headers = dict(Accept="application/json")
                post_headers['Content-Type'] = 'application/json'
                request_data = json.dumps(array_add_req)

                try:
                    (rc, resp) = do_post(ssid, api_url, post_headers, api_usr, api_pwd, validate_certs, request_data,
                                         array_status_timeout_sec)
                except Exception as err:
                    module.fail_json(msg="Failed to add storage system. Id[%s]. Request body [%s]. Error[%s]." %
                                         (ssid, request_data, to_native(err)))

            else:  # array exists, modify...
                post_headers = dict(Accept="application/json")
                post_headers['Content-Type'] = 'application/json'
                post_body = dict(
                    controllerAddresses=controller_addresses,
                    removeAllTags=True,
                    enableTrace=enable_trace,
                    metaTags=meta_tags
                )

                try:
                    (rc, resp) = do_post(ssid, api_url, post_headers, api_usr, api_pwd, validate_certs, post_body,
                                         array_status_timeout_sec)
                except Exception as err:
                    module.fail_json(msg="Failed to update storage system. Id[%s]. Request body [%s]. Error[%s]." %
                                         (ssid, post_body, to_native(err)))

        elif state == 'absent':
            # delete the array
            try:
                (rc, resp) = request(api_url + "/storage-systems/%s" % ssid, method='DELETE',
                                     url_username=api_usr,
                                     url_password=api_pwd, validate_certs=validate_certs)
            except Exception as err:
                module.fail_json(msg="Failed to remove storage array. Id[%s]. Error[%s]." % (ssid, to_native(err)))

            if rc == 422:
                module.exit_json(changed=changed, msg="Storage system was not presented.")
            if rc == 204:
                module.exit_json(changed=changed, msg="Storage system removed.")

    module.exit_json(changed=changed, **resp)
Esempio n. 14
0
    def __init__(self):
        self.name = None
        self.log_mode = None
        self.log_path = None
        self.api_url = None
        self.api_username = None
        self.api_password = None
        self.ssid = None
        self.validate_certs = None
        self.disk_count = None
        self.size_unit = None
        self.cache_size_min = None
        self.io_type = None
        self.driveRefs = None
        self.state = None
        self._size_unit_map = dict(bytes=1,
                                   b=1,
                                   kb=1024,
                                   mb=1024**2,
                                   gb=1024**3,
                                   tb=1024**4,
                                   pb=1024**5,
                                   eb=1024**6,
                                   zb=1024**7,
                                   yb=1024**8)

        argument_spec = basic_auth_argument_spec()
        argument_spec.update(
            dict(
                api_username=dict(type='str', required=True),
                api_password=dict(type='str', required=True, no_log=True),
                api_url=dict(type='str', required=True),
                state=dict(default='present',
                           choices=['present', 'absent'],
                           type='str'),
                ssid=dict(required=True, type='str'),
                name=dict(required=True, type='str'),
                disk_count=dict(type='int'),
                disk_refs=dict(type='list'),
                cache_size_min=dict(type='int'),
                io_type=dict(default='filesystem',
                             choices=['filesystem', 'database', 'media']),
                size_unit=dict(default='gb',
                               choices=[
                                   'bytes', 'b', 'kb', 'mb', 'gb', 'tb', 'pb',
                                   'eb', 'zb', 'yb'
                               ],
                               type='str'),
                criteria_disk_phy_type=dict(choices=[
                    'sas', 'sas4k', 'fibre', 'fibre520b', 'scsi', 'sata',
                    'pata'
                ],
                                            type='str'),
                log_mode=dict(type='str'),
                log_path=dict(type='str'),
            ))
        self.module = AnsibleModule(
            argument_spec=argument_spec,
            required_if=[],
            mutually_exclusive=[],
            # TODO: update validation for various selection criteria
            supports_check_mode=True)

        self.__dict__.update(self.module.params)

        # logging setup
        self._logger = logging.getLogger(self.__class__.__name__)
        self.debug = self._logger.debug

        if self.log_mode == 'file' and self.log_path:
            logging.basicConfig(level=logging.DEBUG, filename=self.log_path)
        elif self.log_mode == 'stderr':
            logging.basicConfig(level=logging.DEBUG, stream=sys.stderr)

        self.post_headers = dict(Accept="application/json")
        self.post_headers['Content-Type'] = 'application/json'