summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Tanous <edtanous@google.com>2023-01-23 22:28:10 +0300
committerEd Tanous <ed@tanous.net>2023-02-15 03:52:56 +0300
commitee61a619da7f180a3148317d569d2dabd1cd9832 (patch)
tree147e6ccba1d3965f6c8edff2a28eba79a22d6cbc
parent2f3d9bd0c8504176e6f7a12503bb253a7761ed8b (diff)
downloadbmcweb-ee61a619da7f180a3148317d569d2dabd1cd9832.tar.xz
Implement Manager/ServiceRootUptime
This property was added in Redfish 2022.2 to denote how long this service has been up and available. This implementation opts to go to systemd to get the bmcweb service uptime rather than track it through internal process state, given that systemd already has an API that tracks the bmcweb uptime, and bmcweb attempts to keep as little state as possible. Given that we already have helper functions that give durations in milliseconds precision, this patchset opts to keep the millisecond granularity, rather than dropping to microsecond precision of the systemd API. There are no use cases that would require microsecond precision, so this patchset opts for lower complexity. Tested: Redfish service validator passes. GET /redfish/v1/Managers/bmc Returns a ServiceRootUptime property. Value matches systemctl status bmcweb. systemctl restart bmcweb, causes counter to reset. Signed-off-by: Ed Tanous <edtanous@google.com> Change-Id: Iae7e805f3f7f5f26745476eaeaecb63bda16a957
-rw-r--r--Redfish.md1
-rw-r--r--redfish-core/lib/managers.hpp44
2 files changed, 45 insertions, 0 deletions
diff --git a/Redfish.md b/Redfish.md
index ba58c55ba0..3739581c54 100644
--- a/Redfish.md
+++ b/Redfish.md
@@ -404,6 +404,7 @@ Fields common to all schemas
- Links/ManagerForServers
- Links/ManagerForServers@odata.count
- Links/ManagerInChassis
+- Links/ServiceRootUptime
- Links/SoftwareImages
- Links/SoftwareImages@odata.count
- LogServices
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 376f70c52b..0be135400f 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -33,6 +33,7 @@
#include <algorithm>
#include <array>
+#include <chrono>
#include <cstdint>
#include <memory>
#include <sstream>
@@ -1769,6 +1770,47 @@ inline void
});
}
+inline void
+ afterGetManagerStartTime(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+ const boost::system::error_code& ec,
+ uint64_t bmcwebResetTime)
+{
+ if (ec)
+ {
+ return;
+ }
+ using std::chrono::steady_clock;
+ std::chrono::microseconds usReset{bmcwebResetTime};
+ steady_clock::time_point resetTime{usReset};
+
+ steady_clock::time_point now = steady_clock::now();
+
+ steady_clock::duration run = now - resetTime;
+
+ if (run < steady_clock::duration::zero())
+ {
+ BMCWEB_LOG_CRITICAL << "Uptime was negative????";
+ messages::internalError(aResp->res);
+ return;
+ }
+
+ using Milli = std::chrono::milliseconds;
+ Milli uptimeMs = std::chrono::duration_cast<Milli>(run);
+
+ using redfish::time_utils::toDurationString;
+ aResp->res.jsonValue["ServiceRootUptime"] = toDurationString(uptimeMs);
+}
+
+inline void
+ managerGetServiceRootUptime(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
+{
+ sdbusplus::asio::getProperty<uint64_t>(
+ *crow::connections::systemBus, "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1/unit/bmcweb_2eservice",
+ "org.freedesktop.systemd1.Unit", "ActiveEnterTimestampMonotonic",
+ std::bind_front(afterGetManagerStartTime, aResp));
+}
+
/**
* @brief Set the running firmware image
*
@@ -2026,6 +2068,8 @@ inline void requestRoutesManager(App& app)
managerGetLastResetTime(asyncResp);
+ managerGetServiceRootUptime(asyncResp);
+
// ManagerDiagnosticData is added for all BMCs.
nlohmann::json& managerDiagnosticData =
asyncResp->res.jsonValue["ManagerDiagnosticData"];