Exemple #1
0
def get_volume(rest_api, vserver, name):
    api = 'storage/volumes/'
    query = dict(name=name)
    query['svm.name'] = vserver
    response, error = rest_api.get(api, query)
    volume, error = rrh.check_for_0_or_1_records(api, response, error, query)
    return volume, error
Exemple #2
0
 def get_igroup_rest(self, name):
     api = "protocols/san/igroups"
     fields = 'name,uuid,svm,initiators,os_type,protocol'
     if self.rest_api.meets_rest_minimum_version(self.use_rest, 9, 9):
         fields += ',igroups'
     query = dict(name=name, fields=fields)
     query['svm.name'] = self.parameters['vserver']
     response, error = self.rest_api.get(api, query)
     igroup, error = rrh.check_for_0_or_1_records(api, response, error)
     self.fail_on_error(error)
     if igroup:
         try:
             igroup_details = dict(
                 name=igroup['name'],
                 uuid=igroup['uuid'],
                 vserver=igroup['svm']['name'],
                 os_type=igroup['os_type'],
                 initiator_group_type=igroup['protocol'],
                 name_to_uuid=dict()
             )
         except KeyError as exc:
             self.module.fail_json(msg='Error: unexpected igroup body: %s, KeyError on %s' % (str(igroup), str(exc)))
         igroup_details['name_to_key'] = dict()
         for attr in ('igroups', 'initiators'):
             if attr in igroup:
                 igroup_details[attr] = [item['name'] for item in igroup[attr]]
                 # for initiators, there is no uuid, so we're using name as the key
                 igroup_details['name_to_uuid'][attr] = dict((item['name'], item.get('uuid', item['name'])) for item in igroup[attr])
             else:
                 igroup_details[attr] = []
                 igroup_details['name_to_uuid'][attr] = dict()
         return igroup_details
     return None
Exemple #3
0
 def _set_application_uuid(self):
     """Use REST application/applications to get application uuid"""
     api = '/application/applications'
     query = {'return_timeout': 30, 'return_records': 'true', 'svm.name': self.svm_name, 'name': self.app_name}
     response, error = self.rest_api.get(api, query)
     record, error = rrh.check_for_0_or_1_records(api, response, error, query)
     if error is None and record is not None:
         self.app_uuid = record['uuid']
     return None, error
Exemple #4
0
def get_flexcache(rest_api, vserver, name, fields=None):
    api = 'storage/flexcache/flexcaches'
    query = dict(name=name)
    query['svm.name'] = vserver
    if fields is not None:
        query['fields'] = fields
    response, error = rest_api.get(api, query)
    flexcache, error = rrh.check_for_0_or_1_records(api, response, error,
                                                    query)
    return flexcache, error
Exemple #5
0
 def get_application_component_uuid(self):
     """Use REST application/applications to get component uuid
        Assume a single component per application
     """
     self.fail_if_no_uuid()
     response, error = self.get_application_components()
     record, error = rrh.check_for_0_or_1_records(None, response, error,
                                                  None)
     if error is None and record is not None:
         return record['uuid'], None
     return None, error
Exemple #6
0
    def get_storage_failover(self):
        """
        get the storage failover for a given node
        :return: dict of is-enabled: true if enabled is true None if not
        """

        if self.use_rest:
            return_value = None
            api = "cluster/nodes"
            query = {
                'fields': 'uuid,ha.enabled',
                'name': self.parameters['node_name']
            }
            message, error = self.rest_api.get(api, query)
            records, error = rrh.check_for_0_or_1_records(api, message, error)

            if error is None and records is not None:
                return_value = {
                    'uuid': message['records'][0]['uuid'],
                    'is_enabled': message['records'][0]['ha']['enabled']
                }

            if error:
                self.module.fail_json(msg=error)

            if not records:
                error = "REST API did not return failover details for node %s" % (self.parameters['node_name'])
                self.module.fail_json(msg=error)

            return return_value

        else:
            storage_failover_get_iter = netapp_utils.zapi.NaElement('cf-status')
            storage_failover_get_iter.add_new_child('node', self.parameters['node_name'])

            try:
                result = self.server.invoke_successfully(storage_failover_get_iter, True)
                return_value = {'is_enabled': self.na_helper.get_value_for_bool(True, result.get_child_content('is-enabled'))}

            except netapp_utils.zapi.NaApiError as error:
                self.module.fail_json(msg='Error getting storage failover info for node %s: %s' % (
                    self.parameters['node_name'], to_native(error)), exception=traceback.format_exc())

            return return_value
