.. _dish_manager_transitions: ========================================== States and Mode Transitions ========================================== The Dish Manager acts as the high-level orchestration TANGO device for the Dish. As such, it does not have a physical statits own; instead, it aggregates and computes its states, modes, and configurations based on the statuses of its underlying sub-elements: * **DS** (Dish Structure) * **SPF** (Single Pixel Feed Controller) * **SPFRx** (Single Pixel Feed Receiver) State computation is handled dynamically by evaluating a set of predefined transition rules using the ``rule_engine`` library. These rules are housed in the ``ska_mid_dish_manager.models.transition_rules`` directory. -------------------------------------------------- Commands, Target States, and Aggregated Attributes -------------------------------------------------- When the Dish Manager receives a command, it does not immediately change its own state. Instead, it delegates the command down to the relevant sub-elements and monitors their telemetry. The Dish Manager only transitions to the **Desired State** once the transition rules calculate that the **Aggregated Attributes** from the specific **Target Sub-devices** have reached their required values. +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ | Commands | Desired dishMode | Target Sub-device(s) | Additional dishMode attribute(s) | Attributes to watch and their expected values | +=========================+==============================+=============================+==================================+===============================================+ || ``SetStandbyLPMode`` || ``STANDBY_LP`` || **DS**, **SPF**, **SPFRx** || || ``operatingMode`` | || || || || || DSOperatingMode.STANDBY (DS) | || || || || || SPFOperatingMode.STANDBY_LP (SPF) | || || || || || SPFRxOperatingMode.STANDBY (SPFRx) | || || || || || ``powerState`` | || || || || || DSPowerState.LOW_POWER (DS) | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``SetStandbyFPMode`` || ``STANDBY_FP`` || **DS**, **SPF**, **SPFRx** || || ``operatingMode`` | || || || || || DSOperatingMode.STANDBY (DS) | || || || || || ``powerState`` | || || || || || DSPowerState.FULL_POWER (DS) | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``SetStowMode`` || ``STOW`` || **DS** || || ``operatingMode`` | || || || || || DSOperatingMode.STOW | || || || || || ``achievedPointing`` | || || || || || desiredpointingel == 90 degrees | || || || || || | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``SetMaintenanceMode`` || ``MAINTAINANCE`` || **DS**, **SPF**, **SPFRx** || || ``operatingMode`` | || || || || || DSOperatingMode.STOW | || || || || || SPFRxOperatingMode.STANDBY | || || || || || SPFOperatingMode.MAINTENANCE | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``ConfigureBand`` || ``OPERATE`` (with new Band) || **DS**, **SPF**, **SPFRx** || || ``configuredBand`` | || [1, 2, 3, 4, 5a, 5b] || || || || SPFRx.configuredband (SPF) | || || || || || ``bandInFocus`` | || || || || || SPF.bandinfocus (SPF) | || || || || || ``indexerPosition`` | || || || || || DS.indexerposition (DS) | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``Scan`` || ``SLEW`` || **DS** || || ``pointingState`` | || || || || || PointingState.SLEW (DS) | || || ``TRACK`` || || || ``desiredPointing`` | || || || || || ``achievedPointing`` | || || || || || ``achievedTargetLock`` | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``Track`` || ``SLEW`` || **DS** || || ``pointingState`` | || || ``TRACK`` || || || PointingState.SLEW (DS) | || || || || || ``desiredPointing`` | || || || || || ``achievedPointing`` | || || || || || ``achievedTargetLock`` | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ | ``Slew`` | ``SLEW`` | **DS** | | ``pointingState`` | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ | ``TrackStop`` | ``READY`` | **DS** | | PointingState.READY | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ || ``TrackLoadStaticOff`` || || **DS** || || actstaticoffsetvaluexel | || || || || || actstaticoffsetvalueel | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ | ``SetKvalue`` | | **SPFRx** | KValue updated | | +-------------------------+------------------------------+-----------------------------+----------------------------------+-----------------------------------------------+ ------------------------------------------ Transition Logic and ignored sub-elements ------------------------------------------ To support engineering, maintenance, and partial-system operations, the Dish Manager allows operators to "ignore" certain sub-elements. The transition engine dynamically swaps the rule sets based on which devices are currently active or ignored. For every aggregated state, the Dish Manager defines specific rule sets such as: * ``RULES_ALL_DEVICES``: Evaluated when all sub-elements are communicating and monitored. * ``RULES_SPF_IGNORED``: Evaluated when the SPF controller is ignored. * ``RULES_SPFRX_IGNORED``: Evaluated when the SPFRx device is ignored. * ``RULES_DS_ONLY``: Evaluated when only the Dish Structure is monitor .. Note:: Users can configure the sub-element(s) actively being controlled and monitored by Dish Manager by setting the following boolean attributes on the dish manager interface; * 'ignorespf' * 'ignorespfrx' ------------------------------------------ Power State Transitions ------------------------------------------ The overall Dish Manager Power State (e.g., ``UPS``, ``LOW_POWER``, ``FULL_POWER``, ``OFF``) is computed by checking the power states of the sub-elements. Power State Rule Evaluation ------------------------------------------ When calculating the aggregated Power State, the Dish Manager uses different rule dictionaries depending on whether there are any sub-elements monitored or ignored. Below are the decision tables based on transition rules evaluated by the engine when all devices are active, as well as when sub-device(s) are ignored: POWER_STATE_RULES_ALL_DEVICES ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------+-----------------------------------------------------------------------------------------+ | Rule | Condition | +===================+=========================================================================================+ | UPS | DS.powerstate in ['DSPowerState.UPS', 'DSPowerState.OFF'] | +-------------------+-----------------------------------------------------------------------------------------+ || LOW (Case 1) || DS.powerstate == 'DSPowerState.LOW_POWER' | + +-----------------------------------------------------------------------------------------+ || LOW (Case 2) || DS.powerstate == 'DSPowerState.UNKNOWN' **and** | || || SPF.powerstate == 'SPFPowerState.LOW_POWER' | + +-----------------------------------------------------------------------------------------+ || LOW (Case 3) || DS.powerstate == 'DSPowerState.UNKNOWN' **and** | || || SPF.powerstate == 'SPFPowerState.UNKNOWN' | +-------------------+-----------------------------------------------------------------------------------------+ || FULL (Case 1) || DS.powerstate == 'DSPowerState.FULL_POWER' | + +-----------------------------------------------------------------------------------------+ || FULL (Case 2) || DS.powerstate == 'DSPowerState.UNKNOWN' **and** | + + + || ||SPF.powerstate == 'SPFPowerState.FULL_POWER' | +-------------------+-----------------------------------------------------------------------------------------+ POWER_STATE_RULES_SPF_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +---------+-----------------------------------------------------------------------+ | Rule | Condition | +=========+=======================================================================+ | UPS | DS.powerstate in ['DSPowerState.UPS', 'DSPowerState.OFF'] | +---------+-----------------------------------------------------------------------+ | LOW | DS.powerstate in ['DSPowerState.LOW_POWER', 'DSPowerState.UNKNOWN'] | +---------+-----------------------------------------------------------------------+ | FULL | DS.powerstate == 'DSPowerState.FULL_POWER' | +---------+-----------------------------------------------------------------------+ ------------------------------------------ Dish Mode Transitions ------------------------------------------ Dish Mode transitions (e.g., ``STARTUP``, ``STANDBY_LP``, ``STANDBY_FP``, ``OPERATE``, ``STOW``, ``MAINT``) are determined by a combination of the sub-element Operating Modes, Power States, and Indexer Positions. Dish Mode Rule Evaluation ------------------------------------------ DISH_MODE_RULES_ALL_DEVICES ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +============+=================================================================================================================================================================+ | STARTUP | DS.operatingmode == 'DSOperatingMode.STARTUP' **or** SPF.operatingmode == 'SPFOperatingMode.STARTUP' **or** SPFRX.operatingmode == 'SPFRxOperatingMode.STARTUP' | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | STOW | DS.operatingmode == 'DSOperatingMode.STOW' | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | CONFIG | SPFRX.operatingmode == 'SPFRxOperatingMode.CONFIGURE' **or** DS.indexerposition == 'IndexerPosition.MOVING' | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | OPERATE | DS.operatingmode == 'DSOperatingMode.POINT' **and** SPF.operatingmode == 'SPFOperatingMode.OPERATE' **and** SPFRX.operatingmode == 'SPFRxOperatingMode.OPERATE' | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | STANDBY_LP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.LOW_POWER' **and** SPF.operatingmode != 'SPFOperatingMode.OPERATE' | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | STANDBY_FP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.FULL_POWER' | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ DISH_MODE_RULES_SPF_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------+-------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +============+=============================================================================================================+ | STARTUP | DS.operatingmode == 'DSOperatingMode.STARTUP' **or** SPFRX.operatingmode == 'SPFRxOperatingMode.STARTUP' | +------------+-------------------------------------------------------------------------------------------------------------+ | STOW | DS.operatingmode == 'DSOperatingMode.STOW' | +------------+-------------------------------------------------------------------------------------------------------------+ | CONFIG | SPFRX.operatingmode == 'SPFRxOperatingMode.CONFIGURE' **or** DS.indexerposition == 'IndexerPosition.MOVING' | +------------+-------------------------------------------------------------------------------------------------------------+ | OPERATE | DS.operatingmode == 'DSOperatingMode.POINT' **and** SPFRX.operatingmode == 'SPFRxOperatingMode.OPERATE' | +------------+-------------------------------------------------------------------------------------------------------------+ | STANDBY_LP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.LOW_POWER' | +------------+-------------------------------------------------------------------------------------------------------------+ | STANDBY_FP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.FULL_POWER' | +------------+-------------------------------------------------------------------------------------------------------------+ DISH_MODE_RULES_SPFRX_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +============+=========================================================================================================================================================+ | STARTUP | DS.operatingmode == 'DSOperatingMode.STARTUP' **or** SPF.operatingmode == 'SPFOperatingMode.STARTUP' | +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | STOW | DS.operatingmode == 'DSOperatingMode.STOW' | +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | CONFIG | DS.indexerposition == 'IndexerPosition.MOVING' | +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | OPERATE | DS.operatingmode == 'DSOperatingMode.POINT' **and** SPF.operatingmode == 'SPFOperatingMode.OPERATE' | +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | STANDBY_LP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.LOW_POWER' **and** SPF.operatingmode != 'SPFOperatingMode.OPERATE' | +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | STANDBY_FP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.FULL_POWER' | +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ DISH_MODE_RULES_DS_ONLY ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------+--------------------------------------------------------------------------------------------------+ | Rule | Condition | +============+==================================================================================================+ | STARTUP | DS.operatingmode == 'DSOperatingMode.STARTUP' | +------------+--------------------------------------------------------------------------------------------------+ | STOW | DS.operatingmode == 'DSOperatingMode.STOW' | +------------+--------------------------------------------------------------------------------------------------+ | CONFIG | DS.indexerposition == 'IndexerPosition.MOVING' | +------------+--------------------------------------------------------------------------------------------------+ | OPERATE | DS.operatingmode == 'DSOperatingMode.POINT' | +------------+--------------------------------------------------------------------------------------------------+ | STANDBY_LP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.LOW_POWER' | +------------+--------------------------------------------------------------------------------------------------+ | STANDBY_FP | DS.operatingmode == 'DSOperatingMode.STANDBY' **and** DS.powerstate == 'DSPowerState.FULL_POWER' | +------------+--------------------------------------------------------------------------------------------------+ ------------------------------------------ Band and Pointing Configurations ------------------------------------------ Dish Band Configuration rules ------------------------------- The Band Configuration state (e.g., ``OPERATE`` with a specific band) is determined by evaluating the configured band on the **SPFRx**, the band in focus on the **SPF**, and the indexer position on the **DS**. A transient change to the CONFIG mode may also occur during band changes. CONFIGURED_BAND_RULES_ALL_DEVICES ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +======+=========================================================================================================================================+ | NONE | SPFRX.configuredband == 'Band.NONE' | +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | B1 | DS.indexerposition == 'IndexerPosition.B1' **and** SPFRX.configuredband == 'Band.B1' **and** SPF.bandinfocus == 'SPFBandInFocus.B1' | +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | B2 | DS.indexerposition == 'IndexerPosition.B2' **and** SPFRX.configuredband == 'Band.B2' **and** SPF.bandinfocus == 'SPFBandInFocus.B2' | +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | B3 | DS.indexerposition == 'IndexerPosition.B3' **and** SPFRX.configuredband == 'Band.B3' **and** SPF.bandinfocus == 'SPFBandInFocus.B3' | +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | B4 | DS.indexerposition == 'IndexerPosition.B4' **and** SPFRX.configuredband == 'Band.B4' **and** SPF.bandinfocus == 'SPFBandInFocus.B4' | +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | B5a | DS.indexerposition == 'IndexerPosition.B5a' **and** SPFRX.configuredband == 'Band.B5a' **and** SPF.bandinfocus == 'SPFBandInFocus.B5a'| +------+-----------------------------------------------------------------------------------------------------------------------------------------+ | B5b | DS.indexerposition == 'IndexerPosition.B5b' **and** SPFRX.configuredband == 'Band.B1' **and** SPF.bandinfocus == 'SPFBandInFocus.B5b' | +------+-----------------------------------------------------------------------------------------------------------------------------------------+ CONFIGURED_BAND_RULES_SPF_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------+-------------------------------------------------------------------------------------------+ | Rule | Condition | +======+===========================================================================================+ | NONE | SPFRX.configuredband == 'Band.NONE' | +------+-------------------------------------------------------------------------------------------+ | B1 | DS.indexerposition == 'IndexerPosition.B1' **and** SPFRX.configuredband == 'Band.B1' | +------+-------------------------------------------------------------------------------------------+ | B2 | DS.indexerposition == 'IndexerPosition.B2' **and** SPFRX.configuredband == 'Band.B2' | +------+-------------------------------------------------------------------------------------------+ | B3 | DS.indexerposition == 'IndexerPosition.B3' **and** SPFRX.configuredband == 'Band.B3' | +------+-------------------------------------------------------------------------------------------+ | B4 | DS.indexerposition == 'IndexerPosition.B4' **and** SPFRX.configuredband == 'Band.B4' | +------+-------------------------------------------------------------------------------------------+ | B5a | DS.indexerposition == 'IndexerPosition.B5a' **and** SPFRX.configuredband == 'Band.B5a' | +------+-------------------------------------------------------------------------------------------+ | B5b | DS.indexerposition == 'IndexerPosition.B5b' **and** SPFRX.configuredband == 'Band.B1' | +------+-------------------------------------------------------------------------------------------+ CONFIGURED_BAND_RULES_SPFRX_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------+---------------------------------------------------------------------------------------------+ | Rule | Condition | +======+=============================================================================================+ | B1 | DS.indexerposition == 'IndexerPosition.B1' **and** SPF.bandinfocus == 'SPFBandInFocus.B1' | +------+---------------------------------------------------------------------------------------------+ | B2 | DS.indexerposition == 'IndexerPosition.B2' **and** SPF.bandinfocus == 'SPFBandInFocus.B2' | +------+---------------------------------------------------------------------------------------------+ | B3 | DS.indexerposition == 'IndexerPosition.B3' **and** SPF.bandinfocus == 'SPFBandInFocus.B3' | +------+---------------------------------------------------------------------------------------------+ | B4 | DS.indexerposition == 'IndexerPosition.B4' **and** SPF.bandinfocus == 'SPFBandInFocus.B4' | +------+---------------------------------------------------------------------------------------------+ | B5a | DS.indexerposition == 'IndexerPosition.B5a' **and** SPF.bandinfocus == 'SPFBandInFocus.B5a'| +------+---------------------------------------------------------------------------------------------+ | B5b | DS.indexerposition == 'IndexerPosition.B5b' **and** SPF.bandinfocus == 'SPFBandInFocus.B5b'| +------+---------------------------------------------------------------------------------------------+ CONFIGURED_BAND_RULES_DS_ONLY ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------+-----------------------------------------------------+ | Rule | Condition | +======+=====================================================+ | B1 | DS.indexerposition == 'IndexerPosition.B1' | +------+-----------------------------------------------------+ | B2 | DS.indexerposition == 'IndexerPosition.B2' | +------+-----------------------------------------------------+ | B3 | DS.indexerposition == 'IndexerPosition.B3' | +------+-----------------------------------------------------+ | B4 | DS.indexerposition == 'IndexerPosition.B4' | +------+-----------------------------------------------------+ | B5a | DS.indexerposition == 'IndexerPosition.B5a' | +------+-----------------------------------------------------+ | B5b | DS.indexerposition == 'IndexerPosition.B5b' | +------+-----------------------------------------------------+ Pointing State ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Reflects whether the Dish is ``READY``, ``SLEW``, or ``TRACK``. This state relies almost entirely on the Dish Structure (DS) tracking telemetry. -------------------------------- Dish Health States -------------------------------- The Dish Manager also computes aggregated health states such as ``OK``, ``DEGRADED``, ``FAILED``, and ``UNKNOWN`` based on the health states of the sub-devices. Dish Health State Rule Evaluation ------------------------------------------ HEALTH_STATE_RULES_ALL_DEVICES ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------+-------------------------------------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +===========+===========================================================================================================================================+ || DEGRADED || DS.healthstate == 'HealthState.DEGRADED' **and** | || || SPF.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] **and** | | || SPFRX.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] | + +-------------------------------------------------------------------------------------------------------------------------------------------+ | | **or** | + +-------------------------------------------------------------------------------------------------------------------------------------------+ || || DS.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] **and** | || || SPF.healthstate == 'HealthState.DEGRADED' **and** | || || SPFRX.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] | + +-------------------------------------------------------------------------------------------------------------------------------------------+ | | **or** | + +-------------------------------------------------------------------------------------------------------------------------------------------+ || || DS.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] **and** | || || SPF.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] **and** | || || SPFRX.healthstate == 'HealthState.DEGRADED' | +-----------+-------------------------------------------------------------------------------------------------------------------------------------------+ | FAILED | DS.healthstate == 'HealthState.FAILED' **or** SPF.healthstate == 'HealthState.FAILED' **or** SPFRX.healthstate == 'HealthState.FAILED' | +-----------+-------------------------------------------------------------------------------------------------------------------------------------------+ | OK | DS.healthstate == 'HealthState.OK' **and** SPF.healthstate == 'HealthState.OK' **and** SPFRX.healthstate == 'HealthState.OK' | +-----------+-------------------------------------------------------------------------------------------------------------------------------------------+ | UNKNOWN | DS.healthstate == 'HealthState.UNKNOWN' **or** SPF.healthstate == 'HealthState.UNKNOWN' **or** SPFRX.healthstate == 'HealthState.UNKNOWN' | +-----------+-------------------------------------------------------------------------------------------------------------------------------------------+ HEALTH_STATE_RULES_SPF_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------+--------------------------------------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +===========+============================================================================================================================================+ || DEGRADED || DS.healthstate == 'HealthState.DEGRADED' **and** | || ||SPFRX.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] | + +--------------------------------------------------------------------------------------------------------------------------------------------+ || || **or** | + +--------------------------------------------------------------------------------------------------------------------------------------------+ || || DS.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] **and** SPFRX.healthstate == 'HealthState.DEGRADED' | +-----------+--------------------------------------------------------------------------------------------------------------------------------------------+ | FAILED | DS.healthstate == 'HealthState.FAILED' **or** SPFRX.healthstate == 'HealthState.FAILED' | +-----------+--------------------------------------------------------------------------------------------------------------------------------------------+ | OK | DS.healthstate == 'HealthState.OK' **and** SPFRX.healthstate == 'HealthState.OK' | +-----------+--------------------------------------------------------------------------------------------------------------------------------------------+ | UNKNOWN | DS.healthstate == 'HealthState.UNKNOWN' **or** SPFRX.healthstate == 'HealthState.UNKNOWN' | +-----------+--------------------------------------------------------------------------------------------------------------------------------------------+ HEALTH_STATE_RULES_SPFRX_IGNORED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------+----------------------------------------------------------------------------------------------------------------------------------------+ | Rule | Condition | +===========+========================================================================================================================================+ || DEGRADED || DS.healthstate == 'HealthState.DEGRADED' **and** SPF.healthstate == 'HealthState.DEGRADED' | || || SPF.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] | + +----------------------------------------------------------------------------------------------------------------------------------------+ || || **or** | + +----------------------------------------------------------------------------------------------------------------------------------------+ || || DS.healthstate in ['HealthState.OK', 'HealthState.DEGRADED', 'HealthState.UNKNOWN'] **and** SPF.healthstate == 'HealthState.DEGRADED' | +-----------+----------------------------------------------------------------------------------------------------------------------------------------+ | FAILED | DS.healthstate == 'HealthState.FAILED' **or** SPF.healthstate == 'HealthState.FAILED' | +-----------+----------------------------------------------------------------------------------------------------------------------------------------+ | OK | DS.healthstate == 'HealthState.OK' **and** SPF.healthstate == 'HealthState.OK' | +-----------+----------------------------------------------------------------------------------------------------------------------------------------+ | UNKNOWN | DS.healthstate == 'HealthState.UNKNOWN' **or** SPF.healthstate == 'HealthState.UNKNOWN' | +-----------+----------------------------------------------------------------------------------------------------------------------------------------+ HEALTH_STATE_RULES_DS_ONLY ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +----------+-----------------------------------------+ | Rule | Condition | +==========+=========================================+ | DEGRADED | DS.healthstate == 'HealthState.DEGRADED'| +----------+-----------------------------------------+ | FAILED | DS.healthstate == 'HealthState.FAILED' | +----------+-----------------------------------------+ | OK | DS.healthstate == 'HealthState.OK' | +----------+-----------------------------------------+ | UNKNOWN | DS.healthstate == 'HealthState.UNKNOWN' | +----------+-----------------------------------------+