Slice PM Counters VES Standard defined
[o-du/l2.git] / src / o1 / ves / VesCommonHeader.cpp
index 3c4b1f9..23e274f 100644 (file)
 #include <sstream>
 #include "JsonHelper.hpp"
 #include "VesCommonHeader.hpp"
+#include "VesUtils.hpp"
 
-static uint16_t seqNo = 0;
+static double seqNo = 0;
+
+#define MAX_TIME_STR 35
 
 /*******************************************************************
  *
@@ -46,7 +49,7 @@ static uint16_t seqNo = 0;
  *
  * ****************************************************************/
 
-uint16_t VesCommonHeader::nextSequenceNo()
+double VesCommonHeader::nextSequenceNo()
 {
    return seqNo++;
 }
@@ -67,7 +70,7 @@ uint16_t VesCommonHeader::nextSequenceNo()
  *
  * ****************************************************************/
 
-uint16_t VesCommonHeader::getSequenceNo()
+double VesCommonHeader::getSequenceNo()
 {
    return seqNo;
 }
@@ -98,16 +101,27 @@ string VesCommonHeader::getEventTypeToStr()
          str = "pnfRegistration";
          break;
       case VesEventType::FAULT_NOTIFICATION:
-         str = "faultNotification";
+         #ifdef StdDef
+         str = "stndDefined";
+         #else
+         str = "fault";
+         #endif
          break;
       case VesEventType::PM_NOTIFICATION:
          str = "pmNotification";
          break;
+      case VesEventType::PM_SLICE:
+         #ifdef StdDef
+         str = "stndDefined";
+         #else
+         str = "measurement";
+         #endif
+         break;
       case VesEventType::HEARTBEAT:
          str = "heartbeat";
          break;
       default:
-         O1_LOG("O1 VES : VES msg Type is not avilable\n");
+         O1_LOG("\nO1 VesCommonHeader : VES msg Type not supported");
          break;
    }
    return str;
