Add BMC UUID to BmcStaticMetrics.

Introduce a new field `bmc_uuid_` in `BmcStaticMetrics` and add a method `FetchBmcUuid` to retrieve the BMC's UUID during initialization.

#tlbmc
#pid-tlbmc-migration

PiperOrigin-RevId: 826174773
Change-Id: I59469498dcfcc962ed0ddd07bf4461e6d8059644
diff --git a/tlbmc/metrics/bmc_static_metrics.cc b/tlbmc/metrics/bmc_static_metrics.cc
index 4304ce7..049478a 100644
--- a/tlbmc/metrics/bmc_static_metrics.cc
+++ b/tlbmc/metrics/bmc_static_metrics.cc
@@ -1,5 +1,8 @@
 #include "tlbmc/metrics/bmc_static_metrics.h"
 
+#include <sys/sysinfo.h>
+#include <systemd/sd-id128.h>
+
 #include <array>
 #include <cstdint>
 #include <filesystem>  // NOLINT
@@ -93,6 +96,23 @@
   return version_id;
 }
 
+absl::StatusOr<std::string> BmcStaticMetrics::FetchBmcUuid() {
+  std::string uuid;
+  // This ID needs to match the one in ipmid
+  sd_id128_t app_id{{0Xe0, 0Xe1, 0X73, 0X76, 0X64, 0X61, 0X47, 0Xda, 0Xa5, 0X0c,
+                     0Xd0, 0Xcc, 0X64, 0X12, 0X45, 0X78}};
+  sd_id128_t machine_id{};
+  if (sd_id128_get_machine_app_specific(app_id, &machine_id) == 0) {
+    std::array<char, SD_ID128_STRING_MAX> str{};
+    uuid = sd_id128_to_string(machine_id, str.data());
+    uuid.insert(8, 1, '-');
+    uuid.insert(13, 1, '-');
+    uuid.insert(18, 1, '-');
+    uuid.insert(23, 1, '-');
+  }
+  return uuid;
+}
+
 absl::StatusOr<std::unique_ptr<BmcStaticMetrics>> BmcStaticMetrics::Create(
     std::string_view root_path) {
   ECCLESIA_ASSIGN_OR_RETURN(std::string bmc_firmware_version,
@@ -101,8 +121,10 @@
       std::string bmc_firmware_version_id,
       FetchBmcFirmwareVersionId(root_path, bmc_firmware_version));
 
-  return absl::WrapUnique(
-      new BmcStaticMetrics(bmc_firmware_version, bmc_firmware_version_id));
+  ECCLESIA_ASSIGN_OR_RETURN(std::string bmc_uuid, FetchBmcUuid());
+
+  return absl::WrapUnique(new BmcStaticMetrics(
+      bmc_firmware_version, bmc_firmware_version_id, bmc_uuid));
 }
 
 std::string BmcStaticMetrics::GetBmcFirmwareVersion() const {
@@ -113,4 +135,6 @@
   return bmc_firmware_version_id_;
 }
 
+std::string BmcStaticMetrics::GetBmcUuid() const { return bmc_uuid_; }
+
 }  // namespace milotic_tlbmc
diff --git a/tlbmc/metrics/bmc_static_metrics.h b/tlbmc/metrics/bmc_static_metrics.h
index e625165..3b25441 100644
--- a/tlbmc/metrics/bmc_static_metrics.h
+++ b/tlbmc/metrics/bmc_static_metrics.h
@@ -17,6 +17,7 @@
 
   std::string GetBmcFirmwareVersion() const;
   std::string GetBmcFirmwareVersionId() const;
+  std::string GetBmcUuid() const;
 
  protected:
   BmcStaticMetrics() = default;
@@ -33,14 +34,19 @@
   static absl::StatusOr<std::string> FetchBmcFirmwareFlashId(
       std::string_view root_path);
 
+  static absl::StatusOr<std::string> FetchBmcUuid();
+
  private:
   explicit BmcStaticMetrics(std::string_view bmc_firmware_version,
-                            std::string_view bmc_firmware_version_id)
+                            std::string_view bmc_firmware_version_id,
+                            std::string_view bmc_uuid)
       : bmc_firmware_version_(bmc_firmware_version),
-        bmc_firmware_version_id_(bmc_firmware_version_id) {}
+        bmc_firmware_version_id_(bmc_firmware_version_id),
+        bmc_uuid_(bmc_uuid) {}
 
   std::string bmc_firmware_version_;
   std::string bmc_firmware_version_id_;
+  std::string bmc_uuid_;
 };
 
 }  // namespace milotic_tlbmc