blob: 521b0b8e51bfedbaf83711eed1e3bf4e278f93cd [file] [log] [blame]
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -06001#include "config.h"
2
3#include "dump_manager_resource.hpp"
4
5#include "dump_utils.hpp"
Dhruvaraj Subhashchandranad50d422022-01-18 05:54:02 -06006#include "op_dump_consts.hpp"
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -06007#include "resource_dump_entry.hpp"
8#include "xyz/openbmc_project/Common/error.hpp"
9
George Liu858fbb22021-07-01 12:25:44 +080010#include <fmt/core.h>
11
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060012#include <phosphor-logging/elog-errors.hpp>
13#include <phosphor-logging/elog.hpp>
14
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060015namespace openpower
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060016{
17namespace dump
18{
19namespace resource
20{
21
22using namespace phosphor::logging;
23using InternalFailure =
24 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
25
26void Manager::notify(uint32_t dumpId, uint64_t size)
27{
28 // Get the timestamp
29 std::time_t timeStamp = std::time(nullptr);
30
Dhruvaraj Subhashchandran583ebc02022-02-01 03:02:35 -060031 // If there is an entry with invalid id update that.
32 // If there a completed one with same source id ignore it
33 // if there is no invalid id, create new entry
34 openpower::dump::resource::Entry* upEntry = NULL;
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060035 for (auto& entry : entries)
36 {
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060037 openpower::dump::resource::Entry* resEntry =
38 dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get());
Dhruvaraj Subhashchandran583ebc02022-02-01 03:02:35 -060039
40 // If there is already a completed entry with input source id then
41 // ignore this notification.
42 if ((resEntry->sourceDumpId() == dumpId) &&
43 (resEntry->status() == phosphor::dump::OperationStatus::Completed))
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060044 {
Dhruvaraj Subhashchandran583ebc02022-02-01 03:02:35 -060045 log<level::INFO>(
46 fmt::format("Resource dump entry with source dump id({}) is "
47 "already present with entry id({})",
48 dumpId, resEntry->getDumpId())
49 .c_str());
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060050 return;
51 }
Dhruvaraj Subhashchandran583ebc02022-02-01 03:02:35 -060052
53 // Save the first entry with INVALID_SOURCE_ID
54 // but continue in the loop to make sure the
55 // new entry is not duplicate
56 if ((resEntry->status() ==
57 phosphor::dump::OperationStatus::InProgress) &&
58 (resEntry->sourceDumpId() == INVALID_SOURCE_ID) &&
59 (upEntry == NULL))
60 {
61 upEntry = resEntry;
62 }
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060063 }
Dhruvaraj Subhashchandran583ebc02022-02-01 03:02:35 -060064 if (upEntry != NULL)
65 {
66 log<level::INFO>(
67 fmt::format("Resource Dump Notify: Updating dumpId({}) "
68 "with source Id({}) Size({})",
69 upEntry->getDumpId(), dumpId, size)
70 .c_str());
71 upEntry->update(timeStamp, size, dumpId);
72 return;
73 }
74
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060075 // Get the id
76 auto id = lastEntryId + 1;
77 auto idString = std::to_string(id);
Jayanth Othayoth3fc6df42021-04-08 03:45:24 -050078 auto objPath = std::filesystem::path(baseEntryPath) / idString;
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060079
80 try
81 {
Dhruvaraj Subhashchandran583ebc02022-02-01 03:02:35 -060082 log<level::INFO>(fmt::format("Resouce Dump Notify: creating new dump "
83 "entry dumpId({}) Id({}) Size({})",
84 id, dumpId, size)
85 .c_str());
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060086 entries.insert(std::make_pair(
87 id, std::make_unique<resource::Entry>(
88 bus, objPath.c_str(), id, timeStamp, size, dumpId,
89 std::string(), std::string(),
90 phosphor::dump::OperationStatus::Completed, *this)));
91 }
92 catch (const std::invalid_argument& e)
93 {
George Liu858fbb22021-07-01 12:25:44 +080094 log<level::ERR>(fmt::format("Error in creating resource dump entry, "
95 "errormsg({}),OBJECTPATH({}),ID({}),"
96 "TIMESTAMP({}),SIZE({}),SOURCEID({})",
George Liu363af242021-07-16 17:52:36 +080097 e.what(), objPath.c_str(), id, timeStamp,
98 size, dumpId)
George Liu858fbb22021-07-01 12:25:44 +080099 .c_str());
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -0600100 report<InternalFailure>();
101 return;
102 }
103 lastEntryId++;
104}
105
106sdbusplus::message::object_path
Dhruvaraj Subhashchandranddc33662021-07-19 09:28:42 -0500107 Manager::createDump(phosphor::dump::DumpCreateParams params)
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -0600108{
109
110 using NotAllowed =
111 sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
112 using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
113
114 // Allow creating resource dump only when the host is up.
115 if (!phosphor::dump::isHostRunning())
116 {
117 elog<NotAllowed>(
118 Reason("Resource dump can be initiated only when the host is up"));
119 return std::string();
120 }
Dhruvaraj Subhashchandranddc33662021-07-19 09:28:42 -0500121
122 using InvalidArgument =
123 sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
124 using Argument = xyz::openbmc_project::Common::InvalidArgument;
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -0600125 using CreateParameters =
126 sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
127
128 auto id = lastEntryId + 1;
129 auto idString = std::to_string(id);
Jayanth Othayoth3fc6df42021-04-08 03:45:24 -0500130 auto objPath = std::filesystem::path(baseEntryPath) / idString;
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -0600131 std::time_t timeStamp = std::time(nullptr);
132
Dhruvaraj Subhashchandranddc33662021-07-19 09:28:42 -0500133 std::string vspString;
134 auto iter = params.find(
135 sdbusplus::com::ibm::Dump::server::Create::
136 convertCreateParametersToString(CreateParameters::VSPString));
137 if (iter == params.end())
138 {
139 // Host will generate a default dump if no resource selector string
140 // is provided. The default dump will be a non-disruptive system dump.
141 log<level::INFO>(
142 "VSP string is not provided, a non-disruptive system dump will be "
143 "generated by the host");
144 }
145 else
146 {
147 try
148 {
149 vspString = std::get<std::string>(iter->second);
150 }
151 catch (const std::bad_variant_access& e)
152 {
153 // Exception will be raised if the input is not string
154 log<level::ERR>(
155 fmt::format("An invalid vsp string is passed errormsg({})",
156 e.what())
157 .c_str());
158 elog<InvalidArgument>(Argument::ARGUMENT_NAME("VSP_STRING"),
159 Argument::ARGUMENT_VALUE("INVALID INPUT"));
160 }
161 }
162
163 std::string pwd;
164 iter = params.find(
165 sdbusplus::com::ibm::Dump::server::Create::
166 convertCreateParametersToString(CreateParameters::Password));
167 if (iter == params.end())
168 {
169 log<level::ERR>("Required argument password is missing");
170 elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSOWORD"),
171 Argument::ARGUMENT_VALUE("MISSING"));
172 }
173
174 try
175 {
176 pwd = std::get<std::string>(iter->second);
177 }
178 catch (const std::bad_variant_access& e)
179 {
180 // Exception will be raised if the input is not string
181 log<level::ERR>(
182 fmt::format("An invalid password string is passed errormsg({})",
183 e.what())
184 .c_str());
185 elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSWORD"),
186 Argument::ARGUMENT_VALUE("INVALID INPUT"));
187 }
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -0600188
189 try
190 {
191 entries.insert(std::make_pair(
192 id, std::make_unique<resource::Entry>(
193 bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
194 vspString, pwd, phosphor::dump::OperationStatus::InProgress,
195 *this)));
196 }
197 catch (const std::invalid_argument& e)
198 {
George Liu858fbb22021-07-01 12:25:44 +0800199 log<level::ERR>(
200 fmt::format(
201 "Error in creating resource dump "
202 "entry,errormsg({}),OBJECTPATH({}), VSPSTRING({}), ID({})",
George Liu363af242021-07-16 17:52:36 +0800203 e.what(), objPath.c_str(), vspString, id)
George Liu858fbb22021-07-01 12:25:44 +0800204 .c_str());
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -0600205 elog<InternalFailure>();
206 return std::string();
207 }
208 lastEntryId++;
209 return objPath.string();
210}
211
212} // namespace resource
213} // namespace dump
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -0600214} // namespace openpower