コード例 #1
0
class AwsCvsNetappActiveDir(object):
    """
    Contains methods to parse arguments,
    derive details of AWS_CVS objects
    and send requests to AWS CVS via
    the restApi
    """

    def __init__(self):
        """
        Parse arguments, setup state variables,
        check paramenters and ensure request module is installed
        """
        self.argument_spec = netapp_utils.aws_cvs_host_argument_spec()
        self.argument_spec.update(dict(
            state=dict(required=True, choices=['present', 'absent'], type='str'),
            region=dict(required=True, type='str'),
            DNS=dict(required=False, type='str'),
            domain=dict(required=False, type='str'),
            password=dict(required=False, type='str', no_log=True),
            netBIOS=dict(required=False, type='str'),
            username=dict(required=False, type='str')
        ))

        self.module = AnsibleModule(
            argument_spec=self.argument_spec,
            required_if=[
                ('state', 'present', ['region', 'domain']),
            ],
            supports_check_mode=True
        )

        self.na_helper = NetAppModule()

        # set up state variables
        self.parameters = self.na_helper.set_parameters(self.module.params)
        # Calling generic AWSCVS restApi class
        self.restApi = AwsCvsRestAPI(self.module)

    def get_activedirectoryId(self):
        # Check if  ActiveDirectory exists
        # Return UUID for ActiveDirectory is found, None otherwise
        try:
            list_activedirectory, error = self.restApi.get('Storage/ActiveDirectory')
        except Exception as e:
            return None

        for ActiveDirectory in list_activedirectory:
            if ActiveDirectory['region'] == self.parameters['region']:
                return ActiveDirectory['UUID']
        return None

    def get_activedirectory(self, activeDirectoryId=None):
        if activeDirectoryId is None:
            return None
        else:
            ActiveDirectoryInfo, error = self.restApi.get('Storage/ActiveDirectory/%s' % activeDirectoryId)
            if not error:
                return ActiveDirectoryInfo
            return None

    def create_activedirectory(self):
        # Create ActiveDirectory
        api = 'Storage/ActiveDirectory'
        data = {"region": self.parameters['region'], "DNS": self.parameters['DNS'], "domain": self.parameters['domain'],
                "username": self.parameters['username'], "password": self.parameters['password'], "netBIOS": self.parameters['netBIOS']}

        response, error = self.restApi.post(api, data)

        if not error:
            return response
        else:
            self.module.fail_json(msg=response['message'])

    def delete_activedirectory(self):
        activedirectoryId = self.get_activedirectoryId()
        # Delete ActiveDirectory

        if activedirectoryId:
            api = 'Storage/ActiveDirectory/' + activedirectoryId
            data = None
            response, error = self.restApi.delete(api, data)
            if not error:
                return response
            else:
                self.module.fail_json(msg=response['message'])

        else:
            self.module.fail_json(msg="Active Directory does not exist")

    def update_activedirectory(self, activedirectoryId, updated_activedirectory):
        # Update ActiveDirectory
        api = 'Storage/ActiveDirectory/' + activedirectoryId
        data = {
            "region": self.parameters['region'],
            "DNS": updated_activedirectory['DNS'],
            "domain": updated_activedirectory['domain'],
            "username": updated_activedirectory['username'],
            "password": updated_activedirectory['password'],
            "netBIOS": updated_activedirectory['netBIOS']
        }

        response, error = self.restApi.put(api, data)
        if not error:
            return response
        else:
            self.module.fail_json(msg=response['message'])

    def apply(self):
        """
        Perform pre-checks, call functions and exit
        """
        modify = False
        activeDirectoryId = self.get_activedirectoryId()
        current = self.get_activedirectory(activeDirectoryId)
        cd_action = self.na_helper.get_cd_action(current, self.parameters)

        if current and self.parameters['state'] != 'absent':
            keys_to_check = ['DNS', 'domain', 'username', 'password', 'netBIOS']
            updated_active_directory, modify = self.na_helper.compare_and_update_values(current, self.parameters, keys_to_check)

            if modify is True:
                self.na_helper.changed = True
                if 'domain' in self.parameters and self.parameters['domain'] is not None:
                    ad_exists = self.get_activedirectory(updated_active_directory['domain'])
                    if ad_exists:
                        modify = False
                        self.na_helper.changed = False

        if self.na_helper.changed:
            if self.module.check_mode:
                pass
            else:
                if modify is True:
                    self.update_activedirectory(activeDirectoryId, updated_active_directory)
                elif cd_action == 'create':
                    self.create_activedirectory()
                elif cd_action == 'delete':
                    self.delete_activedirectory()

        self.module.exit_json(changed=self.na_helper.changed)
