162337a92SDhruvaraj Subhashchandran #include "config.h"
262337a92SDhruvaraj Subhashchandran 
362337a92SDhruvaraj Subhashchandran #include "dump_manager_resource.hpp"
462337a92SDhruvaraj Subhashchandran 
562337a92SDhruvaraj Subhashchandran #include "dump_utils.hpp"
662337a92SDhruvaraj Subhashchandran #include "resource_dump_entry.hpp"
762337a92SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Common/error.hpp"
862337a92SDhruvaraj Subhashchandran 
962337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp>
1062337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
1162337a92SDhruvaraj Subhashchandran 
12341d683dSDhruvaraj Subhashchandran namespace openpower
1362337a92SDhruvaraj Subhashchandran {
1462337a92SDhruvaraj Subhashchandran namespace dump
1562337a92SDhruvaraj Subhashchandran {
1662337a92SDhruvaraj Subhashchandran namespace resource
1762337a92SDhruvaraj Subhashchandran {
1862337a92SDhruvaraj Subhashchandran 
1962337a92SDhruvaraj Subhashchandran using namespace phosphor::logging;
2062337a92SDhruvaraj Subhashchandran using InternalFailure =
2162337a92SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
2262337a92SDhruvaraj Subhashchandran 
2362337a92SDhruvaraj Subhashchandran void Manager::notify(uint32_t dumpId, uint64_t size)
2462337a92SDhruvaraj Subhashchandran {
2562337a92SDhruvaraj Subhashchandran     // Get the timestamp
2662337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
2762337a92SDhruvaraj Subhashchandran 
2862337a92SDhruvaraj Subhashchandran     // If there is an entry with this sourceId or an invalid id
2962337a92SDhruvaraj Subhashchandran     // update that.
3062337a92SDhruvaraj Subhashchandran     // If host is sending the source id before the completion
3162337a92SDhruvaraj Subhashchandran     // the source id will be updated by the transport layer with host.
3262337a92SDhruvaraj Subhashchandran     // if not the source id will stay as invalid one.
3362337a92SDhruvaraj Subhashchandran     for (auto& entry : entries)
3462337a92SDhruvaraj Subhashchandran     {
35341d683dSDhruvaraj Subhashchandran         openpower::dump::resource::Entry* resEntry =
36341d683dSDhruvaraj Subhashchandran             dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get());
3762337a92SDhruvaraj Subhashchandran         if ((resEntry->status() ==
3862337a92SDhruvaraj Subhashchandran              phosphor::dump::OperationStatus::InProgress) &&
3962337a92SDhruvaraj Subhashchandran             ((resEntry->sourceDumpId() == dumpId) ||
4062337a92SDhruvaraj Subhashchandran              (resEntry->sourceDumpId() == INVALID_SOURCE_ID)))
4162337a92SDhruvaraj Subhashchandran         {
4262337a92SDhruvaraj Subhashchandran             resEntry->update(timeStamp, size, dumpId);
4362337a92SDhruvaraj Subhashchandran             return;
4462337a92SDhruvaraj Subhashchandran         }
4562337a92SDhruvaraj Subhashchandran     }
4662337a92SDhruvaraj Subhashchandran     // Get the id
4762337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
4862337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
49*3fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
5062337a92SDhruvaraj Subhashchandran 
5162337a92SDhruvaraj Subhashchandran     try
5262337a92SDhruvaraj Subhashchandran     {
5362337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
5462337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
5562337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, size, dumpId,
5662337a92SDhruvaraj Subhashchandran                     std::string(), std::string(),
5762337a92SDhruvaraj Subhashchandran                     phosphor::dump::OperationStatus::Completed, *this)));
5862337a92SDhruvaraj Subhashchandran     }
5962337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
6062337a92SDhruvaraj Subhashchandran     {
6162337a92SDhruvaraj Subhashchandran         log<level::ERR>(e.what());
6262337a92SDhruvaraj Subhashchandran         log<level::ERR>("Error in creating resource dump entry",
6362337a92SDhruvaraj Subhashchandran                         entry("OBJECTPATH=%s", objPath.c_str()),
6462337a92SDhruvaraj Subhashchandran                         entry("ID=%d", id), entry("TIMESTAMP=%ull", timeStamp),
6562337a92SDhruvaraj Subhashchandran                         entry("SIZE=%d", size), entry("SOURCEID=%d", dumpId));
6662337a92SDhruvaraj Subhashchandran         report<InternalFailure>();
6762337a92SDhruvaraj Subhashchandran         return;
6862337a92SDhruvaraj Subhashchandran     }
6962337a92SDhruvaraj Subhashchandran     lastEntryId++;
7062337a92SDhruvaraj Subhashchandran }
7162337a92SDhruvaraj Subhashchandran 
7262337a92SDhruvaraj Subhashchandran sdbusplus::message::object_path
7362337a92SDhruvaraj Subhashchandran     Manager::createDump(std::map<std::string, std::string> params)
7462337a92SDhruvaraj Subhashchandran {
7562337a92SDhruvaraj Subhashchandran 
7662337a92SDhruvaraj Subhashchandran     using NotAllowed =
7762337a92SDhruvaraj Subhashchandran         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
7862337a92SDhruvaraj Subhashchandran     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
7962337a92SDhruvaraj Subhashchandran 
8062337a92SDhruvaraj Subhashchandran     // Allow creating resource dump only when the host is up.
8162337a92SDhruvaraj Subhashchandran     if (!phosphor::dump::isHostRunning())
8262337a92SDhruvaraj Subhashchandran     {
8362337a92SDhruvaraj Subhashchandran         elog<NotAllowed>(
8462337a92SDhruvaraj Subhashchandran             Reason("Resource dump can be initiated only when the host is up"));
8562337a92SDhruvaraj Subhashchandran         return std::string();
8662337a92SDhruvaraj Subhashchandran     }
8762337a92SDhruvaraj Subhashchandran     using CreateParameters =
8862337a92SDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
8962337a92SDhruvaraj Subhashchandran 
9062337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
9162337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
92*3fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
9362337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
9462337a92SDhruvaraj Subhashchandran 
9562337a92SDhruvaraj Subhashchandran     std::string vspString = params[sdbusplus::com::ibm::Dump::server::Create::
9662337a92SDhruvaraj Subhashchandran                                        convertCreateParametersToString(
9762337a92SDhruvaraj Subhashchandran                                            CreateParameters::VSPString)];
9862337a92SDhruvaraj Subhashchandran     std::string pwd =
9962337a92SDhruvaraj Subhashchandran         params[sdbusplus::com::ibm::Dump::server::Create::
10062337a92SDhruvaraj Subhashchandran                    convertCreateParametersToString(CreateParameters::Password)];
10162337a92SDhruvaraj Subhashchandran 
10262337a92SDhruvaraj Subhashchandran     try
10362337a92SDhruvaraj Subhashchandran     {
10462337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
10562337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
10662337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
10762337a92SDhruvaraj Subhashchandran                     vspString, pwd, phosphor::dump::OperationStatus::InProgress,
10862337a92SDhruvaraj Subhashchandran                     *this)));
10962337a92SDhruvaraj Subhashchandran     }
11062337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
11162337a92SDhruvaraj Subhashchandran     {
11262337a92SDhruvaraj Subhashchandran         log<level::ERR>(e.what());
11362337a92SDhruvaraj Subhashchandran         log<level::ERR>("Error in creating resource dump entry",
11462337a92SDhruvaraj Subhashchandran                         entry("OBJECTPATH=%s", objPath.c_str()),
11562337a92SDhruvaraj Subhashchandran                         entry("VSPSTRING=%s", vspString.c_str()),
11662337a92SDhruvaraj Subhashchandran                         entry("ID=%d", id));
11762337a92SDhruvaraj Subhashchandran         elog<InternalFailure>();
11862337a92SDhruvaraj Subhashchandran         return std::string();
11962337a92SDhruvaraj Subhashchandran     }
12062337a92SDhruvaraj Subhashchandran     lastEntryId++;
12162337a92SDhruvaraj Subhashchandran     return objPath.string();
12262337a92SDhruvaraj Subhashchandran }
12362337a92SDhruvaraj Subhashchandran 
12462337a92SDhruvaraj Subhashchandran } // namespace resource
12562337a92SDhruvaraj Subhashchandran } // namespace dump
126341d683dSDhruvaraj Subhashchandran } // namespace openpower
127