Skip to content

Commit

Permalink
Merge pull request #46 from trisha-dell/ANSBLTRID-1662-victory_update
Browse files Browse the repository at this point in the history
Adding support for PowerStore 4.0.0.0
  • Loading branch information
Jennifer-John authored Apr 23, 2024
2 parents f412ac1 + fe9c95d commit cc538e0
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 38 deletions.
3 changes: 2 additions & 1 deletion codecov.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
---
fixes:
- "/ansible_collections/dellemc/powerstore/::"
- "/ansible_collections/dellemc/powerstore/::"
2 changes: 2 additions & 0 deletions plugins/modules/security_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
- Modification of protocol mode is only supported for PowerStore v2.0.0.0 and
above.
- The I(check_mode) is not supported.
- Only C(TLSv1_1) is supported for I(protocol_mode) for PowerStore v3.0.0.0 and
above.
'''

EXAMPLES = r'''
Expand Down
52 changes: 28 additions & 24 deletions plugins/modules/volume.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@
- If volume in metro session, volume can only be modified, refreshed and
restored when session is in the pause state.
- The I(Check_mode) is not supported.
- I(performance_policy) and I(host_group) details are not in the return values for
PowerStore 4.0.0.0.
'''

EXAMPLES = r'''
Expand Down Expand Up @@ -842,27 +844,27 @@ def map_unmap_volume_to_host(self, vol, host, mapping_state):
self.module.fail_json(msg=error_msg, **utils.failure_codes(e))
return False

def map_unmap_volume_to_hostgroup(self, vol, hostgroup, mapping_state):
def map_unmap_volume_to_hostgroup(self, vol, hostgroup_details, mapping_state):
host_group_identifier = self.module.params['hostgroup']
current_hostgroups = vol['host_group']
current_hostgroup_ids = []
for hostgroup_t in current_hostgroups:
current_hostgroup_ids.append(hostgroup_t['id'])

if mapping_state == 'mapped' and hostgroup in current_hostgroup_ids:
LOG.info('Volume %s is already mapped to hostgroup %s',
vol['name'], host_group_identifier)
return False
current_volumes = hostgroup_details['mapped_host_groups']
current_volume_ids = []
for volume in range(len(current_volumes)):
current_volume_ids.append(hostgroup_details['mapped_host_groups'][volume]['volume_id'])

if hostgroup_details['mapped_host_groups'] != []:
if mapping_state == 'mapped' and vol['id'] in current_volume_ids:
LOG.info('Volume %s is already mapped to hostgroup %s',
vol['name'], host_group_identifier)
return False

if mapping_state == 'mapped' and hostgroup not in\
current_hostgroup_ids:
if mapping_state == 'mapped' and vol['id'] not in current_volume_ids:
hlu = self.module.params['hlu']
LOG.info('Mapping volume %s to hostgroup %s with HLU %s',
vol['name'], host_group_identifier, hlu)
try:
self.provisioning.map_volume_to_host_group(
volume_id=vol['id'],
host_group_id=hostgroup,
host_group_id=hostgroup_details['id'],
logical_unit_number=hlu)
return True
except Exception as e:
Expand All @@ -873,18 +875,17 @@ def map_unmap_volume_to_hostgroup(self, vol, hostgroup, mapping_state):
LOG.error(error_msg)
self.module.fail_json(msg=error_msg, **utils.failure_codes(e))

if mapping_state == 'unmapped' and hostgroup not in\
current_hostgroup_ids:
if mapping_state == 'unmapped' and vol['id'] not in current_volume_ids:
LOG.info('Volume %s is not mapped to hostgroup %s', vol['name'],
host_group_identifier)
return False

if mapping_state == 'unmapped' and hostgroup in current_hostgroup_ids:
if mapping_state == 'unmapped' and vol['id'] in current_volume_ids:
LOG.info('Unmapping volume %s from hostgroup %s', vol['name'],
host_group_identifier)
try:
self.provisioning.unmap_volume_from_host_group(
volume_id=vol['id'], host_group_id=hostgroup)
volume_id=vol['id'], host_group_id=hostgroup_details['id'])
return True
except Exception as e:
error_msg = (
Expand Down Expand Up @@ -926,7 +927,7 @@ def validate_clone_details(self, clone_details):
if clone_details['host'] is not None:
clone_details['host_id'] = self.get_host_id_by_name(clone_details['host'])
if clone_details['host_group'] is not None:
clone_details['host_group_id'] = self.get_host_group_id_by_name(clone_details['host_group'])
clone_details['host_group_id'] = self.get_host_group_id_by_name(clone_details['host_group'])['id']
if clone_details['host_id'] is None and clone_details['host_group_id'] is None and clone_details['logical_unit_number'] is not None:
errormsg = "Either of host identifier or host group identifier is required along with logical_unit_number."
LOG.error(errormsg)
Expand Down Expand Up @@ -1187,8 +1188,11 @@ def perform_module_operation(self):
description = self.module.params['description']
mapping_state = self.module.params['mapping_state']
host = self.get_host_id_by_name(self.module.params['host'])
hostgroup = self.get_host_group_id_by_name(
hostgroup_details = self.get_host_group_id_by_name(
self.module.params['hostgroup'])
hostgroup = None
if hostgroup_details:
hostgroup = hostgroup_details['id']
hlu = self.module.params['hlu']
clone_volume = self.module.params['clone_volume']
source_volume = self.module.params['source_volume']
Expand Down Expand Up @@ -1375,7 +1379,7 @@ def perform_module_operation(self):
volume, host, mapping_state) or changed
if hostgroup:
changed = self.map_unmap_volume_to_hostgroup(
volume, hostgroup, mapping_state) or changed
volume, hostgroup_details, mapping_state) or changed

