# Example PDM configuration file.

- name: example path group
  description: >
      'A path group is a named collection of D-Bus object paths and associated
      metadata.  These collections serve only to be referenced by other
      configuration directives.

      The metadata element has different uses depending on the referencing
      directive.

      Within a single configuration file path group names must be unique.  The
      same name can appear in multiple configuration files; however, the
      referencing directive will only search for the group in the same
      configuration file.'
  class: group
  group: path
  members:
      - meta: PATH
        path: /xyz/openbmc_project/testing/inst1
      - meta: PATH
        path: /xyz/openbmc_project/testing/inst2
      - meta: PATH
        path: /xyz/openbmc_project/testing/inst3
      - meta: PATH
        path: /xyz/openbmc_project/testing/inst4

- name: example property group
  description: >
      'Like path groups, a property group is a named collection of D-Bus
      property names and associated metadata.

      Properties in a group must all have the same D-Bus type signature and must
      be explicitly declared.'
  class: group
  group: property
  type: uint32
  members:
      - interface: xyz.openbmc_project.Sensor.Value
        meta: PROPERTY
        property: ValueA
      - interface: xyz.openbmc_project.Sensor.Value
        meta: PROPERTY
        property: ValueB

- name: example property watch
  description: >
      'A property watch instructs PDM to maintain a cache of the state of the
      specified properties on the specified D-Bus objects.

      An optional set of filters can be applied to the specified properties,
      where each property's cache is cleared when it fails to pass any one
      filter. The property's cache is cleared so it will not have an affect on
      any optional callback that may be triggered.

      An optional callback can be triggered when property values change and
      those values pass all filters that may be defined.

      By default the callback is called when the monitor starts. An optional
      `ignore_start_callback` can be set to true so that the callback will not
      be called when the monitor starts.'

  class: watch
  watch: property
  paths: example path group
  properties: example property group
  callback: example count condition
  filters:
      - op: ">="
        bound: 0
      - op: "<="
        bound: 100
  ignore_start_callback: true

- name: example journal callback
  description: >
      'Callbacks are actions PDM should take when instructed to do so.

      Some callback types refer to a group of paths and group of properties in a
      similar fashion as the property watch directive.

      The journal callback logs the specified message to the systemd journal
      with the specified severity.

      Additionally, the journal callback will add to the journal key value pair
      metadata for each property in the specified property group with the key
      being the property element metadata and the value being the property
      value.'
  class: callback
  callback: journal
  paths: example path group
  properties: example property group
  severity: INFO
  message: Hello world from PDM!

- name: example elog callback
  description: >
      'Callbacks are actions PDM should take when instructed to do so.

      Some callback types refer to a group of paths and group of properties in a
      similar fashion as the property watch directive.

      The elog callback logs the elog and elog metadata.'
  class: callback
  callback: elog
  paths: example path group
  properties: example property group
  error: xyz::openbmc_project::Common::Error::InvalidArgument
  metadata:
      - name: xyz::openbmc_project::Common::InvalidArgument::ARGUMENT_NAME
        value: testing...
        type: string
      - name: xyz::openbmc_project::Common::InvalidArgument::ARGUMENT_VALUE
        value: testing...
        type: string

- name: example elog with metadata capture callback
  description: >
      'Callbacks are actions pdm should take when instructed to do so.

      This callback creates an elog, and it will capture the values of the
      properties that passed its condition check in the metadata field (that
      must be a string type) in the form:

          |path1:property1=value1|path2:property2=value2|

      Note that as this callback depends on the condition that called it to fill
      in the result of its checks on each property, this callback should use the
      same properties and paths keywords as the condition that calls it.

      Currently an error log with only 1 metadata entry of type string is
      supported.'

  class: callback
  callback: elog_with_metadata
  paths: example path group
  properties: example property group
  error: xyz::openbmc_project::Common::Callout::Error::Inventory
  metadata: xyz::openbmc_project::Common::Callout::Inventory::CALLOUT_INVENTORY_PATH

