Correct determination of Trigger's MetricType
Determining triggers type only by checking existence of either
`DiscreteThresholds` or `NumericThresholds` is wrong, because both
properties are always present in their dbus interface representation.
This leads to situations, where:
- `Trigger` resources, which were supposed to be numeric, contain
properties exclusive to discrete ones (like `DiscreteTriggerCondition`),
- `Trigger` resources, which were supposed to be discrete, have
`MetricType` set to `Numeric` (because `NumericThresholds` property
exists as an empty array).
To fully determine trigger's type, a check for `Discrete` property value
need to be made.
Tested:
1. POST three different triggers on
/redfish/v1/TelemetryService/Triggers:
- simple numeric trigger (`MetricType` set to `Numeric`, non-empty
`NumericThresholds`)
- simple discrete trigger (`MetricType` set to `Discrete`,
`DiscreteTriggerCondition` set to `Specified`, non-empty
`DiscreteTriggers`)
- simple discrete on-change trigger (`MetricType` set to `Discrete`,
`DiscreteTriggerCondition` set to `Changed`, empty `DiscreteTriggers`)
2. Verified `MetricType` value of created `Trigger` resources:
- simple numeric trigger has `MetricType` set to `Numeric`,
- simple discrete trigger has `MetricType` set to `Discrete`,
- simple discrete on-change trigger has `MetricType` set to `Discrete`.
Change-Id: Ifc7033eda0fb52fa42e292e1dc36dc433e9ea022
Signed-off-by: Michal Orzel <michalx.orzel@intel.com>
diff --git a/redfish-core/lib/trigger.hpp b/redfish-core/lib/trigger.hpp
index 75e8287..0cad4ae 100644
--- a/redfish-core/lib/trigger.hpp
+++ b/redfish-core/lib/trigger.hpp
@@ -886,39 +886,50 @@
json["Links"]["MetricReportDefinitions"] = *linkedReports;
}
- if (discreteThresholds != nullptr)
+ if (discreteThresholds == nullptr || numericThresholds == nullptr)
{
- std::optional<nlohmann::json::array_t> discreteTriggers =
- getDiscreteTriggers(*discreteThresholds);
-
- if (!discreteTriggers)
- {
- BMCWEB_LOG_ERROR("Property Thresholds is invalid for discrete "
- "triggers in Trigger: {}",
- id);
- return false;
- }
-
- json["DiscreteTriggers"] = *discreteTriggers;
- json["DiscreteTriggerCondition"] =
- discreteTriggers->empty() ? "Changed" : "Specified";
- json["MetricType"] = metric_definition::MetricType::Discrete;
+ // Current design of telemetry's Trigger interface shouldn't allow that
+ // to happen. If the code goes here, then this is an internal error to
+ // investigate.
+ return false;
}
- if (numericThresholds != nullptr)
+
+ if (discrete != nullptr)
{
- std::optional<nlohmann::json::object_t> jnumericThresholds =
- getNumericThresholds(*numericThresholds);
-
- if (!jnumericThresholds)
+ if (*discrete)
{
- BMCWEB_LOG_ERROR("Property Thresholds is invalid for numeric "
- "thresholds in Trigger: {}",
- id);
- return false;
- }
+ std::optional<nlohmann::json::array_t> discreteTriggers =
+ getDiscreteTriggers(*discreteThresholds);
- json["NumericThresholds"] = *jnumericThresholds;
- json["MetricType"] = metric_definition::MetricType::Numeric;
+ if (!discreteTriggers)
+ {
+ BMCWEB_LOG_ERROR("Property Thresholds is invalid for discrete "
+ "triggers in Trigger: {}",
+ id);
+ return false;
+ }
+
+ json["DiscreteTriggers"] = *discreteTriggers;
+ json["DiscreteTriggerCondition"] =
+ discreteTriggers->empty() ? "Changed" : "Specified";
+ json["MetricType"] = metric_definition::MetricType::Discrete;
+ }
+ else
+ {
+ std::optional<nlohmann::json::object_t> jnumericThresholds =
+ getNumericThresholds(*numericThresholds);
+
+ if (!jnumericThresholds)
+ {
+ BMCWEB_LOG_ERROR("Property Thresholds is invalid for numeric "
+ "thresholds in Trigger: {}",
+ id);
+ return false;
+ }
+
+ json["NumericThresholds"] = *jnumericThresholds;
+ json["MetricType"] = metric_definition::MetricType::Numeric;
+ }
}
if (name != nullptr)