blob: cc16448b2b019a0dc597f0c4df922e5ea29ae781 [file] [log] [blame]
#pragma once
#include <cstdint>
#include <map>
#include <nlohmann/json.hpp>
#include <string>
#include <tuple>
#include <vector>
namespace google
{
namespace ipmi
{
using VersionTuple =
std::tuple<std::uint8_t, std::uint8_t, std::uint8_t, std::uint8_t>;
extern const std::string defaultConfigFile;
class HandlerInterface
{
public:
virtual ~HandlerInterface() = default;
/**
* Return ethernet details (hard-coded).
*
* @return tuple of ethernet details (channel, if name).
*/
virtual std::tuple<std::uint8_t, std::string> getEthDetails() const = 0;
/**
* Return the value of rx_packets, given a if_name.
*
* @param[in] name, the interface name.
* @return the number of packets received.
* @throw IpmiException on failure.
*/
virtual std::int64_t getRxPackets(const std::string& name) const = 0;
/**
* Return the values from a cpld version file.
*
* @param[in] id - the cpld id number.
* @return the quad of numbers as a tuple (maj,min,pt,subpt)
* @throw IpmiException on failure.
*/
virtual VersionTuple getCpldVersion(unsigned int id) const = 0;
/**
* Set the PSU Reset delay.
*
* @param[in] delay - delay in seconds.
* @throw IpmiException on failure.
*/
virtual void psuResetDelay(std::uint32_t delay) const = 0;
/**
* Return the entity name.
* On the first call to this method it'll build the list of entities.
* @todo Consider moving the list building to construction time (and ignore
* failures).
*
* @param[in] id - the entity id value
* @param[in] instance - the entity instance
* @return the entity's name
* @throw IpmiException on failure.
*/
virtual std::string getEntityName(std::uint8_t id,
std::uint8_t instance) = 0;
/**
* Populate the i2c-pcie mapping vector.
*/
virtual void buildI2cPcieMapping() = 0;
/**
* Return the size of the i2c-pcie mapping vector.
*
* @return the size of the vector holding the i2c-pcie mapping tuples.
*/
virtual size_t getI2cPcieMappingSize() const = 0;
/**
* Return a copy of the entry in the vector.
*
* @param[in] entry - the index into the vector.
* @return the tuple at that index.
*/
virtual std::tuple<std::uint32_t, std::string>
getI2cEntry(unsigned int entry) const = 0;
};
class Handler : public HandlerInterface
{
public:
explicit Handler(const std::string& entityConfigPath = defaultConfigFile) :
_configFile(entityConfigPath){};
~Handler() = default;
std::tuple<std::uint8_t, std::string> getEthDetails() const override;
std::int64_t getRxPackets(const std::string& name) const override;
VersionTuple getCpldVersion(unsigned int id) const override;
void psuResetDelay(std::uint32_t delay) const override;
std::string getEntityName(std::uint8_t id, std::uint8_t instance) override;
void buildI2cPcieMapping() override;
size_t getI2cPcieMappingSize() const override;
std::tuple<std::uint32_t, std::string>
getI2cEntry(unsigned int entry) const override;
private:
std::string _configFile;
bool _entityConfigParsed = false;
const std::map<uint8_t, std::string> _entityIdToName{
{0x03, "cpu"},
{0x04, "storage_device"},
{0x06, "system_management_module"},
{0x07, "system_board"},
{0x08, "memory_module"},
{0x0B, "add_in_card"},
{0x0E, "power_system_board"},
{0x10, "system_internal_expansion_board"},
{0x11, "other_system_board"},
{0x17, "system_chassis"},
{0x1D, "fan"},
{0x1E, "cooling_unit"},
{0x20, "memory_device"}};
nlohmann::json _entityConfig{};
std::vector<std::tuple<uint32_t, std::string>> _pcie_i2c_map;
};
/**
* Given a type, entity instance, and a configuration, return the name.
*
* @param[in] type - the entity type
* @param[in] instance - the entity instance
* @param[in] config - the json object holding the entity mapping
* @return the name of the entity from the map
*/
std::string readNameFromConfig(const std::string& type, uint8_t instance,
const nlohmann::json& config);
extern Handler handlerImpl;
} // namespace ipmi
} // namespace google