1 #include "resource_dump_entry.hpp"
2 
3 #include "dump_utils.hpp"
4 #include "host_transport_exts.hpp"
5 #include "op_dump_consts.hpp"
6 
7 #include <fmt/core.h>
8 
9 #include <phosphor-logging/elog-errors.hpp>
10 #include <xyz/openbmc_project/Common/error.hpp>
11 
12 namespace openpower
13 {
14 namespace dump
15 {
16 namespace resource
17 {
18 // TODO #ibm-openbmc/issues/2859
19 // Revisit host transport impelementation
20 // This value is used to identify the dump in the transport layer to host,
21 constexpr auto TRANSPORT_DUMP_TYPE_IDENTIFIER = 9;
22 using namespace phosphor::logging;
23 
24 void Entry::initiateOffload(std::string uri)
25 {
26     using NotAllowed =
27         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
28     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
29     log<level::INFO>(
30         fmt::format(
31             "Resource dump offload request id({}) uri({}) source dumpid({})",
32             id, uri, sourceDumpId())
33             .c_str());
34 
35     if (!phosphor::dump::isHostRunning())
36     {
37         elog<NotAllowed>(
38             Reason("This dump can be offloaded only when the host is up"));
39         return;
40     }
41     phosphor::dump::Entry::initiateOffload(uri);
42     phosphor::dump::host::requestOffload(sourceDumpId());
43 }
44 
45 void Entry::delete_()
46 {
47     auto srcDumpID = sourceDumpId();
48     auto dumpId = id;
49 
50     if ((!offloadUri().empty()) && (phosphor::dump::isHostRunning()))
51     {
52         log<level::ERR>(
53             fmt::format("Dump offload is in progress, cannot delete "
54                         "dump, id({}) srcdumpid({})",
55                         dumpId, srcDumpID)
56                 .c_str());
57         elog<sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed>(
58             xyz::openbmc_project::Common::NotAllowed::REASON(
59                 "Dump offload is in progress"));
60     }
61 
62     log<level::INFO>(fmt::format("Resource dump delete id({}) srcdumpid({})",
63                                  dumpId, srcDumpID)
64                          .c_str());
65 
66     // Remove resource dump when host is up by using source dump id
67 
68     // which is present in resource dump entry dbus object as a property.
69     if ((phosphor::dump::isHostRunning()) && (srcDumpID != INVALID_SOURCE_ID))
70     {
71         try
72         {
73             phosphor::dump::host::requestDelete(srcDumpID,
74                                                 TRANSPORT_DUMP_TYPE_IDENTIFIER);
75         }
76         catch (const std::exception& e)
77         {
78             log<level::ERR>(fmt::format("Error deleting dump from host id({}) "
79                                         "host id({}) error({})",
80                                         dumpId, srcDumpID, e.what())
81                                 .c_str());
82             elog<sdbusplus::xyz::openbmc_project::Common::Error::Unavailable>();
83         }
84     }
85 
86     // Remove Dump entry D-bus object
87     phosphor::dump::Entry::delete_();
88 }
89 } // namespace resource
90 } // namespace dump
91 } // namespace openpower
92