X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=ntsimulator%2Fsrc%2Fntsimulator-manager%2Fsimulator-operations.c;fp=ntsimulator%2Fsrc%2Fntsimulator-manager%2Fsimulator-operations.c;h=0000000000000000000000000000000000000000;hb=f1d5c9198acde7a7ce296490087cad37e008f688;hp=87b1d68543ce5c5bf62b915984a1648b1494e614;hpb=f2d8f1002fa93848c80a88e5658db4816cba3020;p=sim%2Fo1-interface.git diff --git a/ntsimulator/src/ntsimulator-manager/simulator-operations.c b/ntsimulator/src/ntsimulator-manager/simulator-operations.c deleted file mode 100644 index 87b1d68..0000000 --- a/ntsimulator/src/ntsimulator-manager/simulator-operations.c +++ /dev/null @@ -1,3009 +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 "simulator-operations.h" -#include "sysrepo.h" -#include "sysrepo/values.h" -#include -#include -#include -#include - -#include "utils.h" - -#define LINE_BUFSIZE 128 - -static CURL *curl; //share the same curl connection for communicating with the Docker Engine API -static CURL *curl_odl; //share the same curl connection for mounting servers in ODL -static CURL *curl_k8s; //share the same curl connection for communicating with the K8S cluster - -/* -curl -X POST -H 'Content-Type: application/json' -i http://localhost:5000/scale --data '{"simulatedDevices":2}' -*/ - -static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - size_t realsize = size * nmemb; - struct MemoryStruct *mem = (struct MemoryStruct *)userp; - - char *ptr = realloc(mem->memory, mem->size + realsize + 1); - if(ptr == NULL) { - /* out of memory! */ - printf("not enough memory (realloc returned NULL)\n"); - return 0; - } - - mem->memory = ptr; - memcpy(&(mem->memory[mem->size]), contents, realsize); - mem->size += realsize; - mem->memory[mem->size] = 0; - - return realsize; -} - -static void set_curl_common_info() -{ - struct curl_slist *chunk = NULL; - chunk = curl_slist_append(chunk, "Content-Type: application/json"); - chunk = curl_slist_append(chunk, "Accept: application/json"); - - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); - - curl_easy_setopt(curl, CURLOPT_UNIX_SOCKET_PATH, "/var/run/docker.sock"); - - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2L); // seconds timeout for a connection - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); //seconds timeout for an operation - - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); -} - -static void set_curl_common_info_odl() -{ - struct curl_slist *chunk = NULL; - chunk = curl_slist_append(chunk, "Content-Type: application/xml"); - chunk = curl_slist_append(chunk, "Accept: application/xml"); - - curl_easy_setopt(curl_odl, CURLOPT_HTTPHEADER, chunk); - - curl_easy_setopt(curl_odl, CURLOPT_CONNECTTIMEOUT, 2L); // seconds timeout for a connection - curl_easy_setopt(curl_odl, CURLOPT_TIMEOUT, 10L); //seconds timeout for an operation - - curl_easy_setopt(curl_odl, CURLOPT_VERBOSE, 1L); -} - -static void set_curl_common_info_k8s() -{ - struct curl_slist *chunk = NULL; - chunk = curl_slist_append(chunk, "Content-Type: application/json"); - chunk = curl_slist_append(chunk, "Accept: application/json"); - - curl_easy_setopt(curl_k8s, CURLOPT_HTTPHEADER, chunk); - - curl_easy_setopt(curl_k8s, CURLOPT_CONNECTTIMEOUT, 2L); // seconds timeout for a connection - curl_easy_setopt(curl_k8s, CURLOPT_TIMEOUT, 10L); //seconds timeout for an operation - - curl_easy_setopt(curl_k8s, CURLOPT_VERBOSE, 1L); -} - -static cJSON* get_docker_container_bindings(void) -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[200]; - sprintf(url, "http:/v%s/containers/%s/json", getenv("DOCKER_ENGINE_VERSION"), getenv("HOSTNAME")); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return NULL; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - - printf("%lu bytes retrieved\n", (unsigned long)curl_response_mem.size); - - if (json_response == NULL) - { - printf("Could not parse JSON response for url=\"%s\"\n", url); - return NULL; - } - - cJSON *hostConfig = cJSON_GetObjectItemCaseSensitive(json_response, "HostConfig"); - - if (hostConfig == NULL) - { - printf("Could not get HostConfig object\n"); - return NULL; - } - - cJSON *binds = cJSON_GetObjectItemCaseSensitive(hostConfig, "Binds"); - - if (binds == NULL) - { - printf("Could not get Binds object\n"); - return NULL; - } - - cJSON *bindsCopy = cJSON_Duplicate(binds, 1); - - cJSON_Delete(json_response); - - return bindsCopy; - } - - return NULL; -} - -static cJSON* get_docker_container_network_node(void) -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[200]; - sprintf(url, "http:/v%s/containers/%s/json", getenv("DOCKER_ENGINE_VERSION"), getenv("HOSTNAME")); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return NULL; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - - printf("%lu bytes retrieved\n", (unsigned long)curl_response_mem.size); - - if (json_response == NULL) - { - printf("Could not parse JSON response for url=\"%s\"\n", url); - return NULL; - } - - cJSON *hostConfig = cJSON_GetObjectItemCaseSensitive(json_response, "HostConfig"); - - if (hostConfig == NULL) - { - printf("Could not get HostConfig object\n"); - return NULL; - } - - cJSON *networkMode = cJSON_GetObjectItemCaseSensitive(hostConfig, "NetworkMode"); - - if (networkMode == NULL) - { - printf("Could not get NetworkMode object\n"); - return NULL; - } - - cJSON *networkCopy = cJSON_Duplicate(networkMode, 1); - - cJSON_Delete(json_response); - - return networkCopy; - } - - return NULL; -} - -static char* create_docker_container_curl(int base_netconf_port, cJSON* managerBinds, cJSON* networkMode, int device_number) -{ - if (managerBinds == NULL) - { - printf("Could not retrieve JSON object: Binds\n"); - return NULL; - } - cJSON *binds = cJSON_Duplicate(managerBinds, 1); - - if (networkMode == NULL) - { - printf("Could not retrieve JSON object: NetworkMode\n"); - return NULL; - } - cJSON *netMode = cJSON_Duplicate(networkMode, 1); - - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[100]; - sprintf(url, "http:/v%s/containers/create", getenv("DOCKER_ENGINE_VERSION")); - - // the docker image name to be used is defined in the Dockerfile of the NTS Manager, - // under the MODELS_IMAGE env variable - char models_var[50]; - sprintf(models_var, "%s", getenv("MODELS_IMAGE")); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - cJSON *postDataJson = cJSON_CreateObject(); - - if (cJSON_AddStringToObject(postDataJson, "Image", models_var) == NULL) - { - printf("Could not create JSON object: Image\n"); - return NULL; - } - - char device_name[100]; - sprintf(device_name, "%s-%d", getenv("CONTAINER_NAME"), device_number); - - if (cJSON_AddStringToObject(postDataJson, "Hostname", device_name) == NULL) - { - printf("Could not create JSON object: Hostname\n"); - return NULL; - } - - cJSON *hostConfig = cJSON_CreateObject(); - if (hostConfig == NULL) - { - printf("Could not create JSON object: HostConfig\n"); - return NULL; - } - - cJSON_AddItemToObject(postDataJson, "HostConfig", hostConfig); - - cJSON *portBindings = cJSON_CreateObject(); - if (portBindings == NULL) - { - printf("Could not create JSON object: PortBindings\n"); - return NULL; - } - - cJSON_AddItemToObject(hostConfig, "PortBindings", portBindings); - - for (int i = 0; i < NETCONF_CONNECTIONS_PER_DEVICE; ++i) - { - cJSON *port = cJSON_CreateArray(); - if (port == NULL) - { - printf("Could not create JSON object: port\n"); - return NULL; - } - - char dockerContainerPort[20]; - sprintf(dockerContainerPort, "%d/tcp", 830 + i); - - cJSON_AddItemToObject(portBindings, dockerContainerPort, port); - - cJSON *hostPort = cJSON_CreateObject(); - if (hostPort == NULL) - { - printf("Could not create JSON object: HostPort\n"); - return NULL; - } - - char dockerHostPort[10]; - sprintf(dockerHostPort, "%d", base_netconf_port + i); - if (cJSON_AddStringToObject(hostPort, "HostPort", dockerHostPort) == NULL) - { - printf("Could not create JSON object: HostPortString\n"); - return NULL; - } - if (cJSON_AddStringToObject(hostPort, "HostIp", getenv("NTS_IP")) == NULL) - { - printf("Could not create JSON object: HostIpString\n"); - return NULL; - } - - cJSON_AddItemToArray(port, hostPort); - } - - cJSON *labels = cJSON_CreateObject(); - if (labels == NULL) - { - printf("Could not create JSON object: Labels\n"); - return NULL; - } - - cJSON_AddItemToObject(postDataJson, "Labels", labels); - - if (cJSON_AddStringToObject(labels, "NTS", "") == NULL) - { - printf("Could not create JSON object: NTS\n"); - return NULL; - } - - if (cJSON_AddStringToObject(labels, "NTS_Manager", getenv("HOSTNAME")) == NULL) - { - printf("Could not create JSON object: NTS Manager\n"); - return NULL; - } - - cJSON *env_variables_array = cJSON_CreateArray(); - if (env_variables_array == NULL) - { - printf("Could not create JSON object: Env array\n"); - return NULL; - } - - cJSON_AddItemToObject(postDataJson, "Env", env_variables_array); - - char environment_var[100]; - sprintf(environment_var, "NTS_IP=%s", getenv("NTS_IP")); - - cJSON *env_var_obj = cJSON_CreateString(environment_var); - if (env_var_obj == NULL) - { - printf("Could not create JSON object: Env array object NTS_IP\n"); - return NULL; - } - cJSON_AddItemToArray(env_variables_array, env_var_obj); - - char *external_nts_ip = getenv("EXTERNAL_NTS_IP"); - if (external_nts_ip == NULL) - { - sprintf(environment_var, "EXTERNAL_NTS_IP=%s", getenv("NTS_IP")); - } - else - { - sprintf(environment_var, "EXTERNAL_NTS_IP=%s", external_nts_ip); - } - - cJSON *env_var_obj_0 = cJSON_CreateString(environment_var); - if (env_var_obj_0 == NULL) - { - printf("Could not create JSON object: Env array object EXTERNAL_NTS_IP\n"); - return NULL; - } - cJSON_AddItemToArray(env_variables_array, env_var_obj_0); - - sprintf(environment_var, "NETCONF_BASE=%d", base_netconf_port); - cJSON *env_var_obj_2 = cJSON_CreateString(environment_var); - if (env_var_obj_2 == NULL) - { - printf("Could not create JSON object: Env array object NETCONF_BASE\n"); - return NULL; - } - cJSON_AddItemToArray(env_variables_array, env_var_obj_2); - - char scripts_dir[200]; - sprintf(scripts_dir, "SCRIPTS_DIR=%s", getenv("SCRIPTS_DIR")); - cJSON *env_var_obj_3 = cJSON_CreateString(scripts_dir); - if (env_var_obj_3 == NULL) - { - printf("Could not create JSON object: Env array object SCRIPTS_DIR\n"); - return NULL; - } - cJSON_AddItemToArray(env_variables_array, env_var_obj_3); - - char k8s_deployment[50]; - sprintf(k8s_deployment, "K8S_DEPLOYMENT=%s", getenv("K8S_DEPLOYMENT")); - cJSON *env_var_obj_4 = cJSON_CreateString(k8s_deployment); - if (env_var_obj_4 == NULL) - { - printf("Could not create JSON object: Env array object K8S_DEPLOYMENT\n"); - return NULL; - } - cJSON_AddItemToArray(env_variables_array, env_var_obj_4); - - char ipv6_enabled[50]; - sprintf(ipv6_enabled, "IPv6Enabled=%s", getenv("IPv6Enabled")); - cJSON *env_var_obj_5 = cJSON_CreateString(ipv6_enabled); - if (env_var_obj_5 == NULL) - { - printf("Could not create JSON object: Env array object IPv6Enabled\n"); - return NULL; - } - cJSON_AddItemToArray(env_variables_array, env_var_obj_5); - - cJSON_AddItemToObject(hostConfig, "Binds", binds); - - cJSON_AddItemToObject(hostConfig, "NetworkMode", netMode); - - char *post_data_string = NULL; - - post_data_string = cJSON_PrintUnformatted(postDataJson); - - printf("Post data JSON:\n%s\n", post_data_string); - - if (postDataJson != NULL) - { - cJSON_Delete(postDataJson); - } - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data_string); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (post_data_string != NULL) - { - free(post_data_string); - } - - if (res != CURLE_OK) - { - return NULL; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - const cJSON *container_id = NULL; - - printf("%lu bytes retrieved\n", (unsigned long)curl_response_mem.size); - - container_id = cJSON_GetObjectItemCaseSensitive(json_response, "Id"); - - if (cJSON_IsString(container_id) && (container_id->valuestring != NULL)) - { - printf("Container id: \"%s\"\n", container_id->valuestring); - - char container_id_short[13]; - - memset(container_id_short, '\0', sizeof(container_id_short)); - strncpy(container_id_short, container_id->valuestring, 12); - - printf("Container id short: \"%s\"\n", container_id_short); - - cJSON_Delete(json_response); - return strdup(container_id_short); - } - - cJSON_Delete(json_response); - } - - return NULL; -} - -static int start_docker_container_curl(char *container_id) -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[100]; - sprintf(url, "http:/v%s/containers/%s/start", getenv("DOCKER_ENGINE_VERSION"), container_id); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - else - { - printf("Container %s started successfully!\n", container_id); - } - - return SR_ERR_OK; -} - -static int rename_docker_container_curl(char *container_id, int device_number) -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char device_name[100]; - sprintf(device_name, "%s-%d", getenv("CONTAINER_NAME"), device_number); - - char url[100]; - sprintf(url, "http:/v%s/containers/%s/rename?name=%s", getenv("DOCKER_ENGINE_VERSION"), container_id, - device_name); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - else - { - printf("Container %s renamed successfully to %s!\n", container_id, device_name); - } - - return SR_ERR_OK; -} - -static int kill_and_remove_docker_container_curl(char *container_id) -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[100]; - sprintf(url, "http:/v%s/containers/%s?force=true", getenv("DOCKER_ENGINE_VERSION"), container_id); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - else - { - printf("Container %s removed successfully!\n", container_id); - } - - return SR_ERR_OK; -} - -static int send_mount_device_instance_ssh(char *url, char *credentials, char *device_name, int device_port) -{ - CURLcode res; - - curl_easy_reset(curl_odl); - set_curl_common_info_odl(); - - char url_for_curl[200]; - sprintf(url_for_curl, "%s%s_%d", url, device_name, device_port); - - curl_easy_setopt(curl_odl, CURLOPT_URL, url_for_curl); - - char post_data_xml[1500]; - - sprintf(post_data_xml, - "" - "%s_%d" - "%s" - "%d" - "%s" - "%s" - "false" - "120" - "false" - "1.5" - "20000" - "100" - "2000" - "", - device_name, device_port, (getenv("EXTERNAL_NTS_IP") == NULL) ? getenv("NTS_IP") : getenv("EXTERNAL_NTS_IP"), - device_port, "netconf", "netconf"); - - printf("Post data:\n%s\n", post_data_xml); - - curl_easy_setopt(curl_odl, CURLOPT_POSTFIELDS, post_data_xml); - curl_easy_setopt(curl_odl, CURLOPT_CUSTOMREQUEST, "PUT"); - curl_easy_setopt(curl_odl, CURLOPT_USERPWD, credentials); - - res = curl_easy_perform(curl_odl); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_odl, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static int send_mount_device_instance_tls(char *url, char *credentials, char *device_name, int device_port) -{ - CURLcode res; - - curl_easy_reset(curl_odl); - set_curl_common_info_odl(); - - char url_for_curl[200]; - sprintf(url_for_curl, "%s%s_%d", url, device_name, device_port); - - curl_easy_setopt(curl_odl, CURLOPT_URL, url_for_curl); - - char post_data_xml[1500]; - - sprintf(post_data_xml, - "" - "" - "TLS" - "" - "%s_%d" - "%s" - "" - "%s" - "device-key" - "" - "%d" - "false" - "120" - "false" - "1.5" - "20000" - "100" - "2000" - "", - device_name, device_port, (getenv("EXTERNAL_NTS_IP") == NULL) ? getenv("NTS_IP") : getenv("EXTERNAL_NTS_IP"), "netconf", device_port); - - printf("Post data:\n%s\n", post_data_xml); - - curl_easy_setopt(curl_odl, CURLOPT_POSTFIELDS, post_data_xml); - curl_easy_setopt(curl_odl, CURLOPT_CUSTOMREQUEST, "PUT"); - curl_easy_setopt(curl_odl, CURLOPT_USERPWD, credentials); - - res = curl_easy_perform(curl_odl); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_odl, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static int send_unmount_device_instance(char *url, char *credentials, char *device_name, int device_port) -{ - CURLcode res; - - curl_easy_reset(curl_odl); - set_curl_common_info_odl(); - - char url_for_curl[200]; - sprintf(url_for_curl, "%s%s_%d", url, device_name, device_port); - - curl_easy_setopt(curl_odl, CURLOPT_URL, url_for_curl); - - curl_easy_setopt(curl_odl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl_odl, CURLOPT_CUSTOMREQUEST, "DELETE"); - curl_easy_setopt(curl_odl, CURLOPT_USERPWD, credentials); - - res = curl_easy_perform(curl_odl); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_odl, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code == 200 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - - -static int send_mount_device(device_t *current_device, controller_t controller_details) -{ - int rc = SR_ERR_OK; - bool is_mounted = true; - int port = 0; - - char device_name[200]; - sprintf(device_name, "%s-%d", getenv("CONTAINER_NAME"), current_device->device_number); - - //This is where we hardcoded: 7 devices will have SSH connections and 3 devices will have TLS connections - for (int i = 0; i < SSH_CONNECTIONS_PER_DEVICE; ++port, ++i) - { - - - rc = send_mount_device_instance_ssh(controller_details.url, controller_details.credentials, - device_name, current_device->netconf_port + port); - if (rc != SR_ERR_OK) - { - is_mounted = false; - } - } - for (int i = 0; i < TLS_CONNECTIONS_PER_DEVICE; ++port, ++i) - { - rc = send_mount_device_instance_tls(controller_details.url, controller_details.credentials, - device_name, current_device->netconf_port + port); - if (rc != SR_ERR_OK) - { - is_mounted = false; - } - } - - current_device->is_mounted = is_mounted; - - return SR_ERR_OK; -} - -static int send_unmount_device(device_t *current_device, controller_t controller_details) -{ - int rc = SR_ERR_OK; - char device_name[100]; - sprintf(device_name, "%s-%d", getenv("CONTAINER_NAME"), current_device->device_number); - - for (int port = 0; port < NETCONF_CONNECTIONS_PER_DEVICE; ++port) - { - rc = send_unmount_device_instance(controller_details.url, controller_details.credentials, - device_name, current_device->netconf_port + port); - if (rc != SR_ERR_OK) - { - printf("Could not send unmount for ODL with url=\"%s\", for device=\"%s\" and port=%d\n", - controller_details.url, device_name, current_device->netconf_port); - } - } - current_device->is_mounted = false; - - return SR_ERR_OK; -} - -device_stack_t *new_device_stack(void) -{ - device_stack_t *stack = malloc(sizeof(*stack)); - - if (stack) { - stack->head = NULL; - stack->stack_size = 0; - } - return stack; -} - -void push_device(device_stack_t *theStack, char *dev_id, int port, int dev_num) -{ - device_t *new_dev = malloc(sizeof(*new_dev)); - - if (new_dev) { - new_dev->device_id = strdup(dev_id); - new_dev->netconf_port = port; - new_dev->device_number = dev_num; - new_dev->is_mounted = false; - new_dev->operational_state = strdup("not-specified"); - - new_dev->next = theStack->head; - - theStack->head = new_dev; - theStack->stack_size++; - } -} - -void pop_device(device_stack_t *theStack) -{ - if (theStack && theStack->head) { - device_t *temp = theStack->head; - theStack->head = theStack->head->next; - - free(temp->device_id); - free(temp->operational_state); - free(temp); - theStack->stack_size--; - } -} - -int get_netconf_port_next(device_stack_t *theStack) -{ - if (theStack && theStack->stack_size > 0) { - return theStack->head->netconf_port + NETCONF_CONNECTIONS_PER_DEVICE; - } - - return get_netconf_port_base(); -} - -int get_netconf_port_base() -{ - int netconf_port_base; - - netconf_port_base = getIntFromString(getenv("NETCONF_BASE"), 50000); - - return netconf_port_base; -} - -// we start numbering the containers from 0 -int get_device_number_next(device_stack_t *theStack) -{ - if (theStack && theStack->stack_size > 0) { - return theStack->head->device_number + 1; - } - - return 0; -} - -char *get_id_last_device(device_stack_t *theStack) -{ - if (theStack && theStack->head) { - return theStack->head->device_id; - } - return NULL; -} - -int get_current_number_of_mounted_devices(device_stack_t *theStack) -{ - int mounted_devices = 0; - - if (theStack && theStack->head) - { - device_t *current_device = theStack->head; - - while (current_device != NULL) - { - if (current_device->is_mounted) - { - mounted_devices++; - } - current_device = current_device->next; - } - } - - return mounted_devices; -} - -int get_current_number_of_devices(device_stack_t *theStack) -{ - //TODO implement function for k8s deployment - if (strcmp(getenv("K8S_DEPLOYMENT"), "true") == 0) - { - return 0; - } - - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[100]; - sprintf(url, "http:/v%s/containers/json?all=true&filters={\"label\":[\"NTS_Manager=%s\"],\"status\":[\"running\"]}", - getenv("DOCKER_ENGINE_VERSION"), getenv("HOSTNAME")); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - - printf("%lu bytes retrieved\n", (unsigned long)curl_response_mem.size); - - if (json_response == NULL || !cJSON_IsArray(json_response)) - { - printf("Could not parse JSON response for url=\"%s\"\n", url); - return SR_ERR_OPERATION_FAILED; - } - - int num_of_devices = cJSON_GetArraySize(json_response); - cJSON_Delete(json_response); - - return num_of_devices; - } - - return 0; -} - -static int set_operational_state_of_device(device_stack_t *theStack, char *device_id, char *operational_state) -{ - if (theStack && theStack->head) - { - device_t *current_device = theStack->head; - - while (current_device != NULL) - { - if (strcmp(current_device->device_id, device_id) == 0) - { - free(current_device->operational_state); - current_device->operational_state = strdup(operational_state); - - return SR_ERR_OK; - } - - current_device = current_device->next; - } - } - - printf("Could not find device with uuid=\"%s\"\n", device_id); - return SR_ERR_OPERATION_FAILED; -} - -char* get_docker_container_operational_state(device_stack_t *theStack, char *container_id) -{ - if (theStack && theStack->head) - { - device_t *current_device = theStack->head; - - while (current_device != NULL) - { - if (strcmp(current_device->device_id, container_id) == 0) - { - return current_device->operational_state; - } - - current_device = current_device->next; - } - } - - return NULL; -} - -int start_device(device_stack_t *theStack) -{ - int rc = SR_ERR_OK; - static cJSON *managerBindings = NULL, *networkMode = NULL; - - if (managerBindings == NULL) - { - managerBindings = get_docker_container_bindings(); - } - - if (networkMode == NULL) - { - networkMode = get_docker_container_network_node(); - } - - int netconf_base = get_netconf_port_next(theStack); - int device_number = get_device_number_next(theStack); - - char *dev_id = create_docker_container_curl(netconf_base, managerBindings, networkMode, device_number); - if (dev_id == NULL) - { - printf("ERROR: Could not create docker container!\n"); - return SR_ERR_OPERATION_FAILED; - } - - push_device(theStack, dev_id, netconf_base, device_number); - - rc = start_docker_container_curl(dev_id); - if (rc != SR_ERR_OK) - { - printf("Could not start device with device_id=\"%s\"\n", dev_id); - } - - rc = rename_docker_container_curl(dev_id, device_number); - if (rc != SR_ERR_OK) - { - printf("Could not rename device with device_id=\"%s\"\n", dev_id); - } - - if (dev_id) { - free(dev_id); - } - - return SR_ERR_OK; -} - -int _init_curl() -{ - curl = curl_easy_init(); - - if (curl == NULL) { - printf("cURL initialization error! Aborting call!\n"); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -int cleanup_curl() -{ - if (curl != NULL) - { - curl_easy_cleanup(curl); - } - - return SR_ERR_OK; -} - -int _init_curl_odl() -{ - curl_odl = curl_easy_init(); - - if (curl_odl == NULL) { - printf("cURL initialization error! Aborting call!\n"); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -int cleanup_curl_odl() -{ - if (curl_odl != NULL) - { - curl_easy_cleanup(curl_odl); - } - - return SR_ERR_OK; -} - -int _init_curl_k8s() -{ - curl_k8s = curl_easy_init(); - - if (curl_k8s == NULL) { - printf("cURL initialization error! Aborting call!\n"); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -int cleanup_curl_k8s() -{ - if (curl_k8s != NULL) - { - curl_easy_cleanup(curl_k8s); - } - - return SR_ERR_OK; -} - -int stop_device(device_stack_t *theStack) -{ - int rc = SR_ERR_OK; - char *last_id = get_id_last_device(theStack); - - rc = kill_and_remove_docker_container_curl(last_id); - if (rc != SR_ERR_OK) - { - printf("Could not kill and remove docker container with uuid=\"%s\"\n", last_id); - } - - rc = removeDeviceEntryFromStatusFile(last_id); - if (rc != SR_ERR_OK) - { - printf("Could not remove entry from status file for uuid=\"%s\"\n", last_id); - } - - pop_device(theStack); - - return SR_ERR_OK; -} - -int mount_device(device_stack_t *theStack, controller_t controller_details) -{ - int rc; - - if (theStack && theStack->head) - { - device_t *current_device = theStack->head; - while (current_device != NULL && current_device->is_mounted == true) - { - printf("Device \"%s\" is already mounted, skipping...\n", current_device->device_id); - current_device = current_device->next; - } - - if (current_device != NULL) - { - printf("Sending mount device for device \"%s\"...\n", current_device->device_id); - rc = send_mount_device(current_device, controller_details); - if (rc != SR_ERR_OK) - { - return SR_ERR_OPERATION_FAILED; - } - } - } - - return SR_ERR_OK; -} - -int unmount_device(device_stack_t *theStack, controller_t controller_list) -{ - int rc; - - if (theStack && theStack->head) - { - device_t *current_device = theStack->head; - while (current_device != NULL && current_device->is_mounted == false) - { - printf("Device \"%s\" is already unmounted, skipping...\n", current_device->device_id); - current_device = current_device->next; - } - - if (current_device != NULL) - { - printf("Sending unmount device for device \"%s\"...\n", current_device->device_id); - rc = send_unmount_device(current_device, controller_list); - if (rc != SR_ERR_OK) - { - return SR_ERR_OPERATION_FAILED; - } - } - } - - return SR_ERR_OK; -} - -int get_docker_containers_operational_state_curl(device_stack_t *theStack) -{ - - //TODO implement function for k8s deployment - if (strcmp(getenv("K8S_DEPLOYMENT"), "true") == 0) - { - return SR_ERR_OK; - } - - int rc = SR_ERR_OK; - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[100]; - sprintf(url, "http:/v%s/containers/json?all=true&filters={\"label\":[\"NTS_Manager=%s\"]}", - getenv("DOCKER_ENGINE_VERSION"), getenv("HOSTNAME")); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - const cJSON *container = NULL; - - printf("%lu bytes retrieved\n", (unsigned long)curl_response_mem.size); - - if (json_response == NULL || !cJSON_IsArray(json_response)) - { - printf("Could not parse JSON response for url=\"%s\"\n", url); - return SR_ERR_OPERATION_FAILED; - } - - cJSON_ArrayForEach(container, json_response) - { - cJSON *container_id_long = cJSON_GetObjectItemCaseSensitive(container, "Id"); - cJSON *state = cJSON_GetObjectItemCaseSensitive(container, "State"); - - if (cJSON_IsString(container_id_long) && (container_id_long->valuestring != NULL)) - { - char container_id_short[13]; - - memset(container_id_short, '\0', sizeof(container_id_short)); - strncpy(container_id_short, container_id_long->valuestring, 12); - - if (cJSON_IsString(state) && (state->valuestring != NULL)) - { - rc = set_operational_state_of_device(theStack, container_id_short, state->valuestring); - if (rc != SR_ERR_OK) - { - printf("Could not set the operational state for the device with uuid=\"%s\"\n", container_id_short); - return SR_ERR_OPERATION_FAILED; - } - } - } - } - - cJSON_Delete(json_response); - } - - return SR_ERR_OK; -} - -char* get_docker_container_resource_stats(device_stack_t *theStack) -{ - //TOD need to implement this for k8s deployment - if (strcmp(getenv("K8S_DEPLOYMENT"), "true")) - { - return strdup("CPU=0%;RAM=0MiB"); - } - - char line[LINE_BUFSIZE]; - int linenr; - FILE *pipe; - - /* Get a pipe where the output from the scripts comes in */ - char script[200]; - sprintf(script, "/opt/dev/docker_stats.sh %s", getenv("HOSTNAME")); - - pipe = popen(script, "r"); - if (pipe == NULL) { /* check for errors */ - printf("Could not open script.\n"); - return NULL; /* return with exit code indicating error */ - } - - /* Read script output from the pipe line by line */ - linenr = 1; - while (fgets(line, LINE_BUFSIZE, pipe) != NULL) { - printf("Script output line %d: %s", linenr, line); - ++linenr; - - pclose(pipe); /* Close the pipe */ - return strdup(line); - } - - /* Once here, out of the loop, the script has ended. */ - pclose(pipe); /* Close the pipe */ - return NULL; /* return with exit code indicating success. */ -} - -int notification_delay_period_changed(sr_val_t *val, size_t count) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *notifConfig = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config"); - if (!cJSON_IsObject(notifConfig)) - { - printf("Configuration JSON is not as expected: notification-config is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *faultNotifDelay = cJSON_GetObjectItemCaseSensitive(notifConfig, "fault-notification-delay-period"); - if (!cJSON_IsArray(faultNotifDelay)) - { - printf("Configuration JSON is not as expected: fault-notification-delay-period is not an array."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON_DeleteItemFromObject(notifConfig, "fault-notification-delay-period"); - - faultNotifDelay = NULL; - - faultNotifDelay = cJSON_CreateArray(); - if (faultNotifDelay == NULL) - { - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - cJSON_AddItemToObject(notifConfig, "fault-notification-delay-period", faultNotifDelay); - - if (val != NULL && count > 0) - { - cJSON *arrayEntry = NULL; - for (size_t i=0; i" - "" - "device-key" - "MIIEpAIBAAKCAQEAueCQaNQWoNmFK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68" - "SfFNaY06zZl8QB9W02nr5kWeeMY0VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt" - "6jAWZDzVfopwpJPAzRPxACDftIqFGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4" - "VDUHSNVbglc+u4UbEzNIFXMdEFsJZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuH" - "QwAHdubuB07ObM2z01UhyEdDvEYGHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UE" - "FI1yTYw+xZ42HgFx3uGwApCImxhbj69GBYWFqwIDAQABAoIBAQCZN9kR8DGu6V7y" - "t0Ax68asL8O5B/OKaHWKQ9LqpVrXmikZJOxkbzoGldow/CIFoU+q+Zbwu9aDa65a" - "0wiP7Hoa4Py3q5XNNUrOQDyU/OYC7cI0I83WS0lJ2zOJGYj8wKae5Z81IeQFKGHK" - "4lsy1OGPAvPRGh7RjUUgRavA2MCwe07rWRuDb/OJFe4Oh56UMEjwMiNBtMNtncog" - "j1vr/qgRJdf9tf0zlJmLvUJ9+HSFFV9I/97LJyFhb95gAfHkjdVroLVgT3Cho+4P" - "WtZaKCIGD0OwfOG2nLV4leXvRUk62/LMlB8NI9+JF7Xm+HCKbaWHNWC7mvWSLV58" - "Zl4AbUWRAoGBANyJ6SFHFRHSPDY026SsdMzXR0eUxBAK7G70oSBKKhY+O1j0ocLE" - "jI2krHJBhHbLlnvJVyMUaCUOTS5m0uDw9hgSsAqeSL3hL38kxVZw+KNG9Ouno1Fl" - "KnE/xXHlPQyeGs/P8nAMzHZxQtEsQdQayJEhK2XXHTsy7Q3MxDisfVJ1AoGBANfD" - "34gB+OMx6pwj7zk3qWbYXSX8xjCZMR0ciko+h4xeMP2N8B0oyoqC+v1ABMAtJ3wG" - "sGZd0hV9gwM7OUM3SEwkn6oeg1GemWLcn4rlSmTnZc4aeVwrEWlnSNFX3s4g9l4u" - "k8Ugu4MVJYqH8HuDQ5Ggl6/QAwPzMSEdCW0O+jOfAoGAIBRbegC5+t6m7Yegz4Ja" - "dxV1g98K6f58x+MDsQu4tYWV4mmrQgaPH2dtwizvlMwmdpkh+LNWNtWuumowkJHc" - "akIFo3XExQIFg6wYnGtQb4e5xrGa2xMpKlIJaXjb+YLiCYqJDG2ALFZrTrvuU2kV" - "9a5qfqTc1qigvNolTM0iaaUCgYApmrZWhnLUdEKV2wP813PNxfioI4afxlpHD8LG" - "sCn48gymR6E+Lihn7vuwq5B+8fYEH1ISWxLwW+RQUjIneNhy/jjfV8TgjyFqg7or" - "0Sy4KjpiNI6kLBXOakELRNNMkeSPopGR2E7v5rr3bGD9oAD+aqX1G7oJH/KgPPYd" - "Vl7+ZwKBgQDcHyWYrimjyUgKaQD2GmoO9wdcJYQ59ke9K+OuGlp4ti5arsi7N1tP" - "B4f09aeELM2ASIuk8Q/Mx0jQFnm8lzRFXdewgvdPoZW/7VufM9O7dGPOc41cm2Dh" - "yrTcXx/VmUBb+/fnXVEgCv7gylp/wtdTGHQBQJHR81jFBz0lnLj+gg==" - "" - "" - ""); - - printf("Post data:\n%s\n", post_data_xml); - - curl_easy_setopt(curl_odl, CURLOPT_POSTFIELDS, post_data_xml); - curl_easy_setopt(curl_odl, CURLOPT_CUSTOMREQUEST, "POST"); - curl_easy_setopt(curl_odl, CURLOPT_USERPWD, credentials); - - res = curl_easy_perform(curl_odl); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_odl, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static int add_private_key_odl(char *url, char *credentials) -{ - CURLcode res; - - curl_easy_reset(curl_odl); - set_curl_common_info_odl(); - - char url_for_curl[200]; - sprintf(url_for_curl, "%s", url); - - curl_easy_setopt(curl_odl, CURLOPT_URL, url_for_curl); - - char post_data_xml[4000]; - - sprintf(post_data_xml, - "" - "" - "device-key" - "MIIEpAIBAAKCAQEAueCQaNQWoNmFK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68SfFNaY06zZl8QB9W02nr5kWeeMY0VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt6jAWZDzVfopwpJPAzRPxACDftIqFGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4VDUHSNVbglc+u4UbEzNIFXMdEFsJZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuHQwAHdubuB07ObM2z01UhyEdDvEYGHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UEFI1yTYw+xZ42HgFx3uGwApCImxhbj69GBYWFqwIDAQABAoIBAQCZN9kR8DGu6V7yt0Ax68asL8O5B/OKaHWKQ9LqpVrXmikZJOxkbzoGldow/CIFoU+q+Zbwu9aDa65a0wiP7Hoa4Py3q5XNNUrOQDyU/OYC7cI0I83WS0lJ2zOJGYj8wKae5Z81IeQFKGHK4lsy1OGPAvPRGh7RjUUgRavA2MCwe07rWRuDb/OJFe4Oh56UMEjwMiNBtMNtncogj1vr/qgRJdf9tf0zlJmLvUJ9+HSFFV9I/97LJyFhb95gAfHkjdVroLVgT3Cho+4PWtZaKCIGD0OwfOG2nLV4leXvRUk62/LMlB8NI9+JF7Xm+HCKbaWHNWC7mvWSLV58Zl4AbUWRAoGBANyJ6SFHFRHSPDY026SsdMzXR0eUxBAK7G70oSBKKhY+O1j0ocLEjI2krHJBhHbLlnvJVyMUaCUOTS5m0uDw9hgSsAqeSL3hL38kxVZw+KNG9Ouno1FlKnE/xXHlPQyeGs/P8nAMzHZxQtEsQdQayJEhK2XXHTsy7Q3MxDisfVJ1AoGBANfD34gB+OMx6pwj7zk3qWbYXSX8xjCZMR0ciko+h4xeMP2N8B0oyoqC+v1ABMAtJ3wGsGZd0hV9gwM7OUM3SEwkn6oeg1GemWLcn4rlSmTnZc4aeVwrEWlnSNFX3s4g9l4uk8Ugu4MVJYqH8HuDQ5Ggl6/QAwPzMSEdCW0O+jOfAoGAIBRbegC5+t6m7Yegz4JadxV1g98K6f58x+MDsQu4tYWV4mmrQgaPH2dtwizvlMwmdpkh+LNWNtWuumowkJHcakIFo3XExQIFg6wYnGtQb4e5xrGa2xMpKlIJaXjb+YLiCYqJDG2ALFZrTrvuU2kV9a5qfqTc1qigvNolTM0iaaUCgYApmrZWhnLUdEKV2wP813PNxfioI4afxlpHD8LGsCn48gymR6E+Lihn7vuwq5B+8fYEH1ISWxLwW+RQUjIneNhy/jjfV8TgjyFqg7or0Sy4KjpiNI6kLBXOakELRNNMkeSPopGR2E7v5rr3bGD9oAD+aqX1G7oJH/KgPPYdVl7+ZwKBgQDcHyWYrimjyUgKaQD2GmoO9wdcJYQ59ke9K+OuGlp4ti5arsi7N1tPB4f09aeELM2ASIuk8Q/Mx0jQFnm8lzRFXdewgvdPoZW/7VufM9O7dGPOc41cm2DhyrTcXx/VmUBb+/fnXVEgCv7gylp/wtdTGHQBQJHR81jFBz0lnLj+gg==" - "MIIECTCCAvGgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgMDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEMMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkBFhNleGFtcGxlY2FAbG9jYWxob3N0MB4XDTE1MDczMDA3MjcxOFoXDTM1MDcyNTA3MjcxOFowgYUxCzAJBgNVBAYTAkNaMRYwFAYDVQQIDA1Tb3V0aCBNb3JhdmlhMQ8wDQYDVQQKDAZDRVNORVQxDDAKBgNVBAsMA1RNQzEXMBUGA1UEAwwOZXhhbXBsZSBjbGllbnQxJjAkBgkqhkiG9w0BCQEWF2V4YW1wbGVjbGllbnRAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueCQaNQWoNmFK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68SfFNaY06zZl8QB9W02nr5kWeeMY0VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt6jAWZDzVfopwpJPAzRPxACDftIqFGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4VDUHSNVbglc+u4UbEzNIFXMdEFsJZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuHQwAHdubuB07ObM2z01UhyEdDvEYGHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UEFI1yTYw+xZ42HgFx3uGwApCImxhbj69GBYWFqwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUXGpLeLnh2cSDARAVA7KrBxGYpo8wHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gwDQYJKoZIhvcNAQELBQADggEBAJPV3RTXFRtNyOU4rjPpYeBAIAFp2aqGc4t2J1c7oPp/1n+lZvjnwtlJpZHxMM783e2ryDQ6dkvXDf8kpwKlg3U3mkJ3xKkDdWrM4QwghXdCN519aa9qmu0zdFL+jUAaWlQ5tsceOrvbusCcbMqiFGk/QfpHqPv52SVWbYyUx7IX7DE+UjgsLHycfV/tlcx4ZE6soTzl9VdgSL/zmzG3rjsr58J80rXckLgBhvijgBlIAJvWfC7D0vaouvBInSFXymdPVoUDZ30cdGLf+hI/i/TfsEMOinLrXVdkSGNo6FXAHKSvXeB9oFKSzhQ7OPyRyqvEPycUSw/qD6FVr80oDDc=" - "" - ""); - - printf("Post data:\n%s\n", post_data_xml); - - curl_easy_setopt(curl_odl, CURLOPT_POSTFIELDS, post_data_xml); - curl_easy_setopt(curl_odl, CURLOPT_CUSTOMREQUEST, "POST"); - curl_easy_setopt(curl_odl, CURLOPT_USERPWD, credentials); - - res = curl_easy_perform(curl_odl); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_odl, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static int add_trusted_ca_odl(char *url, char *credentials) -{ - CURLcode res; - - curl_easy_reset(curl_odl); - set_curl_common_info_odl(); - - char url_for_curl[200]; - sprintf(url_for_curl, "%s", url); - - curl_easy_setopt(curl_odl, CURLOPT_URL, url_for_curl); - - char post_data_xml[2000]; - - sprintf(post_data_xml, - "" - "" - "test_trusted_cert" - "MIID7TCCAtWgAwIBAgIJAMtE1NGAR5KoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJDWjEWMBQGA1UECAwNU291dGggTW9yYXZpYTENMAsGA1UEBwwEQnJubzEPMA0GA1UECgwGQ0VTTkVUMQwwCgYDVQQLDANUTUMxEzARBgNVBAMMCmV4YW1wbGUgQ0ExIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVjYUBsb2NhbGhvc3QwHhcNMTQwNzI0MTQxOTAyWhcNMjQwNzIxMTQxOTAyWjCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgMDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEMMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkBFhNleGFtcGxlY2FAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+mGaxPEOTSL3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfxKTgxZC12uOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBwUHolcLCUbmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG9sb1wq3QaDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUxXgJoXkyWcm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABo1AwTjAdBgNVHQ4EFgQUc1YQIqjZsHVwlea0AB4N+ilNI2gwHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAI/1KH60qnw9Xs2RGfi0/IKf5EynXt4bQX8EIyVKwSkYKe04zZxYfLIl/Q2HOPYoFmm3daj5ddr0ZS1i4p4fTUhstjsYWvXs3W/HhVmFUslakkn3PrswhP77fCk6eEJLxdfyJ1C7Uudq2m1isZbKih+XF0mG1LxJaDMocSz4eAya7M5brwjy8DoOmA1TnLQFCVcpn+sCr7VC4wE/JqxyVhBCk/MuGqqM3B1j90bGFZ112ZOecyE0EDSr6IbiRBtmeNbEwOFjKXhNLYdxpBZ9D8A/368OckZkCrVLGuJNxK9UwCVTe8IhotHUqU9EqFDmxdV8oIdU/OzUwwNPA/Bd/9g==" - "" - ""); - - printf("Post data:\n%s\n", post_data_xml); - - curl_easy_setopt(curl_odl, CURLOPT_POSTFIELDS, post_data_xml); - curl_easy_setopt(curl_odl, CURLOPT_CUSTOMREQUEST, "POST"); - curl_easy_setopt(curl_odl, CURLOPT_USERPWD, credentials); - - res = curl_easy_perform(curl_odl); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_odl, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -int add_key_pair_to_odl(controller_t *controller_list, int controller_list_size) -{ - int rc = SR_ERR_OK; - - rc = add_keystore_entry_odl(controller_list[0].url_for_keystore_add, controller_list[0].credentials); - if (rc != SR_ERR_OK) - { - printf("Failed to add keystore entry to ODL.\n"); - } - - rc = add_private_key_odl(controller_list[0].url_for_private_key_add, controller_list[0].credentials); - if (rc != SR_ERR_OK) - { - printf("Failed to add private key entry to ODL.\n"); - } - - rc = add_trusted_ca_odl(controller_list[0].url_for_trusted_ca_add, controller_list[0].credentials); - if (rc != SR_ERR_OK) - { - printf("Failed to add trusted CA entry to ODL.\n"); - } - - return SR_ERR_OK; -} - -int ves_ip_changed(char *new_ip) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details"); - if (!cJSON_IsObject(vesDetails)) - { - printf("Configuration JSON is not as expected: ves-endpoint-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *vesIp = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-ip"); - if (!cJSON_IsString(vesIp)) - { - printf("Configuration JSON is not as expected: ves-endpoint-ip is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(vesDetails, "ves-endpoint-ip", cJSON_CreateString(new_ip)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int ves_port_changed(int new_port) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details"); - if (!cJSON_IsObject(vesDetails)) - { - printf("Configuration JSON is not as expected: ves-endpoint-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *vesPort = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-port"); - if (!cJSON_IsNumber(vesPort)) - { - printf("Configuration JSON is not as expected: ves-endpoint-port is not a number."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_SetNumberValue(vesPort, new_port); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int ves_username_changed(char *new_username) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details"); - if (!cJSON_IsObject(vesDetails)) - { - printf("Configuration JSON is not as expected: ves-endpoint-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *vesUsername = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-username"); - if (!cJSON_IsString(vesUsername)) - { - printf("Configuration JSON is not as expected: ves-endpoint-username is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(vesDetails, "ves-endpoint-username", cJSON_CreateString(new_username)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int ves_password_changed(char *new_password) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details"); - if (!cJSON_IsObject(vesDetails)) - { - printf("Configuration JSON is not as expected: ves-endpoint-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *vesPassword = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-password"); - if (!cJSON_IsString(vesPassword)) - { - printf("Configuration JSON is not as expected: ves-endpoint-password is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(vesDetails, "ves-endpoint-password", cJSON_CreateString(new_password)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int ves_auth_method_changed(char *new_auth_method) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details"); - if (!cJSON_IsObject(vesDetails)) - { - printf("Configuration JSON is not as expected: ves-endpoint-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *vesAuthMethod = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-auth-method"); - if (!cJSON_IsString(vesAuthMethod)) - { - printf("Configuration JSON is not as expected: ves-endpoint-auth-method is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(vesDetails, "ves-endpoint-auth-method", cJSON_CreateString(new_auth_method)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int ves_registration_changed(cJSON_bool new_bool) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details"); - if (!cJSON_IsObject(vesDetails)) - { - printf("Configuration JSON is not as expected: ves-endpoint-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *vesRegistration = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-registration"); - if (!cJSON_IsBool(vesRegistration)) - { - printf("Configuration JSON is not as expected: ves-registration is not a bool."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the ves-registration object - cJSON_ReplaceItemInObject(vesDetails, "ves-registration", cJSON_CreateBool(new_bool)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int is_netconf_available_changed(cJSON_bool new_bool) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *notifConfig = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config"); - if (!cJSON_IsObject(notifConfig)) - { - printf("Configuration JSON is not as expected: notification-config is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *isNetconfAvailable = cJSON_GetObjectItemCaseSensitive(notifConfig, "is-netconf-available"); - if (!cJSON_IsBool(isNetconfAvailable)) - { - printf("Configuration JSON is not as expected: is-netconf-available is not a bool."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the ves-registration object - cJSON_ReplaceItemInObject(notifConfig, "is-netconf-available", cJSON_CreateBool(new_bool)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int is_ves_available_changed(cJSON_bool new_bool) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *notifConfig = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config"); - if (!cJSON_IsObject(notifConfig)) - { - printf("Configuration JSON is not as expected: notification-config is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *isVesAvailable = cJSON_GetObjectItemCaseSensitive(notifConfig, "is-ves-available"); - if (!cJSON_IsBool(isVesAvailable)) - { - printf("Configuration JSON is not as expected: is-ves-available is not a bool."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the ves-registration object - cJSON_ReplaceItemInObject(notifConfig, "is-ves-available", cJSON_CreateBool(new_bool)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - - int ssh_connections_changed(int number) - { - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *sshConnections = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ssh-connections"); - if (!cJSON_IsNumber(sshConnections)) - { - printf("Configuration JSON is not as expected: ssh-connections is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the ssh-connections object - cJSON_SetNumberValue(sshConnections, number); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int tls_connections_changed(int number) - { - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *tlsConnections = cJSON_GetObjectItemCaseSensitive(jsonConfig, "tls-connections"); - if (!cJSON_IsNumber(tlsConnections)) - { - printf("Configuration JSON is not as expected: tls-connections is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the tls-connections object - cJSON_SetNumberValue(tlsConnections, number); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -/* -curl -X POST -H 'Content-Type: application/json' -i http://localhost:5000/extend-ports --data '{"number-of-ports":12}' -*/ -int send_k8s_extend_port(void) -{ - int num_of_ports = getSshConnectionsFromConfigJson() + getTlsConnectionsFromConfigJson(); - - CURLcode res; - - curl_easy_reset(curl_k8s); - set_curl_common_info_k8s(); - - char url_for_curl[100]; - sprintf(url_for_curl, "http://localhost:5000/extend-ports"); - - curl_easy_setopt(curl_k8s, CURLOPT_URL, url_for_curl); - - char post_data_json[1500]; - - sprintf(post_data_json, - "{\"number-of-ports\":%d}", - num_of_ports); - - printf("Post data:\n%s\n", post_data_json); - - curl_easy_setopt(curl_k8s, CURLOPT_POSTFIELDS, post_data_json); - curl_easy_setopt(curl_k8s, CURLOPT_CUSTOMREQUEST, "POST"); - - res = curl_easy_perform(curl_k8s); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_k8s, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -/* -curl -X POST -H 'Content-Type: application/json' -i http://localhost:5000/scale --data '{"simulatedDevices":2}' -*/ -int send_k8s_scale(int number_of_devices) -{ - CURLcode res; - - curl_easy_reset(curl_k8s); - set_curl_common_info_k8s(); - - char url_for_curl[100]; - sprintf(url_for_curl, "http://localhost:5000/scale"); - - curl_easy_setopt(curl_k8s, CURLOPT_URL, url_for_curl); - - char post_data_json[1500]; - - sprintf(post_data_json, - "{\"simulatedDevices\":%d}", - number_of_devices); - - printf("Post data:\n%s\n", post_data_json); - - curl_easy_setopt(curl_k8s, CURLOPT_POSTFIELDS, post_data_json); - curl_easy_setopt(curl_k8s, CURLOPT_CUSTOMREQUEST, "POST"); - - res = curl_easy_perform(curl_k8s); - if (res != CURLE_OK) - { - printf("cURL failed to url=%s\n", url_for_curl); - } - - long http_response_code = 0; - curl_easy_getinfo (curl_k8s, CURLINFO_RESPONSE_CODE, &http_response_code); - if (http_response_code >= 200 && http_response_code <= 226 && http_response_code != CURLE_ABORTED_BY_CALLBACK) - { - printf("cURL succeeded to url=%s\n", url_for_curl); - } - else - { - printf("cURL to url=%s failed with code=%ld\n", url_for_curl, http_response_code); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -int controller_ip_changed(char *new_ip) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *controllerDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "controller-details"); - if (!cJSON_IsObject(controllerDetails)) - { - printf("Configuration JSON is not as expected: controller-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *controllerIp = cJSON_GetObjectItemCaseSensitive(controllerDetails, "controller-ip"); - if (!cJSON_IsString(controllerIp)) - { - printf("Configuration JSON is not as expected: controller-ip is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(controllerDetails, "controller-ip", cJSON_CreateString(new_ip)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int controller_port_changed(int new_port) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *controllerDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "controller-details"); - if (!cJSON_IsObject(controllerDetails)) - { - printf("Configuration JSON is not as expected: controller-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *controllerPort = cJSON_GetObjectItemCaseSensitive(controllerDetails, "controller-port"); - if (!cJSON_IsNumber(controllerPort)) - { - printf("Configuration JSON is not as expected: controller-port is not a number."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_SetNumberValue(controllerPort, new_port); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int controller_netconf_call_home_port_changed(int new_port) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *controllerDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "controller-details"); - if (!cJSON_IsObject(controllerDetails)) - { - printf("Configuration JSON is not as expected: controller-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *netconfCallHomePort = cJSON_GetObjectItemCaseSensitive(controllerDetails, "netconf-call-home-port"); - if (!cJSON_IsNumber(netconfCallHomePort)) - { - printf("Configuration JSON is not as expected: netconf-call-home-port is not a number."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_SetNumberValue(netconfCallHomePort, new_port); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int controller_username_changed(char *new_username) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *controllerDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "controller-details"); - if (!cJSON_IsObject(controllerDetails)) - { - printf("Configuration JSON is not as expected: controller-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *controllerUsername = cJSON_GetObjectItemCaseSensitive(controllerDetails, "controller-username"); - if (!cJSON_IsString(controllerUsername)) - { - printf("Configuration JSON is not as expected: controller-username is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(controllerDetails, "controller-username", cJSON_CreateString(new_username)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int controller_password_changed(char *new_password) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *controllerDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "controller-details"); - if (!cJSON_IsObject(controllerDetails)) - { - printf("Configuration JSON is not as expected: controller-details is not an object"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *controllerPassword = cJSON_GetObjectItemCaseSensitive(controllerDetails, "controller-password"); - if (!cJSON_IsString(controllerPassword)) - { - printf("Configuration JSON is not as expected: controller-password is not a string"); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the fault-notification-delay-period object - cJSON_ReplaceItemInObject(controllerDetails, "controller-password", cJSON_CreateString(new_password)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -int netconf_call_home_changed(cJSON_bool new_bool) -{ - char *stringConfiguration = readConfigFileInString(); - - if (stringConfiguration == NULL) - { - printf("Could not read configuration file!\n"); - return SR_ERR_OPERATION_FAILED; - } - - cJSON *jsonConfig = cJSON_Parse(stringConfiguration); - if (jsonConfig == NULL) - { - free(stringConfiguration); - const char *error_ptr = cJSON_GetErrorPtr(); - if (error_ptr != NULL) - { - fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr); - } - return SR_ERR_OPERATION_FAILED; - } - //we don't need the string anymore - free(stringConfiguration); - stringConfiguration = NULL; - - cJSON *netconfCallHome = cJSON_GetObjectItemCaseSensitive(jsonConfig, "netconf-call-home"); - if (!cJSON_IsBool(netconfCallHome)) - { - printf("Configuration JSON is not as expected: netconf-call-home is not a bool."); - cJSON_Delete(jsonConfig); - return SR_ERR_OPERATION_FAILED; - } - - //we set the value of the ves-registration object - cJSON_ReplaceItemInObject(jsonConfig, "netconf-call-home", cJSON_CreateBool(new_bool)); - - //writing the new JSON to the configuration file - stringConfiguration = cJSON_Print(jsonConfig); - writeConfigFile(stringConfiguration); - - if (stringConfiguration != NULL) - { - free(stringConfiguration); - stringConfiguration = NULL; - } - - cJSON_Delete(jsonConfig); - - return SR_ERR_OK; -} - -static int start_device_notification(char *exec_id) -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[500]; - sprintf(url, "http:/v%s/exec/%s/start", getenv("DOCKER_ENGINE_VERSION"), exec_id); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - cJSON *postDataJson = cJSON_CreateObject(); - - if (cJSON_AddFalseToObject(postDataJson, "Detach") == NULL) - { - printf("Could not create JSON object: Detach\n"); - return SR_ERR_OPERATION_FAILED; - } - - if (cJSON_AddFalseToObject(postDataJson, "Tty") == NULL) - { - printf("Could not create JSON object: Tty\n"); - return SR_ERR_OPERATION_FAILED; - } - - char *post_data_string = NULL; - - post_data_string = cJSON_PrintUnformatted(postDataJson); - - printf("Post data JSON:\n%s\n", post_data_string); - - if (postDataJson != NULL) - { - cJSON_Delete(postDataJson); - } - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data_string); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (post_data_string != NULL) - { - free(post_data_string); - } - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - const cJSON *message = NULL; - - printf("%lu bytes retrieved\n", (unsigned long)curl_response_mem.size); - - message = cJSON_GetObjectItemCaseSensitive(json_response, "message"); - - if (cJSON_IsString(message) && (message->valuestring != NULL)) - { - printf("Message: \"%s\"\n", message->valuestring); - } - - cJSON_Delete(json_response); - } - - return SR_ERR_OK; -} - -static int inspect_device_notification_execution(char *exec_id) -{ - int rc = SR_ERR_OK; - - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[500]; - sprintf(url, "http:/v%s/exec/%s/json", getenv("DOCKER_ENGINE_VERSION"), exec_id); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - rc = SR_ERR_OPERATION_FAILED; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - const cJSON *exit_code = NULL; - - exit_code = cJSON_GetObjectItemCaseSensitive(json_response, "ExitCode"); - - if (cJSON_IsNumber(exit_code)) - { - rc = exit_code->valueint; - } - else - { - printf("Exit code is not a number!\n"); - rc = SR_ERR_OPERATION_FAILED; - } - - cJSON_Delete(json_response); - } - - return rc; -} - -int invoke_device_notification(char *device_id, char *module_name, char *notification_string) -{ - int rc = SR_ERR_OK; - - printf("Device-name = %s\nModule-name = %s\nNotification-object = %s\n", device_id, module_name, notification_string); - - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[300]; - sprintf(url, "http:/v%s/containers/%s/exec", getenv("DOCKER_ENGINE_VERSION"), device_id); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - cJSON *postDataJson = cJSON_CreateObject(); - - if (cJSON_AddFalseToObject(postDataJson, "AtttachStdin") == NULL) - { - printf("Could not create JSON object: AtttachStdin\n"); - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - - if (cJSON_AddTrueToObject(postDataJson, "AtttachStdout") == NULL) - { - printf("Could not create JSON object: AtttachStdout\n"); - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - - if (cJSON_AddTrueToObject(postDataJson, "AtttachStderr") == NULL) - { - printf("Could not create JSON object: AtttachStderr\n"); - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - - if (cJSON_AddTrueToObject(postDataJson, "Privileged") == NULL) - { - printf("Could not create JSON object: Privileged\n"); - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - - if (cJSON_AddStringToObject(postDataJson, "User", "root") == NULL) - { - printf("Could not create JSON object: User\n"); - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - - cJSON *cmd_array = cJSON_CreateArray(); - if (cmd_array == NULL) - { - printf("Could not create JSON object: Cmd array\n"); - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - - cJSON_AddItemToObject(postDataJson, "Cmd", cmd_array); - - cJSON *cmd_string_1 = cJSON_CreateString("sh"); - cJSON_AddItemToArray(cmd_array, cmd_string_1); - - cJSON *cmd_string_2 = cJSON_CreateString("-c"); - cJSON_AddItemToArray(cmd_array, cmd_string_2); - - //some notifications require a really long notification object - char string_command[1000000]; - sprintf(string_command, "/usr/local/bin/generic-notifications %s '%s'", module_name, notification_string); - - cJSON *cmd_string_3 = cJSON_CreateString(string_command); - cJSON_AddItemToArray(cmd_array, cmd_string_3); - - char *post_data_string = NULL; - - post_data_string = cJSON_PrintUnformatted(postDataJson); - - printf("Post data JSON:\n%s\n", post_data_string); - - if (postDataJson != NULL) - { - cJSON_Delete(postDataJson); - } - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data_string); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - res = curl_easy_perform(curl); - - if (post_data_string != NULL) - { - free(post_data_string); - } - - if (res != CURLE_OK) - { - rc = SR_ERR_OPERATION_FAILED; - goto cleanup; - } - else - { - cJSON *json_response = cJSON_Parse(curl_response_mem.memory); - const cJSON *exec_id = NULL; - - exec_id = cJSON_GetObjectItemCaseSensitive(json_response, "Id"); - - if (cJSON_IsString(exec_id) && (exec_id->valuestring != NULL)) - { - printf("Exec id: \"%s\"\n", exec_id->valuestring); - - rc = start_device_notification(exec_id->valuestring); - if (rc != SR_ERR_OK) - { - printf("Could not start the execution of the notification...\n"); - } - - sleep(1); - - rc = inspect_device_notification_execution(exec_id->valuestring); - } - - cJSON_Delete(json_response); - } - -cleanup: - if (device_id != NULL) - { - free(device_id); - } - if (module_name != NULL) - { - free(module_name); - } - if (notification_string != NULL) - { - free(notification_string); - } - - return rc; -} - -int pull_docker_image_of_simulated_device() -{ - struct MemoryStruct curl_response_mem; - - curl_response_mem.memory = malloc(1); /* will be grown as needed by the realloc above */ - curl_response_mem.size = 0; /* no data at this point */ - - CURLcode res; - - curl_easy_reset(curl); - set_curl_common_info(); - - char url[300]; - sprintf(url, "http:/v%s/images/create?fromImage=%s", getenv("DOCKER_ENGINE_VERSION"), getenv("MODELS_IMAGE")); - - curl_easy_setopt(curl, CURLOPT_URL, url); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ""); - - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&curl_response_mem); - - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 300L); - - res = curl_easy_perform(curl); - - if (res != CURLE_OK) - { - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} \ No newline at end of file