summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/storage/netapp/na_ontap_volume_autosize.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules/storage/netapp/na_ontap_volume_autosize.py')
-rw-r--r--lib/ansible/modules/storage/netapp/na_ontap_volume_autosize.py361
1 files changed, 0 insertions, 361 deletions
diff --git a/lib/ansible/modules/storage/netapp/na_ontap_volume_autosize.py b/lib/ansible/modules/storage/netapp/na_ontap_volume_autosize.py
deleted file mode 100644
index b0adab1c47..0000000000
--- a/lib/ansible/modules/storage/netapp/na_ontap_volume_autosize.py
+++ /dev/null
@@ -1,361 +0,0 @@
-#!/usr/bin/python
-
-# (c) 2019, NetApp, Inc
-# GNU General Public License v3.0+
-# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
-
-from __future__ import absolute_import, division, print_function
-__metaclass__ = type
-
-ANSIBLE_METADATA = {'metadata_version': '1.1',
- 'status': ['preview'],
- 'supported_by': 'community'}
-
-DOCUMENTATION = '''
-module: na_ontap_volume_autosize
-short_description: NetApp ONTAP manage volume autosize
-extends_documentation_fragment:
- - netapp.na_ontap
-version_added: '2.9'
-author: NetApp Ansible Team (@carchi8py) <ng-ansibleteam@netapp.com>
-description:
-- Modify Volume AutoSize
-options:
- volume:
- description:
- - The name of the flexible volume for which we want to set autosize.
- type: str
- required: true
-
- mode:
- description:
- - Specify the flexible volume's autosize mode of operation.
- type: str
- choices: ['grow', 'grow_shrink', 'off']
-
- vserver:
- description:
- - Name of the vserver to use.
- required: true
- type: str
-
- grow_threshold_percent:
- description:
- - Specifies the percentage of the flexible volume's capacity at which autogrow is initiated.
- - The default grow threshold varies from 85% to 98%, depending on the volume size.
- - It is an error for the grow threshold to be less than or equal to the shrink threshold.
- - Range between 0 and 100
- type: int
-
- increment_size:
- description:
- - Specify the flexible volume's increment size using the following format < number > [k|m|g|t]
- - The amount is the absolute size to set.
- - The trailing 'k', 'm', 'g', and 't' indicates the desired units, namely 'kilobytes', 'megabytes', 'gigabytes', and 'terabytes' (respectively).
- type: str
-
- maximum_size:
- description:
- - Specify the flexible volume's maximum allowed size using the following format < number > [k|m|g|t]
- - The amount is the absolute size to set.
- - The trailing 'k', 'm', 'g', and 't' indicates the desired units, namely 'kilobytes', 'megabytes', 'gigabytes', and 'terabytes' (respectively).
- - The default value is 20% greater than the volume size at the time autosize was enabled.
- - It is an error for the maximum volume size to be less than the current volume size.
- - It is also an error for the maximum size to be less than or equal to the minimum size.
- type: str
-
- minimum_size:
- description:
- - Specify the flexible volume's minimum allowed size using the following format < number > [k|m|g|t] The amount is the absolute size to set.
- - The trailing 'k', 'm', 'g', and 't' indicates the desired units, namely 'kilobytes', 'megabytes', 'gigabytes', and 'terabytes' (respectively).
- - The default value is the size of the volume at the time the 'grow_shrink' mode was enabled.
- - It is an error for the minimum size to be greater than or equal to the maximum size.
- type: str
-
- reset:
- description:
- - "Sets the values of maximum_size, increment_size, minimum_size, grow_threshold_percent, shrink_threshold_percent and mode to their defaults"
- type: bool
-
- shrink_threshold_percent:
- description:
- - Specifies the percentage of the flexible volume's capacity at which autoshrink is initiated.
- - The default shrink threshold is 50%. It is an error for the shrink threshold to be greater than or equal to the grow threshold.
- - Range between 0 and 100
- type: int
-'''
-
-EXAMPLES = """
- - name: Modify volume autosize
- na_ontap_volume_autosize:
- hostname: 10.193.79.189
- username: admin
- password: netapp1!
- volume: ansibleVolumesize12
- mode: grow
- grow_threshold_percent: 99
- increment_size: 50m
- maximum_size: 10g
- minimum_size: 21m
- shrink_threshold_percent: 40
- vserver: ansible_vserver
-
- - name: Reset volume autosize
- na_ontap_volume_autosize:
- hostname: 10.193.79.189
- username: admin
- password: netapp1!
- volume: ansibleVolumesize12
- reset: true
- vserver: ansible_vserver
-"""
-
-RETURN = """
-"""
-import sys
-import copy
-import traceback
-import ansible.module_utils.netapp as netapp_utils
-from ansible.module_utils.netapp_module import NetAppModule
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils.netapp import OntapRestAPI
-from ansible.module_utils._text import to_native
-
-HAS_NETAPP_LIB = netapp_utils.has_netapp_lib()
-
-
-class NetAppOntapVolumeAutosize(object):
- def __init__(self):
- self.use_rest = False
- # Volume_autosize returns KB and not B like Volume so values are shifted down 1
- self._size_unit_map = dict(
- k=1,
- m=1024,
- g=1024 ** 2,
- t=1024 ** 3,
- )
- self.argument_spec = netapp_utils.na_ontap_host_argument_spec()
- self.argument_spec.update(dict(
- volume=dict(required=True, type="str"),
- mode=dict(required=False, choices=['grow', 'grow_shrink', 'off']),
- vserver=dict(required=True, type='str'),
- grow_threshold_percent=dict(required=False, type='int'),
- increment_size=dict(required=False, type='str'),
- maximum_size=dict(required=False, type='str'),
- minimum_size=dict(required=False, type='str'),
- reset=dict(required=False, type='bool'),
- shrink_threshold_percent=dict(required=False, type='int')
- ))
- self.module = AnsibleModule(
- argument_spec=self.argument_spec,
- supports_check_mode=True,
- mutually_exclusive=[
- ['reset', 'maximum_size'],
- ['reset', 'increment_size'],
- ['reset', 'minimum_size'],
- ['reset', 'grow_threshold_percent'],
- ['reset', 'shrink_threshold_percent'],
- ['reset', 'mode']
- ]
- )
- self.na_helper = NetAppModule()
- self.parameters = self.na_helper.set_parameters(self.module.params)
- # API should be used for ONTAP 9.6 or higher, ZAPI for lower version
- self.restApi = OntapRestAPI(self.module)
- if self.restApi.is_rest():
- self.use_rest = True
- # increment size and reset are not supported with rest api
- if self.parameters.get('increment_size'):
- self.module.fail_json(msg="Rest API does not support increment size, please switch to ZAPI")
- if self.parameters.get('reset'):
- self.module.fail_json(msg="Rest API does not support reset, please switch to ZAPI")
- else:
- if HAS_NETAPP_LIB is False:
- self.module.fail_json(msg="the python NetApp-Lib module is required")
- else:
- self.server = netapp_utils.setup_na_ontap_zapi(module=self.module, vserver=self.parameters['vserver'])
-
- def get_volume_autosize(self, uuid=None):
- """
- Get volume_autosize information from the ONTAP system
- :return:
- """
- if self.use_rest:
- params = {'fields': 'autosize'}
- api = 'storage/volumes/' + uuid
- message, error = self.restApi.get(api, params)
- if error is not None:
- self.module.fail_json(msg="%s" % error)
- return self._create_get_volume_return(message['autosize'])
- else:
- volume_autosize_info = netapp_utils.zapi.NaElement('volume-autosize-get')
- volume_autosize_info.add_new_child('volume', self.parameters['volume'])
- try:
- result = self.server.invoke_successfully(volume_autosize_info, True)
- except netapp_utils.zapi.NaApiError as error:
- self.module.fail_json(msg='Error fetching volume autosize infor for %s : %s' % (self.parameters['volume'],
- to_native(error)),
- exception=traceback.format_exc())
- return self._create_get_volume_return(result)
-
- def _create_get_volume_return(self, results):
- """
- Create a return value from volume-autosize-get info file
- :param results:
- :return:
- """
- return_value = {}
- if self.use_rest:
- if 'mode' in results:
- return_value['mode'] = results['mode']
- if 'grow_threshold' in results:
- return_value['grow_threshold_percent'] = results['grow_threshold']
- if 'maximum' in results:
- return_value['maximum_size'] = results['maximum']
- if 'minimum' in results:
- return_value['minimum_size'] = results['minimum']
- if 'shrink_threshold' in results:
- return_value['shrink_threshold_percent'] = results['shrink_threshold']
- else:
- if results.get_child_by_name('mode'):
- return_value['mode'] = results.get_child_content('mode')
- if results.get_child_by_name('grow-threshold-percent'):
- return_value['grow_threshold_percent'] = int(results.get_child_content('grow-threshold-percent'))
- if results.get_child_by_name('increment-size'):
- return_value['increment_size'] = results.get_child_content('increment-size')
- if results.get_child_by_name('maximum-size'):
- return_value['maximum_size'] = results.get_child_content('maximum-size')
- if results.get_child_by_name('minimum-size'):
- return_value['minimum_size'] = results.get_child_content('minimum-size')
- if results.get_child_by_name('shrink-threshold-percent'):
- return_value['shrink_threshold_percent'] = int(results.get_child_content('shrink-threshold-percent'))
- if return_value == {}:
- return_value = None
- return return_value
-
- def modify_volume_autosize(self, uuid=None):
- """
- Modify a Volumes autosize
- :return:
- """
- if self.use_rest:
- params = {}
- data = {}
- autosize = {}
- if self.parameters.get('mode'):
- autosize['mode'] = self.parameters['mode']
- if self.parameters.get('grow_threshold_percent'):
- autosize['grow_threshold'] = self.parameters['grow_threshold_percent']
- if self.parameters.get('maximum_size'):
- autosize['maximum'] = self.parameters['maximum_size']
- if self.parameters.get('minimum_size'):
- autosize['minimum'] = self.parameters['minimum_size']
- if self.parameters.get('shrink_threshold_percent'):
- autosize['shrink_threshold'] = self.parameters['shrink_threshold_percent']
- data['autosize'] = autosize
- api = "storage/volumes/" + uuid
- message, error = self.restApi.patch(api, data, params)
- if error is not None:
- self.module.fail_json(msg="%s" % error)
-
- else:
- volume_autosize_info = netapp_utils.zapi.NaElement('volume-autosize-set')
- volume_autosize_info.add_new_child('volume', self.parameters['volume'])
- if self.parameters.get('mode'):
- volume_autosize_info.add_new_child('mode', self.parameters['mode'])
- if self.parameters.get('grow_threshold_percent'):
- volume_autosize_info.add_new_child('grow-threshold-percent', str(self.parameters['grow_threshold_percent']))
- if self.parameters.get('increment_size'):
- volume_autosize_info.add_new_child('increment-size', self.parameters['increment_size'])
- if self.parameters.get('reset') is not None:
- volume_autosize_info.add_new_child('reset', str(self.parameters['reset']))
- if self.parameters.get('maximum_size'):
- volume_autosize_info.add_new_child('maximum-size', self.parameters['maximum_size'])
- if self.parameters.get('minimum_size'):
- volume_autosize_info.add_new_child('minimum-size', self.parameters['minimum_size'])
- if self.parameters.get('shrink_threshold_percent'):
- volume_autosize_info.add_new_child('shrink-threshold-percent', str(self.parameters['shrink_threshold_percent']))
- try:
- self.server.invoke_successfully(volume_autosize_info, True)
- except netapp_utils.zapi.NaApiError as error:
- self.module.fail_json(msg="Error modify volume autosize for %s: %s" % (self.parameters["volume"], to_native(error)),
- exception=traceback.format_exc())
-
- def modify_to_kb(self, converted_parameters):
- """
- Save a converted parameter
- :param converted_parameters: Dic of all parameters
- :return:
- """
- for attr in ['maximum_size', 'minimum_size', 'increment_size']:
- if converted_parameters.get(attr):
- if self.use_rest:
- converted_parameters[attr] = self.convert_to_byte(attr, converted_parameters)
- else:
- converted_parameters[attr] = str(self.convert_to_kb(attr, converted_parameters))
- return converted_parameters
-
- def convert_to_kb(self, variable, converted_parameters):
- """
- Convert a number 10m in to its correct KB size
- :param variable: the Parameter we are going to covert
- :param converted_parameters: Dic of all parameters
- :return:
- """
- if converted_parameters.get(variable)[-1] not in ['k', 'm', 'g', 't']:
- self.module.fail_json(msg="%s must end with a k, m, g or t" % variable)
- return self._size_unit_map[converted_parameters.get(variable)[-1]] * int(converted_parameters.get(variable)[:-1])
-
- def convert_to_byte(self, variable, converted_parameters):
- if converted_parameters.get(variable)[-1] not in ['k', 'm', 'g', 't']:
- self.module.fail_json(msg="%s must end with a k, m, g or t" % variable)
- return (self._size_unit_map[converted_parameters.get(variable)[-1]] * int(converted_parameters.get(variable)[:-1])) * 1024
-
- def get_volume_uuid(self):
- """
- Get a volume's UUID
- :return: uuid of the volume
- """
- params = {'fields': '*',
- 'name': self.parameters['volume'],
- 'svm.name': self.parameters['vserver']}
- api = "storage/volumes"
- message, error = self.restApi.get(api, params)
- if error is not None:
- self.module.fail_json(msg="%s" % error)
- return message['records'][0]['uuid']
-
- def apply(self):
- # TODO Logging for rest
- uuid = None
- if not self.use_rest:
- netapp_utils.ems_log_event("na_ontap_volume_autosize", self.server)
- if self.use_rest:
- # we only have the volume name, we need to the uuid for the volume
- uuid = self.get_volume_uuid()
- current = self.get_volume_autosize(uuid=uuid)
- converted_parameters = copy.deepcopy(self.parameters)
- converted_parameters = self.modify_to_kb(converted_parameters)
- self.na_helper.get_modified_attributes(current, converted_parameters)
- if self.na_helper.changed:
- if self.module.check_mode:
- pass
- else:
- self.modify_volume_autosize(uuid=uuid)
- if self.parameters.get('reset') is True:
- self.modify_volume_autosize(uuid=uuid)
- self.na_helper.changed = True
- self.module.exit_json(changed=self.na_helper.changed)
-
-
-def main():
- """
- Apply volume autosize operations from playbook
- :return:
- """
- obj = NetAppOntapVolumeAutosize()
- obj.apply()
-
-
-if __name__ == '__main__':
- main()