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 
9858fbb2eSGeorge Liu #include <fmt/core.h>
10858fbb2eSGeorge Liu 
1162337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp>
1262337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
1362337a92SDhruvaraj Subhashchandran 
14341d683dSDhruvaraj Subhashchandran namespace openpower
1562337a92SDhruvaraj Subhashchandran {
1662337a92SDhruvaraj Subhashchandran namespace dump
1762337a92SDhruvaraj Subhashchandran {
1862337a92SDhruvaraj Subhashchandran namespace resource
1962337a92SDhruvaraj Subhashchandran {
2062337a92SDhruvaraj Subhashchandran 
2162337a92SDhruvaraj Subhashchandran using namespace phosphor::logging;
2262337a92SDhruvaraj Subhashchandran using InternalFailure =
2362337a92SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
2462337a92SDhruvaraj Subhashchandran 
2562337a92SDhruvaraj Subhashchandran void Manager::notify(uint32_t dumpId, uint64_t size)
2662337a92SDhruvaraj Subhashchandran {
2762337a92SDhruvaraj Subhashchandran     // Get the timestamp
2862337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
2962337a92SDhruvaraj Subhashchandran 
3062337a92SDhruvaraj Subhashchandran     // If there is an entry with this sourceId or an invalid id
3162337a92SDhruvaraj Subhashchandran     // update that.
3262337a92SDhruvaraj Subhashchandran     // If host is sending the source id before the completion
3362337a92SDhruvaraj Subhashchandran     // the source id will be updated by the transport layer with host.
3462337a92SDhruvaraj Subhashchandran     // if not the source id will stay as invalid one.
3562337a92SDhruvaraj Subhashchandran     for (auto& entry : entries)
3662337a92SDhruvaraj Subhashchandran     {
37341d683dSDhruvaraj Subhashchandran         openpower::dump::resource::Entry* resEntry =
38341d683dSDhruvaraj Subhashchandran             dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get());
3962337a92SDhruvaraj Subhashchandran         if ((resEntry->status() ==
4062337a92SDhruvaraj Subhashchandran              phosphor::dump::OperationStatus::InProgress) &&
4162337a92SDhruvaraj Subhashchandran             ((resEntry->sourceDumpId() == dumpId) ||
4262337a92SDhruvaraj Subhashchandran              (resEntry->sourceDumpId() == INVALID_SOURCE_ID)))
4362337a92SDhruvaraj Subhashchandran         {
4462337a92SDhruvaraj Subhashchandran             resEntry->update(timeStamp, size, dumpId);
4562337a92SDhruvaraj Subhashchandran             return;
4662337a92SDhruvaraj Subhashchandran         }
4762337a92SDhruvaraj Subhashchandran     }
4862337a92SDhruvaraj Subhashchandran     // Get the id
4962337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
5062337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
513fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
5262337a92SDhruvaraj Subhashchandran 
5362337a92SDhruvaraj Subhashchandran     try
5462337a92SDhruvaraj Subhashchandran     {
5562337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
5662337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
5762337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, size, dumpId,
5862337a92SDhruvaraj Subhashchandran                     std::string(), std::string(),
5962337a92SDhruvaraj Subhashchandran                     phosphor::dump::OperationStatus::Completed, *this)));
6062337a92SDhruvaraj Subhashchandran     }
6162337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
6262337a92SDhruvaraj Subhashchandran     {
63858fbb2eSGeorge Liu         log<level::ERR>(fmt::format("Error in creating resource dump entry, "
64858fbb2eSGeorge Liu                                     "errormsg({}),OBJECTPATH({}),ID({}),"
65858fbb2eSGeorge Liu                                     "TIMESTAMP({}),SIZE({}),SOURCEID({})",
66*363af249SGeorge Liu                                     e.what(), objPath.c_str(), id, timeStamp,
67*363af249SGeorge Liu                                     size, dumpId)
68858fbb2eSGeorge Liu                             .c_str());
6962337a92SDhruvaraj Subhashchandran         report<InternalFailure>();
7062337a92SDhruvaraj Subhashchandran         return;
7162337a92SDhruvaraj Subhashchandran     }
7262337a92SDhruvaraj Subhashchandran     lastEntryId++;
7362337a92SDhruvaraj Subhashchandran }
7462337a92SDhruvaraj Subhashchandran 
7562337a92SDhruvaraj Subhashchandran sdbusplus::message::object_path
7662337a92SDhruvaraj Subhashchandran     Manager::createDump(std::map<std::string, std::string> params)
7762337a92SDhruvaraj Subhashchandran {
7862337a92SDhruvaraj Subhashchandran 
7962337a92SDhruvaraj Subhashchandran     using NotAllowed =
8062337a92SDhruvaraj Subhashchandran         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
8162337a92SDhruvaraj Subhashchandran     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
8262337a92SDhruvaraj Subhashchandran 
8362337a92SDhruvaraj Subhashchandran     // Allow creating resource dump only when the host is up.
8462337a92SDhruvaraj Subhashchandran     if (!phosphor::dump::isHostRunning())
8562337a92SDhruvaraj Subhashchandran     {
8662337a92SDhruvaraj Subhashchandran         elog<NotAllowed>(
8762337a92SDhruvaraj Subhashchandran             Reason("Resource dump can be initiated only when the host is up"));
8862337a92SDhruvaraj Subhashchandran         return std::string();
8962337a92SDhruvaraj Subhashchandran     }
9062337a92SDhruvaraj Subhashchandran     using CreateParameters =
9162337a92SDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
9262337a92SDhruvaraj Subhashchandran 
9362337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
9462337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
953fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
9662337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
9762337a92SDhruvaraj Subhashchandran 
9862337a92SDhruvaraj Subhashchandran     std::string vspString = params[sdbusplus::com::ibm::Dump::server::Create::
9962337a92SDhruvaraj Subhashchandran                                        convertCreateParametersToString(
10062337a92SDhruvaraj Subhashchandran                                            CreateParameters::VSPString)];
10162337a92SDhruvaraj Subhashchandran     std::string pwd =
10262337a92SDhruvaraj Subhashchandran         params[sdbusplus::com::ibm::Dump::server::Create::
10362337a92SDhruvaraj Subhashchandran                    convertCreateParametersToString(CreateParameters::Password)];
10462337a92SDhruvaraj Subhashchandran 
10562337a92SDhruvaraj Subhashchandran     try
10662337a92SDhruvaraj Subhashchandran     {
10762337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
10862337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
10962337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
11062337a92SDhruvaraj Subhashchandran                     vspString, pwd, phosphor::dump::OperationStatus::InProgress,
11162337a92SDhruvaraj Subhashchandran                     *this)));
11262337a92SDhruvaraj Subhashchandran     }
11362337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
11462337a92SDhruvaraj Subhashchandran     {
115858fbb2eSGeorge Liu         log<level::ERR>(
116858fbb2eSGeorge Liu             fmt::format(
117858fbb2eSGeorge Liu                 "Error in creating resource dump "
118858fbb2eSGeorge Liu                 "entry,errormsg({}),OBJECTPATH({}), VSPSTRING({}), ID({})",
119*363af249SGeorge Liu                 e.what(), objPath.c_str(), vspString, id)
120858fbb2eSGeorge Liu                 .c_str());
12162337a92SDhruvaraj Subhashchandran         elog<InternalFailure>();
12262337a92SDhruvaraj Subhashchandran         return std::string();
12362337a92SDhruvaraj Subhashchandran     }
12462337a92SDhruvaraj Subhashchandran     lastEntryId++;
12562337a92SDhruvaraj Subhashchandran     return objPath.string();
12662337a92SDhruvaraj Subhashchandran }
12762337a92SDhruvaraj Subhashchandran 
12862337a92SDhruvaraj Subhashchandran } // namespace resource
12962337a92SDhruvaraj Subhashchandran } // namespace dump
130341d683dSDhruvaraj Subhashchandran } // namespace openpower
131