# Air cooled Talos fan policy for PDM. # # An air cooled Talos requires a minimum of one functional fan. # If the number of functional fans drops below that # power the system off. - name: fans description: > 'An air cooled Talos has six fans to monitor.' class: group group: path members: - meta: FAN path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0 - meta: FAN path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1 - meta: FAN path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2 - meta: FAN path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3 - meta: FAN path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4 - meta: FAN path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5 - name: chassis state description: > 'Talos has a single chassis to monitor.' class: group group: path members: - meta: CHASSISSTATE path: /xyz/openbmc_project/state/chassis0 - name: chassis description: > 'Talos has a single chassis to monitor.' class: group group: path members: - meta: CHASSIS path: /xyz/openbmc_project/inventory/system/chassis - name: fan present description: > 'Monitor the presence state of each fan.' class: group group: property type: boolean members: - interface: xyz.openbmc_project.Inventory.Item meta: PRESENT property: Present - name: fan functional description: > 'Monitor the functional state of each fan.' class: group group: property type: boolean members: - interface: xyz.openbmc_project.State.Decorator.OperationalStatus meta: FUNCTIONAL property: Functional - name: chassis powered description: > 'Monitor the chassis power state.' class: group group: property type: string members: - interface: xyz.openbmc_project.State.Chassis meta: CHASSIS_STATE property: CurrentPowerState - name: chassis air cooled description: > 'Monitor the chassis cooling type.' class: group group: property type: boolean members: - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType meta: COOLING_TYPE property: WaterCooled - name: watch fan present description: > 'Trigger logic on fan presence state changes.' class: watch watch: property paths: fans properties: fan present callback: check cooling type - name: watch fan functional description: > 'Trigger logic on fan functional state changes.' class: watch watch: property paths: fans properties: fan functional callback: check cooling type - name: watch chassis state description: > 'Trigger logic on chassis power state changes.' class: watch watch: property paths: chassis state properties: chassis powered callback: check cooling type - name: watch cooling type description: > 'Maintain a cache of the chassis cooling type.' class: watch watch: property paths: chassis properties: chassis air cooled - name: check cooling type description: > 'If this condition passes the chassis is air cooled.' class: condition condition: count paths: chassis properties: chassis air cooled callback: check power countop: '==' countbound: 0 op: '==' bound: true - name: check power description: > 'If the chassis has power, check fans.' class: condition condition: count paths: chassis state properties: chassis powered callback: check fans countop: '>' countbound: 0 op: '==' bound: xyz.openbmc_project.State.Chassis.PowerState.On - name: check fans description: > 'Verify there are at least three functional fans, power off if not.' class: callback callback: group members: - check group presence - check group functional - name: check group presence description: > 'If this condition passes more than one fan has been unplugged for more than 25 seconds. Shut the system down. Count present fans rather than non-present fans since the latter would pass if the fan has not been created for some reason. For a more detailed definition of unplugged, consult the documentation of xyz.openbmc_project.Inventory.Item and/or the documentation of the fan inventory object implementation.' class: condition condition: count paths: fans properties: fan present defer: 25000000us callback: log and shutdown countop: '<' countbound: 1 op: '==' bound: true - name: check group functional description: > 'If this condition passes more than one fan in the group has been marked as nonfunctional for five seconds. Shut the system down. For a more detailed definition of nonfunctional, consult the documentation of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the documentation of the fan inventory object implementation.' class: condition condition: count paths: fans properties: fan functional defer: 5000000us callback: log and shutdown countop: '>' countbound: 1 op: '==' bound: false - name: log and shutdown description: > 'Shut the system down, log an event in the journal, and create an error log.' class: callback callback: group members: - shutdown - log - create shutdown error - name: shutdown description: > 'Shut down the system.' class: callback callback: method service: org.freedesktop.systemd1 path: /org/freedesktop/systemd1 interface: org.freedesktop.systemd1.Manager method: StartUnit args: - value: obmc-chassis-hard-poweroff@0.target type: string - value: replace type: string - name: log description: > 'Log a shutdown event to the systemd journal.' class: callback callback: journal paths: chassis state properties: chassis powered severity: ERR message: Shutting down system. There are not enough functional fans. - name: create shutdown error description: > 'Create a Fan Shutdown Error log.' class: callback callback: elog paths: chassis state properties: chassis powered error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan