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)