This CL integrates the PowerFaultLogCollector into the tlbmc store.

This change includes:

- Adding PowerFaultLogCollector to the collector factory and store implementation.
- Including the PowerFaultLogCollector in the JSON outputs for debug and store.
- Exposing methods to retrieve power fault log entries and file content through the Store interface.
- Updating unit tests to mock and test the new PowerFaultLogCollector integration.

This allows the tlbmc to collect and expose power fault logs.

#tlbmc_power_fault_log

PiperOrigin-RevId: 847542851
Change-Id: I9b7c0f35262f07ac260e6f45f5c2ffe2623e94f7
diff --git a/tlbmc/store/factory.h b/tlbmc/store/factory.h
index 429a21f..a9453aa 100644
--- a/tlbmc/store/factory.h
+++ b/tlbmc/store/factory.h
@@ -14,6 +14,7 @@
 #include "tlbmc/collector/fru_collector.h"
 #include "tlbmc/collector/gpio_collector.h"
 #include "tlbmc/collector/metric_collector.h"
+#include "tlbmc/collector/power_fault_log_collector.h"
 #include "tlbmc/collector/sensor_collector.h"
 #include "tlbmc/collector/thermal_collector.h"
 #include "tlbmc/configs/entity_config.h"
@@ -42,6 +43,9 @@
                          SensorCollector* absl_nonnull sensor_collector) = 0;
   virtual absl::StatusOr<std::shared_ptr<PowerControl>> CreatePowerControl(
       const PowerControl::Params& params) = 0;
+  virtual absl::StatusOr<std::unique_ptr<PowerFaultLogCollector>>
+  CreatePowerFaultLogCollector(
+      const PowerFaultLogCollector::Params& params) = 0;
 };
 
 class CollectorFactoryImpl : public CollectorFactory {
@@ -76,6 +80,12 @@
       const PowerControl::Params& params) override {
     return PowerControl::Create(params);
   }
+
+  absl::StatusOr<std::unique_ptr<PowerFaultLogCollector>>
+  CreatePowerFaultLogCollector(
+      const PowerFaultLogCollector::Params& params) override {
+    return PowerFaultLogCollector::Create(params);
+  }
 };
 
 // Factory to create a config reader.
diff --git a/tlbmc/store/store.h b/tlbmc/store/store.h
index 92119f5..8a4690a 100644
--- a/tlbmc/store/store.h
+++ b/tlbmc/store/store.h
@@ -23,6 +23,7 @@
 #include "topology_config.pb.h"
 #include "tlbmc/credentials/credential_manager.h"
 #include "fru.pb.h"
+#include "power_fault_log_entry.pb.h"
 #include "software_metrics.pb.h"
 #include "tlbmc/sensors/sensor.h"
 #include "tlbmc/thermal/fan_pid_controller.h"
@@ -183,6 +184,13 @@
                                               absl::Duration delay) = 0;
   // Get hotswap GPIO name for AC power cycle.
   virtual absl::StatusOr<std::string> GetHotswapGpioName() = 0;
+
+  // Get power fault log entries.
+  virtual PowerFaultLogEntries GetPowerFaultLogEntries() const = 0;
+
+  // Get power fault log file content.
+  virtual absl::StatusOr<std::string> GetPowerFaultLogFileContent(
+      absl::string_view folder_name, absl::string_view file_name) const = 0;
 };
 
 }  // namespace milotic_tlbmc
diff --git a/tlbmc/store/store_impl.cc b/tlbmc/store/store_impl.cc
index 1b34a7a..b79a42b 100644
--- a/tlbmc/store/store_impl.cc
+++ b/tlbmc/store/store_impl.cc
@@ -26,6 +26,7 @@
 #include "tlbmc/collector/fru_collector.h"
 #include "tlbmc/collector/gpio_collector.h"
 #include "tlbmc/collector/metric_collector.h"
+#include "tlbmc/collector/power_fault_log_collector.h"
 #include "tlbmc/collector/sensor_collector.h"
 #include "tlbmc/collector/thermal_collector.h"
 #include "ad_hoc_fru_config.pb.h"
@@ -287,6 +288,7 @@
   json["Metric"] = all_collectors_.metric_collector->ToJson();
   json["Gpio"] = all_collectors_.gpio_collector->ToJson();
   json["Fan"] = all_collectors_.thermal_collector->ToJson();
