# Copyright (c) 2001-2014 NetApp, Inc., All Rights Reserved # Any use, modification, or distribution is prohibited # without prior written consent from NetApp, Inc. # ## @summary StorageFailover ComponentState Module (auto-generated by CGT) ## @author dl-nacl-dev@netapp.com ## @status shared ## @pod here =head1 NAME NACL::CS::StorageFailover =head1 DESCRIPTION C is a derived class of L. It represents the state of an ONTAP StorageFailover. A related class is L, which represents access to an ONTAP StorageFailover. =head1 ATTRIBUTES The individual pieces of data that are part of the state of the StorageFailover element are the attributes of the StorageFailover ComponentState. Additionally, the command_interface used to obtain the ComponentState object is also an attribute of the object. This makes it easier to obtain the component object corresponding to the CS object, using L. =over =item command_interface The command_interface with which the CS object was obtained. (Available in all CS objects regardless of requested_fields and the mode/interface) =item C<< check_partner >> Check Partner Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mbx_abs_time_partner >> Partner Mailbox Absolute Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_sk_cycles_partner >> Partner IC CPU Cycles Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< node_state >> Node State Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< takeover_time >> Takeover Time Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< interconnect_up >> Interconnect Up possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< hwassist_health_check_interval >> Hwassist Health Check Interval (secs) ranges from 60 to 900 Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< node_name >> Node Name as Returned by Storage Failover Component Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< current_index >> Current Progress Index Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< missing_disks_local >> Disks Missing on Local Node (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $missing_disks_local = $obj->missing_disks_local(); # $missing_disks_local contains a reference to the array of values my @missing_disks_local = $obj->missing_disks_local(); # @missing_disks_local contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { missing_disks_local = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< enabled >> Takeover Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< firmware_received_cycles >> Firmware Received in CPU Cycles Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< auto_giveback_override_vetoes >> Auto-giveback Override Vetoes Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< minor_seq_num_partner >> Partner Minor Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< onfailure >> Takeover on Failure Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< partner_nvramid >> Partner NVRAM ID Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< total_system_uptime >> Total System Uptime Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< is_giveback_requested >> Giveback Requested possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< fanta_reloc_aggr_count >> Number of partner homed aggregates Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< possible >> Takeover Possible possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mailbox_disks_local >> Local Mailbox Disks (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $mailbox_disks_local = $obj->mailbox_disks_local(); # $mailbox_disks_local contains a reference to the array of values my @mailbox_disks_local = $obj->mailbox_disks_local(); # @mailbox_disks_local contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { mailbox_disks_local = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< auto_giveback_last_veto_check >> Auto Giveback Last Veto Check Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< firmware_received >> Firmware Received Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< takeover_by_partner_not_possible_reason >> Reason Takeover by Partner not Possible (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $takeover_by_partner_not_possible_reason = $obj->takeover_by_partner_not_possible_reason(); # $takeover_by_partner_not_possible_reason contains a reference to the array of values my @takeover_by_partner_not_possible_reason = $obj->takeover_by_partner_not_possible_reason(); # @takeover_by_partner_not_possible_reason contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { takeover_by_partner_not_possible_reason = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< auto_giveback_cifs_terminate_minutes >> Auto Giveback Delay Before Terminating CIFS (minutes) ranges from 0 to 999 Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< bypass_takeover_optimization >> Bypass Takeover Optimization Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< node >> Node possible value(s) are, ,local Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< interconnect_links >> Interconnect Links Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< current_entry >> Current Progress Entry Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_sk_cycles_local >> Local IC CPU Cycles Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< detection_time >> Takeover Detection Time (secs) ranges from 10 to 180 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< local_in_headswap >> Local node in headswap possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< missing_disks_partner >> Disks Missing on Partner Node (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $missing_disks_partner = $obj->missing_disks_partner(); # $missing_disks_partner contains a reference to the array of values my @missing_disks_partner = $obj->missing_disks_partner(); # @missing_disks_partner contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { missing_disks_partner = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< attempts >> Number of Giveback Attempts ranges from 2 to 10 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< partner_mailbox_state >> Partner Mailbox Status (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $partner_mailbox_state = $obj->partner_mailbox_state(); # $partner_mailbox_state contains a reference to the array of values my @partner_mailbox_state = $obj->partner_mailbox_state(); # @partner_mailbox_state contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { partner_mailbox_state = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< onpanic >> Takeover on Panic Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< reset_disks >> Issue Disk Resets during Failover possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< read_interval >> Node Status Read Interval (secs) ranges from 1 to 120 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< reason_enum >> Reason Takeover not Possible (Enum value) (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $reason_enum = $obj->reason_enum(); # $reason_enum contains a reference to the array of values my @reason_enum = $obj->reason_enum(); # @reason_enum contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { reason_enum = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< firmware_timeout >> Firmware Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< dumpcore_timeout >> Dumpcore Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< abort_operations >> Auto-Abort Operations Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_mailbox_disks >> Partner Mailbox Disks Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_abs_time_partner >> Partner IC Absolute Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_name >> Partner Name Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< fast_timeout >> Fast Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< takeover_failure_reason >> Reason why takeover failed Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< hwassist_partner_ip >> Partner's Hwassist IP Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_headswap_state >> Partner Head Swap State Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< slow_timeout >> Slow Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< is_mirror_enabled >> Is NVRAM Mirroring Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< bmbox_status >> Backup Mailbox Status (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $bmbox_status = $obj->bmbox_status(); # $bmbox_status contains a reference to the array of values my @bmbox_status = $obj->bmbox_status(); # @bmbox_status contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { bmbox_status = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< btransition >> Backup Transition IO Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< transit_timer >> Transit Timer Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< booting_received >> Booting Received Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< giveback_state >> Giveback State Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< hwassist_retry_count >> Hwassist Retry Count ranges from 0 to 4 Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< mbx_abs_time_local >> Local Mailbox Absolute Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< booting_timeout >> Booting Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< current_time >> Current System Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< local_firmware_progress >> Local Firmware Progress Counter Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mailbox_timeout >> Mailbox Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< major_seq_num_partner >> Partner Major Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< is_memory_insufficient >> Is Memory Insufficient To Takeover possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< time_since_takeover >> Time Since Takeover Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_abs_time_local >> Local IC Absolute Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< propagate >> Propagate Status via Mailbox possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< interconnect_type >> Interconnect Type Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< state_description >> State Description Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< partner_firmware_state >> Partner Firmware State Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< fm_giveback_state >> FM Giveback State Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_in_headswap >> Partner node in headswap possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_aggregates >> Control Partner Aggregates possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_reason_enum >> Reason Takeover not Possible by Partner (Enum value) (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $partner_reason_enum = $obj->partner_reason_enum(); # $partner_reason_enum contains a reference to the array of values my @partner_reason_enum = $obj->partner_reason_enum(); # @partner_reason_enum contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { partner_reason_enum = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_mbx_node_status >> Partner Mailbox Node Status Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< giveback_failure_reason >> Reason why giveback failed Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< operator_timeout >> Operator Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< hwassist_status >> Hwassist Status Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< mode >> HA Mode possible value(s) are, ha,non_ha Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< time_until_takeover >> Time Until Takeover Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< minor_seq_num_local >> Local Minor Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_sk_time_partner >> Partner IC Kernel Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< transit_time >> Transit Event Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< onreboot >> Takeover on Reboot Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< hwassist_partner_port >> Partner's Hwassist Port ranges from 4000 to 4500 Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_missing_disks >> Missing Disks on Partner Node Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_minor_seq_num_partner >> Partner IC Minor Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< reason >> Reason Takeover not Possible (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $reason = $obj->reason(); # $reason contains a reference to the array of values my @reason = $obj->reason(); # @reason contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { reason = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< was_auto_giveback_done >> Was Auto Giveback Done possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< local_mbx_node_status >> Local Mailbox Node Status Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< onshort_uptime >> Takeover on Short Uptime Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mbx_sk_cycles_partner >> Partner Mailbox CPU Cycles Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< write_interval >> Node Status Write Interval (secs) ranges from 1 to 120 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< memio_state >> Current State of Memio Link Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< takeover_by_partner_possible >> Takeover by partner possible possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< auto_giveback >> Auto Giveback Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< current_mode >> Current HA Mode possible value(s) are, ha,non_ha Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< pmbox_status >> Primary Mailbox Status (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $pmbox_status = $obj->pmbox_status(); # $pmbox_status contains a reference to the array of values my @pmbox_status = $obj->pmbox_status(); # @pmbox_status contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { pmbox_status = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< short_uptime >> Short Uptime (secs) ranges from 0 to 86400 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< hwassist >> Hardware Assist Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< is_degraded >> Are Partner Mailbox Disks Not Known possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< connect_timeout >> Connect Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< fm_takeover_state >> FM Takeover State Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< local_headswap_state >> Local Head Swap State Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< local_firmware_state >> Local Firmware State Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< ic_sk_time_local >> Local IC Kernel Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< reboot_timeout >> Reboot Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< takeover_state >> Takeover State Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< aggregate_migration_timeout >> Aggregate Migration Timeout (secs) ranges from 30 to 300 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< reserve_policy >> FM Reservation Policy Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< is_mirror_consistency_required >> Is Mirror Consistency Required possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< mbx_sk_time_local >> Local Mailbox Kernel Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< current_giveback_module >> Current Giveback Module Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< current_takeover_module >> Current Takeover Module Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< state >> State Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< bnormal >> Backup Normal IO Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< mbx_sk_cycles_local >> Local Mailbox CPU Cycles Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< is_auto_giveback_attempts_exceeded >> Auto Giveback Attempts Exceeded possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< auto_sendhome >> Auto Sendhome Enabled possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_reason >> Reason Takeover not Possible by Partner (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $partner_reason = $obj->partner_reason(); # $partner_reason contains a reference to the array of values my @partner_reason = $obj->partner_reason(); # @partner_reason contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { partner_reason = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_firmware_progress >> Partner Firmware Progress Counter Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< local_takeover_info >> Local Takeover Info Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ic_major_seq_num_partner >> Partner IC Major Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< mailbox_disks_partner >> Partner Mailbox Disks (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $mailbox_disks_partner = $obj->mailbox_disks_partner(); # $mailbox_disks_partner contains a reference to the array of values my @mailbox_disks_partner = $obj->mailbox_disks_partner(); # @mailbox_disks_partner contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { mailbox_disks_partner = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< local_mailbox_disks >> Local Mailbox Disks Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_takeover_info >> Partner Takeover Info Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< maximum_index >> Maximum Progress Index Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< local_missing_disks >> Missing Disks on Local Node Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< takeover_reason >> Reason why takeover triggered Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< logs_unsynced >> Logs Unsynced Count Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< major_seq_num_local >> Local Major Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< killpackets >> Issue Kill Packets possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< transit_timeout >> Transit Timeout Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< takeover_of_partner_not_possible_reason >> Reason Takeover of Partner not Possible (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $takeover_of_partner_not_possible_reason = $obj->takeover_of_partner_not_possible_reason(); # $takeover_of_partner_not_possible_reason contains a reference to the array of values my @takeover_of_partner_not_possible_reason = $obj->takeover_of_partner_not_possible_reason(); # @takeover_of_partner_not_possible_reason contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { takeover_of_partner_not_possible_reason = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mbx_minor_seq_num_partner >> Partner Mailbox Minor Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< delay_seconds >> Delay Before Auto Giveback (secs) ranges from 0 to 600 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mbx_sk_time_partner >> Partner Mailbox Kernel Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< local_mailbox_state >> Local Mailbox Status (Array) Note that for array fields, the accessor method can be invoked in either scalar or list context. my $local_mailbox_state = $obj->local_mailbox_state(); # $local_mailbox_state contains a reference to the array of values my @local_mailbox_state = $obj->local_mailbox_state(); # @local_mailbox_state contains the array of values If this field needs to be passed to the filter hash, the value for this field should be passed in as an arrayref # filter => { local_mailbox_state = [ value1, value2...] } Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< time_until_autogiveback >> Time Until Auto Giveback (secs) Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< partner_state >> Partner State Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< pnormal >> Primary Normal IO Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< cifs_ndo_duration >> CIFS NDO Duration possible value(s) are, default,medium,low Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< is_cifs_auto_giveback_stopping >> Is CIFS Auto Giveback Stopping possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< nvramid >> Node NVRAM ID Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< cancel_auto_giveback_network_failure >> Cancel Auto Giveback if Network Failure Takeover possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< ptransition >> Primary Transition IO Time Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< attempts_time >> Giveback Attempts Period (minutes) ranges from 1 to 90 Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =item C<< mbx_major_seq_num_partner >> Partner Mailbox Major Sequence Number Filled in for CMode CLI/ZAPI iter, non-iter. =item C<< auto_giveback_after_panic >> Auto Giveback After Takeover On Panic possible value(s) are, true,false Filled in for CMode CLI/ZAPI iter, non-iter. Mapping for CMode ZAPI iter: Mapping for CMode ZAPI non-iter: =back =cut package NACL::CS::StorageFailover; use strict; use warnings; use Params::Validate qw(validate); use NACL::ComponentUtils qw(_dump_one); use NACL::Exceptions::InvalidChoice; use NACL::Exceptions::NoElementsFound qw(:try); use NATE::Log qw(log_global); my $Log = log_global(); my $may_enter = $Log->may_enter(); my $may_exit = $Log->may_exit(); use NACL::CS::ComponentState::ZapiSkip qw(make_zapi_skip); use NACL::CS::ComponentState::ZapiArray qw(make_zapi_array); use base 'NACL::CS::ComponentState::ONTAP'; use Data::Dumper; use Class::MethodMaker [ scalar => 'node', scalar => 'partner_name', scalar => 'nvramid', scalar => 'partner_nvramid', scalar => 'enabled', scalar => 'possible', array => 'reason', scalar => 'interconnect_up', scalar => 'state', scalar => 'time_until_takeover', array => 'partner_reason', scalar => 'killpackets', scalar => 'partner_aggregates', scalar => 'current_index', scalar => 'current_entry', scalar => 'maximum_index', array => 'pmbox_status', array => 'bmbox_status', scalar => 'fast_timeouts', scalar => 'low_timeout', scalar => 'mailbox_timeout', scalar => 'connect_timeout', scalar => 'operator_timeout', scalar => 'firmware_timeout', scalar => 'dumpcore_timeout', scalar => 'booting_timeout', scalar => 'transit_timer', scalar => 'transit_timeout', scalar => 'firmware_received', scalar => 'booting_received', scalar => 'transit_time', scalar => 'pnormal', scalar => 'ptransition', scalar => 'bnormal', scalar => 'btransition', scalar => 'logs_unsynced', scalar => 'auto_giveback', scalar => 'abort_operations', scalar => 'check_partner', scalar => 'detection_time', scalar => 'onfailure', scalar => 'onpanic', scalar => 'onshort_uptime', scalar => 'short_uptime', scalar => 'attempts', scalar => 'attempts_time', scalar => 'propagate', scalar => 'read_interval', scalar => 'write_interval', scalar => 'onreboot', scalar => 'delay_seconds', scalar => 'state_description', scalar => 'ha_type', # Zapi 7 mode fields scalar => 'current_time', scalar => 'time_master_status', scalar => 'hwassist_status', scalar => 'hwassist_partner_port', scalar => 'hwassist_health_check_interval', scalar => 'node_name', scalar => 'hwassist', scalar => 'interconnect_links', scalar => 'local_firmware_state', array => 'reason_enum', scalar => 'partner_mailbox_disks', scalar => 'fast_timeout', scalar => 'hwassist_partner_ip', scalar => 'auto_sendhome', scalar => 'slow_timeout', scalar => 'partner_firmware_progress', scalar => 'hwassist_retry_count', scalar => 'local_mailbox_disks', scalar => 'local_firmware_progress', scalar => 'interconnect_type', scalar => 'partner_firmware_state', scalar => 'time_until_autogiveback', scalar => 'partner_state', scalar => 'cancel_auto_giveback_network_failure', array => 'partner_reason_enum', #7 mode cli fields scalar => 'partner', scalar => 'cluster_monitor', scalar => 'partner_missing_disks', scalar => 'local_missing_disks', scalar => 'reboot_timeout', scalar => 'time_since_takeover', scalar => 'mode', scalar => 'current_mode', scalar => 'bypass_optimization', scalar => 'bypass_takeover_optimization', scalar => 'aggregate_migration_timeout', scalar => 'auto_giveback_override_vetoes', scalar => 'auto_giveback_after_panic', scalar => 'node_state', scalar => 'fanta_reloc_aggr_count', scalar => 'local_in_headswap', scalar => 'takeover_state', scalar => 'current_giveback_module', scalar => 'current_takeover_module', scalar => 'giveback_state', scalar => 'partner_in_headswap', scalar => 'takeover_time', array => 'missing_disks_local', array => 'mailbox_disks_local', scalar => 'takeover_by_partner_possible', array => 'takeover_by_partner_not_possible_reason', array => 'missing_disks_partner', array => 'partner_mailbox_state', scalar => 'takeover_failure_reason', array => 'mailbox_disks_partner', array => 'takeover_of_partner_not_possible_reason', array => 'local_mailbox_state', scalar => 'giveback_failure_reason', scalar => 'cifs_ndo_duration', scalar => 'mbx_abs_time_partner', scalar => 'ic_sk_cycles_partner', scalar => 'firmware_received_cycles', scalar => 'minor_seq_num_partner', scalar => 'total_system_uptime', scalar => 'is_giveback_requested', scalar => 'auto_giveback_last_veto_check', scalar => 'ic_sk_cycles_local', scalar => 'reset_disks', scalar => 'ic_abs_time_partner', scalar => 'partner_headswap_state', scalar => 'is_mirror_enabled', scalar => 'mbx_abs_time_local', scalar => 'major_seq_num_partner', scalar => 'is_memory_insufficient', scalar => 'ic_abs_time_local', scalar => 'fm_giveback_state', scalar => 'partner_mbx_node_status', scalar => 'minor_seq_num_local', scalar => 'ic_sk_time_partner', scalar => 'ic_minor_seq_num_partner', scalar => 'was_auto_giveback_done', scalar => 'local_mbx_node_status', scalar => 'mbx_sk_cycles_partner', scalar => 'memio_state', scalar => 'is_degraded', scalar => 'fm_takeover_state', scalar => 'local_headswap_state', scalar => 'ic_sk_time_local', scalar => 'reserve_policy', scalar => 'is_mirror_consistency_required', scalar => 'mbx_sk_time_local', scalar => 'is_auto_giveback_attempts_exceeded', scalar => 'mbx_sk_cycles_local', scalar => 'ic_major_seq_num_partner', scalar => 'local_takeover_info', scalar => 'partner_takeover_info', scalar => 'major_seq_num_local', scalar => 'mbx_minor_seq_num_partner', scalar => 'mbx_sk_time_partner', scalar => 'is_cifs_auto_giveback_stopping', scalar => 'mbx_major_seq_num_partner', scalar => 'auto_giveback_cifs_terminate_minutes', scalar => 'takeover_reason', ]; sub isa { $Log->enter() if $may_enter; my ($pkg_or_obj, $kind) = @_; my $isa = $pkg_or_obj->_build_isa( kind => $kind, alias => 'NACL::CS::Failover' ); $Log->exit() if $may_exit; return $isa; } =head1 METHODS =head2 fetch my $node_state = NACL::CS::StorageFailover->fetch(command_interface=>$ci,...); my @node_states = NACL::CS::StorageFailover->fetch(command_interface=>$ci,...); see L =over =item Exceptions =over =item C When there are no elements matching the query specified or elements of that type doesn't exist, then this exception will be thrown. =back =back =cut sub fetch { $Log->enter() if $may_enter; my ($pkg, @args) = @_; my @state_objs = $pkg->SUPER::fetch( @args, choices => [ { method => "_fetch_cmode_cli", interface => "CLI", set => "CMode", zapi_type => 'none', }, { method => '_fetch_cmode_zapi', interface => 'ZAPI', set => 'CMode', zapi_type => 'iter', check => "_check_cmode_zapi", }, { method => '_fetch_cmode_zapi_non_iter', interface => 'ZAPI', set => 'CMode', zapi_type => 'non-iter', check => "_check_filter_node", }, { method => "_fetch_7mode_cli", interface => "CLI", set => "7Mode", }, { method => "_fetch_7mode_zapi", interface => "ZAPI", set => "7Mode", }, ], show_cmd => 'storage failover show', exception_text => 'No matching StorageFailover found' ); $Log->exit() if $may_exit; return wantarray ? @state_objs : $state_objs[0]; } ## end sub fetch sub _fetch_cmode_cli { my $pkg = shift; return $pkg->SUPER::_fetch_cmode_cli(@_, api => "storage_failover_show"); } sub _fetch_7mode_zapi { my $pkg = shift; my %opts = validate @_, $pkg->_fetch_backend_validate_spec(); my $apiset = delete $opts{apiset}; delete $opts{filter}; my $response = $apiset->cf_status(); my $output = $response->get_parsed_output(); my @state_objs; foreach my $cf_output (@{$output}) { my $obj = $pkg->new(); my $target = $pkg->_zapi_hash_copy( source => $cf_output, copy => [qw(state)], map => [ 'is-enabled' => 'enabled', 'is-interconnect-up' => 'interconnect_up', 'partner' => 'partner_name' ] ); $obj->_set_fields(row => $target); push @state_objs, $obj; } ## end foreach my $cf_output ( @{$output... return @state_objs; } ## end sub _fetch_7mode_zapi sub _fetch_cmode_zapi_non_iter { my $pkg = shift; my %opts = validate @_, $pkg->_fetch_backend_validate_spec(); my $apiset = delete $opts{apiset}; my $filter = delete $opts{filter}; if (!exists($filter->{node})) { NATE::BaseException->throw( 'Mandatory field "node" needs to be passed via "filter"'); } my $response = $apiset->cf_status(node => $filter->{node}); my $output = $response->get_parsed_output(); my @state_objs; foreach my $cf_output (@{$output}) { my $obj = $pkg->new(); my $target = $pkg->_zapi_hash_copy( source => $cf_output, copy => [ qw(state time-until-takeover booting-received firmware-received current-time time-master-status interconnect-links interconnect-type local-firmware-progress local-firmware-state local-mailbox-disks partner-firmware-progress partner-firmware-state partner-mailbox-disks partner-name giveback-state current-giveback-module) ], map => [ 'is-enabled' => 'enabled', 'is-interconnect-up' => 'interconnect_up', 'partner' => 'partner_name', 'takeover-failure-reason' => 'reason', 'backup-io-times' => 'bnormal', 'backup-mailbox-status' => 'bmbox_status', 'control-partner-aggregates' => 'partner_aggregates', 'current-resource-table-entry' => 'current_entry', 'current-resource-table-entry-index' => 'current_index', 'kill-packets' => 'killpackets', 'logs-unsynced-count' => 'logs_unsynced', 'max-resource-table-index' => 'maximum_index', 'name' => 'node_name', 'nvram-id' => 'nvramid', 'partner-nvram-id' => 'partner_nvramid', 'primary-io-times' => 'pnormal', 'primary-mailbox-status' => 'pmbox_status', 'takeover-possible' => 'possible', 'time-until-auto-giveback' => 'time_until_autogiveback', 'transit-event-time' => 'transit_time', 'name' => 'node', ] ); my @values; if ($target->{'partner-mailbox-disks'}) { foreach my $temp ( @{$target->{'partner-mailbox-disks'}[0]->{'sf-disk-info'}}) { push @values, $temp->{name} if (defined $temp->{name}); } if (@values) { $target->{'partner-mailbox-disks'} = join ',', @values; } } my @local_m_values; if ($target->{'local-mailbox-disks'}) { foreach my $tem ( @{$target->{'local-mailbox-disks'}[0]->{'sf-disk-info'}}) { push @local_m_values, $tem->{'sf-disk-info'} if (defined $tem->{'sf-disk-info'}); } if (@values) { $target->{'local-mailbox-disks'} = join ',', @local_m_values; } } if ($target->{'pnormal'}) { $target->{'pnormal'} = $target->{'pnormal'}->[0]{'mailbox-io-times-info'} ->[0]{normal}; } if ($target->{'bnormal'}) { $target->{'bnormal'} = $target->{'bnormal'}->[0]{'mailbox-io-times-info'} ->[0]{normal}; } if ($cf_output->{'sf-options'}->[0]{'sf-options-info'}) { my $copy_opts = [ qw(hwassist-health-check-interval hwassist-partner-ip hwassist-retry-count hwassist-partner-port bypass-takeover-optimization ) ]; my $map = { 'takeover-on-reboot' => 'onreboot', 'takeover-on-failure' => 'onfailure', 'send-home-auto-attempts-minutes' => 'attempts_time', 'send-home-auto-attempts' => 'attempts', 'node-status-in-mailbox-disks-read-interval' => 'read_interval', 'node-status-in-mailbox-disks-write-interval' => 'write_interval', 'takeover-on-panic' => 'onpanic', 'hwassist-enable' => 'hwassist', 'takeover-on-short-uptime' => 'onshort_uptime', 'giveback-auto' => 'auto_giveback', 'send-home-check-partner-waiting' => 'check_partner', 'send-home-auto-delay-seconds' => 'delay_seconds', }; $pkg->_hash_copy( source => $cf_output->{'sf-options'}->[0]{'sf-options-info'}->[0], copy => $copy_opts, map => $map, target => $target, ); } $obj->_set_fields(row => $target); push @state_objs, $obj; } ## end foreach my $cf_output ( @{$output... return @state_objs; } ## end sub _fetch_cmode_non_iter_zapi sub _fetch_cmode_zapi { $Log->enter() if $may_enter; my ($pkg, @args) = @_; my @state_objs = $pkg->SUPER::_fetch_cmode_zapi( @args, map => { 'check-partner' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info' ], 'takeover-time' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'time-since-takeover' ], 'node-state' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'node-state' ], state => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'node-state', ], 'interconnect-up' => [ 'sfo-interconnect-info', make_zapi_skip('interconnect-related-info'), 'is-interconnect-up' ], 'missing-disks-local' => [ make_zapi_array('sfo-storage-info'), make_zapi_skip('storage-related-info'), ], 'auto-giveback-override-vetoes' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info', make_zapi_skip('giveback-options'), 'auto-giveback-override-vetoes-enabled', ], 'onfailure' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'takeover-onfailure-enabled', ], 'partner-nvramid' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'partner-nvram-id' ], 'mailbox-disks-local' => [ make_zapi_array('sfo-storage-info'), make_zapi_skip('storage-related-info'), ], 'possible' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-of-partner-possible' ], 'takeover-by-partner-not-possible-reason' => [ make_zapi_array('sfo-takeover-info'), make_zapi_skip('takeover-related-info'), ], 'bypass-takeover-optimization' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'bypass-takeover-optimization-enabled' ], 'node' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'node' ], 'interconnect-links' => [ 'sfo-interconnect-info', make_zapi_skip('interconnect-related-info'), 'interconnect-links' ], 'detection-time' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'takeover-detection-interval', ], 'missing-disks-partner' => [ make_zapi_array('sfo-storage-info'), make_zapi_skip('storage-related-info'), ], 'partner-mailbox-state' => [ make_zapi_array('sfo-storage-info'), make_zapi_skip('storage-related-info'), ], 'attempts' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info', make_zapi_skip('giveback-options'), 'giveback-attempts-count', ], 'onpanic' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'takeover-onpanic-enabled', ], 'read-interval' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-advanced-options-info', make_zapi_skip('advanced-options'), 'read-interval', ], 'partner-name' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'partner-name' ], 'takeover-failure-reason' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-failure-reason' ], 'giveback-state' => [ 'sfo-giveback-info', make_zapi_skip('giveback-related-info'), 'giveback-state' ], 'local-firmware-progress' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'local-firmware-progress' ], 'propagate' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-advanced-options-info', make_zapi_skip('advanced-options'), 'propagate-mailbox-enabled', ], 'state-description' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'state-description' ], 'interconnect-type' => [ 'sfo-interconnect-info', make_zapi_skip('interconnect-related-info'), 'interconnect-type' ], 'partner-firmware-state' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'partner-firmware-state' ], 'giveback-failure-reason' => [ 'sfo-giveback-info', make_zapi_skip('giveback-related-info'), 'giveback-failure-reason' ], 'mode' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'ha-mode' ], 'time-until-takeover' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'time-until-takeover' ], 'onreboot' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'takeover-onreboot-enabled', ], 'onshort-uptime' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'takeover-onshort-uptime-enabled', ], 'write-interval' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-advanced-options-info', make_zapi_skip('advanced-options'), 'write-interval', ], 'takeover-by-partner-possible' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-by-partner-possible' ], 'current-mode' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'current-mode' ], 'short-uptime' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-takeover-options-info', make_zapi_skip('takeover-options'), 'short-uptime-duration', ], 'local-firmware-state' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'local-firmware-state' ], 'takeover-state' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-state' ], 'aggregate-migration-timeout' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-advanced-options-info', make_zapi_skip('advanced-options'), 'aggregate-migration-timeout' ], 'current-giveback-module' => [ 'sfo-giveback-info', make_zapi_skip('giveback-related-info'), 'giveback-module' ], 'current-takeover-module' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-module' ], 'partner-firmware-progress' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'partner-firmware-progress' ], 'mailbox-disks-partner' => [ make_zapi_array('sfo-storage-info'), make_zapi_skip('storage-related-info'), ], 'takeover-reason' => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-reason' ], 'takeover-of-partner-not-possible-reason' => [ make_zapi_array('sfo-takeover-info'), make_zapi_skip('takeover-related-info'), ], 'delay-seconds' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info', make_zapi_skip('giveback-options'), 'autogiveback-delay', ], 'local-mailbox-state' => [ make_zapi_array('sfo-storage-info'), make_zapi_skip('storage-related-info'), ], 'cifs-ndo-duration' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-advanced-options-info', make_zapi_skip('advanced-options'), 'cifs-ndo-duration' ], 'nvramid' => [ 'sfo-node-info', make_zapi_skip('node-related-info'), 'nvram-id' ], 'attempts-time' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info', make_zapi_skip('giveback-options'), 'giveback-attempts-interval', ], 'auto-giveback-after-panic' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info', make_zapi_skip('giveback-options'), 'auto-giveback-after-panic-enabled', ], 'auto-giveback' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'auto-giveback-enabled', ], 'check-partner' => [ 'sfo-options-info', make_zapi_skip('options-related-info'), 'sfo-giveback-options-info', make_zapi_skip('giveback-options'), 'check-partner-enabled', ], enabled => [ 'sfo-takeover-info', make_zapi_skip('takeover-related-info'), 'takeover-enabled', ], }, api => "cf-get-iter", ); $Log->exit() if $may_exit; return @state_objs; } ## end sub _fetch_cmode_iter_zapi sub _fetch_7mode_cli { my $pkg = shift; my %opts = validate @_, $pkg->_fetch_backend_validate_spec(); my $command_interface = $opts{command_interface}; my $apiset = $opts{apiset}; my %copy_filter = %{$opts{filter}}; my @copy_requested_fields = @{$opts{requested_fields}}; my $deleted_filter = $pkg->_remove_relational_regex_filters( filter => \%copy_filter, requested_fields => \@copy_requested_fields ); my $filter = \%copy_filter; my $requested_fields = \@copy_requested_fields; my $req_field_filter; $req_field_filter->{'requested_fields'} = $requested_fields; $req_field_filter->{'filter'} = \%copy_filter; my @state_objs; my $cf_monitor_hash = {}; my $cf_status_hash = {}; $pkg->_hash_copy( source => \%opts, target => $req_field_filter, copy => [qw(requested_fields filter)] ); if ($pkg->_want_any_field_of( %{$req_field_filter}, fields_filled_by_api => [qw(enabled partner-state partner-name)] ) ) { my $cf_monitor_resp = $apiset->cf_monitor(); my $cf_monitor_output = $cf_monitor_resp->get_parsed_output(); $cf_monitor_hash = $cf_monitor_output->[0]; } ## end if ( $pkg->_want_any_field_of... if ($pkg->_want_any_field_of( %{$req_field_filter}, fields_filled_by_api => [qw(possible reason interconnect-up)] ) ) { my $cf_status_resp = $apiset->cf_status(); my $cf_status_output = $cf_status_resp->get_parsed_output(); $cf_status_hash = $cf_status_output->[0]; } ## end if ( $pkg->_want_any_field_of... # 7mode fields added: cf.takeover.on_disk_shelf_miscompare, # cf.giveback.auto.terminate.bigjobs cf.takeover.change_fsid # cf.takeover.on_network_interface_failure.policy # cf.takeover.use_mcrc_file cf.takeover.on_network_interface_failure # cf.giveback.auto.cifs.terminate.minutes cf.giveback.auto.cancel.on_network_failure # cf.nodestatus.enable cf.mode my @fields_filled_by_options = ( qw(hwassist-partner-ip cf.takeover.on_disk_shelf_miscompare cf.giveback.auto.terminate.bigjobs onpanic cf.takeover.change_fsid short-uptime cf.takeover.on_network_interface_failure.policy check-partner cf.takeover.use_mcrc_file onfailure delay-seconds cf.takeover.on_network_interface_failure cf.giveback.auto.cifs.terminate.minutes hwassist-partner-port onreboot cf.giveback.auto.cancel.on_network_failure hwassist cf.nodestatus.enable detection-time auto-giveback mode auto-giveback-after-panic) ); my $options_hash = {}; if ($pkg->_want_any_field_of( %{$req_field_filter}, fields_filled_by_api => \@fields_filled_by_options ) ) { my $options_response = $apiset->options('show-options' => 'cf'); my $options_output = $options_response->get_parsed_output(); $options_hash = $options_output->[0]; } ## end if ( $pkg->_want_any_field_of... my %final_attributes = (%$options_hash, %$cf_monitor_hash, %$cf_status_hash); # Using _hash_move so that we don't need to specify all the # options to copy $pkg->_hash_move( source => \%final_attributes, map => { 'cf.hw_assist.partner.address' => 'hwassist-partner-ip', 'cf.takeover.on_panic' => 'onpanic', 'cf.takeover.on_short_uptime' => 'short-uptime', 'cf.giveback.check.partner' => 'check-partner', 'cf.takeover.on_failure' => 'onfailure', 'cf.giveback.auto.delay.seconds' => 'delay-seconds', 'cf.hw_assist.partner.port' => 'hwassist-partner-port', 'cf.takeover.on_reboot' => 'onreboot', 'cf.hw_assist.enable' => 'hwassist', 'cf.takeover.detection.seconds' => 'detection-time', 'cf.giveback.auto.enable' => 'auto-giveback', cluster_monitor => 'enabled', partner => 'partner-name', state => 'partner-state', interconnect_status => 'interconnect-up', 'cf.mode' => 'mode', 'cf.giveback.auto.after.panic.takeover' => 'auto-giveback-after-panic', }, target => \%final_attributes ); if (defined($final_attributes{enabled})) { if ($final_attributes{enabled} =~ /enabled/) { $final_attributes{enabled} = 'true'; } elsif ($final_attributes{enabled} =~ /disabled/) { $final_attributes{enabled} = 'false'; } else { $final_attributes{enabled} = '-'; } } ## end if ( defined( $final_attributes... if (defined($final_attributes{interconnect_up})) { if ($final_attributes{interconnect_up} =~ /up/i) { $final_attributes{interconnect_up} = 'true'; } elsif ($final_attributes{interconnect_up} =~ /down/i) { $final_attributes{interconnect_up} = 'false'; } else { $final_attributes{interconnect_up} = '-'; } } ## end if ( defined( $final_attributes... foreach my $attribute ( qw(check-partner hwassist onfailure onpanic onreboot auto-giveback auto-giveback-after-panic) ) { if (defined($final_attributes{$attribute})) { if ($final_attributes{$attribute} =~ /on/) { $final_attributes{$attribute} = 'true'; } elsif ($final_attributes{$attribute} =~ /off/) { $final_attributes{$attribute} = 'false'; } } ## end if ( defined( $final_attributes... } ## end foreach my $attribute (... $final_attributes{node} = $command_interface->node(); my $readfw_options = {}; my $readfw_hash; my $target_readfw = {}; my @fields_filled_by_readfw = qw(local-firmware-state partner-firmware-state); if ($pkg->_want_any_field_of( %{$req_field_filter}, fields_filled_by_api => \@fields_filled_by_readfw ) ) { my $readfw_response = $apiset->cf_readfw(); my $readfw_output = $readfw_response->get_parsed_output(); $readfw_hash = $readfw_output->[0]; $pkg->_hash_move( source => $readfw_hash, target => $target_readfw, map => { 'local_state' => 'local_firmware_state', 'partner_state' => 'partner_firmware_state' } ); } ## end if ( $pkg->_want_any_field_of... %final_attributes = (%final_attributes, %$target_readfw); my $obj = $pkg->new( command_interface => $opts{command_interface}, node => $final_attributes{'node'} ); $obj->_set_fields(row => \%final_attributes); push @state_objs, $obj; return @state_objs; } ## end sub _fetch_7mode_cli sub _check_filter_node { $Log->enter() if $may_enter; my ($pkg_or_obj, %opts) = @_; my $filter = $opts{filter}; $pkg_or_obj->_process_options(options => $filter); my $node = $filter->{node}; if (!defined $node) { $Log->exit() if $may_exit; NACL::Exceptions::InvalidChoice->throw( 'Mandatory field "node" needs to be passed via "filter"'); } else { my $has_sp_chr = $pkg_or_obj->_check_relational_regex_filter( filter_value => $node); if ($has_sp_chr) { $Log->exit() if $may_exit; NACL::Exceptions::InvalidChoice->throw('Cannot use the ZAPI ' . "implementation because the 'node' specified (value = " . "'$node') has special characters"); } } $Log->exit() if $may_exit; } sub _check_cmode_zapi { $Log->enter() if $may_enter; my ($pkg, %opts) = @_; my $filter = $opts{filter}; my @requested = @{$opts{requested_fields}}; if ('abort-operations' ~~ @requested || defined $filter->{'abort-operations'}) { $Log->exit() if $may_exit; NACL::Exceptions::InvalidChoice->throw("'abort-operations' is not supported " . "by 'cf-get-iter' ZAPI in NACL::CS::StorageFailover, hence ZAPI cannot be used. "); } } 1;