phosphor-state-manager: Support multi-host for persist files
phosphor-host-state-manager and phosphor-chassis-state-manager store
informations in files then restore that on service starting.
Since state-managers already change to multi-host now, information
should store into different files from each service instance.
forbackward capability, if there are legacy persist file exist,
rename it to the new file format of instance ;0',i.e, rename files:
'requestedHostTransition' to 'host0-PersistData',
'POHCounter' to 'chassis-POHCounter',
'chassisStateChangeTime' to 'chassis0-StateChangeTime'
Changes:
a.phosphor-host-state-manager:
'/var/lib/phosphor-state-manager/requestedHostTransition'
this file not only store requestedHostTransition now,
rename to PersistData and add host-N prefix for each service.
For example, bus xyz.openbmc_project.State.Host1 store data to
'/var/lib/phosphor-state-manager/host1-PersistData'
xyz.openbmc_project.State.Host2 store date to
'/var/lib/phosphor-state-manager/host2-PersistData'
b.phosphor-chassis-state-manager:
There are two files to store informations
'/var/lib/phosphor-state-manager/POHCounter',
'/var/lib/phosphor-state-manager/chassisStateChangeTime'
change to:
'/var/lib/phosphor-state-manager/chassis1-POHCounter',
'/var/lib/phosphor-state-manager/chassis2-POHCounter'
...
'/var/lib/phosphor-state-manager/chassis1-StateChangeTime'
'/var/lib/phosphor-state-manager/chassis2-StateChangeTime'
... for each service.
Tested on Bletchley HW,
set xyz.openbmc_project.State.Host1 RequestedHostTransition to On
'busctl set-property xyz.openbmc_project.State.Host1 /xyz/openbmc_project/state/host1
xyz.openbmc_project.State.Host RequestedHostTransition s "xyz.openbmc_project.State.Host.Transition.On"'
This request will store in file:
'cat /var/lib/phosphor-state-manager/host1-PersistData'
{
"value0": {
"cereal_class_version": 1,
"value0": "xyz.openbmc_project.State.Host.Transition.On",
"value1": "xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified",
"value2": "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive"
}
restart xyz.openbmc_project.State.Host1~Host6 or reboot BMC, 'RequestedHostTransition' for host1 still "On"
'busctl get-property xyz.openbmc_project.State.Host1 /xyz/openbmc_project/state/host1
xyz.openbmc_project.State.Host RequestedHostTransition'
s "xyz.openbmc_project.State.Host.Transition.On"
'RequestedHostTransition' of the rest 5 Hosts are default value "xyz.openbmc_project.State.Host.Transition.Off"
Also, set POHCounter of xyz.openbmc_project.State.Chassis2
'busctl set-property xyz.openbmc_project.State.Chassis2 /xyz/openbmc_project/state/chassis2
xyz.openbmc_project.State.PowerOnHours POHCounter u 5'
it will restore after service restart or BMC reboot,
'busctl get-property xyz.openbmc_project.State.Chassis2 /xyz/openbmc_project/state/chassis2
xyz.openbmc_project.State.PowerOnHours POHCounter'
u 5
Change-Id: I739c62707bb805e7c25f399a2fea06beee5543a0
Signed-off-by: Allen.Wang <Allen_Wang@quantatw.com>
diff --git a/chassis_state_manager_main.cpp b/chassis_state_manager_main.cpp
index eac4fd4..c1dccf7 100644
--- a/chassis_state_manager_main.cpp
+++ b/chassis_state_manager_main.cpp
@@ -2,14 +2,21 @@
#include "chassis_state_manager.hpp"
+#include <fmt/format.h>
#include <getopt.h>
#include <sdbusplus/bus.hpp>
#include <cstdlib>
#include <exception>
+#include <filesystem>
#include <iostream>
+constexpr auto LEGACY_POH_COUNTER_PERSIST_PATH =
+ "/var/lib/phosphor-state-manager/POHCounter";
+constexpr auto LEGACY_STATE_CHANGE_PERSIST_PATH =
+ "/var/lib/phosphor-state-manager/chassisStateChangeTime";
+
int main(int argc, char** argv)
{
size_t chassisId = 0;
@@ -30,12 +37,37 @@
}
}
+ namespace fs = std::filesystem;
+
auto bus = sdbusplus::bus::new_default();
auto chassisBusName =
std::string{CHASSIS_BUSNAME} + std::to_string(chassisId);
auto objPathInst = std::string{CHASSIS_OBJPATH} + std::to_string(chassisId);
+ if (chassisId == 0)
+ {
+ // Chassis State Manager was only support single-chassis and there only
+ // two file to store persist values(POH and state change time), to
+ // support multi-chassis state mamagement, each service access new file
+ // paths with prefix 'chassisN', if any legacy persist file is exist,
+ // rename it to the new file format of chassis0.
+
+ fs::path legacyPohPath{LEGACY_POH_COUNTER_PERSIST_PATH};
+ fs::path legacyStateChangePath{LEGACY_STATE_CHANGE_PERSIST_PATH};
+ fs::path newPohPath{fmt::format(POH_COUNTER_PERSIST_PATH, chassisId)};
+ fs::path newStateChangePath{
+ fmt::format(CHASSIS_STATE_CHANGE_PERSIST_PATH, chassisId)};
+ if (fs::exists(legacyPohPath))
+ {
+ fs::rename(legacyPohPath, newPohPath);
+ }
+ if (fs::exists(legacyStateChangePath))
+ {
+ fs::rename(legacyStateChangePath, newStateChangePath);
+ }
+ }
+
// Add sdbusplus ObjectManager.
sdbusplus::server::manager::manager objManager(bus, objPathInst.c_str());
phosphor::state::manager::Chassis manager(bus, objPathInst.c_str(),