blob: 76580ee67a09376ca8d6846598cd36dd895bc640 [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"
6#include "resource_dump_entry.hpp"
7#include "xyz/openbmc_project/Common/error.hpp"
8
9#include <phosphor-logging/elog-errors.hpp>
10#include <phosphor-logging/elog.hpp>
11
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060012namespace openpower
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060013{
14namespace dump
15{
16namespace resource
17{
18
19using namespace phosphor::logging;
20using InternalFailure =
21 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
22
23void Manager::notify(uint32_t dumpId, uint64_t size)
24{
25 // Get the timestamp
26 std::time_t timeStamp = std::time(nullptr);
27
28 // If there is an entry with this sourceId or an invalid id
29 // update that.
30 // If host is sending the source id before the completion
31 // the source id will be updated by the transport layer with host.
32 // if not the source id will stay as invalid one.
33 for (auto& entry : entries)
34 {
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060035 openpower::dump::resource::Entry* resEntry =
36 dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get());
Dhruvaraj Subhashchandran62337a92020-11-22 21:24:30 -060037 if ((resEntry->status() ==
38 phosphor::dump::OperationStatus::InProgress) &&
39 ((resEntry->sourceDumpId() == dumpId) ||
40 (resEntry->sourceDumpId() == INVALID_SOURCE_ID)))
41 {
42 resEntry->update(timeStamp, size, dumpId);
43 return;
44 }
45 }
46 // Get the id
47 auto id = lastEntryId + 1;
48 auto idString = std::to_string(id);
49 auto objPath = fs::path(baseEntryPath) / idString;
50
51 try
52 {
53 entries.insert(std::make_pair(
54 id, std::make_unique<resource::Entry>(
55 bus, objPath.c_str(), id, timeStamp, size, dumpId,
56 std::string(), std::string(),
57 phosphor::dump::OperationStatus::Completed, *this)));
58 }
59 catch (const std::invalid_argument& e)
60 {
61 log<level::ERR>(e.what());
62 log<level::ERR>("Error in creating resource dump entry",
63 entry("OBJECTPATH=%s", objPath.c_str()),
64 entry("ID=%d", id), entry("TIMESTAMP=%ull", timeStamp),
65 entry("SIZE=%d", size), entry("SOURCEID=%d", dumpId));
66 report<InternalFailure>();
67 return;
68 }
69 lastEntryId++;
70}
71
72sdbusplus::message::object_path
73 Manager::createDump(std::map<std::string, std::string> params)
74{
75
76 using NotAllowed =
77 sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
78 using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
79
80 // Allow creating resource dump only when the host is up.
81 if (!phosphor::dump::isHostRunning())
82 {
83 elog<NotAllowed>(
84 Reason("Resource dump can be initiated only when the host is up"));
85 return std::string();
86 }
87 using CreateParameters =
88 sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
89
90 auto id = lastEntryId + 1;
91 auto idString = std::to_string(id);
92 auto objPath = fs::path(baseEntryPath) / idString;
93 std::time_t timeStamp = std::time(nullptr);
94
95 std::string vspString = params[sdbusplus::com::ibm::Dump::server::Create::
96 convertCreateParametersToString(
97 CreateParameters::VSPString)];
98 std::string pwd =
99 params[sdbusplus::com::ibm::Dump::server::Create::
100 convertCreateParametersToString(CreateParameters::Password)];
101
102 try
103 {
104 entries.insert(std::make_pair(
105 id, std::make_unique<resource::Entry>(
106 bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
107 vspString, pwd, phosphor::dump::OperationStatus::InProgress,
108 *this)));
109 }
110 catch (const std::invalid_argument& e)
111 {
112 log<level::ERR>(e.what());
113 log<level::ERR>("Error in creating resource dump entry",
114 entry("OBJECTPATH=%s", objPath.c_str()),
115 entry("VSPSTRING=%s", vspString.c_str()),
116 entry("ID=%d", id));
117 elog<InternalFailure>();
118 return std::string();
119 }
120 lastEntryId++;
121 return objPath.string();
122}
123
124} // namespace resource
125} // namespace dump
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -0600126} // namespace openpower