Bug fix.
[sim/o1-interface.git] / ntsimulator / src / ntsimulator-manager / ntsimulator-manager.c
index 165e7bb..b4e1a0f 100644 (file)
@@ -284,19 +284,61 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        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;
-       }
+    /* 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;
-       }
+    rc = ves_ip_changed(val->data.string_val);
+    if (rc != SR_ERR_OK) {
+        goto sr_error;
+    }
 
-       sr_free_val(val);
-       val = NULL;
+    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;
+    }
+
+    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;
 
        /* 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);
@@ -340,69 +382,103 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        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;
-       }
+    /* 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;
-       }
+    rc = is_ves_available_changed(val->data.bool_val);
+    if (rc != SR_ERR_OK) {
+        goto sr_error;
+    }
 
-       sr_free_val(val);
-       val = NULL;
+    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/ssh-connections", &val);
+    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/netconf-call-home", &val);
     if (rc != SR_ERR_OK) {
-        printf("NTS Manager /network-topology-simulator:simulator-config/ssh-connections object not available, ignoring..");
+        goto sr_error;
     }
-    else
-    {
-        rc = ssh_connections_changed(val->data.uint32_val);
-        if (rc != SR_ERR_OK) {
-            goto sr_error;
-        }
 
-        if (strcmp(getenv("K8S_DEPLOYMENT"), "true") == 0)
-        {
-            rc = send_k8s_extend_port();
-            if (rc != SR_ERR_OK)
-            {
-                printf("Could not send the extended port to k8s cluster.\n");
-            }
-        }
+    rc = netconf_call_home_changed(val->data.bool_val);
+    if (rc != SR_ERR_OK) {
+        goto sr_error;
     }
 
     sr_free_val(val);
-       val = NULL;
+    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/tls-connections", &val);
+    rc = sr_get_item(session, "/network-topology-simulator:simulator-config/controller-details/controller-ip", &val);
     if (rc != SR_ERR_OK) {
-        printf("NTS Manager /network-topology-simulator:simulator-config/tls-connections object not available, ignoring..");
+        goto sr_error;
     }
-    else
-    {
-        rc = tls_connections_changed(val->data.uint32_val);
-        if (rc != SR_ERR_OK) {
-            goto sr_error;
-        }
 
-        if (strcmp(getenv("K8S_DEPLOYMENT"), "true") == 0)
-        {
-            rc = send_k8s_extend_port();
-            if (rc != SR_ERR_OK)
-            {
-                printf("Could not send the extended port to k8s cluster.\n");
-            }
-        }
+    rc = controller_ip_changed(val->data.string_val);
+    if (rc != SR_ERR_OK) {
+        goto sr_error;
     }
 
     sr_free_val(val);
-       val = NULL;
+    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;
 
@@ -444,12 +520,12 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
                        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;
-               }
+        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;
 
@@ -460,11 +536,14 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
             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, current_device->device_id, "device-ip");
+                       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");
 
@@ -472,14 +551,14 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
                        {
                                CREATE_NEW_VALUE(rc, v, current_num_of_values);
 
-                               sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/%s", xpath, current_device->device_id, "device-port");
+                               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, current_device->device_id, "is-mounted");
+                       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;
 
@@ -487,66 +566,66 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
 
                        CREATE_NEW_VALUE(rc, v, current_num_of_values);
 
-                       sr_val_build_xpath(&v[current_num_of_values - 1], "%s[uuid='%s']/%s", xpath, current_device->device_id, "operational-state");
+                       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, current_device->device_id, "normal");
+            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, current_device->device_id, "warning");
+            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, current_device->device_id, "minor");
+            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, current_device->device_id, "major");
+            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, current_device->device_id, "critical");
+            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, current_device->device_id, "normal");
+            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, current_device->device_id, "warning");
+            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, current_device->device_id, "minor");
+            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, current_device->device_id, "major");
+            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, current_device->device_id, "critical");
+            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;
 
@@ -605,6 +684,18 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
                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;
@@ -693,29 +784,70 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
     return SR_ERR_OK;
 }
 
-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)
+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;
+    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++;
+    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);
-       }
+    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;
-       }
+    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;
+    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;
 }
 
 
@@ -883,40 +1015,107 @@ main(int argc, char **argv)
         goto cleanup;
     }
 
-    // setting the values that come in an ENV variable as defaults - ssh-connections
-
-    int sshConnections = getIntFromString(getenv("SshConnections"), 1);
+    // setting the values that come in an ENV variable as defaults - ves-endpoint-auth-method
 
     value = (const sr_val_t) { 0 };
-    value.type = SR_UINT32_T;
-    value.data.uint32_val = sshConnections;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/ssh-connections",
+    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 = ssh_connections_changed(sshConnections);
+    rc = ves_auth_method_changed(getenv("VesEndpointAuthMethod"));
     if (SR_ERR_OK != rc) {
-        printf("Error by ssh_connections_changed: %s\n", sr_strerror(rc));
+        printf("Error by ves_auth_method_changed: %s\n", sr_strerror(rc));
         goto cleanup;
     }
 
-    // setting the values that come in an ENV variable as defaults - tls-connections
+    //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;
+        }
 
-    int tlsConnections = getIntFromString(getenv("TlsConnections"), 0);
+        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_UINT32_T;
-    value.data.uint32_val = tlsConnections;
-    rc = sr_set_item(session, "/network-topology-simulator:simulator-config/tls-connections",
+    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));
@@ -932,6 +1131,129 @@ main(int argc, char **argv)
         }
     }
 
+    // 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) {
@@ -981,6 +1303,15 @@ main(int argc, char **argv)
         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);