@@ -134,6 +148,9 @@ string VesCommonHeader::getEventId()
 {
   /*Currently PNF_REGISTRATION only supported. This function must be updated
     in later releases*/
+   std::ostringstream oss;
+   oss << mLastEpochTime;
+   string stringEpochTime = oss.str().substr(0, 10);
    string evntId = "";
    switch(mEventType)
    {
@@ -141,27 +158,40 @@ string VesCommonHeader::getEventId()
          evntId = getSourceName() + "_" + MODEL_NUMBER_007_DEV;
          break;
       case VesEventType::HEARTBEAT:
-         evntId = getEventTypeToStr() + "_" + getCurrentTime();
+         evntId = getEventTypeToStr() + "_" + formatTime(getCurrentTime());
          break;
+      case VesEventType::PM_SLICE:
+         #ifdef StdDef
+         evntId = SLICE_EVENTID;
+         #else
+         evntId = "_" + stringEpochTime + "_" + "PM1min";
+         #endif
+     break;
+      case VesEventType::FAULT_NOTIFICATION:
+         #ifdef StdDef
+         evntId = FAULT_EVENTID;
+         #else
+         evntId ="O_RAN_COMPONENT_Alarms-61";
+         #endif
+     break;
       default:
-         O1_LOG("O1 VES : this VES msg Type support in getEventId is \
-not available\n");
+         O1_LOG("\nO1 VesCommonHeader : this VES msg Type support in getEventId is \
+not available");
          break;
    }
    return evntId;
-
 }
 
 /*******************************************************************
  *
- * @brief create Ves Event Type
+ * @brief create Ves Event Type from Ves Event type
  *
  * @details
  *
  *    Function : getEventType
  *
  *    Functionality:
- *      - create Ves Event Type
+ *      - create Ves Event Type from Ves Event type
  *
  * @params[in] IN - void
  * @return value of string     - success
@@ -181,11 +211,21 @@ string VesCommonHeader::getEventType()
          evntType = EVENT_TYPE_5G;
          break;
       case VesEventType::HEARTBEAT:
-         evntType = EVENT_TYPE_ORAN_COMPONENET;
+         evntType = EVENT_TYPE_ORAN_COMPONENT;
+         break;
+      case VesEventType::PM_SLICE:
+         #ifdef StdDef
+         evntType = PM_SLICE_EVENT_TYPE;
+         #else
+         evntType = EVENT_TYPE_ORAN_COMPONENT_PM;
+         #endif
          break;
+      case VesEventType::FAULT_NOTIFICATION:
+         evntType = FAULT_TYPE;
+        break;
       default:
-         O1_LOG("O1 VES : this VES msg Type support in getEvenType is \
-not available\n");
+         O1_LOG("\nO1 VesCommonHeader : this VES msg Type support in getEvenType is \
+not available");
          break;
    }
    return evntType;
@@ -222,9 +262,15 @@ string VesCommonHeader::getPriority()
       case VesEventType::HEARTBEAT:
          evntId = PRIORITY_LOW;
          break;
+      case VesEventType::PM_SLICE:
+         evntId = PRIORITY_LOW ;
+         break;
+      case VesEventType::FAULT_NOTIFICATION:
+         evntId = PRIORITY_LOW ;
+        break;
       default:
-         O1_LOG("O1 VES : This VES msg Type support in getPriority is \
-not available\n");
+         O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in getPriority is \
+not available");
          break;
    }
    return evntId;
@@ -260,11 +306,25 @@ string VesCommonHeader::getEventName()
          evntName = getEventTypeToStr() + "_" + EVENT_TYPE_5G;
          break;
       case VesEventType::HEARTBEAT:
-         evntName = getEventTypeToStr() + "_" + EVENT_TYPE_ORAN_COMPONENET;
+         evntName = getEventTypeToStr() + "_" + EVENT_TYPE_ORAN_COMPONENT;
          break;
+      case VesEventType::PM_SLICE:
+         #ifdef StdDef
+         evntName = PM_SLICE_EVENT_NAME;
+         #else
+         evntName = getEventTypeToStr() + "_" + EVENT_TYPE_ORAN_COMPONENT_PM;
+         #endif
+         break;
+      case VesEventType::FAULT_NOTIFICATION:
+         #ifdef StdDef
+         evntName = FAULT_EVENT_NAME;
+         #else
+         evntName ="O_RAN_COMPONENT_Alarms";
+         #endif
+        break;
       default:
-         O1_LOG("O1 VES : This VES msg Type support in getEventName is \
-not available\n");
+         O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in getEventName is \
+         not available");
          break;
    }
    return evntName;
@@ -276,7 +336,7 @@ not available\n");
  *
  * @details
  *
- *    Function : getReportingEntityName
+ *    Function : getReportingEntityId
  *
  *    Functionality:
  *      - create Ves Event Name from Ves Event type
@@ -286,20 +346,24 @@ not available\n");
  *         empty string        - failure
  * ****************************************************************/
 