if state == 'present' and clone_volume is not None:
changed = self.clone_volume(vol_id, clone_volume)
Expand Down Expand Up @@ -1587,18 +1591,18 @@ def get_host_group_id_by_name(self, host_group_name):
# Get the host group details using name
host_group_info = self.provisioning.\
get_host_group_by_name(host_group_name)

if host_group_info:
if len(host_group_info) > 1:
error_msg = 'Multiple host groups by the same name ' \
'found'
LOG.error(error_msg)
self.module.fail_json(msg=error_msg)
return host_group_info[0]['id']
return host_group_info[0]
else:
# Get the host group details using id
if self.provisioning.get_host_group_details(host_group_name):
return host_group_name
host_group_info = self.provisioning.get_host_group_details(host_group_name)
if host_group_info:
return host_group_info

error_msg = ("host group {0} not found".format(host_group_name))
LOG.error(error_msg)
Expand Down
40 changes: 40 additions & 0 deletions tests/sanity/ignore-2.18.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
plugins/modules/certificate.py validate-modules:missing-gplv3-license
plugins/modules/cluster.py validate-modules:missing-gplv3-license
plugins/modules/dns.py validate-modules:missing-gplv3-license
plugins/modules/email.py validate-modules:missing-gplv3-license
plugins/modules/filesystem.py validate-modules:missing-gplv3-license
plugins/modules/filesystem_snapshot.py validate-modules:missing-gplv3-license
plugins/modules/host.py validate-modules:missing-gplv3-license
plugins/modules/hostgroup.py validate-modules:missing-gplv3-license
plugins/modules/info.py validate-modules:missing-gplv3-license
plugins/modules/job.py validate-modules:missing-gplv3-license
plugins/modules/ldap_account.py validate-modules:missing-gplv3-license
plugins/modules/local_user.py validate-modules:missing-gplv3-license
plugins/modules/nasserver.py validate-modules:missing-gplv3-license
plugins/modules/network.py validate-modules:missing-gplv3-license
plugins/modules/nfs.py validate-modules:missing-gplv3-license
plugins/modules/ntp.py validate-modules:missing-gplv3-license
plugins/modules/protectionpolicy.py validate-modules:missing-gplv3-license
plugins/modules/quota.py validate-modules:missing-gplv3-license
plugins/modules/remotesystem.py validate-modules:missing-gplv3-license
plugins/modules/remote_support_contact.py validate-modules:missing-gplv3-license
plugins/modules/remote_support.py validate-modules:missing-gplv3-license
plugins/modules/replicationrule.py validate-modules:missing-gplv3-license
plugins/modules/replicationsession.py validate-modules:missing-gplv3-license
plugins/modules/role.py validate-modules:missing-gplv3-license
plugins/modules/security_config.py validate-modules:missing-gplv3-license
plugins/modules/smbshare.py validate-modules:missing-gplv3-license
plugins/modules/smtp_config.py validate-modules:missing-gplv3-license
plugins/modules/snapshot.py validate-modules:missing-gplv3-license
plugins/modules/snapshotrule.py validate-modules:missing-gplv3-license
plugins/modules/storage_container.py validate-modules:missing-gplv3-license
plugins/modules/volume.py validate-modules:missing-gplv3-license
plugins/modules/volumegroup.py validate-modules:missing-gplv3-license
plugins/modules/ldap_domain.py validate-modules:missing-gplv3-license
plugins/modules/vcenter.py validate-modules:missing-gplv3-license
plugins/modules/file_interface.py validate-modules:missing-gplv3-license
plugins/modules/file_dns.py validate-modules:missing-gplv3-license
plugins/modules/file_nis.py validate-modules:missing-gplv3-license
plugins/modules/smb_server.py validate-modules:missing-gplv3-license
plugins/modules/nfs_server.py validate-modules:missing-gplv3-license
plugins/modules/service_config.py validate-modules:missing-gplv3-license
26 changes: 25 additions & 1 deletion tests/unit/plugins/module_utils/mock_volume_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,31 @@ class MockVolumeApi:
}
],
"id": "d0a61806-0992-4e8b-9419-d47ac1ed563f",
"name": "sample_host_group"
"name": "sample_host_group",
"mapped_host_groups": [
{
"id": "6bff38b9-4895-4f3c-8d1c-406d5b734656",
"volume_id": "ae20eb9a-a482-416e-aaf7-2a3fe7203631"
}
]
}]

