summaryrefslogtreecommitdiff
path: root/redfish-core
diff options
context:
space:
mode:
authorAsmitha Karunanithi <asmitk01@in.ibm.com>2024-04-03 14:44:22 +0300
committerEd Tanous <ed@tanous.net>2024-04-09 19:26:52 +0300
commit1827b4f1de1e42bb3e2f53f584f07bb7119a3ed2 (patch)
treefde2e6dfec7ff2c7e817717ca2ee3a84baea55c2 /redfish-core
parent6ea9076048028a4adfdbdd2606698bffc81203d3 (diff)
downloadbmcweb-1827b4f1de1e42bb3e2f53f584f07bb7119a3ed2.tar.xz
Move to Redfish Action specific setProperty call
This commit will migrate all the setProperty calls initiated by a redfish"Action" to "setDbusProperty" method in Redfish namespace that handles all DBuserrors in a consistent manner. This method will determine if a setProperty is called during redfish "Action" or just setting of a dbus property and internally call appropriate methods that handles different set of errors. All the Redfish action specific errors are defined in error_messages.hpp file. This specific change moves setProperty call in hypervisor_system.hpp and covers errors in the mentioned file only. Tested-By: <Yet to test this usecase> Change-Id: I3da48fbeabcdcf088c4481021232f08a44797c86 Signed-off-by: Asmitha Karunanithi <asmitk01@in.ibm.com> Signed-off-by: Ed Tanous <ed@tanous.net>
Diffstat (limited to 'redfish-core')
-rw-r--r--redfish-core/include/error_messages.hpp15
-rw-r--r--redfish-core/include/utils/dbus_utils.hpp36
-rw-r--r--redfish-core/lib/hypervisor_system.hpp32
-rw-r--r--redfish-core/src/error_messages.cpp23
-rw-r--r--redfish-core/src/utils/dbus_utils.cpp49
5 files changed, 127 insertions, 28 deletions
diff --git a/redfish-core/include/error_messages.hpp b/redfish-core/include/error_messages.hpp
index 7adae19c87..91edc3c7cb 100644
--- a/redfish-core/include/error_messages.hpp
+++ b/redfish-core/include/error_messages.hpp
@@ -851,6 +851,21 @@ void actionParameterValueTypeError(crow::Response& res,
std::string_view arg3);
/**
+ * @brief Formats ActionParameterValueError message into JSON
+ * Message body: "Indicates that a parameter was given an invalid value."
+ * The value for the parameter %1 in the action %2 is invalid.
+ *
+ * @param[in] arg1 Parameter of message that will replace %1 in its body.
+ * @param[in] arg2 Parameter of message that will replace %2 in its body.
+ *
+ * @returns Message ActionParameterValueError formatted to JSON */
+nlohmann::json actionParameterValueError(const nlohmann::json& arg1,
+ std::string_view arg2);
+
+void actionParameterValueError(crow::Response& res, const nlohmann::json& arg1,
+ std::string_view arg2);
+
+/**
* @brief Formats SessionLimitExceeded message into JSON
* Message body: "The session establishment failed due to the number of
* simultaneous sessions exceeding the limit of the implementation."
diff --git a/redfish-core/include/utils/dbus_utils.hpp b/redfish-core/include/utils/dbus_utils.hpp
index cd7e0e2ca2..80571698a8 100644
--- a/redfish-core/include/utils/dbus_utils.hpp
+++ b/redfish-core/include/utils/dbus_utils.hpp
@@ -39,7 +39,13 @@ void afterSetProperty(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const nlohmann::json& propertyValue,
const boost::system::error_code& ec,
const sdbusplus::message_t& msg);
-}
+
+void afterSetPropertyAction(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+ const std::string& redfishActionName,
+ const std::string& redfishActionParameterName,
+ const boost::system::error_code& ec,
+ const sdbusplus::message_t& msg);
+} // namespace details
template <typename PropertyType>
void setDbusProperty(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
@@ -64,4 +70,32 @@ void setDbusProperty(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
});
}
+template <typename DbusPropertyType>
+void setDbusPropertyAction(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+ std::string_view processName,
+ const sdbusplus::message::object_path& path,
+ std::string_view interface,
+ std::string_view dbusProperty,
+ std::string_view redfishActionParameterName,
+ std::string_view redfishActionName,
+ const DbusPropertyType& prop)
+{
+ std::string processNameStr(processName);
+ std::string interfaceStr(interface);
+ std::string dbusPropertyStr(dbusProperty);
+
+ sdbusplus::asio::setProperty(
+ *crow::connections::systemBus, processNameStr, path.str, interfaceStr,
+ dbusPropertyStr, prop,
+ [asyncResp,
+ redfishActionParameterName = std::string{redfishActionParameterName},
+ jsonProp = nlohmann::json(prop),
+ redfishActionNameStr = std::string{redfishActionName}](
+ const boost::system::error_code& ec,
+ const sdbusplus::message_t& msg) {
+ details::afterSetPropertyAction(asyncResp, redfishActionNameStr,
+ redfishActionParameterName, ec, msg);
+ });
+}
+
} // namespace redfish
diff --git a/redfish-core/lib/hypervisor_system.hpp b/redfish-core/lib/hypervisor_system.hpp
index 2b3714bae4..ad1fae8850 100644
--- a/redfish-core/lib/hypervisor_system.hpp
+++ b/redfish-core/lib/hypervisor_system.hpp
@@ -915,32 +915,12 @@ inline void handleHypervisorSystemResetPost(
std::string command = "xyz.openbmc_project.State.Host.Transition.On";
- sdbusplus::asio::setProperty(
- *crow::connections::systemBus, "xyz.openbmc_project.State.Hypervisor",
- "/xyz/openbmc_project/state/hypervisor0",
- "xyz.openbmc_project.State.Host", "RequestedHostTransition", command,
- [asyncResp, resetType](const boost::system::error_code& ec) {
- if (ec)
- {
- BMCWEB_LOG_ERROR("D-Bus responses error: {}", ec);
- if (ec.value() == boost::asio::error::invalid_argument)
- {
- messages::actionParameterNotSupported(asyncResp->res,
- *resetType, "Reset");
- return;
- }
-
- if (ec.value() == boost::asio::error::host_unreachable)
- {
- messages::resourceNotFound(asyncResp->res, "Actions", "Reset");
- return;
- }
-
- messages::internalError(asyncResp->res);
- return;
- }
- messages::success(asyncResp->res);
- });
+ setDbusPropertyAction(asyncResp, "xyz.openbmc_project.State.Hypervisor",
+ sdbusplus::message::object_path(
+ "/xyz/openbmc_project/state/hypervisor0"),
+ "xyz.openbmc_project.State.Host",
+ "RequestedHostTransition", "ResetType",
+ "ComputerSystem.Reset", command);
}
inline void requestRoutesHypervisorSystems(App& app)
diff --git a/redfish-core/src/error_messages.cpp b/redfish-core/src/error_messages.cpp
index 6c4282cc67..7b0251562d 100644
--- a/redfish-core/src/error_messages.cpp
+++ b/redfish-core/src/error_messages.cpp
@@ -1453,6 +1453,29 @@ void actionParameterValueTypeError(crow::Response& res,
/**
* @internal
+ * @brief Formats actionParameterValueError message into JSON
+ *
+ * See header file for more information
+ * @endinternal
+ */
+nlohmann::json actionParameterValueError(const nlohmann::json& arg1,
+ std::string_view arg2)
+{
+ std::string arg1Str = arg1.dump(2, ' ', true,
+ nlohmann::json::error_handler_t::replace);
+ return getLog(redfish::registries::base::Index::actionParameterValueError,
+ std::to_array<std::string_view>({arg1Str, arg2}));
+}
+
+void actionParameterValueError(crow::Response& res, const nlohmann::json& arg1,
+ std::string_view arg2)
+{
+ res.result(boost::beast::http::status::bad_request);
+ addMessageToErrorJson(res.jsonValue, actionParameterValueError(arg1, arg2));
+}
+
+/**
+ * @internal
* @brief Formats SessionLimitExceeded message into JSON
*
* See header file for more information
diff --git a/redfish-core/src/utils/dbus_utils.cpp b/redfish-core/src/utils/dbus_utils.cpp
index 59ddb9d6ba..bffe7a867b 100644
--- a/redfish-core/src/utils/dbus_utils.cpp
+++ b/redfish-core/src/utils/dbus_utils.cpp
@@ -66,7 +66,54 @@ void afterSetProperty(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
messages::internalError(asyncResp->res);
return;
}
- // Only set 204 if another erro hasn't already happened.
+ // Only set 204 if another error hasn't already happened.
+ if (asyncResp->res.result() == boost::beast::http::status::ok)
+ {
+ asyncResp->res.result(boost::beast::http::status::no_content);
+ }
+};
+
+void afterSetPropertyAction(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+ const std::string& redfishActionName,
+ const std::string& redfishActionParameterName,
+ const boost::system::error_code& ec,
+ const sdbusplus::message_t& /*msg*/)
+{
+ if (ec)
+ {
+ if (ec.value() == boost::asio::error::invalid_argument)
+ {
+ BMCWEB_LOG_WARNING(
+ "Resource {} is patched with invalid argument during action {}",
+ redfishActionParameterName, redfishActionName);
+ if (redfishActionParameterName.empty())
+ {
+ messages::operationFailed(asyncResp->res);
+ }
+ else
+ {
+ messages::actionParameterValueError(asyncResp->res,
+ redfishActionParameterName,
+ redfishActionName);
+ }
+ return;
+ }
+ if (ec.value() == boost::asio::error::host_unreachable)
+ {
+ BMCWEB_LOG_WARNING(
+ "Resource {} is not found while performing action {}",
+ redfishActionParameterName, redfishActionName);
+ messages::resourceNotFound(asyncResp->res, "Actions",
+ redfishActionName);
+ return;
+ }
+
+ BMCWEB_LOG_ERROR("D-Bus error setting Redfish Property {} ec={}",
+ redfishActionParameterName, ec);
+ messages::internalError(asyncResp->res);
+ return;
+ }
+ // Only set 204 if another error hasn't already happened.
if (asyncResp->res.result() == boost::beast::http::status::ok)
{
asyncResp->res.result(boost::beast::http::status::no_content);