|
|
@ -222,6 +222,17 @@ options:
|
|
|
|
- zh_tw.big5 Traditional Chinese Big 5
|
|
|
|
- zh_tw.big5 Traditional Chinese Big 5
|
|
|
|
- To use UTF-8 as the NFS character set, append '.UTF-8' to the language code
|
|
|
|
- To use UTF-8 as the NFS character set, append '.UTF-8' to the language code
|
|
|
|
version_added: '2.8'
|
|
|
|
version_added: '2.8'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qos_policy_group:
|
|
|
|
|
|
|
|
description:
|
|
|
|
|
|
|
|
- Specifies a QoS policy group to be set on volume.
|
|
|
|
|
|
|
|
version_added: '2.9'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qos_adaptive_policy_group:
|
|
|
|
|
|
|
|
description:
|
|
|
|
|
|
|
|
- Specifies a QoS adaptive policy group to be set on volume.
|
|
|
|
|
|
|
|
version_added: '2.9'
|
|
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
EXAMPLES = """
|
|
|
|
EXAMPLES = """
|
|
|
@ -237,6 +248,7 @@ EXAMPLES = """
|
|
|
|
space_guarantee: none
|
|
|
|
space_guarantee: none
|
|
|
|
policy: default
|
|
|
|
policy: default
|
|
|
|
percent_snapshot_space: 60
|
|
|
|
percent_snapshot_space: 60
|
|
|
|
|
|
|
|
qos_policy_group: max_performance_gold
|
|
|
|
vserver: ansibleVServer
|
|
|
|
vserver: ansibleVServer
|
|
|
|
wait_for_completion: True
|
|
|
|
wait_for_completion: True
|
|
|
|
hostname: "{{ netapp_hostname }}"
|
|
|
|
hostname: "{{ netapp_hostname }}"
|
|
|
@ -303,6 +315,24 @@ EXAMPLES = """
|
|
|
|
snapshot_policy: default
|
|
|
|
snapshot_policy: default
|
|
|
|
time_out: 0
|
|
|
|
time_out: 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- name: Create FlexVol with QoS adaptive
|
|
|
|
|
|
|
|
na_ontap_volume:
|
|
|
|
|
|
|
|
state: present
|
|
|
|
|
|
|
|
name: ansibleVolume15
|
|
|
|
|
|
|
|
is_infinite: False
|
|
|
|
|
|
|
|
aggregate_name: ansible_aggr
|
|
|
|
|
|
|
|
size: 100
|
|
|
|
|
|
|
|
size_unit: gb
|
|
|
|
|
|
|
|
space_guarantee: none
|
|
|
|
|
|
|
|
policy: default
|
|
|
|
|
|
|
|
percent_snapshot_space: 10
|
|
|
|
|
|
|
|
qos_adaptive_policy_group: extreme
|
|
|
|
|
|
|
|
vserver: ansibleVServer
|
|
|
|
|
|
|
|
wait_for_completion: True
|
|
|
|
|
|
|
|
hostname: "{{ netapp_hostname }}"
|
|
|
|
|
|
|
|
username: "{{ netapp_username }}"
|
|
|
|
|
|
|
|
password: "{{ netapp_password }}"
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
RETURN = """
|
|
|
|
RETURN = """
|
|
|
@ -371,7 +401,9 @@ class NetAppOntapVolume(object):
|
|
|
|
auto_provision_as=dict(choices=['flexgroup'], required=False, type='str'),
|
|
|
|
auto_provision_as=dict(choices=['flexgroup'], required=False, type='str'),
|
|
|
|
wait_for_completion=dict(required=False, type='bool', default=False),
|
|
|
|
wait_for_completion=dict(required=False, type='bool', default=False),
|
|
|
|
time_out=dict(required=False, type='int', default=180),
|
|
|
|
time_out=dict(required=False, type='int', default=180),
|
|
|
|
language=dict(type='str', required=False)
|
|
|
|
language=dict(type='str', required=False),
|
|
|
|
|
|
|
|
qos_policy_group=dict(required=False, type='str'),
|
|
|
|
|
|
|
|
qos_adaptive_policy_group=dict(required=False, type='str')
|
|
|
|
))
|
|
|
|
))
|
|
|
|
self.module = AnsibleModule(
|
|
|
|
self.module = AnsibleModule(
|
|
|
|
argument_spec=self.argument_spec,
|
|
|
|
argument_spec=self.argument_spec,
|
|
|
@ -482,6 +514,19 @@ class NetAppOntapVolume(object):
|
|
|
|
return_value['atime_update'] = volume_performance_attributes['is-atime-update-enabled']
|
|
|
|
return_value['atime_update'] = volume_performance_attributes['is-atime-update-enabled']
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
return_value['atime_update'] = None
|
|
|
|
return_value['atime_update'] = None
|
|
|
|
|
|
|
|
if volume_attributes.get_child_by_name('volume-qos-attributes'):
|
|
|
|
|
|
|
|
volume_qos_attributes = volume_attributes['volume-qos-attributes']
|
|
|
|
|
|
|
|
if volume_qos_attributes.get_child_by_name('policy-group-name'):
|
|
|
|
|
|
|
|
return_value['qos_policy_group'] = volume_qos_attributes['policy-group-name']
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return_value['qos_policy_group'] = None
|
|
|
|
|
|
|
|
if volume_qos_attributes.get_child_by_name('adaptive-policy-group-name'):
|
|
|
|
|
|
|
|
return_value['qos_adaptive_policy_group'] = volume_qos_attributes['adaptive-policy-group-name']
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return_value['qos_adaptive_policy_group'] = None
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return_value['qos_policy_group'] = None
|
|
|
|
|
|
|
|
return_value['qos_adaptive_policy_group'] = None
|
|
|
|
|
|
|
|
|
|
|
|
return return_value
|
|
|
|
return return_value
|
|
|
|
|
|
|
|
|
|
|
@ -537,6 +582,7 @@ class NetAppOntapVolume(object):
|
|
|
|
self.assign_efficiency_policy_async()
|
|
|
|
self.assign_efficiency_policy_async()
|
|
|
|
|
|
|
|
|
|
|
|
def create_volume_options(self):
|
|
|
|
def create_volume_options(self):
|
|
|
|
|
|
|
|
'''Set volume options for create operation'''
|
|
|
|
options = {}
|
|
|
|
options = {}
|
|
|
|
if self.volume_style == 'flexGroup':
|
|
|
|
if self.volume_style == 'flexGroup':
|
|
|
|
options['volume-name'] = self.parameters['name']
|
|
|
|
options['volume-name'] = self.parameters['name']
|
|
|
@ -574,6 +620,10 @@ class NetAppOntapVolume(object):
|
|
|
|
options['percentage-snapshot-reserve'] = self.parameters['percent_snapshot_space']
|
|
|
|
options['percentage-snapshot-reserve'] = self.parameters['percent_snapshot_space']
|
|
|
|
if self.parameters.get('language'):
|
|
|
|
if self.parameters.get('language'):
|
|
|
|
options['language-code'] = self.parameters['language']
|
|
|
|
options['language-code'] = self.parameters['language']
|
|
|
|
|
|
|
|
if self.parameters.get('qos_policy_group'):
|
|
|
|
|
|
|
|
options['qos-policy-group-name'] = self.parameters['qos_policy_group']
|
|
|
|
|
|
|
|
if self.parameters.get('qos_adaptive_policy_group'):
|
|
|
|
|
|
|
|
options['qos-adaptive-policy-group-name'] = self.parameters['qos_adaptive_policy_group']
|
|
|
|
return options
|
|
|
|
return options
|
|
|
|
|
|
|
|
|
|
|
|
def delete_volume(self):
|
|
|
|
def delete_volume(self):
|
|
|
@ -688,7 +738,8 @@ class NetAppOntapVolume(object):
|
|
|
|
|
|
|
|
|
|
|
|
def volume_modify_attributes(self):
|
|
|
|
def volume_modify_attributes(self):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
modify volume parameter 'policy','unix_permissions','snapshot_policy','space_guarantee','percent_snapshot_space'
|
|
|
|
modify volume parameter 'policy','unix_permissions','snapshot_policy','space_guarantee', 'percent_snapshot_space',
|
|
|
|
|
|
|
|
'qos_policy_group', 'qos_adaptive_policy_group'
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
# TODO: refactor this method
|
|
|
|
# TODO: refactor this method
|
|
|
|
vol_mod_iter = None
|
|
|
|
vol_mod_iter = None
|
|
|
@ -731,6 +782,13 @@ class NetAppOntapVolume(object):
|
|
|
|
vol_performance_attributes = netapp_utils.zapi.NaElement('volume-performance-attributes')
|
|
|
|
vol_performance_attributes = netapp_utils.zapi.NaElement('volume-performance-attributes')
|
|
|
|
vol_performance_attributes.add_new_child('is-atime-update-enabled', self.parameters.get('atime_update'))
|
|
|
|
vol_performance_attributes.add_new_child('is-atime-update-enabled', self.parameters.get('atime_update'))
|
|
|
|
vol_mod_attributes.add_child_elem(vol_performance_attributes)
|
|
|
|
vol_mod_attributes.add_child_elem(vol_performance_attributes)
|
|
|
|
|
|
|
|
if self.parameters.get('qos_policy_group') or self.parameters.get('qos_adaptive_policy_group'):
|
|
|
|
|
|
|
|
vol_qos_attributes = netapp_utils.zapi.NaElement('volumes-qos-attributes')
|
|
|
|
|
|
|
|
if self.parameters.get('qos_policy_group'):
|
|
|
|
|
|
|
|
vol_qos_attributes.add_new_child('policy-group-name', self.parameters['qos_policy_group'])
|
|
|
|
|
|
|
|
if self.parameters.get('qos_adaptive_policy_group'):
|
|
|
|
|
|
|
|
vol_qos_attributes.add_new_child('adaptive-policy-group-name', self.parameters['qos_adaptive_policy_group'])
|
|
|
|
|
|
|
|
vol_mod_attributes.add_child_elem(vol_qos_attributes)
|
|
|
|
attributes.add_child_elem(vol_mod_attributes)
|
|
|
|
attributes.add_child_elem(vol_mod_attributes)
|
|
|
|
query = netapp_utils.zapi.NaElement('query')
|
|
|
|
query = netapp_utils.zapi.NaElement('query')
|
|
|
|
vol_query_attributes = netapp_utils.zapi.NaElement('volume-attributes')
|
|
|
|
vol_query_attributes = netapp_utils.zapi.NaElement('volume-attributes')
|
|
|
@ -809,6 +867,7 @@ class NetAppOntapVolume(object):
|
|
|
|
% (self.parameters['name'], to_native(error)), exception=traceback.format_exc())
|
|
|
|
% (self.parameters['name'], to_native(error)), exception=traceback.format_exc())
|
|
|
|
|
|
|
|
|
|
|
|
def modify_volume(self, modify):
|
|
|
|
def modify_volume(self, modify):
|
|
|
|
|
|
|
|
'''Modify volume action'''
|
|
|
|
for attribute in modify.keys():
|
|
|
|
for attribute in modify.keys():
|
|
|
|
if attribute == 'size':
|
|
|
|
if attribute == 'size':
|
|
|
|
self.resize_volume()
|
|
|
|
self.resize_volume()
|
|
|
@ -816,8 +875,8 @@ class NetAppOntapVolume(object):
|
|
|
|
self.change_volume_state()
|
|
|
|
self.change_volume_state()
|
|
|
|
if attribute == 'aggregate_name':
|
|
|
|
if attribute == 'aggregate_name':
|
|
|
|
self.move_volume()
|
|
|
|
self.move_volume()
|
|
|
|
if attribute in ['space_guarantee', 'policy', 'unix_permissions',
|
|
|
|
if attribute in ['space_guarantee', 'policy', 'unix_permissions', 'snapshot_policy', 'percent_snapshot_space',
|
|
|
|
'snapshot_policy', 'percent_snapshot_space', 'snapdir_access', 'atime_update']:
|
|
|
|
'snapdir_access', 'atime_update', 'qos_policy_group', 'qos_adaptive_policy_group']:
|
|
|
|
self.volume_modify_attributes()
|
|
|
|
self.volume_modify_attributes()
|
|
|
|
if attribute == 'junction_path':
|
|
|
|
if attribute == 'junction_path':
|
|
|
|
if modify.get('junction_path') == '':
|
|
|
|
if modify.get('junction_path') == '':
|
|
|
@ -865,6 +924,7 @@ class NetAppOntapVolume(object):
|
|
|
|
return total
|
|
|
|
return total
|
|
|
|
|
|
|
|
|
|
|
|
def get_volume_style(self, current):
|
|
|
|
def get_volume_style(self, current):
|
|
|
|
|
|
|
|
'''Get volume style, infinite or standard flexvol'''
|
|
|
|
if current is None:
|
|
|
|
if current is None:
|
|
|
|
if self.parameters.get('aggr_list') or self.parameters.get('aggr_list_multiplier') or self.parameters.get('auto_provision_as'):
|
|
|
|
if self.parameters.get('aggr_list') or self.parameters.get('aggr_list_multiplier') or self.parameters.get('auto_provision_as'):
|
|
|
|
return 'flexGroup'
|
|
|
|
return 'flexGroup'
|
|
|
@ -965,6 +1025,7 @@ class NetAppOntapVolume(object):
|
|
|
|
self.module.fail_json(msg='Operation failed when %s volume.' % action)
|
|
|
|
self.module.fail_json(msg='Operation failed when %s volume.' % action)
|
|
|
|
|
|
|
|
|
|
|
|
def assign_efficiency_policy(self):
|
|
|
|
def assign_efficiency_policy(self):
|
|
|
|
|
|
|
|
'''Set efficiency policy'''
|
|
|
|
options = {'path': '/vol/' + self.parameters['name']}
|
|
|
|
options = {'path': '/vol/' + self.parameters['name']}
|
|
|
|
efficiency_enable = netapp_utils.zapi.NaElement.create_node_with_children('sis-enable', **options)
|
|
|
|
efficiency_enable = netapp_utils.zapi.NaElement.create_node_with_children('sis-enable', **options)
|
|
|
|
try:
|
|
|
|
try:
|
|
|
@ -984,6 +1045,7 @@ class NetAppOntapVolume(object):
|
|
|
|
exception=traceback.format_exc())
|
|
|
|
exception=traceback.format_exc())
|
|
|
|
|
|
|
|
|
|
|
|
def assign_efficiency_policy_async(self):
|
|
|
|
def assign_efficiency_policy_async(self):
|
|
|
|
|
|
|
|
'''Set efficiency policy in asynchronous mode'''
|
|
|
|
options = {'volume-name': self.parameters['name']}
|
|
|
|
options = {'volume-name': self.parameters['name']}
|
|
|
|
efficiency_enable = netapp_utils.zapi.NaElement.create_node_with_children('sis-enable-async', **options)
|
|
|
|
efficiency_enable = netapp_utils.zapi.NaElement.create_node_with_children('sis-enable-async', **options)
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|