blob: e45a44884183dc36ccc53eceed380d57e32bcc43 [file] [log] [blame]
#pragma once
#include "data_interface.hpp"
#include "pel.hpp"
namespace openpower::pels::service_indicators
{
/**
* @class Policy
*
* The base class for service indicator policies.
*/
class Policy
{
public:
Policy() = delete;
virtual ~Policy() = default;
Policy(const Policy&) = default;
Policy& operator=(const Policy&) = default;
Policy(Policy&&) = default;
Policy& operator=(Policy&&) = default;
/**
* @brief Constructor
*
* @param[in] dataIface - The DataInterface object
*/
explicit Policy(const DataInterfaceBase& dataIface) : _dataIface(dataIface)
{}
/**
* @brief Pure virtual function for activating service indicators
* based on PEL contents.
*
* @param[in] pel - The PEL
*/
virtual void activate(const PEL& pel) = 0;
protected:
/**
* @brief Reference to the DataInterface object
*/
const DataInterfaceBase& _dataIface;
};
/**
* @class LightPath
*
* This class implements the 'LightPath' IBM policy for
* activating LEDs. It has a set of rules to use to choose
* which callouts inside PELs should have their LEDs asserted,
* and then activates them by writing the Assert property on
* LED group D-Bus objects.
*/
class LightPath : public Policy
{
public:
LightPath() = delete;
virtual ~LightPath() = default;
LightPath(const LightPath&) = default;
LightPath& operator=(const LightPath&) = default;
LightPath(LightPath&&) = default;
LightPath& operator=(LightPath&&) = default;
/**
* @brief Constructor
*
* @param[in] dataIface - The DataInterface object
*/
explicit LightPath(const DataInterfaceBase& dataIface) : Policy(dataIface)
{}
/**
* @brief Turns on LEDs for certain FRUs called out in the PEL.
*
* First it selectively chooses location codes listed in the FRU
* callout section that it wants to turn on LEDs for. Next it
* looks up the inventory D-Bus paths for the FRU represented by
* those location codes, and then looks for associations to the
* LED group objects for those inventory paths. After it has
* the LED group object, it sets the Asserted property on it.
*
* It only does the above for PELs that were created by the BMC
* or hostboot and have the Serviceable action flag set.
*
* If there are problems looking up any inventory path or LED
* group, then it will stop and not activate any LEDs at all.
*
* @param[in] pel - The PEL
*/
void activate(const PEL& pel) override;
/**
* @brief Returns the location codes for the FRU callouts in the
* callouts list that need their LEDs turned on.
*
* This is public so it can be tested.
*
* @param[in] callouts - The Callout list from a PEL
*
* @return std::vector<std::string> - The location codes
*/
std::vector<std::string> getLocationCodes(
const std::vector<std::unique_ptr<src::Callout>>& callouts) const;
/**
* @brief Function called to check if the code even needs to
* bother looking in the callouts to find LEDs to turn on.
*
* It will ignore all PELs except for those created by the BMC or
* hostboot that have the Serviceable action flag set.
*
* This is public so it can be tested.
*
* @param[in] pel - The PEL
*
* @return bool - If the PEL should be ignored or not.
*/
bool ignore(const PEL& pel) const;
private:
/**
* @brief Returns the inventory D-Bus paths for the passed
* in location codes.
*
* @param[in] locationCodes - The location codes
*
* @return std::vector<std::string> - The inventory D-Bus paths
*/
std::vector<std::string>
getInventoryPaths(const std::vector<std::string>& locationCodes) const;
/**
* @brief Sets the Functional property on the passed in
* inventory paths to false.
*
* There is code watching for this that will then turn on
* any LEDs for that FRU.
*
* @param[in] inventoryPaths - The inventory D-Bus paths
*/
void setNotFunctional(const std::vector<std::string>& inventoryPaths) const;
/**
* @brief Sets the critical association on the passed in
* inventory paths.
*
* @param[in] inventoryPaths - The inventory D-Bus paths
*/
void createCriticalAssociation(
const std::vector<std::string>& inventoryPaths) const;
/**
* @brief Checks if the callout priority is one that the policy
* may turn on an LED for.
*
* The priorities it cares about are high, medium, and medium
* group A.
*
* @param[in] priority - The priority value from the PEL
*
* @return bool - If LightPath cares about a callout with this
* priority.
*/
bool isRequiredPriority(uint8_t priority) const;
/**
* @brief Checks if the callout is either a normal FRU
* callout or a symbolic FRU callout with a trusted
* location code, which is one of the requirements for
* LightPath to turn on an LED.
*
* @param[in] - callout - The Callout object
*
* @return bool - If the callout is a hardware callout
*/
bool isHardwareCallout(const src::Callout& callout) const;
};
/**
* @brief Returns the object for the service indicator policy
* implemented on the system.
*
* @param[in] dataIface - The DataInterface object
*
* @return std::unique_ptr<Policy> - The policy object
*
*/
std::unique_ptr<Policy> getPolicy(const DataInterfaceBase& dataIface);
} // namespace openpower::pels::service_indicators