| # 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 |