Rewrite NTS Framework.
[sim/o1-interface.git] / ntsimulator / src / ntsimulator-manager / ntsimulator-manager.c
diff --git a/ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c b/ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c
deleted file mode 100644 (file)
index 3571ab4..0000000
+++ /dev/null
@@ -1,1374 +0,0 @@
-/*************************************************************************
-*
-* Copyright 2019 highstreet technologies GmbH and others
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-***************************************************************************/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <string.h>
-
-#include "sysrepo.h"
-#include "sysrepo/values.h"
-
-#include "utils.h"
-#include "simulator-operations.h"
-
-volatile int exit_application = 0;
-
-volatile unsigned int simulated_devices_config = 0;
-volatile unsigned int mounted_devices_config = 0;
-
-
-static device_stack_t *device_list = NULL;
-
-controller_t controller_details;
-
-#define XPATH_MAX_LEN 500
-#define CONTROLLER_LIST_MAX_LEN 1
-
-static void
-print_current_config(sr_session_ctx_t *session, const char *module_name)
-{
-    sr_val_t *values = NULL;
-    size_t count = 0;
-    int rc = SR_ERR_OK;
-    char xpath[XPATH_MAX_LEN] = {0};
-    snprintf(xpath, XPATH_MAX_LEN, "/%s:*//.", module_name);
-
-    sr_val_t *odl_ip = NULL;
-    sr_val_t *odl_port = NULL;
-    sr_val_t *odl_username = NULL;
-    sr_val_t *odl_password = NULL;
-
-    rc = sr_get_items(session, xpath, &values, &count);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_get_items: %s\n", sr_strerror(rc));
-        return;
-    }
-    for (size_t i = 0; i < count; i++){
-
-        sr_print_val(&values[i]);
-
-        if (sr_xpath_node_name_eq(values[i].xpath, "controller-ip"))
-        {
-               rc = sr_dup_val(&values[i], &odl_ip);
-        }
-        else if (sr_xpath_node_name_eq(values[i].xpath, "controller-port"))
-        {
-               rc = sr_dup_val(&values[i], &odl_port);
-        }
-        else if (sr_xpath_node_name_eq(values[i].xpath, "controller-username"))
-        {
-               rc = sr_dup_val(&values[i], &odl_username);
-        }
-        else if (sr_xpath_node_name_eq(values[i].xpath, "controller-password"))
-        {
-               rc = sr_dup_val(&values[i], &odl_password);
-        }
-    }
-
-    char *ipv6 = strchr(odl_ip->data.string_val, ':');
-    char odl_ip_string[URL_AND_CREDENTIALS_MAX_LEN];
-    if (ipv6 != NULL)
-    {
-        sprintf(odl_ip_string, "[%s]", odl_ip->data.string_val);
-    }
-    else
-    {
-        sprintf(odl_ip_string, "%s", odl_ip->data.string_val);
-    }
-
-
-    //URL used for mounting/unmounting a device; the device name needs to be appended
-   char url[URL_AND_CREDENTIALS_MAX_LEN];
-   sprintf(url, "http://%s:%d/restconf/config/network-topology:network-topology/topology/"
-                "topology-netconf/node/",
-                odl_ip_string, odl_port->data.uint32_val);
-
-   char credentials[URL_AND_CREDENTIALS_MAX_LEN];
-   sprintf(credentials, "%s:%s", odl_username->data.string_val, odl_password->data.string_val);
-
-   //URLs used for adding key pair to ODL, for TLS connections
-   char url_for_keystore_add[URL_AND_CREDENTIALS_MAX_LEN];
-   sprintf(url_for_keystore_add, "http://%s:%d/restconf/operations/netconf-keystore:add-keystore-entry",
-                        odl_ip_string, odl_port->data.uint32_val);
-
-   char url_for_private_key_add[URL_AND_CREDENTIALS_MAX_LEN];
-   sprintf(url_for_private_key_add, "http://%s:%d/restconf/operations/netconf-keystore:add-private-key",
-                        odl_ip_string, odl_port->data.uint32_val);
-
-   char url_for_trusted_ca_add[URL_AND_CREDENTIALS_MAX_LEN];
-   sprintf(url_for_trusted_ca_add, "http://%s:%d/restconf/operations/netconf-keystore:add-trusted-certificate",
-                        odl_ip_string, odl_port->data.uint32_val);
-
-   strcpy(controller_details.url, url);
-   strcpy(controller_details.credentials, credentials);
-   strcpy(controller_details.url_for_keystore_add, url_for_keystore_add);
-   strcpy(controller_details.url_for_private_key_add, url_for_private_key_add);
-   strcpy(controller_details.url_for_trusted_ca_add, url_for_trusted_ca_add);
-
-   sr_free_val(odl_ip);
-   sr_free_val(odl_port);
-   sr_free_val(odl_username);
-   sr_free_val(odl_password);
-
-   sr_free_values(values, count);
-}
-
-static void clean_current_docker_configuration(void);
-
-static int simulated_devices_changed(int new_value)
-{
-       int rc = SR_ERR_OK;
-
-    if (strcmp(getenv("K8S_DEPLOYMENT"), "true") == 0)
-    {
-        if (new_value != simulated_devices_config)
-        {
-            simulated_devices_config = new_value;
-            rc = send_k8s_scale(new_value);
-            if (rc != SR_ERR_OK)
-            {
-                printf("Could not send new_scale=%d to k8s cluster.\n", new_value);
-            }
-        }
-        return SR_ERR_OK;
-    }
-
-    if (simulated_devices_config > new_value)
-    {
-       //we are configuring less elements that currently
-       for (int i = 0; i < simulated_devices_config - new_value; ++i)
-       {
-               rc = stop_device(device_list);
-       }
-    }
-    else if (simulated_devices_config < new_value)
-    {
-       //we are configuring more elements that currently
-       for (int i = 0; i < new_value - simulated_devices_config; ++i)
-       {
-               rc = start_device(device_list);
-            if (rc != SR_ERR_OK)
-            {
-                printf("ERROR: Could not start simulated device. Ignoring, trying with the next simulated device, if any...\n");
-            }
-       }
-    }
-
-    simulated_devices_config = new_value;
-
-    return rc;
-}
-
-int mounted_devices_changed(sr_session_ctx_t *session, int new_value)
-{
-       int rc = SR_ERR_OK;
-
-       if (mounted_devices_config > new_value)
-       {
-         //we need have less mounted elements
-         for (int i = 0; i < mounted_devices_config - new_value; ++i)
-         {
-                 printf("Sending unmount device...\n");
-                 rc = unmount_device(device_list, controller_details);
-         }
-       }
-       else if (mounted_devices_config < new_value)
-       {
-         //we are configuring more elements that currently
-         for (int i = 0; i < new_value - mounted_devices_config; ++i)
-         {
-                 printf("Sending mount device...\n");
-                 rc = mount_device(device_list, controller_details);
-         }
-       }
-
-       mounted_devices_config = new_value;
-
-    return rc;
-}
-
-static int
-simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, sr_notif_event_t event, void *private_ctx)
-{
-       int rc;
-
-    printf("\n\n ========== CONFIG HAS CHANGED, CURRENT RUNNING CONFIG %s: ==========\n\n", module_name);
-    print_current_config(session, module_name);
-
-    sr_val_t *val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/simulated-devices", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = simulated_devices_changed(val->data.uint32_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-       val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/mounted-devices", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    if (mounted_devices_config != val->data.uint32_val)
-    {
-       if (val->data.uint32_val > simulated_devices_config)
-       {
-               printf("Cannot set mount value greater than number of simulated devices.\n");
-               sr_free_val(val);
-                       val = NULL;
-               return SR_ERR_OK;
-       }
-
-               rc = mounted_devices_changed(session, val->data.uint32_val);
-               if (rc != SR_ERR_OK) {
-                       goto sr_error;
-               }
-    }
-
-    sr_free_val(val);
-       val = NULL;
-
-    size_t count = 0;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_items(session, "/network-topology-simulator:simulator-config/notification-config/fault-notification-delay-period", &val, &count);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = notification_delay_period_changed(val, count);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-    sr_free_values(val, count);
-       val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-       rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/ves-heartbeat-period", &val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       rc = ves_heartbeat_period_changed(val->data.uint32_val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       sr_free_val(val);
-       val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-ip", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = ves_ip_changed(val->data.string_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-auth-method", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = ves_auth_method_changed(val->data.enum_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    if (strcmp(val->data.enum_val, "basic-auth") == 0)
-    {
-        sr_free_val(val);
-        val = NULL;
-
-        /* get the value from sysrepo, we do not care if the value did not change in our case */
-        rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-username", &val);
-        if (rc != SR_ERR_OK) {
-            goto sr_error;
-        }
-
-        rc = ves_username_changed(val->data.string_val);
-        if (rc != SR_ERR_OK) {
-            goto sr_error;
-        }
-
-        sr_free_val(val);
-        val = NULL;
-
-        /* get the value from sysrepo, we do not care if the value did not change in our case */
-        rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-password", &val);
-        if (rc != SR_ERR_OK) {
-            goto sr_error;
-        }
-
-        rc = ves_password_changed(val->data.string_val);
-        if (rc != SR_ERR_OK) {
-            goto sr_error;
-        }
-
-        sr_free_val(val);
-        val = NULL;
-    }
-    else 
-    {
-        sr_free_val(val);
-        val = NULL;
-    }
-
-       /* get the value from sysrepo, we do not care if the value did not change in our case */
-       rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-port", &val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       rc = ves_port_changed(val->data.uint16_val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       sr_free_val(val);
-       val = NULL;
-
-       /* get the value from sysrepo, we do not care if the value did not change in our case */
-       rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-registration", &val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       rc = ves_registration_changed(val->data.bool_val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       sr_free_val(val);
-       val = NULL;
-
-       /* get the value from sysrepo, we do not care if the value did not change in our case */
-       rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/is-netconf-available", &val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       rc = is_netconf_available_changed(val->data.bool_val);
-       if (rc != SR_ERR_OK) {
-               goto sr_error;
-       }
-
-       sr_free_val(val);
-       val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/is-ves-available", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = is_ves_available_changed(val->data.bool_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/netconf-call-home", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = netconf_call_home_changed(val->data.bool_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-ip", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = controller_ip_changed(val->data.string_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-port", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = controller_port_changed(val->data.uint16_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/controller-details/netconf-call-home-port", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = controller_netconf_call_home_port_changed(val->data.uint16_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-username", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = controller_username_changed(val->data.string_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    /* get the value from sysrepo, we do not care if the value did not change in our case */
-    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-password", &val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    rc = controller_password_changed(val->data.string_val);
-    if (rc != SR_ERR_OK) {
-        goto sr_error;
-    }
-
-    sr_free_val(val);
-    val = NULL;
-
-    return SR_ERR_OK;
-
-sr_error:
-       printf("NTSimulator config change callback failed: %s.", sr_strerror(rc));
-       if (val != NULL)
-       {
-               sr_free_val(val);
-               val = NULL;
-       }
-       return rc;
-}
-
-static int
-simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
-        uint64_t request_id, const char *original_xpath, void *private_ctx)
-{
-       int rc;
-
-       // printf("\n\n ========== Called simulator_status_cb for xpath: %s ==========\n\n", xpath);
-
-    counterAlarms ves_counter, netconf_counter;
-    rc = compute_notifications_count(&ves_counter, &netconf_counter);
-    if (rc != SR_ERR_OK)
-    {
-        printf("Could not compute the total number of notification count.\n");
-    }
-
-       if (sr_xpath_node_name_eq(xpath, "simulated-devices-list")) 
-    {
-               sr_val_t *v;
-               size_t current_num_of_values= 0;
-
-               if (simulated_devices_config == 0) //nothing to return if no devices are running
-               {
-                       *values = NULL;
-                       *values_cnt = 0;
-
-                       return SR_ERR_OK;
-               }
-
-        rc = get_docker_containers_operational_state_curl(device_list);
-        if (rc != SR_ERR_OK)
-        {
-            printf("Could not get the operational state for the devices simulated.\n");
-            return SR_ERR_OPERATION_FAILED;
-        }
-
-               device_t *current_device = device_list->head;
-
-               while (current_device != NULL)
-               {
-            counterAlarms vesCount, netconfCount;
-            rc = getDeviceCounters(current_device->device_id, &vesCount, &netconfCount);
-            if (rc != SR_ERR_OK)
-            {
-                printf("Could not get Notification Counters for device with uuid=\"%s\"", current_device->device_id);
-            }
-
-            char device_name[200];
-            sprintf(device_name, "%s-%d", getenv("CONTAINER_NAME"), current_device->device_number);            
-
-                       CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-                       sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/%s", xpath, device_name, "device-ip");
-                       v[current_num_of_values - 1].type = SR_STRING_T;
-                       v[current_num_of_values - 1].data.string_val = getenv("NTS_IP");
-
-                       for (int i = 0; i < NETCONF_CONNECTIONS_PER_DEVICE; ++i)
-                       {
-                               CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-                               sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/%s", xpath, device_name, "device-port");
-                               v[current_num_of_values - 1].type = SR_UINT32_T;
-                               v[current_num_of_values - 1].data.uint32_val = current_device->netconf_port + i;
-                       }
-
-                       CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-                       sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/%s", xpath, device_name, "is-mounted");
-                       v[current_num_of_values - 1].type = SR_BOOL_T;
-                       v[current_num_of_values - 1].data.bool_val = current_device->is_mounted;
-
-                       char *operational_state = get_docker_container_operational_state(device_list, current_device->device_id);
-
-                       CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-                       sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/%s", xpath, device_name, "operational-state");
-                       sr_val_build_str_data(&v[current_num_of_values - 1], SR_ENUM_T, "%s", operational_state);
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/ves-notifications/%s", xpath, device_name, "normal");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = vesCount.normal;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/ves-notifications/%s", xpath, device_name, "warning");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = vesCount.warning;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/ves-notifications/%s", xpath, device_name, "minor");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = vesCount.minor;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/ves-notifications/%s", xpath, device_name, "major");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = vesCount.major;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/ves-notifications/%s", xpath, device_name, "critical");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = vesCount.critical;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/netconf-notifications/%s", xpath, device_name, "normal");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = netconfCount.normal;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/netconf-notifications/%s", xpath, device_name, "warning");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = netconfCount.warning;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/netconf-notifications/%s", xpath, device_name, "minor");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = netconfCount.minor;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/netconf-notifications/%s", xpath, device_name, "major");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = netconfCount.major;
-
-            CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-            sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/notification-count/netconf-notifications/%s", xpath, device_name, "critical");
-            v[current_num_of_values - 1].type = SR_UINT32_T;
-            v[current_num_of_values - 1].data.uint32_val = netconfCount.critical;
-
-                       current_device = current_device->next;
-               }
-
-               //return the values that we have just created
-               *values = v;
-               *values_cnt = current_num_of_values;
-        }
-        else if (sr_xpath_node_name_eq(xpath, "simulation-usage-details"))
-        {
-               float cpu_usage = 0.0, mem_usage = 0.0;
-
-               char *resource_usage_from_script = get_docker_container_resource_stats();
-
-               if (resource_usage_from_script != NULL)
-               {
-                       printf("Received line: %s\n", resource_usage_from_script);
-                       sscanf(resource_usage_from_script, "CPU=%f%%;RAM=%fMiB", &cpu_usage, &mem_usage);
-                       printf("Read cpu=\"%f\" and mem=\"%f\"\n", cpu_usage, mem_usage);
-                       free(resource_usage_from_script);
-               }
-
-               sr_val_t *v;
-               /* convenient functions such as this can be found in sysrepo/values.h */
-               size_t current_num_of_values= 0;
-
-               CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-               sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "running-simulated-devices");
-               v[current_num_of_values - 1].type = SR_UINT32_T;
-               v[current_num_of_values - 1].data.uint32_val = get_current_number_of_devices(device_list);
-
-               CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-               sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "running-mounted-devices");
-               v[current_num_of_values - 1].type = SR_UINT32_T;
-               v[current_num_of_values - 1].data.uint32_val = get_current_number_of_mounted_devices(device_list);
-
-               CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-               sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "base-netconf-port");
-               v[current_num_of_values - 1].type = SR_UINT32_T;
-               v[current_num_of_values - 1].data.uint32_val = get_netconf_port_base();
-
-               CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-               sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "cpu-usage");
-               v[current_num_of_values - 1].type = SR_DECIMAL64_T;
-               v[current_num_of_values - 1].data.decimal64_val = cpu_usage;
-
-               CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-               sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "mem-usage");
-               v[current_num_of_values - 1].type = SR_UINT32_T;
-               v[current_num_of_values - 1].data.uint32_val = (int)mem_usage;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "ssh-connections");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = getSshConnectionsFromConfigJson();
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "tls-connections");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = getTlsConnectionsFromConfigJson();
-
-               //return the values that we have just created
-               *values = v;
-               *values_cnt = current_num_of_values;
-        }
-     else if (sr_xpath_node_name_eq(xpath, "total-ves-notifications"))
-     {
-        sr_val_t *v;
-        /* convenient functions such as this can be found in sysrepo/values.h */
-        size_t current_num_of_values= 0;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "normal");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = ves_counter.normal;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "warning");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = ves_counter.warning;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "minor");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = ves_counter.minor;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "major");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = ves_counter.major;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "critical");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = ves_counter.critical;
-
-        //return the values that we have just created
-        *values = v;
-        *values_cnt = current_num_of_values;
-     }
-     else if (sr_xpath_node_name_eq(xpath, "total-netconf-notifications"))
-     {
-        sr_val_t *v;
-        /* convenient functions such as this can be found in sysrepo/values.h */
-        size_t current_num_of_values= 0;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "normal");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = netconf_counter.normal;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "warning");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = netconf_counter.warning;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "minor");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = netconf_counter.minor;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "major");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = netconf_counter.major;
-
-        CREATE_NEW_VALUE(rc, v, current_num_of_values);
-
-        sr_val_build_xpath(&v[current_num_of_values - 1], "%s/%s", xpath, "critical");
-        v[current_num_of_values - 1].type = SR_UINT32_T;
-        v[current_num_of_values - 1].data.uint32_val = netconf_counter.critical;
-
-        //return the values that we have just created
-        *values = v;
-        *values_cnt = current_num_of_values;
-     }
-
-    return SR_ERR_OK;
-}
-
-static int odl_add_key_pair_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
-      sr_val_t **output, size_t *output_cnt, void *private_ctx)
-{
-    int rc = SR_ERR_OK;
-    controller_t controller_list[CONTROLLER_LIST_MAX_LEN];
-    int controller_list_size = 0;
-
-    controller_list[0] = controller_details;
-    controller_list_size++;
-
-    for (int i = 0; i < controller_list_size; ++i)
-    {
-        printf("%d iteration: Got back url=%s and credentials=%s\n", i, controller_list[i].url, controller_list[i].credentials);
-    }
-
-    rc = add_key_pair_to_odl(controller_list, controller_list_size);
-    if (rc != SR_ERR_OK)
-    {
-        printf("Failed to add key pair to ODL.\n");
-        return SR_ERR_OPERATION_FAILED;
-    }
-
-    return rc;
-}
-
-static int invoke_notification_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
-      sr_val_t **output, size_t *output_cnt, void *private_ctx)
-{
-    int rc = SR_ERR_OK;
-
-    char *device_name = NULL, *module_name = NULL, *notification_object = NULL;
-    
-    /* print input values */
-    printf("\n\n ========== RECEIVED RPC REQUEST ==========\n\n");
-    printf(">>> RPC Input:\n\n");
-    
-    device_name = strdup(input[0].data.string_val);
-    module_name = strdup(input[1].data.string_val);
-    notification_object = strdup(input[2].data.string_val);
-
-    rc = sr_new_values(1, output);
-    if (SR_ERR_OK != rc) {
-        return rc;
-    }
-
-    /* set 'output/step-count' leaf */
-    rc = sr_val_set_xpath(&(*output)[0], "/network-topology-simulator:invoke-notification/status");
-    if (SR_ERR_OK != rc) {
-        return rc;
-    }
-
-    rc = invoke_device_notification(device_name, module_name, notification_object);
-    
-    if (rc != SR_ERR_OK)
-    {
-        sr_val_build_str_data(&(*output)[0], SR_ENUM_T, "%s", "ERROR");
-    }
-    else
-    {
-        sr_val_build_str_data(&(*output)[0], SR_ENUM_T, "%s", "SUCCESS");
-    }
-    *output_cnt = 1;
-
-    return SR_ERR_OK;
-}
-
-
-static void
-sigint_handler(int signum)
-{
-    exit_application = 1;
-}
-
-int
-main(int argc, char **argv)
-{
-    sr_conn_ctx_t *connection = NULL;
-    sr_session_ctx_t *session = NULL;
-    sr_subscription_ctx_t *subscription = NULL;
-    int rc = SR_ERR_OK;
-
-    setbuf(stdout, NULL);
-
-    rc = _init_curl_k8s();
-    if (rc != SR_ERR_OK)
-    {
-        fprintf(stderr, "Could not initialize cURL for K8S connection: %s\n", sr_strerror(rc));
-    }
-
-    device_list = new_device_stack();
-    rc = _init_curl();
-    if (rc != SR_ERR_OK)
-    {
-        fprintf(stderr, "Could not initialize cURL: %s\n", sr_strerror(rc));
-    }
-
-    rc = writeSkeletonConfigFile();
-    if (rc != SR_ERR_OK)
-    {
-        fprintf(stderr, "Could not initialize configuration JSON file: %s\n", sr_strerror(rc));
-    }
-
-    /* connect to sysrepo */
-    rc = sr_connect("network-topology-simulator", SR_CONN_DEFAULT, &connection);
-    if (SR_ERR_OK != rc) {
-        fprintf(stderr, "Error by sr_connect: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    /* start session */
-    rc = sr_session_start(connection, SR_DS_STARTUP, SR_SESS_DEFAULT, &session);
-    if (SR_ERR_OK != rc) {
-        fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - ves-heartbeat-period
-    int vesHeartbeatPeriod = getIntFromString(getenv("VesHeartbeatPeriod"), 0);
-
-    sr_val_t value = { 0 };
-    value.type = SR_UINT32_T;
-    value.data.uint32_val = vesHeartbeatPeriod;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/notification-config/ves-heartbeat-period", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = ves_heartbeat_period_changed(vesHeartbeatPeriod);
-    if (SR_ERR_OK != rc) {
-        printf("Error by ves_heartbeat_period_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - is-netconf-available
-
-    int isNetconfAvailable = 1;
-
-    char *isNetconfAvailablString = getenv("IsNetconfAvailable");
-    if (isNetconfAvailablString != NULL)
-    {
-        if (strcmp(isNetconfAvailablString, "false") == 0)
-        {
-            isNetconfAvailable = 0;
-        }
-    }
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_BOOL_T;
-    value.data.bool_val = isNetconfAvailable;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/notification-config/is-netconf-available", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = is_netconf_available_changed(isNetconfAvailable);
-    if (SR_ERR_OK != rc) {
-        printf("Error by is_netconf_available_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - is-ves-available
-
-    int isVesAvailable = 1;
-
-    char *isVesAvailablString = getenv("IsVesAvailable");
-    if (isVesAvailablString != NULL)
-    {
-        if (strcmp(isVesAvailablString, "false") == 0)
-        {
-            isVesAvailable = 0;
-        }
-    }
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_BOOL_T;
-    value.data.bool_val = isVesAvailable;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/notification-config/is-ves-available", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = is_ves_available_changed(isVesAvailable);
-    if (SR_ERR_OK != rc) {
-        printf("Error by is_ves_available_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - ves-endpoint-port
-
-    int vesEndpointPort = getIntFromString(getenv("VesEndpointPort"), 8080);
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_UINT16_T;
-    value.data.uint16_val = vesEndpointPort;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-port", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = ves_port_changed(vesEndpointPort);
-    if (SR_ERR_OK != rc) {
-        printf("Error by ves_port_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - ves-endpoint-ip
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_STRING_T;
-    value.data.string_val = getenv("VesEndpointIp");
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-ip", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = ves_ip_changed(getenv("VesEndpointIp"));
-    if (SR_ERR_OK != rc) {
-        printf("Error by ves_ip_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - ves-endpoint-auth-method
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_ENUM_T;
-    value.data.enum_val = getenv("VesEndpointAuthMethod");
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-auth-method", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = ves_auth_method_changed(getenv("VesEndpointAuthMethod"));
-    if (SR_ERR_OK != rc) {
-        printf("Error by ves_auth_method_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    //TODO only basic-auth implemented vor VES
-    if (strcmp(getenv("VesEndpointAuthMethod"), "basic-auth")  == 0)
-    {
-        // setting the values that come in an ENV variable as defaults - ves-endpoint-usename
-
-        value = (const sr_val_t) { 0 };
-        value.type = SR_STRING_T;
-        value.data.string_val = getenv("VesEndpointUsername");
-        rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-username",
-                &value, SR_EDIT_DEFAULT);
-        if (SR_ERR_OK != rc) {
-            printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-            goto cleanup;
-        }
-
-        rc = ves_username_changed(getenv("VesEndpointUsername"));
-        if (SR_ERR_OK != rc) {
-            printf("Error by ves_username_changed: %s\n", sr_strerror(rc));
-            goto cleanup;
-        }
-
-        // setting the values that come in an ENV variable as defaults - ves-endpoint-password
-
-        value = (const sr_val_t) { 0 };
-        value.type = SR_STRING_T;
-        value.data.string_val = getenv("VesEndpointPassword");
-        rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-password",
-                &value, SR_EDIT_DEFAULT);
-        if (SR_ERR_OK != rc) {
-            printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-            goto cleanup;
-        }
-
-        rc = ves_password_changed(getenv("VesEndpointPassword"));
-        if (SR_ERR_OK != rc) {
-            printf("Error by ves_password_changed: %s\n", sr_strerror(rc));
-            goto cleanup;
-        }
-    }
-
-    // setting the values that come in an ENV variable as defaults - ves-registration
-
-    int vesRegistration = 1;
-
-    char *vesRegistrationString = getenv("VesRegistration");
-    if (vesRegistrationString != NULL)
-    {
-        if (strcmp(vesRegistrationString, "false") == 0)
-        {
-            vesRegistration = 0;
-        }
-    }
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_BOOL_T;
-    value.data.bool_val = vesRegistration;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-registration",
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = ves_registration_changed(vesRegistration);
-    if (SR_ERR_OK != rc) {
-        printf("Error by ves_registration_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - ssh-connections
-
-    int sshConnections = getIntFromString(getenv("SshConnections"), 1);
-
-    rc = ssh_connections_changed(sshConnections);
-    if (SR_ERR_OK != rc) {
-        printf("Error by ssh_connections_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - tls-connections
-
-    int tlsConnections = getIntFromString(getenv("TlsConnections"), 0);
-
-    rc = tls_connections_changed(tlsConnections);
-    if (SR_ERR_OK != rc) {
-        printf("Error by tls_connections_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    if (strcmp(getenv("K8S_DEPLOYMENT"), "true") == 0)
-    {
-        rc = send_k8s_extend_port();
-        if (rc != SR_ERR_OK)
-        {
-            printf("Could not send the number of ports to k8s cluster\n");
-        }
-    }
-
-    // setting the values that come in an ENV variable as defaults - controller-ip
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_STRING_T;
-    value.data.string_val = getenv("ControllerIp");
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-ip", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = controller_ip_changed(getenv("ControllerIp"));
-    if (SR_ERR_OK != rc) {
-        printf("Error by controller_ip_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - controller-port
-
-    int controllerPort = getIntFromString(getenv("ControllerPort"), 8181);
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_UINT16_T;
-    value.data.uint16_val = controllerPort;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-port", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = controller_port_changed(controllerPort);
-    if (SR_ERR_OK != rc) {
-        printf("Error by controller_port_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - netconf-call-home-port
-
-    int netconfCallHomePort = getIntFromString(getenv("NetconfCallHomePort"), 6666);
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_UINT16_T;
-    value.data.uint16_val = netconfCallHomePort;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/controller-details/netconf-call-home-port", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = controller_netconf_call_home_port_changed(netconfCallHomePort);
-    if (SR_ERR_OK != rc) {
-        printf("Error by controller_netconf_call_home_port_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - controller-username
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_STRING_T;
-    value.data.string_val = getenv("ControllerUsername");
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-username", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = controller_username_changed(getenv("ControllerUsername"));
-    if (SR_ERR_OK != rc) {
-        printf("Error by controller_username_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - controller-password
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_STRING_T;
-    value.data.string_val = getenv("ControllerPassword");
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-password", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = controller_password_changed(getenv("ControllerPassword"));
-    if (SR_ERR_OK != rc) {
-        printf("Error by controller_password_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    // setting the values that come in an ENV variable as defaults - netconf-call-home
-
-    int netconfCallHome = 1;
-
-    char *netconfCallHomeString = getenv("NetconfCallHome");
-    if (netconfCallHomeString != NULL)
-    {
-        if (strcmp(netconfCallHomeString, "false") == 0)
-        {
-            netconfCallHome = 0;
-        }
-    }
-
-    value = (const sr_val_t) { 0 };
-    value.type = SR_BOOL_T;
-    value.data.bool_val = netconfCallHome;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/netconf-call-home", 
-            &value, SR_EDIT_DEFAULT);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_set_item: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = netconf_call_home_changed(netconfCallHome);
-    if (SR_ERR_OK != rc) {
-        printf("Error by netconf_call_home_changed: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    //commit the changes that we have done until now
-    rc = sr_commit(session);
-    if (SR_ERR_OK != rc) {
-        printf("Error by sr_commit: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-       /* read startup config */
-       printf("\n\n ========== READING STARTUP CONFIG network-topology-simulator: ==========\n\n");
-       print_current_config(session, "network-topology-simulator");
-
-       /* subscribe for changes in running config */
-       rc = sr_module_change_subscribe(session, "network-topology-simulator", simulator_config_change_cb, NULL,
-                       0, SR_SUBSCR_DEFAULT | SR_SUBSCR_APPLY_ONLY, &subscription);
-       if (SR_ERR_OK != rc) {
-               fprintf(stderr, "Error by sr_module_change_subscribe: %s\n", sr_strerror(rc));
-               goto cleanup;
-       }
-
-    /* subscribe as state data provider for the ntsimulator state data */
-    rc = sr_dp_get_items_subscribe(session, "/network-topology-simulator:simulator-status", simulator_status_cb, NULL,
-               SR_SUBSCR_CTX_REUSE, &subscription);
-    if (rc != SR_ERR_OK) {
-        goto cleanup;
-    }
-
-    rc = notification_delay_period_changed(NULL, 0);
-    if (rc != SR_ERR_OK) {
-       printf("Could not write the delay period to file!\n");
-        goto cleanup;
-    }
-
-    rc = _init_curl_odl();
-    if (rc != SR_ERR_OK)
-    {
-        fprintf(stderr, "Could not initialize cURL for ODL connection: %s\n", sr_strerror(rc));
-    }
-
-    rc = sr_rpc_subscribe(session, "/network-topology-simulator:add-key-pair-to-odl", odl_add_key_pair_cb, (void *)session,
-               SR_SUBSCR_CTX_REUSE, &subscription);
-
-       printf("\n\n ========== STARTUP CONFIG network-topology-simulator APPLIED AS RUNNING ==========\n\n");
-
-    rc = writeSkeletonStatusFile();
-    if (rc != SR_ERR_OK)
-    {
-        fprintf(stderr, "Could not initialize status JSON file: %s\n", sr_strerror(rc));
-    }
-
-    rc = sr_rpc_subscribe(session, "/network-topology-simulator:invoke-notification", invoke_notification_cb,
-            (void *)session, SR_SUBSCR_DEFAULT, &subscription);
-    if (SR_ERR_OK != rc) {
-        fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
-        goto cleanup;
-    }
-
-    rc = pull_docker_image_of_simulated_device();
-
-    /* loop until ctrl-c is pressed / SIGINT is received */
-    signal(SIGINT, sigint_handler);
-    signal(SIGTERM, sigint_handler);
-    signal(SIGPIPE, SIG_IGN);
-
-    while (!exit_application) {
-
-               sleep(1);  /* or do some more useful work... */
-    }
-
-    printf("Application exit requested, exiting.\n");
-
-cleanup:
-    if (NULL != subscription) {
-        sr_unsubscribe(session, subscription);
-    }
-    if (NULL != session) {
-        sr_session_stop(session);
-    }
-    if (NULL != connection) {
-        sr_disconnect(connection);
-    }
-
-    clean_current_docker_configuration();
-    rc = cleanup_curl();
-    rc = cleanup_curl_odl();
-    rc = cleanup_curl_k8s();
-
-    return rc;
-}
-
-static void clean_current_docker_configuration(void)
-{
-    if (strcmp(getenv("K8S_DEPLOYMENT"), "true"))
-    {
-        return;
-    }
-
-       printf("Cleaning docker containers...\n");
-
-       if (device_list == NULL)
-       {
-               return;
-       }
-
-       for (int i = 0; i < simulated_devices_config; ++i)
-       {
-               stop_device(device_list);
-       }
-
-       printf("Cleaning completed!\n");
-}