Fix idempotency issue when updating host object in FlashArray (#55347)

This commit is contained in:
Simon Dodsley 2019-06-08 20:11:10 +02:00 committed by ansibot
parent c50a75a41e
commit 30c9322e99

View file

@ -68,7 +68,7 @@ options:
personality:
type: str
description:
- Define which operating system the host is. Recommend for
- Define which operating system the host is. Recommended for
ActiveCluster integration.
default: ''
choices: ['hpux', 'vms', 'aix', 'esxi', 'solaris', 'hitachi-vsp', 'oracle-vm-server', 'delete', '']
@ -186,29 +186,41 @@ def _set_host_initiators(module, array):
module.fail_json(msg='Setting of FC WWNs failed.')
def _update_host_initiators(module, array):
def _update_host_initiators(module, array, answer=False):
"""Change host initiator if iscsi or nvme or add new FC WWNs"""
if module.params['protocol'] in ['nvme', 'mixed']:
if module.params['nqn']:
try:
array.set_host(module.params['host'],
nqnlist=module.params['nqn'])
except Exception:
module.fail_json(msg='Change of NVMe NQN failed.')
current_nqn = array.get_host(module.params['host'])['nqn']
if current_nqn != module.params['nqn']:
try:
array.set_host(module.params['host'],
nqnlist=module.params['nqn'])
answer = True
except Exception:
module.fail_json(msg='Change of NVMe NQN failed.')
if module.params['protocol'] in ['iscsi', 'mixed']:
if module.params['iqn']:
try:
array.set_host(module.params['host'],
iqnlist=module.params['iqn'])
except Exception:
module.fail_json(msg='Change of iSCSI IQN failed.')
current_iqn = array.get_host(module.params['host'])['iqn']
if current_iqn != module.params['iqn']:
try:
array.set_host(module.params['host'],
iqnlist=module.params['iqn'])
answer = True
except Exception:
module.fail_json(msg='Change of iSCSI IQN failed.')
if module.params['protocol'] in ['fc', 'mixed']:
if module.params['wwns']:
try:
array.set_host(module.params['host'],
addwwnlist=module.params['wwns'])
except Exception:
module.fail_json(msg='FC WWN additiona failed.')
module.params['wwns'] = [wwn.replace(':', '') for wwn in module.params['wwns']]
module.params['wwns'] = [wwn.upper() for wwn in module.params['wwns']]
current_wwn = array.get_host(module.params['host'])['wwn']
if current_wwn != module.params['wwns']:
try:
array.set_host(module.params['host'],
wwnlist=module.params['wwns'])
answer = True
except Exception:
module.fail_json(msg='FC WWN change failed.')
return answer
def _connect_new_volume(module, array, answer=False):
@ -241,17 +253,26 @@ def _update_host_personality(module, array, answer=False):
"""Change host personality. Only called when supported"""
personality = array.get_host(module.params['host'], personality=True)['personality']
if personality is None and module.params['personality'] != 'delete':
array.set_host(module.params['host'],
personality=module.params['personality'])
answer = True
if personality is not None:
if module.params['personality'] == 'delete':
array.set_host(module.params['host'], personality='')
answer = True
elif personality != module.params['personality']:
try:
array.set_host(module.params['host'],
personality=module.params['personality'])
answer = True
except Exception:
module.fail_json(msg='Personality setting failed.')
if personality is not None:
if module.params['personality'] == 'delete':
try:
array.set_host(module.params['host'], personality='')
answer = True
except Exception:
module.fail_json(msg='Personality deletion failed.')
elif personality != module.params['personality']:
try:
array.set_host(module.params['host'],
personality=module.params['personality'])
answer = True
except Exception:
module.fail_json(msg='Personality change failed.')
return answer
@ -291,9 +312,8 @@ def make_host(module, array):
def update_host(module, array):
changed = False
volumes = array.list_host_connections(module.params['host'])
if module.params['iqn'] or module.params['wwns']:
_update_host_initiators(module, array)
changed = True
if module.params['iqn'] or module.params['wwns'] or module.params['nqn']:
changed = _update_host_initiators(module, array)
if module.params['volume']:
current_vols = [vol['vol'] for vol in volumes]
if not module.params['volume'] in current_vols: