Redfish: Support health status of firmware inventory objects

Support health status of firmware inventory objects based on the mapping
relationship:
 [dbus status]     [redfish state]     [redfish health]
 Ready             Disabled            OK
 Activating        Updating            OK
 Active            Enabled             OK
 NotReady          Disabled            Warning
 Invalid           Disabled            Warning
 Failed            Disabled            Warning

Tested:
 [dbus status] --> [redfish state] --> [redfish health]
 1. Ready --> Disabled --> OK
 $ curl -k -H "X-Auth-Token: $token" https://$bmc/xyz/openbmc_project/software/enumerate
 {
    ...
    "/xyz/openbmc_project/software/9557fe67": {
       "Activation": "xyz.openbmc_project.Software.Activation.Activations.Ready",
    ...
 }
 $curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/9557fe67
 {
   "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory",
   "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/9557fe67",
   ...
   "Status": {
     "Health": "OK",
     "HealthRollup": "OK",
     "State": "Disabled"
   },
   ...
 }
 2. Activating  --> Updating  --> OK
 $ curl -k -H "X-Auth-Token: $token" https://$bmc/xyz/openbmc_project/software/enumerate
 {
    ...
    "/xyz/openbmc_project/software/9557fe67": {
       "Activation": "xyz.openbmc_project.Software.Activation.Activations.Activating",
    ...
 }
 $curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/9557fe67
 {
   "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory",
   "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/9557fe67",
   ...
   "Status": {
     "Health": "OK",
     "HealthRollup": "OK",
     "State": "Updating"
   },
   ...
 }
 3. Active --> Enabled --> OK
 $ curl -k -H "X-Auth-Token: $token" https://$bmc/xyz/openbmc_project/software/enumerate
 {
    "data": {
     "/xyz/openbmc_project/software/9557fe67": {
       "Activation": "xyz.openbmc_project.Software.Activation.Activations.Active",
    ...
 }
 $ curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/9557fe67
 {
   "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory",
   "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/9557fe67",
   ...
   "Status": {
     "Health": "OK",
     "HealthRollup": "OK",
     "State": "Enabled"
   },
   ...
 }
 4. Invalid --> Disabled --> Warning
 # busctl call xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/c0bbba12 \
   org.freedesktop.DBus.Properties Set ssv xyz.openbmc_project.Software.Activation Activation s \
   xyz.openbmc_project.Software.Activation.Activations.Invalid
 $ curl -k -H "X-Auth-Token: $token" https://$bmc/xyz/openbmc_project/software/enumerate
 {
    ...
    "/xyz/openbmc_project/software/c0bbba12": {
       "Activation": "xyz.openbmc_project.Software.Activation.Activations.Invalid",
    ...
 }
 $ curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/c0bbba12
 {
   "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory",
   "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/c0bbba12",
   ...
   "Status": {
     "Health": "Warning",
     "HealthRollup": "OK",
     "State": "Disabled"
   },
   ...
 }
 5. NotReady --> Disabled --> Warning
 # busctl call xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/c0bbba12 \
   org.freedesktop.DBus.Properties Set ssv xyz.openbmc_project.Software.Activation Activation s \
   xyz.openbmc_project.Software.Activation.Activations.NotReady
 $ curl -k -H "X-Auth-Token: $token" https://$bmc/xyz/openbmc_project/software/enumerate
 {
    ...
    "/xyz/openbmc_project/software/c0bbba12": {
       "Activation": "xyz.openbmc_project.Software.Activation.Activations.NotReady",
    ...
 }
 $ curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/c0bbba12
 {
   "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory",
   "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/c0bbba12",
   ...
   "Status": {
     "Health": "Warning",
     "HealthRollup": "OK",
     "State": "Disabled"
   },
   ...
 }
 6. Failed --> Disabled --> Warning
 # busctl call xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/c0bbba12 \
   org.freedesktop.DBus.Properties Set ssv xyz.openbmc_project.Software.Activation Activation s \
    xyz.openbmc_project.Software.Activation.Activations.Failed
 $ curl -k -H "X-Auth-Token: $token" https://$bmc/xyz/openbmc_project/software/enumerate
 {
    ...
    "/xyz/openbmc_project/software/c0bbba12": {
       "Activation": "xyz.openbmc_project.Software.Activation.Activations.Failed",
    ...
 }
 $ curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/c0bbba12
 {
   "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory",
   "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/c0bbba12",
   ...
   "Status": {
     "Health": "Warning",
     "HealthRollup": "OK",
     "State": "Disabled"
   },
   ...
 }

Validator tool result:
 Counter({'pass': 2992, 'skipOptional': 2470, 'metadataNamespaces': 1605,
 'passGet': 189, 'serviceNamespaces': 71, 'invalidPropertyValue': 10,
 'warningPresent': 6, 'passAction': 6, 'optionalAction': 5, 'warnDeprecated':
 2, 'unverifiedComplexAdditional': 1})
 Validation has succeeded.

Change-Id: Ic475f56d19c0be01ca7aebf67a3f6814d35bcacd
Signed-off-by: Carol Wang <wangkair@cn.ibm.com>
diff --git a/redfish-core/include/utils/fw_utils.hpp b/redfish-core/include/utils/fw_utils.hpp
index 7043291..2f14358 100644
--- a/redfish-core/include/utils/fw_utils.hpp
+++ b/redfish-core/include/utils/fw_utils.hpp
@@ -220,6 +220,33 @@
 }
 
 /**
+ * @brief Translate input fwState to Redfish health state
+ *
+ * This function will return the corresponding Redfish health state
+ *
+ * @param[i]   fwState  The OpenBMC firmware state
+ *
+ * @return The corresponding Redfish health state
+ */
+std::string getRedfishFWHealth(const std::string &fwState)
+{
+    if ((fwState ==
+         "xyz.openbmc_project.Software.Activation.Activations.Active") ||
+        (fwState ==
+         "xyz.openbmc_project.Software.Activation.Activations.Activating") ||
+        (fwState ==
+         "xyz.openbmc_project.Software.Activation.Activations.Ready"))
+    {
+        return "OK";
+    }
+    else
+    {
+        BMCWEB_LOG_DEBUG << "FW state " << fwState << " to Warning";
+        return "Warning";
+    }
+}
+
+/**
  * @brief Put status of input swId into json response
  *
  * This function will put the appropriate Redfish state of the input
@@ -268,6 +295,8 @@
             BMCWEB_LOG_DEBUG << "getFwStatus: Activation " << *swInvActivation;
             asyncResp->res.jsonValue["Status"]["State"] =
                 getRedfishFWState(*swInvActivation);
+            asyncResp->res.jsonValue["Status"]["Health"] =
+                getRedfishFWHealth(*swInvActivation);
         },
         dbusSvc, "/xyz/openbmc_project/software/" + *swId,
         "org.freedesktop.DBus.Properties", "GetAll",
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index 57dcc07..e3f5df7 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -772,7 +772,6 @@
                     "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory";
                 asyncResp->res.jsonValue["Name"] = "Software Inventory";
                 asyncResp->res.jsonValue["Updateable"] = false;
-                asyncResp->res.jsonValue["Status"]["Health"] = "OK";
                 asyncResp->res.jsonValue["Status"]["HealthRollup"] = "OK";
             },
             "xyz.openbmc_project.ObjectMapper",