コード例 #2
0
class NetAppAWSCVS(object):
    '''Class  for  Pool operations '''

    def __init__(self):
        """
        Parse arguments, setup state variables,
        """
        self.argument_spec = netapp_utils.aws_cvs_host_argument_spec()
        self.argument_spec.update(dict(
            state=dict(required=True, choices=['present', 'absent']),
            region=dict(required=True, type='str'),
            name=dict(required=True, type='str'),
            from_name=dict(required=False, type='str'),
            serviceLevel=dict(required=False, choices=['basic', 'standard', 'extreme'], type='str'),
            sizeInBytes=dict(required=False, type='int'),
            vendorID=dict(required=False, type='str'),
        ))
        self.module = AnsibleModule(
            argument_spec=self.argument_spec,
            supports_check_mode=True
        )

        self.na_helper = NetAppModule()
        self.parameters = self.na_helper.set_parameters(self.module.params)
        self.restApi = AwsCvsRestAPI(self.module)
        self.sizeInBytes_min_value = 4000000000000

    def get_aws_netapp_cvs_pool(self, name=None):
        """
        Returns Pool object if exists else Return None
        """
        pool_info = None

        if name is None:
            name = self.parameters['name']

        pools, error = self.restApi.get('Pools')

        if error is None and pools is not None:
            for pool in pools:
                if 'name' in pool and pool['region'] == self.parameters['region']:
                    if pool['name'] == name:
                        pool_info = pool
                        break

        return pool_info

    def create_aws_netapp_cvs_pool(self):
        """
        Create a pool
        """
        api = 'Pools'

        for key in ['serviceLevel', 'sizeInBytes', 'vendorID']:
            if key not in self.parameters.keys() or self.parameters[key] is None:
                self.module.fail_json(changed=False, msg="Mandatory key '%s' required" % (key))

        pool = {
            "name": self.parameters['name'],
            "region": self.parameters['region'],
            "serviceLevel": self.parameters['serviceLevel'],
            "sizeInBytes": self.parameters['sizeInBytes'],
            "vendorID": self.parameters['vendorID']
        }

        response, error = self.restApi.post(api, pool)
        if error is not None:
            self.module.fail_json(changed=False, msg=error)

    def update_aws_netapp_cvs_pool(self, update_pool_info, pool_id):
        """
        Update a pool
        """
        api = 'Pools/' + pool_id

        pool = {
            "name": update_pool_info['name'],
            "region": self.parameters['region'],
            "serviceLevel": update_pool_info['serviceLevel'],
            "sizeInBytes": update_pool_info['sizeInBytes'],
            "vendorID": update_pool_info['vendorID']
        }

        response, error = self.restApi.put(api, pool)
        if error is not None:
            self.module.fail_json(changed=False, msg=error)

    def delete_aws_netapp_cvs_pool(self, pool_id):
        """
        Delete a pool
        """
        api = 'Pools/' + pool_id
        data = None
        response, error = self.restApi.delete(api, data)

        if error is not None:
            self.module.fail_json(changed=False, msg=error)

    def apply(self):
        """
        Perform pre-checks, call functions and exit
        """
        update_required = False
        cd_action = None

        if 'sizeInBytes' in self.parameters.keys() and self.parameters['sizeInBytes'] < self.sizeInBytes_min_value:
            self.module.fail_json(changed=False, msg="sizeInBytes should be greater than  or equal to %d" % (self.sizeInBytes_min_value))

        current = self.get_aws_netapp_cvs_pool()
        if self.parameters.get('from_name'):
            existing = self.get_aws_netapp_cvs_pool(self.parameters['from_name'])
            rename = self.na_helper.is_rename_action(existing, current)
            if rename is None:
                self.module.fail_json(changed=False, msg="unable to rename pool: '%s' does not exist" % self.parameters['from_name'])
            if rename:
                current = existing
        else:
            cd_action = self.na_helper.get_cd_action(current, self.parameters)

        if cd_action is None and self.parameters['state'] == 'present':
            keys_to_check = ['name', 'vendorID', 'sizeInBytes', 'serviceLevel']
            update_pool_info, update_required = self.na_helper.compare_and_update_values(current, self.parameters, keys_to_check)

            if update_required is True:
                self.na_helper.changed = True
                cd_action = 'update'

        if self.na_helper.changed:
            if self.module.check_mode:
                pass
            else:
                if cd_action == 'update':
                    self.update_aws_netapp_cvs_pool(update_pool_info, current['poolId'])
                elif cd_action == 'create':
                    self.create_aws_netapp_cvs_pool()
                elif cd_action == 'delete':
                    self.delete_aws_netapp_cvs_pool(current['poolId'])

        self.module.exit_json(changed=self.na_helper.changed)