From a02c182abb21243786b849e5af4b10c8e9e3dd9d Mon Sep 17 00:00:00 2001 From: Simon Dodsley Date: Mon, 24 Nov 2025 10:52:59 -0500 Subject: [PATCH] Add version check for tags --- changelogs/fragments/877_tags_info.yaml | 2 + plugins/modules/purefa_info.py | 274 +++++++++++++----------- 2 files changed, 150 insertions(+), 126 deletions(-) create mode 100644 changelogs/fragments/877_tags_info.yaml diff --git a/changelogs/fragments/877_tags_info.yaml b/changelogs/fragments/877_tags_info.yaml new file mode 100644 index 00000000..a0689dfe --- /dev/null +++ b/changelogs/fragments/877_tags_info.yaml @@ -0,0 +1,2 @@ +bugfixes: + - purefa_info - Added version check to ensure tags are only used in appropriate Purity versions diff --git a/plugins/modules/purefa_info.py b/plugins/modules/purefa_info.py index b6dbe204..53aff681 100644 --- a/plugins/modules/purefa_info.py +++ b/plugins/modules/purefa_info.py @@ -122,6 +122,7 @@ DSROLE_POLICY_API_VERSION = "2.36" CONTEXT_API_VERSION = "2.38" QUOTA_API_VERSION = "2.42" +TAGS_API_VERSION = "2.39" def _is_cbs(array): @@ -1584,16 +1585,19 @@ def generate_snap_dict(array): except KeyError: snap_info[remote_snap_name] = {"remote": []} snap_info[remote_snap_name]["remote"].append(remote_dict) - snaps_tags = list(array.get_volume_snapshots_tags(resource_destroyed=False).items) - for tag in range(len(snaps_tags)): - snap_info[snaps_tags[tag].resource.name]["tags"].append( - { - "key": snaps_tags[tag].key, - "value": snaps_tags[tag].value, - "copyable": snaps_tags[tag].copyable, - "namespace": snaps_tags[tag].namespace, - } + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + snaps_tags = list( + array.get_volume_snapshots_tags(resource_destroyed=False).items ) + for tag in range(len(snaps_tags)): + snap_info[snaps_tags[tag].resource.name]["tags"].append( + { + "key": snaps_tags[tag].key, + "value": snaps_tags[tag].value, + "copyable": snaps_tags[tag].copyable, + "namespace": snaps_tags[tag].namespace, + } + ) return snap_info @@ -1661,16 +1665,19 @@ def generate_del_snap_dict(array): except KeyError: snap_info[remote_snap_name] = {"remote": []} snap_info[remote_snap_name]["remote"].append(remote_dict) - snaps_tags = list(array.get_volume_snapshots_tags(resource_destroyed=True).items) - for tag in range(len(snaps_tags)): - snap_info[snaps_tags[tag].resource.name]["tags"].append( - { - "key": snaps_tags[tag].key, - "value": snaps_tags[tag].value, - "copyable": snaps_tags[tag].copyable, - "namespace": snaps_tags[tag].namespace, - } + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + snaps_tags = list( + array.get_volume_snapshots_tags(resource_destroyed=True).items ) + for tag in range(len(snaps_tags)): + snap_info[snaps_tags[tag].resource.name]["tags"].append( + { + "key": snaps_tags[tag].key, + "value": snaps_tags[tag].value, + "copyable": snaps_tags[tag].copyable, + "namespace": snaps_tags[tag].namespace, + } + ) return snap_info @@ -1737,16 +1744,17 @@ def generate_del_vol_dict(array): ) if LooseVersion(SUBS_API_VERSION) <= LooseVersion(array.get_rest_version()): volume_info[volume]["total_used"] = vols[vol].space.total_used - volume_tags = list(array.get_volumes_tags(resource_destroyed=True).items) - for tag in range(len(volume_tags)): - volume_info[volume_tags[tag].resource.name]["tags"].append( - { - "key": volume_tags[tag].key, - "value": volume_tags[tag].value, - "copyable": volume_tags[tag].copyable, - "namespace": volume_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + volume_tags = list(array.get_volumes_tags(resource_destroyed=True).items) + for tag in range(len(volume_tags)): + volume_info[volume_tags[tag].resource.name]["tags"].append( + { + "key": volume_tags[tag].key, + "value": volume_tags[tag].value, + "copyable": volume_tags[tag].copyable, + "namespace": volume_tags[tag].namespace, + } + ) return volume_info @@ -1838,16 +1846,17 @@ def generate_vol_dict(array, performance): dict(t) for t in set(tuple(d.items()) for d in volume_info[volume]["host_groups"]) ] - volume_tags = list(array.get_volumes_tags(resource_destroyed=False).items) - for tag in range(len(volume_tags)): - volume_info[volume_tags[tag].resource.name]["tags"].append( - { - "key": volume_tags[tag].key, - "value": volume_tags[tag].value, - "copyable": volume_tags[tag].copyable, - "namespace": volume_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + volume_tags = list(array.get_volumes_tags(resource_destroyed=False).items) + for tag in range(len(volume_tags)): + volume_info[volume_tags[tag].resource.name]["tags"].append( + { + "key": volume_tags[tag].key, + "value": volume_tags[tag].value, + "copyable": volume_tags[tag].copyable, + "namespace": volume_tags[tag].namespace, + } + ) if performance: vols_performance = list(array.get_volumes_performance(destroyed=False).items) for perf in range(0, len(vols_performance)): @@ -1976,16 +1985,17 @@ def generate_host_dict(array, performance): host_info[hosts[host]["name"]]["performance_balance"].append( host_perf_balance ) - host_tags = list(array.get_hosts_tags(resource_destroyed=False).items) - for tag in range(len(host_tags)): - host_info[host_tags[tag].resource.name]["tags"].append( - { - "key": host_tags[tag].key, - "value": host_tags[tag].value, - "copyable": host_tags[tag].copyable, - "namespace": host_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + host_tags = list(array.get_hosts_tags(resource_destroyed=False).items) + for tag in range(len(host_tags)): + host_info[host_tags[tag].resource.name]["tags"].append( + { + "key": host_tags[tag].key, + "value": host_tags[tag].value, + "copyable": host_tags[tag].copyable, + "namespace": host_tags[tag].namespace, + } + ) if performance: for perf in range(0, len(hosts_performance)): if ":" not in hosts_performance[perf].name: @@ -2181,16 +2191,19 @@ def generate_del_pgroups_dict(array): pgroups_info[protgroup]["manual_eradication"] = getattr( pg_info.eradication_config, "manual_eradication", None ) - pgroup_tags = list(array.get_protection_groups_tags(resource_destroyed=True).items) - for tag in range(len(pgroup_tags)): - pgroups_info[pgroup_tags[tag].resource.name]["tags"].append( - { - "key": pgroup_tags[tag].key, - "value": pgroup_tags[tag].value, - "copyable": pgroup_tags[tag].copyable, - "namespace": pgroup_tags[tag].namespace, - } + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + pgroup_tags = list( + array.get_protection_groups_tags(resource_destroyed=True).items ) + for tag in range(len(pgroup_tags)): + pgroups_info[pgroup_tags[tag].resource.name]["tags"].append( + { + "key": pgroup_tags[tag].key, + "value": pgroup_tags[tag].value, + "copyable": pgroup_tags[tag].copyable, + "namespace": pgroup_tags[tag].namespace, + } + ) return pgroups_info @@ -2322,16 +2335,19 @@ def generate_pgroups_dict(array): pgroups_info[protgroup]["manual_eradication"] = getattr( pg_info.eradication_config, "manual_eradication", None ) - pgroup_tags = list(array.get_protection_groups_tags(resource_destroyed=False).items) - for tag in range(len(pgroup_tags)): - pgroups_info[pgroup_tags[tag].resource.name]["tags"].append( - { - "key": pgroup_tags[tag].key, - "value": pgroup_tags[tag].value, - "copyable": pgroup_tags[tag].copyable, - "namespace": pgroup_tags[tag].namespace, - } + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + pgroup_tags = list( + array.get_protection_groups_tags(resource_destroyed=False).items ) + for tag in range(len(pgroup_tags)): + pgroups_info[pgroup_tags[tag].resource.name]["tags"].append( + { + "key": pgroup_tags[tag].key, + "value": pgroup_tags[tag].value, + "copyable": pgroup_tags[tag].copyable, + "namespace": pgroup_tags[tag].namespace, + } + ) return pgroups_info @@ -2414,16 +2430,17 @@ def generate_del_pods_dict(array): "status": getattr(pods[pod].arrays[pod_array], "status", None), } ) - pods_tags = list(array.get_pods_tags(resource_destroyed=True).items) - for tag in range(len(pods_tags)): - pods_info[pods_tags[tag].resource.name]["tags"].append( - { - "key": pods_tags[tag].key, - "value": pods_tags[tag].value, - "copyable": pods_tags[tag].copyable, - "namespace": pods_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + pods_tags = list(array.get_pods_tags(resource_destroyed=True).items) + for tag in range(len(pods_tags)): + pods_info[pods_tags[tag].resource.name]["tags"].append( + { + "key": pods_tags[tag].key, + "value": pods_tags[tag].value, + "copyable": pods_tags[tag].copyable, + "namespace": pods_tags[tag].namespace, + } + ) return pods_info @@ -2484,16 +2501,17 @@ def generate_pods_dict(array, performance): "status": getattr(pods[pod].arrays[pod_array], "status", None), } ) - pods_tags = list(array.get_pods_tags(resource_destroyed=False).items) - for tag in range(len(pods_tags)): - pods_info[pods_tags[tag].resource.name]["tags"].append( - { - "key": pods_tags[tag].key, - "value": pods_tags[tag].value, - "copyable": pods_tags[tag].copyable, - "namespace": pods_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + pods_tags = list(array.get_pods_tags(resource_destroyed=False).items) + for tag in range(len(pods_tags)): + pods_info[pods_tags[tag].resource.name]["tags"].append( + { + "key": pods_tags[tag].key, + "value": pods_tags[tag].value, + "copyable": pods_tags[tag].copyable, + "namespace": pods_tags[tag].namespace, + } + ) if performance: pods_performance = list(array.get_pods_performance().items) for perf in range(0, len(pods_performance)): @@ -2640,16 +2658,17 @@ def generate_vgroups_dict(array, performance): ].priority_adjustment.priority_adjustment_operator + str( vgroups[vgroup].priority_adjustment.priority_adjustment_value ) - vgroup_tags = list(array.get_volume_groups_tags(resource_destroyed=False).items) - for tag in range(len(vgroup_tags)): - vgroups_info[vgroup_tags[tag].resource.name]["tags"].append( - { - "key": vgroup_tags[tag].key, - "value": vgroup_tags[tag].value, - "copyable": vgroup_tags[tag].copyable, - "namespace": vgroup_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + vgroup_tags = list(array.get_volume_groups_tags(resource_destroyed=False).items) + for tag in range(len(vgroup_tags)): + vgroups_info[vgroup_tags[tag].resource.name]["tags"].append( + { + "key": vgroup_tags[tag].key, + "value": vgroup_tags[tag].value, + "copyable": vgroup_tags[tag].copyable, + "namespace": vgroup_tags[tag].namespace, + } + ) if performance: vgs_performance = list(array.get_volume_groups_performance().items) for perf in range(0, len(vgs_performance)): @@ -2750,16 +2769,17 @@ def generate_del_vgroups_dict(array): group_name = vg_volumes[vg_vol].group.name if group_name in vgroups_info: vgroups_info[group_name]["volumes"].append(vg_volumes[vg_vol].member.name) - vgroup_tags = list(array.get_volume_groups_tags(resource_destroyed=True).items) - for tag in range(len(vgroup_tags)): - vgroups_info[vgroup_tags[tag].resource.name]["tags"].append( - { - "key": vgroup_tags[tag].key, - "value": vgroup_tags[tag].value, - "copyable": vgroup_tags[tag].copyable, - "namespace": vgroup_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + vgroup_tags = list(array.get_volume_groups_tags(resource_destroyed=True).items) + for tag in range(len(vgroup_tags)): + vgroups_info[vgroup_tags[tag].resource.name]["tags"].append( + { + "key": vgroup_tags[tag].key, + "value": vgroup_tags[tag].value, + "copyable": vgroup_tags[tag].copyable, + "namespace": vgroup_tags[tag].namespace, + } + ) return vgroups_info @@ -3027,16 +3047,17 @@ def generate_hgroups_dict(array, performance): "destroyed": getattr(hgroups[hgroup], "destroyed", False), "time_remaining": getattr(hgroups[hgroup], "time_remaining", None), } - hgroup_tags = list(array.get_host_groups_tags(resource_destroyed=False).items) - for tag in range(len(hgroup_tags)): - hgroups_info[hgroup_tags[tag].resource.name]["tags"].append( - { - "key": hgroup_tags[tag].key, - "value": hgroup_tags[tag].value, - "copyable": hgroup_tags[tag].copyable, - "namespace": hgroup_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + hgroup_tags = list(array.get_host_groups_tags(resource_destroyed=False).items) + for tag in range(len(hgroup_tags)): + hgroups_info[hgroup_tags[tag].resource.name]["tags"].append( + { + "key": hgroup_tags[tag].key, + "value": hgroup_tags[tag].value, + "copyable": hgroup_tags[tag].copyable, + "namespace": hgroup_tags[tag].namespace, + } + ) if performance: hgs_performance = list(array.get_host_groups_performance().items) for perf in range(0, len(hgs_performance)): @@ -3395,16 +3416,17 @@ def generate_realms_dict(array, performance): } if realms_info[name]["destroyed"]: realms_info[name]["time_remaining"] = realms[realm].time_remaining - realms_tags = list(array.get_realms_tags(resource_destroyed=False).items) - for tag in range(len(realms_tags)): - realms_info[realms_tags[tag].resource.name]["tags"].append( - { - "key": realms_tags[tag].key, - "value": realms_tags[tag].value, - "copyable": realms_tags[tag].copyable, - "namespace": realms_tags[tag].namespace, - } - ) + if LooseVersion(TAGS_API_VERSION) <= LooseVersion(array.get_rest_version()): + realms_tags = list(array.get_realms_tags(resource_destroyed=False).items) + for tag in range(len(realms_tags)): + realms_info[realms_tags[tag].resource.name]["tags"].append( + { + "key": realms_tags[tag].key, + "value": realms_tags[tag].value, + "copyable": realms_tags[tag].copyable, + "namespace": realms_tags[tag].namespace, + } + ) if performance: r_perfs = list(array.get_realms_performance().items) for perf in range(0, len(r_perfs)):