Configurable HTTP(S) support for VES messaging
[sim/o1-interface.git] / ntsimulator / src / o-ran-notifications / o-ran-notifications.c
index ad282d1..3699e28 100644 (file)
@@ -23,6 +23,8 @@
 #include <time.h>
 #include <math.h>
 #include <sys/time.h>
+#include <cjson/cJSON.h>
+#include <string.h>
 
 #include "sysrepo.h"
 #include "sysrepo/values.h"
 
 volatile int exit_application = 0;
 
+static counterAlarms netconf_alarm_counter = {
+    .normal = 0,
+    .warning = 0,
+    .minor = 0,
+    .major = 0,
+    .critical = 0
+};
+static counterAlarms ves_alarm_counter= {
+    .normal = 0,
+    .warning = 0,
+    .minor = 0,
+    .major = 0,
+    .critical = 0
+};
+
 struct faultAlarms
 {
        int             faultId;
@@ -83,7 +100,6 @@ static int cleanup_curl()
 
 static int send_fault_ves_message(char *alarm_condition, char *alarm_object, char *severity, char *date_time, char *specific_problem, int port)
 {
-       int rc = SR_ERR_OK;
        CURLcode res;
        static int sequence_id = 0;
        int netconf_port_base = 0;
@@ -96,23 +112,14 @@ static int send_fault_ves_message(char *alarm_condition, char *alarm_object, cha
        if (event == NULL)
        {
                printf("Could not create JSON object: event\n");
-               return 1;
+               return SR_ERR_OPERATION_FAILED;
        }
        cJSON_AddItemToObject(postDataJson, "event", event);
 
        char *hostname = getenv("HOSTNAME");
-       char *netconf_base_string = getenv("NETCONF_BASE");
 
-       if (netconf_base_string != NULL)
-       {
-               rc = sscanf(netconf_base_string, "%d", &netconf_port_base);
-               if (rc != 1)
-               {
-                       printf("Could not find the NETCONF base port, aborting the PNF registration...\n");
-                       return 1;
-               }
-               netconf_port_base += port;
-       }
+    netconf_port_base = getIntFromString(getenv("NETCONF_BASE"), 1);
+    netconf_port_base += port;
 
        char source_name[100];
        sprintf(source_name, "%s_%d", hostname, netconf_port_base);
@@ -121,7 +128,7 @@ static int send_fault_ves_message(char *alarm_condition, char *alarm_object, cha
        if (commonEventHeader == NULL)
        {
                printf("Could not create JSON object: commonEventHeader\n");
-               return 1;
+               return SR_ERR_OPERATION_FAILED;
        }
        cJSON_AddItemToObject(event, "commonEventHeader", commonEventHeader);
 
@@ -133,7 +140,7 @@ static int send_fault_ves_message(char *alarm_condition, char *alarm_object, cha
                {
                        cJSON_Delete(postDataJson);
                }
-               return 1;
+               return SR_ERR_OPERATION_FAILED;
        }
        cJSON_AddItemToObject(event, "faultFields", faultFields);
 
@@ -259,6 +266,30 @@ static int send_dummy_notif(sr_session_ctx_t *sess)
                        printf("Failed to send notification send_dummy_notif\n");
                        return SR_ERR_OPERATION_FAILED;
                }
+               if (oran_fault_alarms[ran].cleared[random_port])
+               {
+                       netconf_alarm_counter.normal++;
+               }
+               else
+               {
+            if (strcmp(oran_fault_alarms[ran].faultSeverity, "WARNING") == 0)
+            {
+                netconf_alarm_counter.warning++;
+            }
+            else if (strcmp(oran_fault_alarms[ran].faultSeverity, "MINOR") == 0)
+            {
+                netconf_alarm_counter.minor++;
+            }
+            else if (strcmp(oran_fault_alarms[ran].faultSeverity, "MAJOR") == 0)
+            {
+                netconf_alarm_counter.major++;
+            }
+            else if (strcmp(oran_fault_alarms[ran].faultSeverity, "CRITICAL") == 0)
+            {
+                netconf_alarm_counter.critical++;
+            }
+               }
+               
                printf("Successfully sent notification with timestamp=\"%s\"\n", dateAndTime);
        }
        if (isVesAvailable)
@@ -271,7 +302,36 @@ static int send_dummy_notif(sr_session_ctx_t *sess)
                {
                        printf("Could not send Fault VES message\n");
                }
+        if (oran_fault_alarms[ran].cleared[random_port])
+               {
+                       ves_alarm_counter.normal++;
+               }
+               else
+               {
+            if (strcmp(oran_fault_alarms[ran].faultSeverity, "WARNING") == 0)
+            {
+                ves_alarm_counter.warning++;
+            }
+            else if (strcmp(oran_fault_alarms[ran].faultSeverity, "MINOR") == 0)
+            {
+                ves_alarm_counter.minor++;
+            }
+            else if (strcmp(oran_fault_alarms[ran].faultSeverity, "MAJOR") == 0)
+            {
+                ves_alarm_counter.major++;
+            }
+            else if (strcmp(oran_fault_alarms[ran].faultSeverity, "CRITICAL") == 0)
+            {
+                ves_alarm_counter.critical++;
+            }
+               }
        }
+    printf("Writing counters to file...\n");
+    rc = writeStatusNotificationCounters(ves_alarm_counter, netconf_alarm_counter);
+    if (rc != SR_ERR_OK)
+    {
+        printf("Could not write status to file...\n");
+    }
 
        sr_free_values(vnotif, current_num_of_values);
 
@@ -291,7 +351,6 @@ main(int argc, char **argv)
     sr_session_ctx_t *session = NULL;
     sr_subscription_ctx_t *subscription = NULL;
     int rc = SR_ERR_OK;
-    int notification_delay_period = 0; //seconds
 
     setbuf(stdout, NULL);
 
@@ -320,19 +379,44 @@ main(int argc, char **argv)
     signal(SIGINT, sigint_handler);
     signal(SIGPIPE, SIG_IGN);
 
-
     while (!exit_application) {
-        notification_delay_period = getFaultNotificationDelayPeriodFromConfigJson();
+        int notif_delay[100], count = 0;
 
-        if (notification_delay_period > 0)
+        rc = getFaultNotificationDelayPeriodFromConfigJson(notif_delay, &count);
+        if (rc != SR_ERR_OK)
         {
-               send_dummy_notif(session);
+            printf("Could not get fault notification delay period.");
+            sleep(1);
+            continue;
+        }
 
-            sleep(notification_delay_period);
+        if (count > 1)
+        {
+            for (int i = 0; i < count; ++i)
+            {
+                sleep(notif_delay[i]);
+                send_dummy_notif(session);                
+            }
         }
-        else
+        else if (count == 1)
         {
-               sleep(1);
+            if (notif_delay[0] > 0)
+            {
+                sleep(notif_delay[0]);
+                send_dummy_notif(session);
+            }
+            else 
+            {
+                sleep(1);
+                // reset the counters when the notifciation delay period is switched back to 0
+                netconf_alarm_counter.normal = netconf_alarm_counter.warning = \
+                netconf_alarm_counter.minor = netconf_alarm_counter.major = \
+                netconf_alarm_counter.critical = 0;
+                
+                ves_alarm_counter.normal = ves_alarm_counter.warning = \
+                ves_alarm_counter.minor = ves_alarm_counter.major = \
+                ves_alarm_counter.critical = 0;
+            }
         }
 
     }