162337a92SDhruvaraj Subhashchandran #include "config.h"
262337a92SDhruvaraj Subhashchandran 
362337a92SDhruvaraj Subhashchandran #include "dump_manager_resource.hpp"
462337a92SDhruvaraj Subhashchandran 
562337a92SDhruvaraj Subhashchandran #include "dump_utils.hpp"
6*ad50d422SDhruvaraj Subhashchandran #include "op_dump_consts.hpp"
762337a92SDhruvaraj Subhashchandran #include "resource_dump_entry.hpp"
862337a92SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Common/error.hpp"
962337a92SDhruvaraj Subhashchandran 
10858fbb2eSGeorge Liu #include <fmt/core.h>
11858fbb2eSGeorge Liu 
1262337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp>
1362337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
1462337a92SDhruvaraj Subhashchandran 
15341d683dSDhruvaraj Subhashchandran namespace openpower
1662337a92SDhruvaraj Subhashchandran {
1762337a92SDhruvaraj Subhashchandran namespace dump
1862337a92SDhruvaraj Subhashchandran {
1962337a92SDhruvaraj Subhashchandran namespace resource
2062337a92SDhruvaraj Subhashchandran {
2162337a92SDhruvaraj Subhashchandran 
2262337a92SDhruvaraj Subhashchandran using namespace phosphor::logging;
2362337a92SDhruvaraj Subhashchandran using InternalFailure =
2462337a92SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
2562337a92SDhruvaraj Subhashchandran 
2662337a92SDhruvaraj Subhashchandran void Manager::notify(uint32_t dumpId, uint64_t size)
2762337a92SDhruvaraj Subhashchandran {
2862337a92SDhruvaraj Subhashchandran     // Get the timestamp
2962337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
3062337a92SDhruvaraj Subhashchandran 
3162337a92SDhruvaraj Subhashchandran     // If there is an entry with this sourceId or an invalid id
3262337a92SDhruvaraj Subhashchandran     // update that.
3362337a92SDhruvaraj Subhashchandran     // If host is sending the source id before the completion
3462337a92SDhruvaraj Subhashchandran     // the source id will be updated by the transport layer with host.
3562337a92SDhruvaraj Subhashchandran     // if not the source id will stay as invalid one.
3662337a92SDhruvaraj Subhashchandran     for (auto& entry : entries)
3762337a92SDhruvaraj Subhashchandran     {
38341d683dSDhruvaraj Subhashchandran         openpower::dump::resource::Entry* resEntry =
39341d683dSDhruvaraj Subhashchandran             dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get());
4062337a92SDhruvaraj Subhashchandran         if ((resEntry->status() ==
4162337a92SDhruvaraj Subhashchandran              phosphor::dump::OperationStatus::InProgress) &&
4262337a92SDhruvaraj Subhashchandran             ((resEntry->sourceDumpId() == dumpId) ||
4362337a92SDhruvaraj Subhashchandran              (resEntry->sourceDumpId() == INVALID_SOURCE_ID)))
4462337a92SDhruvaraj Subhashchandran         {
4562337a92SDhruvaraj Subhashchandran             resEntry->update(timeStamp, size, dumpId);
4662337a92SDhruvaraj Subhashchandran             return;
4762337a92SDhruvaraj Subhashchandran         }
4862337a92SDhruvaraj Subhashchandran     }
4962337a92SDhruvaraj Subhashchandran     // Get the id
5062337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
5162337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
523fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
5362337a92SDhruvaraj Subhashchandran 
5462337a92SDhruvaraj Subhashchandran     try
5562337a92SDhruvaraj Subhashchandran     {
5662337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
5762337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
5862337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, size, dumpId,
5962337a92SDhruvaraj Subhashchandran                     std::string(), std::string(),
6062337a92SDhruvaraj Subhashchandran                     phosphor::dump::OperationStatus::Completed, *this)));
6162337a92SDhruvaraj Subhashchandran     }
6262337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
6362337a92SDhruvaraj Subhashchandran     {
64858fbb2eSGeorge Liu         log<level::ERR>(fmt::format("Error in creating resource dump entry, "
65858fbb2eSGeorge Liu                                     "errormsg({}),OBJECTPATH({}),ID({}),"
66858fbb2eSGeorge Liu                                     "TIMESTAMP({}),SIZE({}),SOURCEID({})",
67363af249SGeorge Liu                                     e.what(), objPath.c_str(), id, timeStamp,
68363af249SGeorge Liu                                     size, dumpId)
69858fbb2eSGeorge Liu                             .c_str());
7062337a92SDhruvaraj Subhashchandran         report<InternalFailure>();
7162337a92SDhruvaraj Subhashchandran         return;
7262337a92SDhruvaraj Subhashchandran     }
7362337a92SDhruvaraj Subhashchandran     lastEntryId++;
7462337a92SDhruvaraj Subhashchandran }
7562337a92SDhruvaraj Subhashchandran 
7662337a92SDhruvaraj Subhashchandran sdbusplus::message::object_path
77ddc3366eSDhruvaraj Subhashchandran     Manager::createDump(phosphor::dump::DumpCreateParams params)
7862337a92SDhruvaraj Subhashchandran {
7962337a92SDhruvaraj Subhashchandran 
8062337a92SDhruvaraj Subhashchandran     using NotAllowed =
8162337a92SDhruvaraj Subhashchandran         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
8262337a92SDhruvaraj Subhashchandran     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
8362337a92SDhruvaraj Subhashchandran 
8462337a92SDhruvaraj Subhashchandran     // Allow creating resource dump only when the host is up.
8562337a92SDhruvaraj Subhashchandran     if (!phosphor::dump::isHostRunning())
8662337a92SDhruvaraj Subhashchandran     {
8762337a92SDhruvaraj Subhashchandran         elog<NotAllowed>(
8862337a92SDhruvaraj Subhashchandran             Reason("Resource dump can be initiated only when the host is up"));
8962337a92SDhruvaraj Subhashchandran         return std::string();
9062337a92SDhruvaraj Subhashchandran     }
91ddc3366eSDhruvaraj Subhashchandran 
92ddc3366eSDhruvaraj Subhashchandran     using InvalidArgument =
93ddc3366eSDhruvaraj Subhashchandran         sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
94ddc3366eSDhruvaraj Subhashchandran     using Argument = xyz::openbmc_project::Common::InvalidArgument;
9562337a92SDhruvaraj Subhashchandran     using CreateParameters =
9662337a92SDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
9762337a92SDhruvaraj Subhashchandran 
9862337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
9962337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
1003fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
10162337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
10262337a92SDhruvaraj Subhashchandran 
103ddc3366eSDhruvaraj Subhashchandran     std::string vspString;
104ddc3366eSDhruvaraj Subhashchandran     auto iter = params.find(
105ddc3366eSDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::
106ddc3366eSDhruvaraj Subhashchandran             convertCreateParametersToString(CreateParameters::VSPString));
107ddc3366eSDhruvaraj Subhashchandran     if (iter == params.end())
108ddc3366eSDhruvaraj Subhashchandran     {
109ddc3366eSDhruvaraj Subhashchandran         // Host will generate a default dump if no resource selector string
110ddc3366eSDhruvaraj Subhashchandran         // is provided. The default dump will be a non-disruptive system dump.
111ddc3366eSDhruvaraj Subhashchandran         log<level::INFO>(
112ddc3366eSDhruvaraj Subhashchandran             "VSP string is not provided, a non-disruptive system dump will be "
113ddc3366eSDhruvaraj Subhashchandran             "generated by the host");
114ddc3366eSDhruvaraj Subhashchandran     }
115ddc3366eSDhruvaraj Subhashchandran     else
116ddc3366eSDhruvaraj Subhashchandran     {
117ddc3366eSDhruvaraj Subhashchandran         try
118ddc3366eSDhruvaraj Subhashchandran         {
119ddc3366eSDhruvaraj Subhashchandran             vspString = std::get<std::string>(iter->second);
120ddc3366eSDhruvaraj Subhashchandran         }
121ddc3366eSDhruvaraj Subhashchandran         catch (const std::bad_variant_access& e)
122ddc3366eSDhruvaraj Subhashchandran         {
123ddc3366eSDhruvaraj Subhashchandran             // Exception will be raised if the input is not string
124ddc3366eSDhruvaraj Subhashchandran             log<level::ERR>(
125ddc3366eSDhruvaraj Subhashchandran                 fmt::format("An invalid  vsp string is passed errormsg({})",
126ddc3366eSDhruvaraj Subhashchandran                             e.what())
127ddc3366eSDhruvaraj Subhashchandran                     .c_str());
128ddc3366eSDhruvaraj Subhashchandran             elog<InvalidArgument>(Argument::ARGUMENT_NAME("VSP_STRING"),
129ddc3366eSDhruvaraj Subhashchandran                                   Argument::ARGUMENT_VALUE("INVALID INPUT"));
130ddc3366eSDhruvaraj Subhashchandran         }
131ddc3366eSDhruvaraj Subhashchandran     }
132ddc3366eSDhruvaraj Subhashchandran 
133ddc3366eSDhruvaraj Subhashchandran     std::string pwd;
134ddc3366eSDhruvaraj Subhashchandran     iter = params.find(
135ddc3366eSDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::
136ddc3366eSDhruvaraj Subhashchandran             convertCreateParametersToString(CreateParameters::Password));
137ddc3366eSDhruvaraj Subhashchandran     if (iter == params.end())
138ddc3366eSDhruvaraj Subhashchandran     {
139ddc3366eSDhruvaraj Subhashchandran         log<level::ERR>("Required argument password is missing");
140ddc3366eSDhruvaraj Subhashchandran         elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSOWORD"),
141ddc3366eSDhruvaraj Subhashchandran                               Argument::ARGUMENT_VALUE("MISSING"));
142ddc3366eSDhruvaraj Subhashchandran     }
143ddc3366eSDhruvaraj Subhashchandran 
144ddc3366eSDhruvaraj Subhashchandran     try
145ddc3366eSDhruvaraj Subhashchandran     {
146ddc3366eSDhruvaraj Subhashchandran         pwd = std::get<std::string>(iter->second);
147ddc3366eSDhruvaraj Subhashchandran     }
148ddc3366eSDhruvaraj Subhashchandran     catch (const std::bad_variant_access& e)
149ddc3366eSDhruvaraj Subhashchandran     {
150ddc3366eSDhruvaraj Subhashchandran         // Exception will be raised if the input is not string
151ddc3366eSDhruvaraj Subhashchandran         log<level::ERR>(
152ddc3366eSDhruvaraj Subhashchandran             fmt::format("An invalid password string is passed errormsg({})",
153ddc3366eSDhruvaraj Subhashchandran                         e.what())
154ddc3366eSDhruvaraj Subhashchandran                 .c_str());
155ddc3366eSDhruvaraj Subhashchandran         elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSWORD"),
156ddc3366eSDhruvaraj Subhashchandran                               Argument::ARGUMENT_VALUE("INVALID INPUT"));
157ddc3366eSDhruvaraj Subhashchandran     }
15862337a92SDhruvaraj Subhashchandran 
15962337a92SDhruvaraj Subhashchandran     try
16062337a92SDhruvaraj Subhashchandran     {
16162337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
16262337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
16362337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
16462337a92SDhruvaraj Subhashchandran                     vspString, pwd, phosphor::dump::OperationStatus::InProgress,
16562337a92SDhruvaraj Subhashchandran                     *this)));
16662337a92SDhruvaraj Subhashchandran     }
16762337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
16862337a92SDhruvaraj Subhashchandran     {
169858fbb2eSGeorge Liu         log<level::ERR>(
170858fbb2eSGeorge Liu             fmt::format(
171858fbb2eSGeorge Liu                 "Error in creating resource dump "
172858fbb2eSGeorge Liu                 "entry,errormsg({}),OBJECTPATH({}), VSPSTRING({}), ID({})",
173363af249SGeorge Liu                 e.what(), objPath.c_str(), vspString, id)
174858fbb2eSGeorge Liu                 .c_str());
17562337a92SDhruvaraj Subhashchandran         elog<InternalFailure>();
17662337a92SDhruvaraj Subhashchandran         return std::string();
17762337a92SDhruvaraj Subhashchandran     }
17862337a92SDhruvaraj Subhashchandran     lastEntryId++;
17962337a92SDhruvaraj Subhashchandran     return objPath.string();
18062337a92SDhruvaraj Subhashchandran }
18162337a92SDhruvaraj Subhashchandran 
18262337a92SDhruvaraj Subhashchandran } // namespace resource
18362337a92SDhruvaraj Subhashchandran } // namespace dump
184341d683dSDhruvaraj Subhashchandran } // namespace openpower
185