blob: 7c067920d7511e65ca7f48a13f1729462cb6ae30 [file] [log] [blame]
# Water cooled Witherspoon fan policy for PDM.
#
# A water cooled Witherspoon requires a minimum of two functional fans.
# If the number of functional fans drops below that
# power the system off.
- name: fan0
class: group
group: path
members:
- meta: FAN
path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
- name: fan2
class: group
group: path
members:
- meta: FAN
path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
- name: fan3
class: group
group: path
members:
- meta: FAN
path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
- name: fans
description: >
'A water cooled Witherspoon has three 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/fan2
- meta: FAN
path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
- name: chassis state
description: >
'Witherspoon has a single chassis to monitor.'
class: group
group: path
members:
- meta: CHASSISSTATE
path: /xyz/openbmc_project/state/chassis0
- name: chassis
description: >
'Witherspoon 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 water 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 water cooled
- name: check cooling type
description: >
'If this condition passes the chassis is water cooled.'
class: condition
condition: count
paths: chassis
properties: chassis water cooled
callback: check power
countop: '=='
countbound: 1
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 two functional fans, power off if not.
Create an error if a fan is nonfuncitonal or not present'
class: callback
callback: group
members:
- check group presence
- check group functional
- check individual presence
- check individual functional
- name: check individual presence
description: >
'Verify each of the 3 fans are present.'
class: callback
callback: group
members:
- check fan0 presence
- check fan2 presence
- check fan3 presence
- name: check individual functional
description: >
'Verify each of the 3 fans are functional.'
class: callback
callback: group
members:
- check fan0 functional
- check fan2 functional
- check fan3 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: 2
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: check fan0 presence
description: >
'If this condition passes fan0 has been unplugged for more than 20 seconds.'
class: condition
condition: count
paths: fan0
properties: fan present
defer: 20000000us
callback: notpresent fan0 error
countop: '<'
countbound: 1
op: '=='
bound: true
- name: check fan0 functional
description: >
'If this condition passes fan0 has been marked as nonfunctional.'
class: condition
condition: count
paths: fan0
properties: fan functional
callback: nonfunctional fan0 error
countop: '>'
countbound: 0
op: '=='
bound: false
- name: check fan2 presence
description: >
'If this condition passes fan2 has been unplugged for more than 20 seconds.'
class: condition
condition: count
paths: fan2
properties: fan present
defer: 20000000us
callback: notpresent fan2 error
countop: '<'
countbound: 1
op: '=='
bound: true
- name: check fan2 functional
description: >
'If this condition passes fan2 has been marked as nonfunctional.'
class: condition
condition: count
paths: fan2
properties: fan functional
callback: nonfunctional fan2 error
countop: '>'
countbound: 0
op: '=='
bound: false
- name: check fan3 presence
description: >
'If this condition passes fan3 has been unplugged for more than 20 seconds.'
class: condition
condition: count
paths: fan3
properties: fan present
defer: 20000000us
callback: notpresent fan3 error
countop: '<'
countbound: 1
op: '=='
bound: true
- name: check fan3 functional
description: >
'If this condition passes fan3 has been marked as nonfunctional.'
class: condition
condition: count
paths: fan3
properties: fan functional
callback: nonfunctional fan3 error
countop: '>'
countbound: 0
op: '=='
bound: false
- name: log and shutdown
description: >
'Shut the system down and log an event.'
class: callback
callback: group
members:
- shutdown
- log
- 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: notpresent fan0 error
class: callback
callback: elog
paths: fan0
properties: fan present
error: xyz::openbmc_project::Inventory::Error::NotPresent
metadata:
- name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
type: string
- name: nonfunctional fan0 error
class: callback
callback: elog
paths: fan0
properties: fan functional
error: xyz::openbmc_project::Inventory::Error::Nonfunctional
metadata:
- name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
type: string
- name: notpresent fan2 error
class: callback
callback: elog
paths: fan2
properties: fan present
error: xyz::openbmc_project::Inventory::Error::NotPresent
metadata:
- name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
type: string
- name: nonfunctional fan2 error
class: callback
callback: elog
paths: fan2
properties: fan functional
error: xyz::openbmc_project::Inventory::Error::Nonfunctional
metadata:
- name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
type: string
- name: notpresent fan3 error
class: callback
callback: elog
paths: fan3
properties: fan present
error: xyz::openbmc_project::Inventory::Error::NotPresent
metadata:
- name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
type: string
- name: nonfunctional fan3 error
class: callback
callback: elog
paths: fan3
properties: fan functional
error: xyz::openbmc_project::Inventory::Error::Nonfunctional
metadata:
- name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
type: string