- name: example event callback
  description: >
      'Callbacks are actions PDM should take when instructed to do so.

      Some callback types refer to a group of paths and group of properties in a
      similar fashion as the property watch directive.

      The event callback creates the event D-Bus object with the given name and
      the event message. eg /xyz/openbmc_project/events/test/<id>'
  class: callback
  callback: event
  paths: example path group
  properties: example property group
  eventName: test
  eventMessage: "Test configuration changed."

- name: example method callback
  description: >
      'The method callback invokes the specified D-Bus method.'
  class: callback
  callback: method
  service: org.freedesktop.systemd1
  path: /org/freedesktop/systemd1
  interface: org.freedesktop.systemd1.Manager
  method: StartUnit
  args:
      - value: foo.unit
        type: string
      - value: replace
        type: string

- name: example resolve callouts callback
  description: >
      'The resolve callout callback resolves all error log entries that are
      associated with the inventory path specified by setting the Resolved
      property in the entries to true.

      A use case could be to watch the Present property on the inventory item
      and resolve all errors for it when a new one is plugged in and the
      property changes to true.'

  class: callback
  callback: resolve callout
  paths: example path group
  properties: example property group
  callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0

- name: example callback group
  description: >
      'Callbacks groups are simply named collections of other callbacks.
      Configuration file directives can only refer to a single callback. Through
      use of a group, these configuration file directives can refer to more than
      one callback.

      For example for a given event, one may wish to trace multiple messages to
      the systemd journal.  The journal callback does not support tracing
      multiple messages.  To do that, define a callback group composed of
      multiple journal callbacks.'

  class: callback
  callback: group
  members:
      - example journal callback
      - example deferred condition
      - example elog callback

- name: example count condition
  description: >
      'Conditions or conditional callbacks apply a test prior to invoking the
      callback function.

      All conditional callbacks must specify the callback to issue if the
      condition evaluates.

      The count condition applies the op comparison operator to the value of
      each property in the specified groups.  It then counts the number of
      properties that pass the comparison, and applies another comparison on the
      result against the specified bound.

      For example, a callback that requires at least three temperature sensors
      in the group to be higher than 115 degrees might use a count condition
      with an op of >, a count op of >=, a bound of 115, and a countbound of 3.

      The optional oneshot parameter defaults to false.  If it is specified and
      set to true, then the callback will only be called once for as long as the
      condition is repeatedly passing.  The condition needs to fail at least
      once to rearm the callback.'

  class: condition
  condition: count
  paths: example path group
  properties: example property group
  callback: example callback group
  countop: ">="
  countbound: 3
  op: ">="
  bound: 115
  oneshot: true

- name: example deferred condition
  description: >
      'Deferred conditions operate in the same fashion as conditional callbacks
      with the added behavior that when the condition is tested and is met,
      invocation of the callback is deferred by the interval specified.

      When the configured time has elapsed, if the condition has not been
      reevaluated the callback is invoked.

      Any condition type can be deferred in this way by setting the defer
      attribute.'

  class: condition
  condition: count
  paths: example path group
  properties: example property group
  defer: 1000us
  callback: example callback group
  countop: ">="
  countbound: 3
  op: ">="
  bound: 115

- name: errorlog path group
  class: group
  group: path
  members:
      - meta: PATH
        path: /xyz/openbmc_project/logging

- name: pathwatch errorlog
  description: >
      'A pathwatch watches on the specified object path group. pathcallback are
      actions PDM should take when instructed to do so.'

  class: pathwatch
  pathwatch: path
  paths: errorlog path group
  pathcallback: create errorlog event

- name: create errorlog event
  description: >
      'eventType specifies the type of the SNMP notification.'
  class: pathcallback
  pathcallback: eventpath
  paths: errorlog path group
  eventType: ErrorTrap