diff options
author | James Feist <james.feist@linux.intel.com> | 2019-10-30 02:26:48 +0300 |
---|---|---|
committer | James Feist <james.feist@linux.intel.com> | 2019-11-04 21:38:52 +0300 |
commit | 2ad9c2f694b9a75b5f14f485ebab28bd32d0f575 (patch) | |
tree | d9e147dbc771515b095c0cb1062dbbf7c6fb2d44 /redfish-core/lib/storage.hpp | |
parent | 0c0f18e71e24cf99af0f0bc6573072c366f789b4 (diff) | |
download | bmcweb-2ad9c2f694b9a75b5f14f485ebab28bd32d0f575.tar.xz |
Add Storage Health & Update Systems Health
This adds health to storage based on drive inventory and
updates systems health to include drives.
This also fixes properties that are manditory in drives to
make this patch pass the validator.
Tested:
Validator Passed.
Failed a drive and saw:
{
"@odata.context": "/redfish/v1/$metadata#Storage.Storage",
"@odata.id": "/redfish/v1/Systems/system/Storage/1",
"@odata.type": "#Storage.v1_7_1.Storage",
"Drives": [
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_1"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_2"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_3"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_4"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_5"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_6"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_7"
},
{
"@odata.id": "/redfish/v1/Systems/system/Storage/1/Drive/Drive_8"
}
],
"Drives@odata.count": 8,
"Id": "1",
"Name": "Storage Controller",
"Status": {
"Health": "Warning",
"HealthRollup": "Warning",
"State": "Enabled"
}
}
And In systems:
"Status": {
"Health": "Warning",
"HealthRollup": "Warning",
"State": "Enabled"
},
Change-Id: I7abf042ac51b1fbe9e4ee0b72876e9be96e60b7c
Signed-off-by: James Feist <james.feist@linux.intel.com>
Diffstat (limited to 'redfish-core/lib/storage.hpp')
-rw-r--r-- | redfish-core/lib/storage.hpp | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp index 611c7e77e9..9c51975eb1 100644 --- a/redfish-core/lib/storage.hpp +++ b/redfish-core/lib/storage.hpp @@ -15,6 +15,8 @@ */ #pragma once +#include "health.hpp" + #include <node.hpp> namespace redfish @@ -74,6 +76,7 @@ class Storage : public Node res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system/Storage/1"; res.jsonValue["Name"] = "Storage Controller"; res.jsonValue["Id"] = "1"; + res.jsonValue["Status"]["State"] = "Enabled"; auto asyncResp = std::make_shared<AsyncResp>(res); crow::connections::systemBus->async_method_call( @@ -83,12 +86,18 @@ class Storage : public Node asyncResp->res.jsonValue["Drives"]; storageArray = nlohmann::json::array(); asyncResp->res.jsonValue["Drives@odata.count"] = 0; + auto health = std::make_shared<HealthPopulate>(asyncResp); + if (ec) { BMCWEB_LOG_ERROR << "Drive mapper call error"; messages::internalError(asyncResp->res); return; } + + health->inventory = storageList; + health->populate(); + for (const std::string &objpath : storageList) { std::size_t lastPos = objpath.rfind("/"); @@ -178,6 +187,8 @@ class Drive : public Node "/redfish/v1/$metadata#Drive.Drive"; asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system/Storage/1/Drives/" + driveId; + asyncResp->res.jsonValue["Name"] = driveId; + asyncResp->res.jsonValue["Id"] = driveId; if (connectionNames.size() != 1) { @@ -197,12 +208,11 @@ class Drive : public Node const std::string &connectionName = connectionNames[0].first; crow::connections::systemBus->async_method_call( - [asyncResp, - driveId](const boost::system::error_code ec, - const std::vector<std::pair< - std::string, - std::variant<bool, std::string, uint64_t>>> - &propertiesList) { + [asyncResp](const boost::system::error_code ec, + const std::vector<std::pair< + std::string, + std::variant<bool, std::string, uint64_t>>> + &propertiesList) { if (ec) { // this interface isn't necessary @@ -233,8 +243,6 @@ class Drive : public Node asyncResp->res.jsonValue[propertyName] = *value; } } - asyncResp->res.jsonValue["Name"] = driveId; - asyncResp->res.jsonValue["Id"] = driveId; }, connectionName, path, "org.freedesktop.DBus.Properties", "GetAll", "xyz.openbmc_project.Inventory.Decorator.Asset"); @@ -242,35 +250,32 @@ class Drive : public Node // default it to Enabled asyncResp->res.jsonValue["Status"]["State"] = "Enabled"; + auto health = std::make_shared<HealthPopulate>(asyncResp); + health->inventory = std::vector<std::string>{path}; + + health->populate(); + crow::connections::systemBus->async_method_call( [asyncResp, path](const boost::system::error_code ec, const std::variant<bool> present) { // this interface isn't necessary, only check it if we // get a good return - if (!ec) + if (ec) { - const bool *enabled = std::get_if<bool>(&present); - if (enabled == nullptr) - { - BMCWEB_LOG_DEBUG << "Illegal property present"; - messages::internalError(asyncResp->res); - return; - } - if (!(*enabled)) - { - asyncResp->res.jsonValue["Status"]["State"] = - "Disabled"; - return; - } + return; + } + const bool *enabled = std::get_if<bool>(&present); + if (enabled == nullptr) + { + BMCWEB_LOG_DEBUG << "Illegal property present"; + messages::internalError(asyncResp->res); + return; + } + if (!(*enabled)) + { + asyncResp->res.jsonValue["Status"]["State"] = + "Disabled"; } - - // only populate if Enabled, assume enabled unless item - // interface says otherwise - auto health = - std::make_shared<HealthPopulate>(asyncResp); - health->inventory = std::vector<std::string>{path}; - - health->populate(); }, connectionName, path, "org.freedesktop.DBus.Properties", "Get", "xyz.openbmc_project.Inventory.Item", "Present"); |