1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2020-2021] [HCL Technologies Ltd.] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains functions to support the preparation of VES common header
28 #include "JsonHelper.hpp"
29 #include "VesCommonHeader.hpp"
30 #include "VesUtils.hpp"
32 static double seqNo = 0;
34 #define MAX_TIME_STR 35
36 /*******************************************************************
38 * @brief provide next sequence number of VES event
42 * Function : nextSequenceNo
45 * - provide next sequence number of VES event
48 * @return next sequence number of event - success
50 * ****************************************************************/
52 double VesCommonHeader::nextSequenceNo()
57 /*******************************************************************
59 * @brief provide current sequence number of VES event
63 * Function : getSequenceNo
66 * - provide current sequence number of VES event
69 * @return current sequence number of event - success
71 * ****************************************************************/
73 double VesCommonHeader::getSequenceNo()
78 /*******************************************************************
80 * @brief Convert Ves Event type to string
84 * Function : getEventTypeToStr
87 * - Convert Ves Event type to String
89 * @params[in] IN - void
90 * @return value of string - success
91 * empty string - failure
93 * ****************************************************************/
95 string VesCommonHeader::getEventTypeToStr()
100 case VesEventType::PNF_REGISTRATION:
101 str = "pnfRegistration";
103 case VesEventType::FAULT_NOTIFICATION:
110 case VesEventType::PM_NOTIFICATION:
111 str = "pmNotification";
113 case VesEventType::PM_SLICE:
120 case VesEventType::HEARTBEAT:
124 O1_LOG("\nO1 VesCommonHeader : VES msg Type not supported");
130 /*******************************************************************
132 * @brief create Ves Event Id from Ves Event type
136 * Function : getEventId
139 * - create Ves Event Id from Ves Event type
141 * @params[in] IN - void
142 * @return value of string - success
143 * empty string - failure
145 * ****************************************************************/
147 string VesCommonHeader::getEventId()
149 /*Currently PNF_REGISTRATION only supported. This function must be updated
151 std::ostringstream oss;
152 oss << mLastEpochTime;
153 string stringEpochTime = oss.str().substr(0, 10);
157 case VesEventType::PNF_REGISTRATION:
158 evntId = getSourceName() + "_" + MODEL_NUMBER_007_DEV;
160 case VesEventType::HEARTBEAT:
161 evntId = getEventTypeToStr() + "_" + formatTime(getCurrentTime());
163 case VesEventType::PM_SLICE:
165 evntId = SLICE_EVENTID;
167 evntId = "_" + stringEpochTime + "_" + "PM1min";
170 case VesEventType::FAULT_NOTIFICATION:
172 evntId = FAULT_EVENTID;
174 evntId ="O_RAN_COMPONENT_Alarms-61";
178 O1_LOG("\nO1 VesCommonHeader : this VES msg Type support in getEventId is \
185 /*******************************************************************
187 * @brief create Ves Event Type from Ves Event type
191 * Function : getEventType
194 * - create Ves Event Type from Ves Event type
196 * @params[in] IN - void
197 * @return value of string - success
198 * empty string - failure
200 * ****************************************************************/
202 string VesCommonHeader::getEventType()
204 /*Currently PNF_REGISTRATION only supported. This function must be updated
207 string evntType = "";
210 case VesEventType::PNF_REGISTRATION:
211 evntType = EVENT_TYPE_5G;
213 case VesEventType::HEARTBEAT:
214 evntType = EVENT_TYPE_ORAN_COMPONENT;
216 case VesEventType::PM_SLICE:
218 evntType = PM_SLICE_EVENT_TYPE;
220 evntType = EVENT_TYPE_ORAN_COMPONENT_PM;
223 case VesEventType::FAULT_NOTIFICATION:
224 evntType = FAULT_TYPE;
227 O1_LOG("\nO1 VesCommonHeader : this VES msg Type support in getEvenType is \
234 /*******************************************************************
236 * @brief return priority of event
240 * Function : getPriority
243 * - send priority of event
245 * @params[in] IN - void
246 * @return value of string - success
247 * empty string - failure
249 * ****************************************************************/
251 string VesCommonHeader::getPriority()
253 /*Currently PNF_REGISTRATION only supported. This function must be updated
259 case VesEventType::PNF_REGISTRATION:
260 evntId = PRIORITY_LOW ;
262 case VesEventType::HEARTBEAT:
263 evntId = PRIORITY_LOW;
265 case VesEventType::PM_SLICE:
266 evntId = PRIORITY_LOW ;
268 case VesEventType::FAULT_NOTIFICATION:
269 evntId = PRIORITY_LOW ;
272 O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in getPriority is \
281 /*******************************************************************
283 * @brief create Ves Event Name from Ves Event type
287 * Function : getEventName
290 * - create Ves Event Name from Ves Event type
292 * @params[in] IN - void
293 * @return value of string - success
294 * empty string - failure
295 * ****************************************************************/
297 string VesCommonHeader::getEventName()
299 /*Currently PNF_REGISTRATION only supported. This function must be updated
302 string evntName = "";
305 case VesEventType::PNF_REGISTRATION:
306 evntName = getEventTypeToStr() + "_" + EVENT_TYPE_5G;
308 case VesEventType::HEARTBEAT:
309 evntName = getEventTypeToStr() + "_" + EVENT_TYPE_ORAN_COMPONENT;
311 case VesEventType::PM_SLICE:
313 evntName = PM_SLICE_EVENT_NAME;
315 evntName = getEventTypeToStr() + "_" + EVENT_TYPE_ORAN_COMPONENT_PM;
318 case VesEventType::FAULT_NOTIFICATION:
320 evntName = FAULT_EVENT_NAME;
322 evntName ="O_RAN_COMPONENT_Alarms";
326 O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in getEventName is \
333 /*******************************************************************
335 * @brief create Ves Event Name from Ves Event type
339 * Function : getReportingEntityId
342 * - create Ves Event Name from Ves Event type
344 * @params[in] IN - void
345 * @return value of string - success
346 * empty string - failure
347 * ****************************************************************/
349 string VesCommonHeader::getReportingEntityId()
351 /*Currently PNF_REGISTRATION and PM_SLICE are only supported.
352 This function must be updated in later releases*/
354 string evntName = "";
357 case VesEventType::PNF_REGISTRATION:
360 case VesEventType::PM_SLICE:
363 case VesEventType::FAULT_NOTIFICATION:
372 /*******************************************************************
374 * @brief create Reporting Entity Name from Ves Event type
378 * Function : getReportingEntityName
381 * - create Reporting Entity Name from Ves Event type
383 * @params[in] IN - void
384 * @return value of string - success
385 * empty string - failure
386 * ****************************************************************/
388 string VesCommonHeader::getReportingEntityName()
390 string evntName = "";
393 case VesEventType::PNF_REGISTRATION:
394 evntName = getSourceName();
396 case VesEventType::PM_SLICE:
397 evntName = PM_REPORTING_ENTITY;
399 case VesEventType::FAULT_NOTIFICATION:
403 O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in \
404 getReportingEntityName is not available");
410 /*******************************************************************
412 * @brief create Source Name from Ves Event type
416 * Function : getSourceName
419 * - create Source Name from Ves Event type
421 * @params[in] IN - void
422 * @return value of string - success
423 * empty string - failure
424 * ****************************************************************/
426 string VesCommonHeader::getSourceName()
428 string sourceName = "";
432 case VesEventType::PNF_REGISTRATION:
433 sourceName = ODU_HIGH;
435 case VesEventType::PM_SLICE:
436 sourceName = ODU_HIGH;
438 case VesEventType::FAULT_NOTIFICATION:
439 sourceName = ODU_HIGH;
447 /*******************************************************************
449 * @brief create Ves Event SourceId from Ves Event type
453 * Function : getSourceId
456 * - create Ves Event SourceId from Ves Event type
458 * @params[in] IN - void
459 * @return value of string - success
460 * empty string - failure
461 * ****************************************************************/
462 string VesCommonHeader::getSourceId()
464 string sourceId = "";
467 case VesEventType::FAULT_NOTIFICATION:
468 sourceId = SOURCE_ID;
476 /*******************************************************************
478 * @brief create Ves Event Name from Ves Event type
482 * Function : getnfcNamingCode
484 * Functionality: create Ves Event nfc naming code
486 * @params[in] IN - void
487 * @return value of string - success
488 * empty string - failure
489 * ****************************************************************/
491 string VesCommonHeader::getnfcNamingCode()
496 case VesEventType::PM_SLICE:
497 name = NFC_NAMING_CODE;
499 case VesEventType::FAULT_NOTIFICATION:
500 name = NFC_NAMING_CODE;
508 /*******************************************************************
510 * @brief create Ves Event Name from Ves Event type
514 * Function : getNamingCode
517 * - Network function type: 4 characters (aligned with vnf and pnf
520 * @params[in] IN - void
521 * @return value of string - success
522 * empty string - failure
523 * ****************************************************************/
525 string VesCommonHeader::getNamingCode()
528 string nammingcdoe = "";
531 case VesEventType::PNF_REGISTRATION:
532 nammingcdoe = NAMING_CODE_ODU;
534 case VesEventType::PM_SLICE:
535 nammingcdoe = NAMING_CODE_ODU;
537 case VesEventType::FAULT_NOTIFICATION:
538 nammingcdoe = NAMING_CODE_ODU;
541 O1_LOG("\nO1 VesCommonHeader : This VES msg Type support in \
542 getReportingEntityName is not available");
550 /*******************************************************************
552 * @brief provide current epoch time
556 * Function : getEpochTime
559 * - provide current epoch time
562 * @return epoch time - success
564 * ****************************************************************/
566 double VesCommonHeader::getEpochTime()
568 double epochTimeInMicrosec = std::chrono::duration_cast \
569 <std::chrono::microseconds> \
570 (std::chrono::system_clock::now().time_since_epoch()).count();
571 return epochTimeInMicrosec;
574 /*******************************************************************
576 * @brief get current time
580 * Function : getCurrentTime
586 * @return time - success
588 * ****************************************************************/
590 time_t VesCommonHeader::getCurrentTime()
597 /*******************************************************************
599 * @brief formats the current time like:
600 * "Thu, 14 Oct 2021 03:15:00 +0000"
604 * Function : formatTime
607 * - formats current time
610 * @return formatted time - success
612 * ****************************************************************/
614 std::string VesCommonHeader::formatTime(time_t t) {
615 std::ostringstream oss;
616 char dateStr[MAX_TIME_STR];
617 strftime(dateStr, sizeof(dateStr), "%a, %d %b %Y %T %z", gmtime(&t));
623 /*******************************************************************
625 * @brief create Ves stndDefinedNamespace from Ves Event type
629 * Function : getstndDefinedNamespace
631 * Functionality: create Ves tndDefinedNamespace
633 * @params[in] IN - void
634 * @return value of string - success
635 * empty string - failure
636 * ****************************************************************/
638 string VesCommonHeader::getstndDefinedNamespace()
640 string stndDefinedNamespace="";
643 case VesEventType::PM_SLICE:
644 stndDefinedNamespace = PM_SLICE_STND_DEFINED_NAMESPACE;
646 case VesEventType::FAULT_NOTIFICATION:
647 stndDefinedNamespace = FAULT_STND_DEFINED_NAMESPACE;
652 return stndDefinedNamespace;
656 /*******************************************************************
658 * @brief Prepare VES Message
665 * - prepare VES event
668 * @return true - success
671 * ****************************************************************/
674 bool VesCommonHeader::prepare(cJSON *commonHeader, \
683 nextSequenceNo(); //update the sequence number for next message
684 //local utility variables:
685 time_t intervalStartTime = getCurrentTime();
686 time_t intervalEndTime = intervalStartTime+60; /*adding 1 min to system time*/
687 double startEpochTime = getEpochTime();
688 mLastEpochTime = startEpochTime+60*100000; /*adding 1 min to epoch time*/
690 if(JsonHelper::addNodeToObject(commonHeader, "domain", \
691 getEventTypeToStr().c_str()) == 0) {
694 else if ( JsonHelper::addNodeToObject(commonHeader, "eventId", \
695 getEventId().c_str()) == 0)
699 else if(JsonHelper::addNodeToObject(commonHeader, "eventName", \
700 getEventName().c_str()) == 0)
704 else if(JsonHelper::addNodeToObject(commonHeader, "eventType", \
705 getEventType().c_str()) == 0)
712 if (mEventType == VesEventType::PM_SLICE)
714 cJSON *internalHeaderFields = JsonHelper::createNode();
715 if(internalHeaderFields == 0)
719 else if(JsonHelper::addJsonNodeToObject(commonHeader, "internalHeaderFields", \
720 internalHeaderFields) == 0)
724 else if(JsonHelper::addNodeToObject(internalHeaderFields, "intervalEndTime", \
725 formatTime(intervalEndTime).c_str()) == 0)
729 else if(JsonHelper::addNodeToObject(internalHeaderFields, "intervalStartTime", \
730 formatTime(intervalStartTime).c_str()) == 0)
737 if(JsonHelper::addNodeToObject(commonHeader, "sequence", \
738 getSequenceNo()) == 0)
742 else if(JsonHelper::addNodeToObject(commonHeader, "priority", \
743 getPriority().c_str()) == 0)
747 else if(JsonHelper::addNodeToObject(commonHeader, "reportingEntityId", \
748 getReportingEntityId().c_str() ) == 0)
752 else if(JsonHelper::addNodeToObject(commonHeader, "reportingEntityName", \
753 getReportingEntityName().c_str()) == 0)
757 else if(JsonHelper::addNodeToObject(commonHeader, "sourceId", \
758 getSourceId().c_str() ) == 0)
762 else if(JsonHelper::addNodeToObject(commonHeader, "sourceName", \
763 getSourceName().c_str()) == 0)
767 else if(JsonHelper::addNodeToObject(commonHeader, "startEpochMicrosec", \
768 startEpochTime) == 0)
772 else if(JsonHelper::addNodeToObject(commonHeader, "lastEpochMicrosec", \
773 mLastEpochTime) == 0)
777 else if(JsonHelper::addNodeToObject(commonHeader, "nfNamingCode", \
778 getNamingCode().c_str() ) == 0)
782 else if(JsonHelper::addNodeToObject(commonHeader, "nfVendorName", \
787 else if(JsonHelper::addNodeToObject(commonHeader, "nfcNamingCode", \
788 getnfcNamingCode().c_str() ) == 0)
792 else if(JsonHelper::addNodeToObject(commonHeader, "timeZoneOffset", \
793 TIME_ZONE_00_00) == 0)
798 else if(JsonHelper::addNodeToObject(commonHeader, "version", \
799 COMMON_HEADER_VERSION) == 0)
803 else if(JsonHelper::addNodeToObject(commonHeader, "stndDefinedNamespace", \
804 getstndDefinedNamespace().c_str())== 0)
808 else if(JsonHelper::addNodeToObject(commonHeader, "vesEventListenerVersion", \
809 VES_EVENT_LISNERT_VERSION) == 0)
815 O1_LOG("\nO1 VesCommonHeader : VES common Header prepared");
820 /**********************************************************************
822 **********************************************************************/