summaryrefslogtreecommitdiffstats
path: root/elog_entry.hpp
blob: 5ee8f5fa0c3ac6f1b411b78ed115699655977f3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#pragma once

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>
#include "xyz/openbmc_project/Logging/Entry/server.hpp"
#include "xyz/openbmc_project/Object/Delete/server.hpp"
#include "xyz/openbmc_project/Software/Version/server.hpp"
#include "org/openbmc/Associations/server.hpp"

namespace phosphor
{
namespace logging
{

using EntryIfaces = sdbusplus::server::object::object<
    sdbusplus::xyz::openbmc_project::Logging::server::Entry,
    sdbusplus::xyz::openbmc_project::Object::server::Delete,
    sdbusplus::org::openbmc::server::Associations,
    sdbusplus::xyz::openbmc_project::Software::server::Version>;

using AssociationList =
     std::vector<std::tuple<std::string, std::string, std::string>>;

namespace internal
{
class Manager;
}

/** @class Entry
 *  @brief OpenBMC logging entry implementation.
 *  @details A concrete implementation for the
 *  xyz.openbmc_project.Logging.Entry and
 *  org.openbmc.Associations DBus APIs.
 */
class Entry : public EntryIfaces
{
    public:
        Entry() = delete;
        Entry(const Entry&) = delete;
        Entry& operator=(const Entry&) = delete;
        Entry(Entry&&) = delete;
        Entry& operator=(Entry&&) = delete;
        virtual ~Entry() = default;

        /** @brief Constructor to put object onto bus at a dbus path.
         *         Defer signal registration (pass true for deferSignal to the
         *         base class) until after the properties are set.
         *  @param[in] bus - Bus to attach to.
         *  @param[in] path - Path to attach at.
         *  @param[in] idErr - The error entry id.
         *  @param[in] timestampErr - The commit timestamp.
         *  @param[in] severityErr - The severity of the error.
         *  @param[in] msgErr - The message of the error.
         *  @param[in] additionalDataErr - The error metadata.
         *  @param[in] objects - The list of associations.
         *  @param[in] fwVersion - The BMC code version.
         *  @param[in] parent - The error's parent.
         */
        Entry(sdbusplus::bus::bus& bus,
              const std::string& path,
              uint32_t idErr,
              uint64_t timestampErr,
              Level severityErr,
              std::string&& msgErr,
              std::vector<std::string>&& additionalDataErr,
              AssociationList&& objects,
              const std::string& fwVersion,
              internal::Manager& parent) :
              EntryIfaces(bus, path.c_str(), true),
              parent(parent)
        {
            id(idErr);
            severity(severityErr);
            timestamp(timestampErr);
            message(std::move(msgErr));
            additionalData(std::move(additionalDataErr));
            associations(std::move(objects));
            // Store a copy of associations in case we need to recreate
            assocs = associations();
            sdbusplus::xyz::openbmc_project::
                Logging::server::Entry::resolved(false);

            version(fwVersion);
            purpose(VersionPurpose::BMC);

            // Emit deferred signal.
            this->emit_object_added();
        };

        /** @brief Constructor that puts an "empty" error object on the bus,
         *         with only the id property populated. Rest of the properties
         *         to be set by the caller. Caller should emit the added signal.
         *  @param[in] bus - Bus to attach to.
         *  @param[in] path - Path to attach at.
         *  @param[in] id - The error entry id.
         *  @param[in] parent - The error's parent.
         */
        Entry(sdbusplus::bus::bus& bus,
              const std::string& path,
              uint32_t entryId,
              internal::Manager& parent) :
              EntryIfaces(bus, path.c_str(), true),
              parent(parent)
        {
            id(entryId);
        };

        /** @brief Set resolution status of the error.
         *  @param[in] value - boolean indicating resolution
         *  status (true = resolved)
         *  @returns value of 'Resolved' property
         */
        bool resolved(bool value) override;

        using sdbusplus::xyz::openbmc_project::
              Logging::server::Entry::resolved;

        /** @brief Delete this d-bus object.
         */
        void delete_() override;

        /** @brief Severity level to check in cap.
         *  @details Errors with severity lesser than this will be
         *           considered as low priority and maximum ERROR_INFO_CAP
         *           number errors of this category will be captured.
        */
        static constexpr auto sevLowerLimit = Entry::Level::Informational;

    private:
        /** @brief This entry's associations */
        AssociationList assocs = {};

        /** @brief This entry's parent */
        internal::Manager& parent;
};

} // namespace logging
} // namespace phosphor
OpenPOWER on IntegriCloud