HG_DETAILS2 = [{
"description": None,
"hosts": [
{
"id": "ced80318-b14a-461d-93a7-11b10afaf347",
"name": "sample_host1"
}
],
"id": "d0a61806-0992-4e8b-9419-d47ac1ed563g",
"name": "sample_host_group_2",
"mapped_host_groups": [
{
"id": "6bff38b9-4895-4f3c-8d1c-406d5b734656",
"volume_id": "ae20eb9a-a482-416e-aaf7-2a3fe7203630"
}
]
}]

VOL_DETAILS1 = [
Expand Down
22 changes: 10 additions & 12 deletions tests/unit/plugins/modules/test_volume.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,17 +301,15 @@ def test_map_host_group_to_volume(self, volume_module_mock):
def test_unmap_host_group_from_volume(self, volume_module_mock):
self.get_module_args.update({
'vol_id': "ae20eb9a-a482-416e-aaf7-2a3fe7203630",
'hostgroup': 'd0a61806-0992-4e8b-9419-d47ac1ed563f',
'hostgroup': "sample_host_group_2",
'mapping_state': 'unmapped',
'state': "present"
})
volume_module_mock.module.params = self.get_module_args
volume_module_mock.provisioning.get_host_group_details = MagicMock(
return_value=MockVolumeApi.HG_DETAILS1[0])
volume_module_mock.provisioning.get_host_group_by_name = MagicMock(
return_value=MockVolumeApi.HG_DETAILS2)
volume_module_mock.provisioning.get_volume_details = MagicMock(
return_value=MockVolumeApi.MODIFY_VOL_DETAILS1[0])
volume_module_mock.provisioning.unmap_volume_from_host_group = MagicMock(
return_value=[])
volume_module_mock.perform_module_operation()
assert volume_module_mock.module.exit_json.call_args[1]['changed'] is True
volume_module_mock.provisioning.unmap_volume_from_host_group.assert_called()
Expand Down Expand Up @@ -385,14 +383,14 @@ def test_unmap_host_group_from_volume_with_exception(self, volume_module_mock):
MockApiException.status_code = "400"
self.get_module_args.update({
'vol_id': "ae20eb9a-a482-416e-aaf7-2a3fe7203630",
'hostgroup': 'd0a61806-0992-4e8b-9419-d47ac1ed563f',
'hostgroup': "sample_host_group_2",
'mapping_state': 'unmapped',
'hlu': 123,
'state': "present"
})
volume_module_mock.module.params = self.get_module_args
volume_module_mock.provisioning.get_host_group_details = MagicMock(
return_value=MockVolumeApi.HG_DETAILS1[0])
volume_module_mock.provisioning.get_host_group_by_name = MagicMock(
return_value=MockVolumeApi.HG_DETAILS2)
volume_module_mock.provisioning.get_volume_details = MagicMock(
return_value=MockVolumeApi.MODIFY_VOL_DETAILS1[0])
volume_module_mock.provisioning.unmap_volume_from_host_group = MagicMock(
Expand Down Expand Up @@ -528,13 +526,13 @@ def test_map_host_to_volume_without_mapping_state(self, volume_module_mock):
def test_map_existing_host_group_to_volume(self, volume_module_mock):
self.get_module_args.update({
'vol_name': "sample_volume_1",
'hostgroup': 'sample_host_group',
'hostgroup': 'sample_host_group2',
'mapping_state': 'mapped',
'state': "present"
})
volume_module_mock.module.params = self.get_module_args
volume_module_mock.provisioning.get_host_group_by_name = MagicMock(
return_value=MockVolumeApi.HG_DETAILS1)
return_value=MockVolumeApi.HG_DETAILS2)
volume_module_mock.provisioning.get_volume_by_name = MagicMock(
return_value=MockVolumeApi.MODIFY_VOL_DETAILS1)
volume_module_mock.perform_module_operation()
Expand Down Expand Up @@ -598,7 +596,7 @@ def operation_before_clone_volume(self, volume_module_mock):
'name': 'test_name_3',
'description': 'test description 1',
'host': 'hst_nm_1',
'host_group': 'hst_gp_1',
'host_group': "sample_host_group_2",
'logical_unit_number': 13,
'protection_policy': 'PP1',
'performance_policy': 'low'
Expand All @@ -611,7 +609,7 @@ def operation_before_clone_volume(self, volume_module_mock):
volume_module_mock.get_performance_policy = MagicMock(return_value=MockVolumeApi.PERFORMANCE_POLICY_LOW)
volume_module_mock.get_protection_policy_id_by_name = MagicMock(return_value='PP_ID_1')
volume_module_mock.get_host_id_by_name = MagicMock(return_value='HD_ID_1')
volume_module_mock.get_host_group_id_by_name = MagicMock(return_value='HD_GP_ID_1')
volume_module_mock.provisioning.get_host_group_details = MagicMock(return_value=MockVolumeApi.HG_DETAILS2)

def test_clone_volume(self, volume_module_mock):
self.operation_before_clone_volume(volume_module_mock)
Expand Down

0 comments on commit cc538e0

Please sign in to comment.