xref: /openbmc/openpower-hw-diags/analyzer/service_data.hpp (revision 2d114321d95e6d49ee152df3a941d0662bd44315)
1 #pragma once
2 
3 #include <analyzer/callout.hpp>
4 #include <analyzer/guard.hpp>
5 #include <hei_main.hpp>
6 #include <nlohmann/json.hpp>
7 
8 namespace analyzer
9 {
10 
11 /**
12  * @brief Data regarding required service actions based on the hardware error
13  *        analysis.
14  */
15 class ServiceData
16 {
17   public:
18     /**
19      * @brief Constructor from components.
20      * @param The signature of the root cause attention.
21      * @param True if the signature list contained a system checkstop attention.
22      *        False, otherwise.
23      */
24     ServiceData(const libhei::Signature& i_rootCause, bool i_isCheckstop) :
25         iv_rootCause(i_rootCause), iv_isCheckstop(i_isCheckstop)
26     {}
27 
28     /** @brief Destructor. */
29     ~ServiceData() = default;
30 
31     /** @brief Copy constructor. */
32     ServiceData(const ServiceData&) = default;
33 
34     /** @brief Assignment operator. */
35     ServiceData& operator=(const ServiceData&) = default;
36 
37   private:
38     /** The signature of the root cause attention. */
39     const libhei::Signature iv_rootCause;
40 
41     /** True if the signature list contained a system checkstop attention.
42      *  False, otherwise. */
43     const bool iv_isCheckstop;
44 
45     /** The list of callouts that will be added to a PEL. */
46     nlohmann::json iv_calloutList = nlohmann::json::array();
47 
48     /** FFDC for callouts that would otherwise not be available in the
49      *  callout list (unit paths, bus types, etc.). */
50     nlohmann::json iv_calloutFFDC = nlohmann::json::array();
51 
52     /** The list of hardware guard requests. Some information will be added to
53      *  the PEL, but the actual guard record will be created after submitting
54      *  the PEL. */
55     std::vector<Guard> iv_guardList;
56 
57   public:
58     /** @return The signature of the root cause attention. */
59     const libhei::Signature& getRootCause() const
60     {
61         return iv_rootCause;
62     }
63 
64     /** @return True if the signature list contained a system checkstop
65      *          attention. False, otherwise. */
66     bool queryCheckstop() const
67     {
68         return iv_isCheckstop;
69     }
70 
71     /**
72      * @brief Add callout information to the callout list.
73      * @param The JSON object for this callout.
74      */
75     void addCallout(const nlohmann::json& i_callout)
76     {
77         iv_calloutList.push_back(i_callout);
78     }
79 
80     /**
81      * @brief Add FFDC for a callout that would otherwise not be available in
82      *        the callout list (unit paths, bus types, etc.).
83      * @param The JSON object for this callout.
84      */
85     void addCalloutFFDC(const nlohmann::json& i_ffdc)
86     {
87         iv_calloutFFDC.push_back(i_ffdc);
88     }
89 
90     /**
91      * @brief  Add a guard request to the guard list.
92      * @param  i_path  Entity path for the target part.
93      * @param  i_guard True, if the part should be guarded. False, otherwise.
94      * @return A reference to the object just added to the guard list.
95      */
96     const Guard& addGuard(const std::string& i_path, bool i_guard)
97     {
98         Guard::Type guardType = Guard::Type::NONE;
99         if (i_guard)
100         {
101             // The guard type is dependent on the presence of a system checkstop
102             // attention.
103             guardType =
104                 queryCheckstop() ? Guard::Type::FATAL : Guard::Type::NON_FATAL;
105         }
106 
107         return iv_guardList.emplace_back(i_path, guardType);
108     }
109 
110     /** @brief Accessor to iv_calloutList. */
111     const nlohmann::json& getCalloutList() const
112     {
113         return iv_calloutList;
114     }
115 
116     /** @brief Accessor to iv_calloutFFDC. */
117     const nlohmann::json& getCalloutFFDC() const
118     {
119         return iv_calloutFFDC;
120     }
121 
122     /** @brief Accessor to iv_guardList. */
123     const std::vector<Guard>& getGuardList() const
124     {
125         return iv_guardList;
126     }
127 };
128 
129 } // namespace analyzer
130