Exemple #7
0
 def get_igroup_rest(self, name):
     api = "protocols/san/igroups"
     query = dict(name=name, fields='name,uuid,svm,initiators,os_type,protocol')
     query['svm.name'] = self.parameters['vserver']
     response, error = self.rest_api.get(api, query)
     igroup, error = rrh.check_for_0_or_1_records(api, response, error)
     self.fail_on_error(error)
     if igroup:
         try:
             igroup_details = dict(
                 name=igroup['name'],
                 uuid=igroup['uuid'],
                 vserver=igroup['svm']['name'],
                 os_type=igroup['os_type'],
                 initiator_group_type=igroup['protocol'],
             )
         except KeyError as exc:
             self.module.fail_json(msg='Error: unexpected igroup body: %s, KeyError on %s' % (str(igroup), str(exc)))
         if 'initiators' in igroup:
             igroup_details['initiators'] = [item['name'] for item in igroup['initiators']]
         else:
             igroup_details['initiators'] = []
         return igroup_details
     return None
    def get_storage_auto_giveback(self):
        """
        get the storage failover giveback options for a given node
        :return: dict for options
        """
        return_value = None

        if self.use_rest:

            api = "private/cli/storage/failover"
            query = {
                'fields': 'node,auto_giveback,auto_giveback_after_panic',
                'node': self.parameters['name'],
            }
            message, error = self.rest_api.get(api, query)
            records, error = rrh.check_for_0_or_1_records(api, message, error)

            if error is None and records is not None:
                return_value = {
                    'name':
                    message['records'][0]['node'],
                    'auto_giveback_enabled':
                    message['records'][0]['auto_giveback'],
                    'auto_giveback_after_panic_enabled':
                    message['records'][0]['auto_giveback_after_panic']
                }

            if error:
                self.module.fail_json(msg=error)

            if not records:
                error = "REST API did not return failover options for node %s" % (
                    self.parameters['name'])
                self.module.fail_json(msg=error)

        else:

            storage_auto_giveback_get_iter = netapp_utils.zapi.NaElement(
                'cf-get-iter')

            try:
                result = self.server.invoke_successfully(
                    storage_auto_giveback_get_iter, True)

            except netapp_utils.zapi.NaApiError as error:
                self.module.fail_json(
                    msg='Error getting auto giveback info for node %s: %s' %
                    (self.parameters['name'], to_native(error)),
                    exception=traceback.format_exc())

            if result.get_child_by_name('attributes-list'):
                attributes_list = result.get_child_by_name('attributes-list')
                for storage_failover_info_attributes in attributes_list.get_children(
                ):

                    sfo_node_info = storage_failover_info_attributes.get_child_by_name(
                        'sfo-node-info')
                    node_related_info = sfo_node_info.get_child_by_name(
                        'node-related-info')

                    if node_related_info.get_child_content(
                            'node') == self.parameters['name']:

                        sfo_options_info = storage_failover_info_attributes.get_child_by_name(
                            'sfo-options-info')
                        options_related_info = sfo_options_info.get_child_by_name(
                            'options-related-info')
                        sfo_giveback_options_info = options_related_info.get_child_by_name(
                            'sfo-giveback-options-info')
                        giveback_options = sfo_giveback_options_info.get_child_by_name(
                            'giveback-options')

                        return_value = {
                            'name':
                            node_related_info.get_child_content('node'),
                            'auto_giveback_enabled':
                            self.na_helper.get_value_for_bool(
                                True,
                                options_related_info.get_child_content(
                                    'auto-giveback-enabled')),
                            'auto_giveback_after_panic_enabled':
                            self.na_helper.get_value_for_bool(
                                True,
                                giveback_options.get_child_content(
                                    'auto-giveback-after-panic-enabled')),
                        }
                        break

        return return_value