summaryrefslogtreecommitdiff
path: root/redfish-core/lib/health.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'redfish-core/lib/health.hpp')
-rw-r--r--redfish-core/lib/health.hpp258
1 files changed, 0 insertions, 258 deletions
diff --git a/redfish-core/lib/health.hpp b/redfish-core/lib/health.hpp
deleted file mode 100644
index 20ea0f6236..0000000000
--- a/redfish-core/lib/health.hpp
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
-// Copyright (c) 2019 Intel Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-*/
-#pragma once
-
-#include "app.hpp"
-#include "async_resp.hpp"
-#include "dbus_singleton.hpp"
-#include "dbus_utility.hpp"
-
-#include <nlohmann/json.hpp>
-
-#include <array>
-#include <ranges>
-#include <string_view>
-#include <variant>
-
-namespace redfish
-{
-
-struct HealthPopulate : std::enable_shared_from_this<HealthPopulate>
-{
- // By default populate status to "/Status" of |asyncResp->res.jsonValue|.
- explicit HealthPopulate(
- const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn) :
- asyncResp(asyncRespIn),
- statusPtr("/Status")
- {}
-
- // Takes a JSON pointer rather than a reference. This is pretty useful when
- // the address of the status JSON might change, for example, elements in an
- // array.
- HealthPopulate(const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn,
- const nlohmann::json::json_pointer& ptr) :
- asyncResp(asyncRespIn),
- statusPtr(ptr)
- {}
-
- HealthPopulate(const HealthPopulate&) = delete;
- HealthPopulate(HealthPopulate&&) = delete;
- HealthPopulate& operator=(const HealthPopulate&) = delete;
- HealthPopulate& operator=(const HealthPopulate&&) = delete;
-
- ~HealthPopulate()
- {
- nlohmann::json& jsonStatus = asyncResp->res.jsonValue[statusPtr];
- nlohmann::json& health = jsonStatus["Health"];
- nlohmann::json& rollup = jsonStatus["HealthRollup"];
-
- health = "OK";
- rollup = "OK";
-
- for (const std::shared_ptr<HealthPopulate>& healthChild : children)
- {
- healthChild->globalInventoryPath = globalInventoryPath;
- healthChild->statuses = statuses;
- }
-
- for (const auto& [path, interfaces] : statuses)
- {
- bool isSelf = false;
- if (selfPath)
- {
- if (path.str == *selfPath ||
- path.str.starts_with(*selfPath + "/"))
- {
- isSelf = true;
- }
- }
-
- // managers inventory is all the inventory, don't skip any
- if (!isManagersHealth && !isSelf)
- {
- // We only want to look at this association if either the path
- // of this association is an inventory item, or one of the
- // endpoints in this association is a child
-
- bool isChild = false;
- for (const std::string& child : inventory)
- {
- if (path.str.starts_with(child))
- {
- isChild = true;
- break;
- }
- }
- if (!isChild)
- {
- for (const auto& [interface, association] : interfaces)
- {
- if (interface != "xyz.openbmc_project.Association")
- {
- continue;
- }
- for (const auto& [name, value] : association)
- {
- if (name != "endpoints")
- {
- continue;
- }
-
- const std::vector<std::string>* endpoints =
- std::get_if<std::vector<std::string>>(&value);
- if (endpoints == nullptr)
- {
- BMCWEB_LOG_ERROR("Illegal association at {}",
- path.str);
- continue;
- }
- bool containsChild = false;
- for (const std::string& endpoint : *endpoints)
- {
- if (std::ranges::find(inventory, endpoint) !=
- inventory.end())
- {
- containsChild = true;
- break;
- }
- }
- if (!containsChild)
- {
- continue;
- }
- }
- }
- }
- }
-
- if (path.str.starts_with(globalInventoryPath) &&
- path.str.ends_with("critical"))
- {
- health = "Critical";
- rollup = "Critical";
- return;
- }
- if (path.str.starts_with(globalInventoryPath) &&
- path.str.ends_with("warning"))
- {
- health = "Warning";
- if (rollup != "Critical")
- {
- rollup = "Warning";
- }
- }
- else if (path.str.ends_with("critical"))
- {
- rollup = "Critical";
- if (isSelf)
- {
- health = "Critical";
- return;
- }
- }
- else if (path.str.ends_with("warning"))
- {
- if (rollup != "Critical")
- {
- rollup = "Warning";
- }
-
- if (isSelf)
- {
- health = "Warning";
- }
- }
- }
- }
-
- // this should only be called once per url, others should get updated by
- // being added as children to the 'main' health object for the page
- void populate()
- {
- if (populated)
- {
- return;
- }
- populated = true;
- getAllStatusAssociations();
- getGlobalPath();
- }
-
- void getGlobalPath()
- {
- constexpr std::array<std::string_view, 1> interfaces = {
- "xyz.openbmc_project.Inventory.Item.Global"};
- std::shared_ptr<HealthPopulate> self = shared_from_this();
- dbus::utility::getSubTreePaths(
- "/", 0, interfaces,
- [self](const boost::system::error_code& ec,
- const dbus::utility::MapperGetSubTreePathsResponse& resp) {
- if (ec || resp.size() != 1)
- {
- // no global item, or too many
- return;
- }
- self->globalInventoryPath = resp[0];
- });
- }
-
- void getAllStatusAssociations()
- {
- std::shared_ptr<HealthPopulate> self = shared_from_this();
- sdbusplus::message::object_path path("/");
- dbus::utility::getManagedObjects(
- "xyz.openbmc_project.ObjectMapper", path,
- [self](const boost::system::error_code& ec,
- const dbus::utility::ManagedObjectType& resp) {
- if (ec)
- {
- return;
- }
- self->statuses = resp;
- for (auto it = self->statuses.begin(); it != self->statuses.end();)
- {
- if (it->first.str.ends_with("critical") ||
- it->first.str.ends_with("warning"))
- {
- it++;
- continue;
- }
- it = self->statuses.erase(it);
- }
- });
- }
-
- std::shared_ptr<bmcweb::AsyncResp> asyncResp;
-
- // Will populate the health status into |asyncResp_json[statusPtr]|
- nlohmann::json::json_pointer statusPtr;
-
- // we store pointers to other HealthPopulate items so we can update their
- // members and reduce dbus calls. As we hold a shared_ptr to them, they get
- // destroyed last, and they need not call populate()
- std::vector<std::shared_ptr<HealthPopulate>> children;
-
- // self is used if health is for an individual items status, as this is the
- // 'lowest most' item, the rollup will equal the health
- std::optional<std::string> selfPath;
-
- std::vector<std::string> inventory;
- bool isManagersHealth = false;
- dbus::utility::ManagedObjectType statuses;
- std::string globalInventoryPath = "-"; // default to illegal dbus path
- bool populated = false;
-};
-} // namespace redfish