-string VesCommonHeader::getReportingEntityName()
+string VesCommonHeader::getReportingEntityId()
 {
-  /*Currently PNF_REGISTRATION only supported. This function must be updated
-    in later releases*/
+  /*Currently PNF_REGISTRATION and PM_SLICE are only supported.
+   This function must be updated in later releases*/
 
    string evntName = "";
    switch(mEventType)
    {
       case VesEventType::PNF_REGISTRATION:
-         evntName = getSourceName();
+         evntName = ODU_HIGH;
          break;
+      case VesEventType::PM_SLICE:
+         evntName = ODU_HIGH;
+        break;
+      case VesEventType::FAULT_NOTIFICATION:
+         evntName = ODU_HIGH;
+        break;
       default:
-         O1_LOG("O1 VES : This VES msg Type support in \
-getReportingEntityName is not available\n");
          break;
    }
    return evntName;
@@ -307,14 +371,52 @@ getReportingEntityName is not available\n");
 
 /*******************************************************************
  *
- * @brief create Ves Event Name from Ves Event type
+ * @brief create Reporting Entity Name from Ves Event type
  *
  * @details
  *
  *    Function : getReportingEntityName
  *
  *    Functionality:
- *      - create Ves Event Name from Ves Event type
+ *      - create Reporting Entity Name from Ves Event type
+ *
+ * @params[in] IN - void
+ * @return value of string     - success
+ *         empty string        - failure
+ * ****************************************************************/
+
+string VesCommonHeader::getReportingEntityName()
+{
+   string evntName = "";
+   switch(mEventType)
+   {
+      case VesEventType::PNF_REGISTRATION:
+         evntName = getSourceName();
+         break;
+      case VesEventType::PM_SLICE:
+         evntName = PM_REPORTING_ENTITY;
+         break;
+      case VesEventType::FAULT_NOTIFICATION:
+         evntName = ODU_HIGH;
+        break;
+      default:
+         O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in \
+         getReportingEntityName is not available");
+         break;
+   }
+   return evntName;
+}
+
+/*******************************************************************
+ *
+ * @brief create Source Name from Ves Event type
+ *
+ * @details
+ *
+ *    Function : getSourceName
+ *
+ *    Functionality:
+ *      - create Source Name from Ves Event type
  *
  * @params[in] IN - void
  * @return value of string     - success
@@ -323,9 +425,84 @@ getReportingEntityName is not available\n");
 
 string VesCommonHeader::getSourceName()
 {
-  /*Currently PNF_REGISTRATION only supported. This function need to be updated
-    in later releases*/
-   return ODU_HIGH;
+   string sourceName = "";
+   switch(mEventType)
+   
+   {
+      case VesEventType::PNF_REGISTRATION:
+         sourceName = ODU_HIGH;
+         break;
+      case VesEventType::PM_SLICE:
+         sourceName = ODU_HIGH;
+        break;
+      case VesEventType::FAULT_NOTIFICATION:
+         sourceName = ODU_HIGH;
+        break;
+      default:
+         break;
+   }
+   return sourceName;
+}
+
+/*******************************************************************
+ *
+ * @brief create Ves Event SourceId from Ves Event type
+ *
+ * @details
+ *
+ *    Function : getSourceId
+ *
+ *    Functionality:
+ *      - create Ves Event SourceId from Ves Event type
+ *
+ * @params[in] IN - void
+ * @return value of string     - success
+ *         empty string        - failure
+ * ****************************************************************/
+string VesCommonHeader::getSourceId()
+{
+   string sourceId = "";
+   switch(mEventType)
+   {
+      case VesEventType::FAULT_NOTIFICATION:
+         sourceId = SOURCE_ID;
+        break;
+      default:
+         break;
+   }
+   return sourceId;
+}
+
+/*******************************************************************
+ *
+ * @brief create Ves Event Name from Ves Event type
+ *
+ * @details
+ *
+ *    Function : getnfcNamingCode
+ *
+ *    Functionality: create Ves Event nfc naming code
+ *
+ * @params[in] IN - void
+ * @return value of string     - success
+ *         empty string        - failure
+ * ****************************************************************/
+
+string VesCommonHeader::getnfcNamingCode()
+{
+   string name = "";
+   switch(mEventType)
+   {
+      case VesEventType::PM_SLICE:
+         name = NFC_NAMING_CODE;
+        break;
+      case VesEventType::FAULT_NOTIFICATION:
+         name = NFC_NAMING_CODE;
+        break;
+      default:
+         break;
+   }
+   return name;
 }
 
 /*******************************************************************
@@ -347,9 +524,25 @@ string VesCommonHeader::getSourceName()
 
 string VesCommonHeader::getNamingCode()
 {
-  /*Currently PNF_REGISTRATION only supported. This function need to be updated
-    in later releases*/
-   return NAMING_CODE_ODU;
+
+   string nammingcdoe = "";
+   switch(mEventType)
+   {
+      case VesEventType::PNF_REGISTRATION:
+         nammingcdoe = NAMING_CODE_ODU;
+         break;
+      case VesEventType::PM_SLICE:
+         nammingcdoe = NAMING_CODE_ODU;
+         break;
+      case VesEventType::FAULT_NOTIFICATION:
+         nammingcdoe = NAMING_CODE_ODU;
+        break;
+      default:
+         O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in \
+         getReportingEntityName is not available");
+         break;
+   }
+   return nammingcdoe;
 }
 
 
@@ -370,9 +563,9 @@ string VesCommonHeader::getNamingCode()
  *
  * ****************************************************************/
 
