summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/storage/purestorage/purefa_info.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules/storage/purestorage/purefa_info.py')
-rw-r--r--lib/ansible/modules/storage/purestorage/purefa_info.py1019
1 files changed, 0 insertions, 1019 deletions
diff --git a/lib/ansible/modules/storage/purestorage/purefa_info.py b/lib/ansible/modules/storage/purestorage/purefa_info.py
deleted file mode 100644
index 78080506f6..0000000000
--- a/lib/ansible/modules/storage/purestorage/purefa_info.py
+++ /dev/null
@@ -1,1019 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-# (c) 2019, Simon Dodsley (simon@purestorage.com)
-# 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 = r'''
----
-module: purefa_info
-version_added: '2.9'
-short_description: Collect information from Pure Storage FlashArray
-description:
- - Collect information from a Pure Storage Flasharray running the
- Purity//FA operating system. By default, the module will collect basic
- information including hosts, host groups, protection
- groups and volume counts. Additional information can be collected
- based on the configured set of arguments.
-author:
- - Pure Storage ansible Team (@sdodsley) <pure-ansible-team@purestorage.com>
-options:
- gather_subset:
- description:
- - When supplied, this argument will define the information to be collected.
- Possible values for this include all, minimum, config, performance,
- capacity, network, subnet, interfaces, hgroups, pgroups, hosts,
- admins, volumes, snapshots, pods, vgroups, offload, apps, arrays,
- certs and kmip.
- type: list
- required: false
- default: minimum
-extends_documentation_fragment:
- - purestorage.fa
-'''
-
-EXAMPLES = r'''
-- name: collect default set of information
- purefa_info:
- fa_url: 10.10.10.2
- api_token: e31060a7-21fc-e277-6240-25983c6c4592
- register: array_info
-- name: show default information
- debug:
- msg: "{{ array_info['purefa_info']['default'] }}"
-
-- name: collect configuration and capacity information
- purefa_info:
- gather_subset:
- - config
- fa_url: 10.10.10.2
- api_token: e31060a7-21fc-e277-6240-25983c6c4592
- register: array_info
-- name: show configuration information
- debug:
- msg: "{{ array_info['purefa_info']['config'] }}"
-
-- name: collect all information
- purefa_info:
- gather_subset:
- - all
- fa_url: 10.10.10.2
- api_token: e31060a7-21fc-e277-6240-25983c6c4592
-- name: show all information
- debug:
- msg: "{{ array_info['purefa_info'] }}"
-'''
-
-RETURN = r'''
-purefa_info:
- description: Returns the information collected from the FlashArray
- returned: always
- type: complex
- sample: {
- "admins": {
- "pureuser": {
- "role": "array_admin",
- "type": "local"
- }
- },
- "apps": {
- "offload": {
- "description": "Snapshot offload to NFS or Amazon S3",
- "status": "healthy",
- "version": "5.2.1"
- }
- },
- "arrays": {},
- "capacity": {
- "data_reduction": 11.664774599686346,
- "free_space": 6995782867042,
- "provisioned_space": 442391871488,
- "shared_space": 3070918120,
- "snapshot_space": 284597118,
- "system_space": 0,
- "thin_provisioning": 0.8201773449669771,
- "total_capacity": 7002920315199,
- "total_reduction": 64.86821472825108,
- "volume_space": 3781932919
- },
- "config": {
- "directory_service": {
- "base_dn": null,
- "bind_password": null,
- "bind_user": null,
- "check_peer": false,
- "enabled": false,
- "uri": [],
- "user_login_attribute": null,
- "user_object_class": null
- },
- "directory_service_roles": {
- "array_admin": {
- "group": null,
- "group_base": null
- },
- "ops_admin": {
- "group": null,
- "group_base": null
- },
- "readonly": {
- "group": null,
- "group_base": null
- },
- "storage_admin": {
- "group": null,
- "group_base": null
- }
- },
- "dns": {
- "domain": "acme.com",
- "nameservers": [
- "8.8.4.4"
- ]
- },
- "global_admin": {
- "lockout_duration": null,
- "max_login_attempts": null,
- "min_password_length": 1,
- "single_sign_on_enabled": false
- },
- "idle_timeout": 0,
- "ntp": [
- "prod-ntp1.puretec.purestorage.com"
- ],
- "phonehome": "enabled",
- "proxy": "",
- "relayhost": "smtp.puretec.purestorage.com",
- "scsi_timeout": 60,
- "senderdomain": "purestorage.com",
- "smtp": [
- {
- "enabled": true,
- "name": "flasharray-alerts@purestorage.com"
- }
- ],
- "snmp": [
- {
- "auth_passphrase": null,
- "auth_protocol": null,
- "community": "****",
- "host": "10.21.23.34",
- "name": "manager1",
- "notification": "trap",
- "privacy_passphrase": null,
- "privacy_protocol": null,
- "user": null,
- "version": "v2c"
- }
- ],
- "syslog": [
- "udp://prod-ntp2.puretec.purestorage.com:333"
- ]
- },
- "default": {
- "admins": 1,
- "array_model": "FA-405",
- "array_name": "array",
- "connected_arrays": 0,
- "connection_key": "c6033033-fe69-2515-a9e8-966bb7fe4b40",
- "hostgroups": 0,
- "hosts": 15,
- "pods": 1,
- "protection_groups": 1,
- "purity_version": "5.2.1",
- "snapshots": 2,
- "volume_groups": 1
- },
- "hgroups": {},
- "hosts": {
- "@offload": {
- "hgroup": null,
- "iqn": [],
- "nqn": [],
- "personality": null,
- "preferred_array": [],
- "target_port": [],
- "wwn": []
- },
- "docker-host": {
- "hgroup": null,
- "iqn": [
- "iqn.1994-05.com.redhat:d97adf78472"
- ],
- "nqn": [],
- "personality": null,
- "preferred_array": [],
- "target_port": [
- "CT0.ETH4",
- "CT1.ETH4"
- ],
- "wwn": []
- }
- },
- "interfaces": {
- "CT0.ETH4": "iqn.2010-06.com.purestorage:flasharray.2111b767484e4682",
- "CT1.ETH4": "iqn.2010-06.com.purestorage:flasharray.2111b767484e4682",
- },
- "network": {
- "@offload.data0": {
- "address": "10.21.200.222",
- "gateway": "10.21.200.1",
- "hwaddr": "52:54:30:02:b9:4e",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "app"
- ],
- "speed": 10000000000
- },
- "ct0.eth0": {
- "address": "10.21.200.211",
- "gateway": "10.21.200.1",
- "hwaddr": "ec:f4:bb:c8:8a:04",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "management"
- ],
- "speed": 1000000000
- },
- "ct0.eth2": {
- "address": "10.21.200.218",
- "gateway": null,
- "hwaddr": "ec:f4:bb:c8:8a:00",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "replication"
- ],
- "speed": 10000000000
- },
- "ct0.eth4": {
- "address": "10.21.200.214",
- "gateway": null,
- "hwaddr": "90:e2:ba:83:79:0c",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "iscsi"
- ],
- "speed": 10000000000
- },
- "ct1.eth0": {
- "address": "10.21.200.212",
- "gateway": "10.21.200.1",
- "hwaddr": "ec:f4:bb:e4:c6:3c",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "management"
- ],
- "speed": 1000000000
- },
- "ct1.eth2": {
- "address": "10.21.200.220",
- "gateway": null,
- "hwaddr": "ec:f4:bb:e4:c6:38",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "replication"
- ],
- "speed": 10000000000
- },
- "ct1.eth4": {
- "address": "10.21.200.216",
- "gateway": null,
- "hwaddr": "90:e2:ba:8b:b1:8c",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "iscsi"
- ],
- "speed": 10000000000
- },
- "vir0": {
- "address": "10.21.200.210",
- "gateway": "10.21.200.1",
- "hwaddr": "fe:ba:e9:e7:6b:0f",
- "mtu": 1500,
- "netmask": "255.255.255.0",
- "services": [
- "management"
- ],
- "speed": 1000000000
- }
- },
- "nfs_offload": {},
- "performance": {
- "input_per_sec": 0,
- "local_queue_usec_per_op": 0,
- "output_per_sec": 0,
- "qos_rate_limit_usec_per_read_op": 0,
- "qos_rate_limit_usec_per_write_op": 0,
- "queue_depth": 0,
- "queue_usec_per_read_op": 0,
- "queue_usec_per_write_op": 0,
- "reads_per_sec": 0,
- "san_usec_per_read_op": 0,
- "san_usec_per_write_op": 0,
- "time": "2019-08-14T21:33:51Z",
- "usec_per_read_op": 0,
- "usec_per_write_op": 0,
- "writes_per_sec": 0
- },
- "pgroups": {
- "test_pg": {
- "hgroups": null,
- "hosts": null,
- "source": "docker-host",
- "targets": null,
- "volumes": null
- }
- },
- "pods": {
- "test": {
- "arrays": [
- {
- "array_id": "043be47c-1233-4399-b9d6-8fe38727dd9d",
- "mediator_status": "online",
- "name": "array2",
- "status": "online"
- }
- ],
- "source": null
- }
- },
- "s3_offload": {
- "s3-offload": {
- "access_key_id": "AKIAILNVEPWZTV4FGWZQ",
- "bucket": "offload-bucket",
- "protocol": "s3",
- "status": "connected"
- }
- },
- "snapshots": {
- "@offload_boot.1": {
- "created": "2019-03-14T15:29:20Z",
- "size": 68719476736,
- "source": "@offload_boot"
- }
- },
- "subnet": {},
- "vgroups": {
- "test": {
- "volumes": [
- "test/test",
- "test/test1"
- ]
- }
- },
- "volumes": {
- "@offload_boot": {
- "bandwidth": null,
- "hosts": [
- [
- "@offload",
- 1
- ]
- ],
- "serial": "43BE47C12334399B00013959",
- "size": 68719476736,
- "source": null
- },
- "docker-store": {
- "bandwidth": null,
- "hosts": [
- [
- "docker-host",
- 1
- ]
- ],
- "serial": "43BE47C12334399B00011418",
- "size": 21474836480,
- "source": null
- }
- }
- }
-'''
-
-
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils.pure import get_system, purefa_argument_spec
-import time
-
-ADMIN_API_VERSION = '1.14'
-S3_REQUIRED_API_VERSION = '1.16'
-LATENCY_REQUIRED_API_VERSION = '1.16'
-AC_REQUIRED_API_VERSION = '1.14'
-CAP_REQUIRED_API_VERSION = '1.6'
-SAN_REQUIRED_API_VERSION = '1.10'
-NVME_API_VERSION = '1.16'
-PREFERRED_API_VERSION = '1.15'
-P53_API_VERSION = '1.17'
-
-
-def generate_default_dict(array):
- default_info = {}
- defaults = array.get()
- api_version = array._list_available_rest_versions()
- if AC_REQUIRED_API_VERSION in api_version:
- default_info['volume_groups'] = len(array.list_vgroups())
- default_info['connected_arrays'] = len(array.list_array_connections())
- default_info['pods'] = len(array.list_pods())
- default_info['connection_key'] = array.get(connection_key=True)['connection_key']
- hosts = array.list_hosts()
- admins = array.list_admins()
- snaps = array.list_volumes(snap=True, pending=True)
- pgroups = array.list_pgroups(pending=True)
- hgroups = array.list_hgroups()
- # Old FA arrays only report model from the primary controller
- ct0_model = array.get_hardware('CT0')['model']
- if ct0_model:
- model = ct0_model
- else:
- ct1_model = array.get_hardware('CT1')['model']
- model = ct1_model
- default_info['array_model'] = model
- default_info['array_name'] = defaults['array_name']
- default_info['purity_version'] = defaults['version']
- default_info['hosts'] = len(hosts)
- default_info['snapshots'] = len(snaps)
- default_info['protection_groups'] = len(pgroups)
- default_info['hostgroups'] = len(hgroups)
- default_info['admins'] = len(admins)
- if P53_API_VERSION in api_version:
- default_info['maintenance_window'] = array.list_maintenance_windows()
- return default_info
-
-
-def generate_perf_dict(array):
- perf_info = {}
- api_version = array._list_available_rest_versions()
- if LATENCY_REQUIRED_API_VERSION in api_version:
- latency_info = array.get(action='monitor', latency=True)[0]
- perf_info = array.get(action='monitor')[0]
- # IOPS
- perf_info['writes_per_sec'] = perf_info['writes_per_sec']
- perf_info['reads_per_sec'] = perf_info['reads_per_sec']
-
- # Bandwidth
- perf_info['input_per_sec'] = perf_info['input_per_sec']
- perf_info['output_per_sec'] = perf_info['output_per_sec']
-
- # Latency
- if LATENCY_REQUIRED_API_VERSION in api_version:
- perf_info['san_usec_per_read_op'] = latency_info['san_usec_per_read_op']
- perf_info['san_usec_per_write_op'] = latency_info['san_usec_per_write_op']
- perf_info['queue_usec_per_read_op'] = latency_info['queue_usec_per_read_op']
- perf_info['queue_usec_per_write_op'] = latency_info['queue_usec_per_write_op']
- perf_info['qos_rate_limit_usec_per_read_op'] = latency_info['qos_rate_limit_usec_per_read_op']
- perf_info['qos_rate_limit_usec_per_write_op'] = latency_info['qos_rate_limit_usec_per_write_op']
- perf_info['local_queue_usec_per_op'] = perf_info['local_queue_usec_per_op']
- perf_info['usec_per_read_op'] = perf_info['usec_per_read_op']
- perf_info['usec_per_write_op'] = perf_info['usec_per_write_op']
- perf_info['queue_depth'] = perf_info['queue_depth']
- return perf_info
-
-
-def generate_config_dict(array):
- config_info = {}
- api_version = array._list_available_rest_versions()
- # DNS
- config_info['dns'] = array.get_dns()
- # SMTP
- config_info['smtp'] = array.list_alert_recipients()
- # SNMP
- config_info['snmp'] = array.list_snmp_managers()
- config_info['snmp_v3_engine_id'] = array.get_snmp_engine_id()['engine_id']
- # DS
- config_info['directory_service'] = array.get_directory_service()
- if S3_REQUIRED_API_VERSION in api_version:
- config_info['directory_service_roles'] = {}
- roles = array.list_directory_service_roles()
- for role in range(0, len(roles)):
- role_name = roles[role]['name']
- config_info['directory_service_roles'][role_name] = {
- 'group': roles[role]['group'],
- 'group_base': roles[role]['group_base'],
- }
- else:
- config_info['directory_service'].update(array.get_directory_service(groups=True))
- # NTP
- config_info['ntp'] = array.get(ntpserver=True)['ntpserver']
- # SYSLOG
- config_info['syslog'] = array.get(syslogserver=True)['syslogserver']
- # Phonehome
- config_info['phonehome'] = array.get(phonehome=True)['phonehome']
- # Proxy
- config_info['proxy'] = array.get(proxy=True)['proxy']
- # Relay Host
- config_info['relayhost'] = array.get(relayhost=True)['relayhost']
- # Sender Domain
- config_info['senderdomain'] = array.get(senderdomain=True)['senderdomain']
- # SYSLOG
- config_info['syslog'] = array.get(syslogserver=True)['syslogserver']
- # Idle Timeout
- config_info['idle_timeout'] = array.get(idle_timeout=True)['idle_timeout']
- # SCSI Timeout
- config_info['scsi_timeout'] = array.get(scsi_timeout=True)['scsi_timeout']
- # Global Admin settings
- if S3_REQUIRED_API_VERSION in api_version:
- config_info['global_admin'] = array.get_global_admin_attributes()
- return config_info
-
-
-def generate_admin_dict(array):
- admin_info = {}
- api_version = array._list_available_rest_versions()
- if ADMIN_API_VERSION in api_version:
- admins = array.list_admins()
- for admin in range(0, len(admins)):
- admin_name = admins[admin]['name']
- admin_info[admin_name] = {
- 'type': admins[admin]['type'],
- 'role': admins[admin]['role'],
- }
- return admin_info
-
-
-def generate_subnet_dict(array):
- sub_info = {}
- subnets = array.list_subnets()
- for sub in range(0, len(subnets)):
- sub_name = subnets[sub]['name']
- if subnets[sub]['enabled']:
- sub_info[sub_name] = {
- 'gateway': subnets[sub]['gateway'],
- 'mtu': subnets[sub]['mtu'],
- 'vlan': subnets[sub]['vlan'],
- 'prefix': subnets[sub]['prefix'],
- 'interfaces': subnets[sub]['interfaces'],
- 'services': subnets[sub]['services'],
- }
- return sub_info
-
-
-def generate_network_dict(array):
- net_info = {}
- ports = array.list_network_interfaces()
- for port in range(0, len(ports)):
- int_name = ports[port]['name']
- net_info[int_name] = {
- 'hwaddr': ports[port]['hwaddr'],
- 'mtu': ports[port]['mtu'],
- 'enabled': ports[port]['enabled'],
- 'speed': ports[port]['speed'],
- 'address': ports[port]['address'],
- 'slaves': ports[port]['slaves'],
- 'services': ports[port]['services'],
- 'gateway': ports[port]['gateway'],
- 'netmask': ports[port]['netmask'],
- }
- if ports[port]['subnet']:
- subnets = array.get_subnet(ports[port]['subnet'])
- if subnets['enabled']:
- net_info[int_name]['subnet'] = {
- 'name': subnets['name'],
- 'prefix': subnets['prefix'],
- 'vlan': subnets['vlan'],
- }
- return net_info
-
-
-def generate_capacity_dict(array):
- capacity_info = {}
- api_version = array._list_available_rest_versions()
- if CAP_REQUIRED_API_VERSION in api_version:
- volumes = array.list_volumes(pending=True)
- capacity_info['provisioned_space'] = sum(item['size'] for item in volumes)
- capacity = array.get(space=True)
- total_capacity = capacity[0]['capacity']
- used_space = capacity[0]["total"]
- capacity_info['free_space'] = total_capacity - used_space
- capacity_info['total_capacity'] = total_capacity
- capacity_info['data_reduction'] = capacity[0]['data_reduction']
- capacity_info['system_space'] = capacity[0]['system']
- capacity_info['volume_space'] = capacity[0]['volumes']
- capacity_info['shared_space'] = capacity[0]['shared_space']
- capacity_info['snapshot_space'] = capacity[0]['snapshots']
- capacity_info['thin_provisioning'] = capacity[0]['thin_provisioning']
- capacity_info['total_reduction'] = capacity[0]['total_reduction']
-
- return capacity_info
-
-
-def generate_snap_dict(array):
- snap_info = {}
- snaps = array.list_volumes(snap=True)
- for snap in range(0, len(snaps)):
- snapshot = snaps[snap]['name']
- snap_info[snapshot] = {
- 'size': snaps[snap]['size'],
- 'source': snaps[snap]['source'],
- 'created': snaps[snap]['created'],
- }
- return snap_info
-
-
-def generate_vol_dict(array):
- volume_info = {}
- vols = array.list_volumes()
- for vol in range(0, len(vols)):
- volume = vols[vol]['name']
- volume_info[volume] = {
- 'source': vols[vol]['source'],
- 'size': vols[vol]['size'],
- 'serial': vols[vol]['serial'],
- 'hosts': [],
- 'bandwidth': ""
- }
- api_version = array._list_available_rest_versions()
- if AC_REQUIRED_API_VERSION in api_version:
- qvols = array.list_volumes(qos=True)
- for qvol in range(0, len(qvols)):
- volume = qvols[qvol]['name']
- qos = qvols[qvol]['bandwidth_limit']
- volume_info[volume]['bandwidth'] = qos
- if P53_API_VERSION in api_version:
- iops = qvols[qvol]['iops_limit']
- volume_info[volume]['iops_limit'] = iops
- vvols = array.list_volumes(protocol_endpoint=True)
- for vvol in range(0, len(vvols)):
- volume = vvols[vvol]['name']
- volume_info[volume] = {
- 'source': vvols[vvol]['source'],
- 'serial': vvols[vvol]['serial'],
- 'hosts': []
- }
- if P53_API_VERSION in array._list_available_rest_versions():
- pe_e2ees = array.list_volumes(protocol_endpoint=True, host_encryption_key=True)
- for pe_e2ee in range(0, len(pe_e2ees)):
- volume = pe_e2ees[pe_e2ee]['name']
- volume_info[volume]['host_encryption_key_status'] = pe_e2ees[pe_e2ee]['host_encryption_key_status']
- if P53_API_VERSION in array._list_available_rest_versions():
- e2ees = array.list_volumes(host_encryption_key=True)
- for e2ee in range(0, len(e2ees)):
- volume = e2ees[e2ee]['name']
- volume_info[volume]['host_encryption_key_status'] = e2ees[e2ee]['host_encryption_key_status']
- cvols = array.list_volumes(connect=True)
- for cvol in range(0, len(cvols)):
- volume = cvols[cvol]['name']
- voldict = {'host': cvols[cvol]['host'], 'lun': cvols[cvol]['lun']}
- volume_info[volume]['hosts'].append(voldict)
- return volume_info
-
-
-def generate_host_dict(array):
- api_version = array._list_available_rest_versions()
- host_info = {}
- hosts = array.list_hosts()
- for host in range(0, len(hosts)):
- hostname = hosts[host]['name']
- tports = []
- host_all_info = array.get_host(hostname, all=True)
- if host_all_info:
- tports = host_all_info[0]['target_port']
- host_info[hostname] = {
- 'hgroup': hosts[host]['hgroup'],
- 'iqn': hosts[host]['iqn'],
- 'wwn': hosts[host]['wwn'],
- 'personality': array.get_host(hostname,
- personality=True)['personality'],
- 'target_port': tports
- }
- if NVME_API_VERSION in api_version:
- host_info[hostname]['nqn'] = hosts[host]['nqn']
- if PREFERRED_API_VERSION in api_version:
- hosts = array.list_hosts(preferred_array=True)
- for host in range(0, len(hosts)):
- hostname = hosts[host]['name']
- host_info[hostname]['preferred_array'] = hosts[host]['preferred_array']
- return host_info
-
-
-def generate_pgroups_dict(array):
- pgroups_info = {}
- pgroups = array.list_pgroups()
- for pgroup in range(0, len(pgroups)):
- protgroup = pgroups[pgroup]['name']
- pgroups_info[protgroup] = {
- 'hgroups': pgroups[pgroup]['hgroups'],
- 'hosts': pgroups[pgroup]['hosts'],
- 'source': pgroups[pgroup]['source'],
- 'targets': pgroups[pgroup]['targets'],
- 'volumes': pgroups[pgroup]['volumes'],
- }
- prot_sched = array.get_pgroup(protgroup, schedule=True)
- prot_reten = array.get_pgroup(protgroup, retention=True)
- if prot_sched['snap_enabled'] or prot_sched['replicate_enabled']:
- pgroups_info[protgroup]['snap_freqyency'] = prot_sched['snap_frequency']
- pgroups_info[protgroup]['replicate_freqyency'] = prot_sched['replicate_frequency']
- pgroups_info[protgroup]['snap_enabled'] = prot_sched['snap_enabled']
- pgroups_info[protgroup]['replicate_enabled'] = prot_sched['replicate_enabled']
- pgroups_info[protgroup]['snap_at'] = prot_sched['snap_at']
- pgroups_info[protgroup]['replicate_at'] = prot_sched['replicate_at']
- pgroups_info[protgroup]['replicate_blackout'] = prot_sched['replicate_blackout']
- pgroups_info[protgroup]['per_day'] = prot_reten['per_day']
- pgroups_info[protgroup]['target_per_day'] = prot_reten['target_per_day']
- pgroups_info[protgroup]['target_days'] = prot_reten['target_days']
- pgroups_info[protgroup]['days'] = prot_reten['days']
- pgroups_info[protgroup]['all_for'] = prot_reten['all_for']
- pgroups_info[protgroup]['target_all_for'] = prot_reten['target_all_for']
- if ":" in protgroup:
- snap_transfers = array.get_pgroup(protgroup, snap=True, transfer=True)
- pgroups_info[protgroup]['snaps'] = {}
- for snap_transfer in range(0, len(snap_transfers)):
- snap = snap_transfers[snap_transfer]['name']
- pgroups_info[protgroup]['snaps'][snap] = {
- 'created': snap_transfers[snap_transfer]['created'],
- 'started': snap_transfers[snap_transfer]['started'],
- 'completed': snap_transfers[snap_transfer]['completed'],
- 'physical_bytes_written': snap_transfers[snap_transfer]['physical_bytes_written'],
- 'data_transferred': snap_transfers[snap_transfer]['data_transferred'],
- 'progress': snap_transfers[snap_transfer]['progress'],
- }
- return pgroups_info
-
-
-def generate_pods_dict(array):
- pods_info = {}
- api_version = array._list_available_rest_versions()
- if AC_REQUIRED_API_VERSION in api_version:
- pods = array.list_pods()
- for pod in range(0, len(pods)):
- acpod = pods[pod]['name']
- pods_info[acpod] = {
- 'source': pods[pod]['source'],
- 'arrays': pods[pod]['arrays'],
- }
- return pods_info
-
-
-def generate_conn_array_dict(array):
- conn_array_info = {}
- api_version = array._list_available_rest_versions()
- carrays = array.list_array_connections()
- for carray in range(0, len(carrays)):
- arrayname = carrays[carray]['array_name']
- conn_array_info[arrayname] = {
- 'array_id': carrays[carray]['id'],
- 'throttled': carrays[carray]['throttled'],
- 'version': carrays[carray]['version'],
- 'type': carrays[carray]['type'],
- 'mgmt_ip': carrays[carray]['management_address'],
- 'repl_ip': carrays[carray]['replication_address'],
- }
- if P53_API_VERSION in api_version:
- conn_array_info[arrayname]['status'] = carrays[carray]['status']
- throttles = array.list_array_connections(throttle=True)
- for throttle in range(0, len(throttles)):
- arrayname = throttles[throttle]['array_name']
- if conn_array_info[arrayname]['throttled']:
- conn_array_info[arrayname]['throttling'] = {
- 'default_limit': throttles[throttle]['default_limit'],
- 'window_limit': throttles[throttle]['window_limit'],
- 'window': throttles[throttle]['window'],
- }
- return conn_array_info
-
-
-def generate_apps_dict(array):
- apps_info = {}
- api_version = array._list_available_rest_versions()
- if SAN_REQUIRED_API_VERSION in api_version:
- apps = array.list_apps()
- for app in range(0, len(apps)):
- appname = apps[app]['name']
- apps_info[appname] = {
- 'version': apps[app]['version'],
- 'status': apps[app]['status'],
- 'description': apps[app]['description'],
- }
- return apps_info
-
-
-def generate_vgroups_dict(array):
- vgroups_info = {}
- api_version = array._list_available_rest_versions()
- if AC_REQUIRED_API_VERSION in api_version:
- vgroups = array.list_vgroups()
- for vgroup in range(0, len(vgroups)):
- virtgroup = vgroups[vgroup]['name']
- vgroups_info[virtgroup] = {
- 'volumes': vgroups[vgroup]['volumes'],
- }
- return vgroups_info
-
-
-def generate_certs_dict(array):
- certs_info = {}
- api_version = array._list_available_rest_versions()
- if P53_API_VERSION in api_version:
- certs = array.list_certificates()
- for cert in range(0, len(certs)):
- certificate = certs[cert]['name']
- valid_from = time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.localtime(certs[cert]['valid_from'] / 1000))
- valid_to = time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.localtime(certs[cert]['valid_to'] / 1000))
- certs_info[certificate] = {
- 'status': certs[cert]['status'],
- 'issued_to': certs[cert]['issued_to'],
- 'valid_from': valid_from,
- 'locality': certs[cert]['locality'],
- 'country': certs[cert]['country'],
- 'issued_by': certs[cert]['issued_by'],
- 'valid_to': valid_to,
- 'state': certs[cert]['state'],
- 'key_size': certs[cert]['key_size'],
- 'org_unit': certs[cert]['organizational_unit'],
- 'common_name': certs[cert]['common_name'],
- 'organization': certs[cert]['organization'],
- 'email': certs[cert]['email'],
- }
- return certs_info
-
-
-def generate_kmip_dict(array):
- kmip_info = {}
- api_version = array._list_available_rest_versions()
- if P53_API_VERSION in api_version:
- kmips = array.list_kmip()
- for kmip in range(0, len(kmips)):
- key = kmips[kmip]['name']
- kmip_info[key] = {
- 'certificate': kmips[kmip]['certificate'],
- 'ca_cert_configured': kmips[kmip]['ca_certificate_configured'],
- 'uri': kmips[kmip]['uri'],
- }
- return kmip_info
-
-
-def generate_nfs_offload_dict(array):
- offload_info = {}
- api_version = array._list_available_rest_versions()
- if AC_REQUIRED_API_VERSION in api_version:
- offload = array.list_nfs_offload()
- for target in range(0, len(offload)):
- offloadt = offload[target]['name']
- offload_info[offloadt] = {
- 'status': offload[target]['status'],
- 'mount_point': offload[target]['mount_point'],
- 'protocol': offload[target]['protocol'],
- 'mount_options': offload[target]['mount_options'],
- 'address': offload[target]['address'],
- }
- return offload_info
-
-
-def generate_s3_offload_dict(array):
- offload_info = {}
- api_version = array._list_available_rest_versions()
- if S3_REQUIRED_API_VERSION in api_version:
- offload = array.list_s3_offload()
- for target in range(0, len(offload)):
- offloadt = offload[target]['name']
- offload_info[offloadt] = {
- 'status': offload[target]['status'],
- 'bucket': offload[target]['bucket'],
- 'protocol': offload[target]['protocol'],
- 'access_key_id': offload[target]['access_key_id'],
- }
- if P53_API_VERSION in api_version:
- offload_info[offloadt]['placement_strategy'] = offload[target]['placement_strategy']
- return offload_info
-
-
-def generate_azure_offload_dict(array):
- offload_info = {}
- api_version = array._list_available_rest_versions()
- if P53_API_VERSION in api_version:
- offload = array.list_azure_offload()
- for target in range(0, len(offload)):
- offloadt = offload[target]['name']
- offload_info[offloadt] = {
- 'status': offload[target]['status'],
- 'account_name': offload[target]['account_name'],
- 'protocol': offload[target]['protocol'],
- 'secret_access_key': offload[target]['secret_access_key'],
- 'container_name': offload[target]['container_name'],
- }
- return offload_info
-
-
-def generate_hgroups_dict(array):
- hgroups_info = {}
- hgroups = array.list_hgroups()
- for hgroup in range(0, len(hgroups)):
- hostgroup = hgroups[hgroup]['name']
- hgroups_info[hostgroup] = {
- 'hosts': hgroups[hgroup]['hosts'],
- 'pgs': [],
- 'vols': [],
- }
- pghgroups = array.list_hgroups(protect=True)
- for pghg in range(0, len(pghgroups)):
- pgname = pghgroups[pghg]['name']
- hgroups_info[pgname]['pgs'].append(pghgroups[pghg]['protection_group'])
- volhgroups = array.list_hgroups(connect=True)
- for pgvol in range(0, len(volhgroups)):
- pgname = volhgroups[pgvol]['name']
- volpgdict = [volhgroups[pgvol]['vol'], volhgroups[pgvol]['lun']]
- hgroups_info[pgname]['vols'].append(volpgdict)
- return hgroups_info
-
-
-def generate_interfaces_dict(array):
- api_version = array._list_available_rest_versions()
- int_info = {}
- ports = array.list_ports()
- for port in range(0, len(ports)):
- int_name = ports[port]['name']
- if ports[port]['wwn']:
- int_info[int_name] = ports[port]['wwn']
- if ports[port]['iqn']:
- int_info[int_name] = ports[port]['iqn']
- if NVME_API_VERSION in api_version:
- if ports[port]['nqn']:
- int_info[int_name] = ports[port]['nqn']
- return int_info
-
-
-def main():
- argument_spec = purefa_argument_spec()
- argument_spec.update(dict(
- gather_subset=dict(default='minimum', type='list',)
- ))
-
- module = AnsibleModule(argument_spec, supports_check_mode=False)
- array = get_system(module)
-
- subset = [test.lower() for test in module.params['gather_subset']]
- valid_subsets = ('all', 'minimum', 'config', 'performance', 'capacity',
- 'network', 'subnet', 'interfaces', 'hgroups', 'pgroups',
- 'hosts', 'admins', 'volumes', 'snapshots', 'pods',
- 'vgroups', 'offload', 'apps', 'arrays', 'certs', 'kmip')
- subset_test = (test in valid_subsets for test in subset)
- if not all(subset_test):
- module.fail_json(msg="value must gather_subset must be one or more of: %s, got: %s"
- % (",".join(valid_subsets), ",".join(subset)))
-
- info = {}
-
- if 'minimum' in subset or 'all' in subset or 'apps' in subset:
- info['default'] = generate_default_dict(array)
- if 'performance' in subset or 'all' in subset:
- info['performance'] = generate_perf_dict(array)
- if 'config' in subset or 'all' in subset:
- info['config'] = generate_config_dict(array)
- if 'capacity' in subset or 'all' in subset:
- info['capacity'] = generate_capacity_dict(array)
- if 'network' in subset or 'all' in subset:
- info['network'] = generate_network_dict(array)
- if 'subnet' in subset or 'all' in subset:
- info['subnet'] = generate_subnet_dict(array)
- if 'interfaces' in subset or 'all' in subset:
- info['interfaces'] = generate_interfaces_dict(array)
- if 'hosts' in subset or 'all' in subset:
- info['hosts'] = generate_host_dict(array)
- if 'volumes' in subset or 'all' in subset:
- info['volumes'] = generate_vol_dict(array)
- if 'snapshots' in subset or 'all' in subset:
- info['snapshots'] = generate_snap_dict(array)
- if 'hgroups' in subset or 'all' in subset:
- info['hgroups'] = generate_hgroups_dict(array)
- if 'pgroups' in subset or 'all' in subset:
- info['pgroups'] = generate_pgroups_dict(array)
- if 'pods' in subset or 'all' in subset:
- info['pods'] = generate_pods_dict(array)
- if 'admins' in subset or 'all' in subset:
- info['admins'] = generate_admin_dict(array)
- if 'vgroups' in subset or 'all' in subset:
- info['vgroups'] = generate_vgroups_dict(array)
- if 'offload' in subset or 'all' in subset:
- info['azure_offload'] = generate_azure_offload_dict(array)
- info['nfs_offload'] = generate_nfs_offload_dict(array)
- info['s3_offload'] = generate_s3_offload_dict(array)
- if 'apps' in subset or 'all' in subset:
- if 'CBS' not in info['default']['array_model']:
- info['apps'] = generate_apps_dict(array)
- else:
- info['apps'] = {}
- if 'arrays' in subset or 'all' in subset:
- info['arrays'] = generate_conn_array_dict(array)
- if 'certs' in subset or 'all' in subset:
- info['certs'] = generate_certs_dict(array)
- if 'kmip' in subset or 'all' in subset:
- info['kmip'] = generate_kmip_dict(array)
-
- module.exit_json(changed=False, purefa_info=info)
-
-
-if __name__ == '__main__':
- main()