Apply Expression Substitution for I2C Bus in Entity Config.
The bus number varies on different mobos in server3.
#tlbmc
PiperOrigin-RevId: 780345227
Change-Id: Iaa030d08fbae6822b66e52b41787a30421c8b4d3
diff --git a/tlbmc/configs/entity_config_json_impl.cc b/tlbmc/configs/entity_config_json_impl.cc
index a2314ca..68d29e2 100644
--- a/tlbmc/configs/entity_config_json_impl.cc
+++ b/tlbmc/configs/entity_config_json_impl.cc
@@ -1088,7 +1088,30 @@
const std::string* config_bus = GetValueAsString(element, "Bus");
if (config_bus != nullptr && fru_info.has_i2c_info() &&
absl::StrContainsIgnoreCase(*config_bus, "$bus")) {
- element["Bus"] = fru_info.i2c_info().bus();
+ absl::string_view config_bus_view(*config_bus);
+ absl::StatusOr<std::string> bus_value_substitute_result =
+ EvaluateStrExpressionSubstitution(
+ config_bus_view,
+ absl::StrContains(config_bus_view, "$bus") ? "$bus" : "$BUS",
+ absl::StrCat(fru_info.i2c_info().bus()));
+ if (!bus_value_substitute_result.ok()) {
+ mutable_data.parsed_status = bus_value_substitute_result.status();
+ return EntityConfigJsonImplData{
+ .immutable_data = std::move(immutable_data),
+ .mutable_data = std::move(mutable_data),
+ .max_updates_to_mutable_data = ad_hoc_fru_count};
+ }
+ uint64_t bus_value;
+ if (!absl::SimpleAtoi(*bus_value_substitute_result, &bus_value)) {
+ LOG(WARNING) << absl::StrCat(
+ "Invalid json: Failed to convert value at Bus",
+ " to unsigned value: ", config_bus_view);
+ return EntityConfigJsonImplData{
+ .immutable_data = std::move(immutable_data),
+ .mutable_data = std::move(mutable_data),
+ .max_updates_to_mutable_data = ad_hoc_fru_count};
+ }
+ element["Bus"] = bus_value;
}
// Substitute Address field.