-uint64_t VesCommonHeader::getEpochTime()
+double VesCommonHeader::getEpochTime()
 {
-    uint64_t epochTimeInMicrosec = std::chrono::duration_cast \
+    double epochTimeInMicrosec = std::chrono::duration_cast \
             <std::chrono::microseconds> \
             (std::chrono::system_clock::now().time_since_epoch()).count();
     return epochTimeInMicrosec;
@@ -380,51 +573,107 @@ uint64_t VesCommonHeader::getEpochTime()
 
 /*******************************************************************
  *
- * @brief get current date-time
+ * @brief get current time
  *
  * @details
  *
  *    Function : getCurrentTime
  *
  *    Functionality:
- *      - get current date-time
+ *      - get current time
  *
  * @params[in] void
- * @return time-date     - success
+ * @return time     - success
  *
  * ****************************************************************/
 
-string VesCommonHeader::getCurrentTime()
+time_t VesCommonHeader::getCurrentTime()
 {
-   time_t t = time(0);
+   time_t t;
+   time(&t);
+   return t;
+}
+
+/*******************************************************************
+ *
+ * @brief formats the current time like: 
+ *           "Thu, 14 Oct 2021 03:15:00 +0000"
+ *
+ * @details
+ *
+ *    Function : formatTime
+ *
+ *    Functionality:
+ *      - formats current time
+ *
+ * @params[in] void
+ * @return formatted time - success
+ *
+ * ****************************************************************/
+
+std::string VesCommonHeader::formatTime(time_t t) {
    std::ostringstream oss;
-   char *dateStr;
-   strftime(dateStr, MAX_TIME_STR, "%F", localtime(&t));
-    oss << dateStr;
-    return oss.str();
+   char dateStr[MAX_TIME_STR];
+   strftime(dateStr, sizeof(dateStr), "%a, %d %b %Y %T %z", gmtime(&t));
+   oss << dateStr;
+   return oss.str();
 }
 
+
 /*******************************************************************
  *
- * @brief create Ves Event Name from Ves Event type
+ * @brief create Ves stndDefinedNamespace from Ves Event type
  *
  * @details
  *
- *    Function : getEventName
+ *    Function : getstndDefinedNamespace
+ *
+ *    Functionality: create Ves tndDefinedNamespace
+ *
+ * @params[in] IN - void
+ * @return value of string     - success
+ *         empty string        - failure
+ * ****************************************************************/
+
+string VesCommonHeader::getstndDefinedNamespace()
+{
+   string stndDefinedNamespace="";
+   switch(mEventType)
+   {
+      case VesEventType::PM_SLICE:
+         stndDefinedNamespace = PM_SLICE_STND_DEFINED_NAMESPACE;
+        break;
+      case VesEventType::FAULT_NOTIFICATION:
+         stndDefinedNamespace = FAULT_STND_DEFINED_NAMESPACE;
+        break;
+      default:
+         break;
+   }
+   return stndDefinedNamespace;
+
+}
+
+/*******************************************************************
+ *
+ * @brief Prepare VES Message
+ *
+ * @details
+ *
+ *    Function : prepare
  *
  *    Functionality:
- *      - create Ves Event Name from Ves Event type
+ *      - prepare VES event
  *
- * @params[in] IN - VesEventType , OUT - Ves Event Name
- * @return ture     - success
+ * @params[in] void
+ * @return true     - success
  *         false    - failure
  *
  * ****************************************************************/
 
+
 bool VesCommonHeader::prepare(cJSON *commonHeader, \
                               VesEventType type)
 {
-   O1_LOG("O1 VES : createCommonHeader fuction started\n");
    bool ret=true;
    string typeStr;
    string evntId;
@@ -432,8 +681,14 @@ bool VesCommonHeader::prepare(cJSON *commonHeader, \
    mEventType = type;
    seqNo=0;
    nextSequenceNo(); //update the sequence number for next message
+   //local utility variables:
+   time_t intervalStartTime = getCurrentTime();
+   time_t intervalEndTime = intervalStartTime+60; /*adding 1 min to system time*/
+   double startEpochTime = getEpochTime();
+   mLastEpochTime = startEpochTime+60*100000; /*adding 1 min to epoch time*/
+
    if(JsonHelper::addNodeToObject(commonHeader, "domain", \
-       getEventTypeToStr().c_str()) == 0) {
+                                  getEventTypeToStr().c_str()) == 0) {
       ret=false;
    }
    else if ( JsonHelper::addNodeToObject(commonHeader, "eventId", \
@@ -451,7 +706,35 @@ bool VesCommonHeader::prepare(cJSON *commonHeader, \
    {
       ret = false;
    }
-   else if(JsonHelper::addNodeToObject(commonHeader, "sequence", \
+
+   #ifdef StdDef
+   #else
+   if (mEventType == VesEventType::PM_SLICE)
+   {
+      cJSON *internalHeaderFields = JsonHelper::createNode();
+      if(internalHeaderFields == 0)
+      {
+         ret = false;
+      }
+      else if(JsonHelper::addJsonNodeToObject(commonHeader, "internalHeaderFields", \
+                                          internalHeaderFields) == 0)
+      {
+         ret = false;
+      }
+      else if(JsonHelper::addNodeToObject(internalHeaderFields, "intervalEndTime", \
+                                          formatTime(intervalEndTime).c_str()) == 0)
+      {
+         ret = false;
+      }
+      else if(JsonHelper::addNodeToObject(internalHeaderFields, "intervalStartTime", \
+                                          formatTime(intervalStartTime).c_str()) == 0)
+      {
+         ret = false;
+      }
+   }
+   #endif
+
+   if(JsonHelper::addNodeToObject(commonHeader, "sequence", \
                                        getSequenceNo()) == 0)
    {
       ret = false;
@@ -462,7 +745,7 @@ bool VesCommonHeader::prepare(cJSON *commonHeader, \
       ret = false;
    }
    else if(JsonHelper::addNodeToObject(commonHeader, "reportingEntityId", \
-                                       "") == 0)
+                                       getReportingEntityId().c_str() ) == 0)
    {
       ret = false;
    }
@@ -471,8 +754,8 @@ bool VesCommonHeader::prepare(cJSON *commonHeader, \
    {
       ret = false;
    }
-  else if(JsonHelper::addNodeToObject(commonHeader, "sourceId", \
-                                      "") == 0)
+   else if(JsonHelper::addNodeToObject(commonHeader, "sourceId", \
+                                      getSourceId().c_str() ) == 0)
    {
       ret = false;
    }
@@ -481,47 +764,57 @@ bool VesCommonHeader::prepare(cJSON *commonHeader, \
    {
       ret = false;
    }
-  else if(JsonHelper::addNodeToObject(commonHeader, "startEpochMicrosec", \
-                                      (double) getEpochTime()) == 0)
+   else if(JsonHelper::addNodeToObject(commonHeader, "startEpochMicrosec", \
+                                      startEpochTime) == 0)
    {
       ret = false;
    }
    else if(JsonHelper::addNodeToObject(commonHeader, "lastEpochMicrosec", \
-                                       (double) getEpochTime()) == 0)
+                                      mLastEpochTime) == 0)
    {
       ret = false;
    }
    else if(JsonHelper::addNodeToObject(commonHeader, "nfNamingCode", \
-                                       getNamingCode().c_str()) == 0)
+                                       getNamingCode().c_str() ) == 0)
    {
       ret = false;
    }
    else if(JsonHelper::addNodeToObject(commonHeader, "nfVendorName", \
-                                       "") == 0)
+                                       "POC") == 0)
+   {
+      ret = false;
+   }
+   else if(JsonHelper::addNodeToObject(commonHeader, "nfcNamingCode", \
+                                       getnfcNamingCode().c_str() ) == 0)
    {
       ret = false;
    }
-  else if(JsonHelper::addNodeToObject(commonHeader, "timeZoneOffset", \
+   else if(JsonHelper::addNodeToObject(commonHeader, "timeZoneOffset", \
                                       TIME_ZONE_00_00) == 0)
    {
       ret = false;
    }
+
    else if(JsonHelper::addNodeToObject(commonHeader, "version", \
-                                       VERSION_4_0_1) == 0)
+                                          COMMON_HEADER_VERSION) == 0)
+   {
+      ret = false;
+   }
+   else if(JsonHelper::addNodeToObject(commonHeader, "stndDefinedNamespace", \
+                                       getstndDefinedNamespace().c_str())== 0)            
    {
       ret = false;
    }
    else if(JsonHelper::addNodeToObject(commonHeader, "vesEventListenerVersion", \
-                                       VES_EVENT_LISTENER_7_2_1) == 0)
+                                       VES_EVENT_LISNERT_VERSION) == 0)
    {
       ret = false;
    }
    else
    {
-      O1_LOG("O1 VES : VES common Header prepared successfully \n");
+      O1_LOG("\nO1 VesCommonHeader : VES common Header prepared");
    }
    return ret;
-
 }
 
 /**********************************************************************