+  json["PowerFaultLog"] = all_collectors_.power_fault_log_collector->ToJson();
   json["EntityConfig"] = entity_config_->ToJson();
   return json;
 }
@@ -300,6 +302,8 @@
       all_collectors_.metric_collector->GetSchedulerStats();
   json["GpioCollector"] = all_collectors_.gpio_collector->GetSchedulerStats();
   json["Fan"] = all_collectors_.thermal_collector->GetSchedulerStats();
+  json["PowerFaultLogCollector"] =
+      all_collectors_.power_fault_log_collector->GetSchedulerStats();
   json["Store"] = task_scheduler_->ToJson();
   return json;
 }
@@ -431,6 +435,7 @@
       .metric_collector = EmptyMetricCollector::Create(),
       .gpio_collector = EmptyGpioCollector::Create(),
       .thermal_collector = EmptyThermalCollector::Create(),
+      .power_fault_log_collector = EmptyPowerFaultLogCollector::Create(),
   };
   std::shared_ptr<EntityConfig> entity_config_shared =
       EmptyEntityConfigImpl::Create();
@@ -652,6 +657,27 @@
     }
   }
 
+  if (GetTlbmcConfig().power_fault_log_collector_module().enabled()) {
+    // The PowerFaultLogCollector is responsible for loading its own config.
+    PowerFaultLogCollector::Params params;
+    params.config = options.proto_parser->GetPowerFaultLogConfig();
+    absl::StatusOr<std::unique_ptr<PowerFaultLogCollector>>
+        power_fault_log_collector =
+            options.collector_factory->CreatePowerFaultLogCollector(params);
+    if (!power_fault_log_collector.ok()) {
+      LOG(ERROR) << "Failed to create PowerFaultLogCollector: "
+                 << power_fault_log_collector.status();
+      return power_fault_log_collector.status();
+    }
+    if (absl::Status status = (*power_fault_log_collector)->StartCollection();
+        !status.ok()) {
+      LOG(ERROR) << "Failed to start PowerFaultLogCollector: " << status;
+      return status;
+    }
+    all_collectors.power_fault_log_collector =
+        std::move(*power_fault_log_collector);
+  }
+
   // Create the store
   int periodic_dump_interval_ms =
       options.override_store_snapshot_interval_ms.value_or(
@@ -740,4 +766,14 @@
   }
 }
 
+PowerFaultLogEntries StoreImpl::GetPowerFaultLogEntries() const {
+  return all_collectors_.power_fault_log_collector->GetCollectedEntries();
+}
+
+absl::StatusOr<std::string> StoreImpl::GetPowerFaultLogFileContent(
+    absl::string_view folder_name, absl::string_view file_name) const {
+  return all_collectors_.power_fault_log_collector->GetLogFileContent(
+      folder_name, file_name);
+}
+
 }  // namespace milotic_tlbmc
diff --git a/tlbmc/store/store_impl.h b/tlbmc/store/store_impl.h
index 17643e6..54d15a6 100644
--- a/tlbmc/store/store_impl.h
+++ b/tlbmc/store/store_impl.h
@@ -17,6 +17,7 @@
 #include "tlbmc/collector/fru_collector.h"
 #include "tlbmc/collector/gpio_collector.h"
 #include "tlbmc/collector/metric_collector.h"
+#include "tlbmc/collector/power_fault_log_collector.h"
 #include "tlbmc/collector/sensor_collector.h"
 #include "tlbmc/collector/thermal_collector.h"
 #include "ad_hoc_fru_config.pb.h"
@@ -56,6 +57,7 @@
   std::unique_ptr<MetricCollector> metric_collector = nullptr;
   std::unique_ptr<GpioCollector> gpio_collector = nullptr;
   std::unique_ptr<ThermalCollector> thermal_collector = nullptr;
+  std::unique_ptr<PowerFaultLogCollector> power_fault_log_collector = nullptr;
 };
 
 // Implementation of the Store interface.
@@ -227,6 +229,12 @@
 
   absl::StatusOr<std::string> GetHotswapGpioName() override;
 
+  PowerFaultLogEntries GetPowerFaultLogEntries() const override;
+
+  absl::StatusOr<std::string> GetPowerFaultLogFileContent(
+      absl::string_view folder_name,
+      absl::string_view file_name) const override;
+
  protected:
   StoreImpl() = default;
   std::unique_ptr<CredentialManager> credential_manager_;