X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=sim%2Fo1-interface.git;a=blobdiff_plain;f=ntsimulator%2Fntsim-ng%2Fcore%2Fdocker.c;h=7e8588d5f3d715df539fba04f97e06e669008bec;hp=40f2bff1af68dcdfdcb7d53829e5d0690a9ab3a4;hb=96526af57d1c3026430e11cfe899e50629a91296;hpb=db05cb943f111d47e9a715f602a1942b925ba675 diff --git a/ntsimulator/ntsim-ng/core/docker.c b/ntsimulator/ntsim-ng/core/docker.c index 40f2bff..7e8588d 100644 --- a/ntsimulator/ntsim-ng/core/docker.c +++ b/ntsimulator/ntsim-ng/core/docker.c @@ -260,8 +260,8 @@ static void list_yangs(const char *path, struct installable_module **modules, in int docker_device_init(void) { char *response = 0; - char *url = 0; - asprintf(&url, "http://v%s/containers/%s/json", framework_environment.docker_engine_version, framework_environment.hostname); + char url[512]; + sprintf(url, "http://v%s/containers/%s/json", framework_environment.docker_engine_version, framework_environment.hostname); int rc = http_socket_request(url, DOCKER_SOCK_FNAME, "GET", 0, 0, &response); if(rc != NTS_ERR_OK) { @@ -280,12 +280,14 @@ int docker_device_init(void) { cJSON *hostConfig = cJSON_GetObjectItemCaseSensitive(json_response, "HostConfig"); if(hostConfig == 0) { log_error("could not get HostConfig object"); + cJSON_Delete(json_response); return NTS_ERR_FAILED; } cJSON *networkMode = cJSON_GetObjectItemCaseSensitive(hostConfig, "NetworkMode"); if(networkMode == 0) { log_error("could not get NetworkMode object"); + cJSON_Delete(json_response); return NTS_ERR_FAILED; } @@ -299,6 +301,7 @@ int docker_device_init(void) { docker_environment_var = (environment_var_t *)malloc(sizeof(environment_var_t) * docker_environment_var_count); if(docker_environment_var == 0) { log_error("malloc failed"); + cJSON_Delete(networkMode); return NTS_ERR_FAILED; } @@ -322,21 +325,21 @@ int docker_device_start(const manager_network_function_type *function_type, mana assert(instance); assert(docker_network_info); - char *image = 0; + char image[512]; if(function_type->docker_version_tag && (function_type->docker_version_tag[0] != 0)) { - if(function_type->docker_repository && (function_type->docker_repository[0] != 0)) { - asprintf(&image, "%s/%s:%s", function_type->docker_repository, function_type->docker_image_name, function_type->docker_version_tag); + if(function_type->docker_repository && (function_type->docker_repository[0] != 0) && (strcmp(function_type->docker_repository, "local") != 0)) { + sprintf(image, "%s/%s:%s", function_type->docker_repository, function_type->docker_image_name, function_type->docker_version_tag); } else { - asprintf(&image, "%s:%s", function_type->docker_image_name, function_type->docker_version_tag); + sprintf(image, "%s:%s", function_type->docker_image_name, function_type->docker_version_tag); } } else { - if(function_type->docker_repository && (function_type->docker_repository[0] != 0)) { - asprintf(&image, "%s/%s:latest", function_type->docker_repository, function_type->docker_image_name); + if(function_type->docker_repository && (function_type->docker_repository[0] != 0) && (strcmp(function_type->docker_repository, "local") != 0)) { + sprintf(image, "%s/%s:latest", function_type->docker_repository, function_type->docker_image_name); } else { - asprintf(&image, "%s:latest", function_type->docker_image_name); + sprintf(image, "%s:latest", function_type->docker_image_name); } } @@ -345,17 +348,18 @@ int docker_device_start(const manager_network_function_type *function_type, mana log_error("docker_container_create failed"); return NTS_ERR_FAILED; } - free(image); rc = docker_container_start(instance); if(rc != NTS_ERR_OK) { log_error("docker_container_start failed"); + docker_device_stop(instance); return NTS_ERR_FAILED; } rc = docker_container_inspect(instance); if(rc != NTS_ERR_OK) { log_error("docker_container_inspect failed"); + docker_device_stop(instance); return NTS_ERR_FAILED; } @@ -367,11 +371,10 @@ int docker_device_start(const manager_network_function_type *function_type, mana int docker_device_stop(manager_network_function_instance_t *instance) { assert(instance); - char *url = 0; - asprintf(&url, "http://v%s/containers/%s?force=true", framework_environment.docker_engine_version, instance->docker_id); + char url[512]; + sprintf(url, "http://v%s/containers/%s?force=true", framework_environment.docker_engine_version, instance->docker_id); int rc = http_socket_request(url, DOCKER_SOCK_FNAME, "DELETE", "", 0, 0); - free(url); if(rc != NTS_ERR_OK) { log_error("http_socket_request failed"); return NTS_ERR_FAILED; @@ -502,6 +505,7 @@ static char *docker_parse_json_message(const char *json_string) { message = cJSON_GetObjectItem(json_response, "message"); if(message == 0) { log_error("json parsing failed"); + cJSON_Delete(json_response); return 0; } @@ -522,27 +526,39 @@ static int docker_container_create(const char *image, manager_network_function_i if(cJSON_AddStringToObject(postDataJson, "Hostname", instance->name) == 0) { log_error("could not create JSON object: Hostname"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } cJSON *hostConfig = cJSON_CreateObject(); if(hostConfig == 0) { log_error("could not create JSON object: HostConfig"); + cJSON_Delete(postDataJson); + return NTS_ERR_FAILED; + } + if(cJSON_AddItemToObject(postDataJson, "HostConfig", hostConfig) == 0) { + log_error("cJSON_AddItemToObject failed"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } - cJSON_AddItemToObject(postDataJson, "HostConfig", hostConfig); cJSON *portBindings = cJSON_CreateObject(); if(portBindings == 0) { printf("could not create JSON object: PortBindings"); + cJSON_Delete(postDataJson); + return NTS_ERR_FAILED; + } + if(cJSON_AddItemToObject(hostConfig, "PortBindings", portBindings) == 0) { + log_error("cJSON_AddItemToObject failed"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } - cJSON_AddItemToObject(hostConfig, "PortBindings", portBindings); for(int i = 0; i < (framework_environment.ssh_connections + framework_environment.tls_connections + framework_environment.ftp_connections + framework_environment.sftp_connections); ++i) { cJSON *port = cJSON_CreateArray(); if(port == 0) { log_error("could not create JSON object: port"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } @@ -556,11 +572,16 @@ static int docker_container_create(const char *image, manager_network_function_i else if(i < (framework_environment.ssh_connections + framework_environment.tls_connections + framework_environment.ftp_connections + framework_environment.sftp_connections)) { sprintf(dockerContainerPort, "%d/tcp", STANDARD_SFTP_PORT); } - cJSON_AddItemToObject(portBindings, dockerContainerPort, port); + if(cJSON_AddItemToObject(portBindings, dockerContainerPort, port) == 0) { + log_error("cJSON_AddItemToObject failed"); + cJSON_Delete(postDataJson); + return NTS_ERR_FAILED; + } cJSON *hostPort = cJSON_CreateObject(); if(hostPort == 0) { log_error("could not create JSON object: HostPort"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } @@ -568,15 +589,21 @@ static int docker_container_create(const char *image, manager_network_function_i sprintf(dockerHostPort, "%d", instance->host_port + i); if(cJSON_AddStringToObject(hostPort, "HostPort", dockerHostPort) == 0) { log_error("could not create JSON object: HostPortString"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } if(cJSON_AddStringToObject(hostPort, "HostIp", "0.0.0.0") == 0) { //instance->host_ip log_error("could not create JSON object: HostIpString"); + cJSON_Delete(postDataJson); return NTS_ERR_FAILED; } - cJSON_AddItemToArray(port, hostPort); + if(cJSON_AddItemToArray(port, hostPort) == 0) { + log_error("cJSON_AddItemToArray failed"); + cJSON_Delete(postDataJson); + return NTS_ERR_FAILED; + } } @@ -584,24 +611,26 @@ static int docker_container_create(const char *image, manager_network_function_i asprintf(&docker_environment_var[4].value, "%d", instance->host_port); cJSON *env_variables_array = cJSON_CreateArray(); - if (env_variables_array == 0) { + if(env_variables_array == 0) { log_error("Could not create JSON object: Env array"); return NTS_ERR_FAILED; } cJSON_AddItemToObject(postDataJson, "Env", env_variables_array); for(int i = 0; i < docker_environment_var_count; i++) { - char *environment_var = 0; - asprintf(&environment_var, "%s=%s", docker_environment_var[i].name, docker_environment_var[i].value); + if(docker_environment_var[i].value) { + char *environment_var = 0; + asprintf(&environment_var, "%s=%s", docker_environment_var[i].name, docker_environment_var[i].value); + + cJSON *env_var_obj = cJSON_CreateString(environment_var); + if(env_var_obj == 0) { + log_error("could not create JSON object"); + return NTS_ERR_FAILED; + } + cJSON_AddItemToArray(env_variables_array, env_var_obj); - cJSON *env_var_obj = cJSON_CreateString(environment_var); - if(env_var_obj == 0) { - log_error("could not create JSON object"); - return NTS_ERR_FAILED; + free(environment_var); } - cJSON_AddItemToArray(env_variables_array, env_var_obj); - - free(environment_var); } free(docker_environment_var[4].value); @@ -615,17 +644,17 @@ static int docker_container_create(const char *image, manager_network_function_i post_data_string = cJSON_PrintUnformatted(postDataJson); cJSON_Delete(postDataJson); - char *url = 0; - asprintf(&url, "http:/v%s/containers/create?name=%s", framework_environment.docker_engine_version, instance->name); + char url[512]; + sprintf(url, "http:/v%s/containers/create?name=%s", framework_environment.docker_engine_version, instance->name); char *response = 0; int response_code = 0; int rc = http_socket_request(url, DOCKER_SOCK_FNAME, "POST", post_data_string, &response_code, &response); + free(post_data_string); if(rc != NTS_ERR_OK) { log_error("http_socket_request failed"); return NTS_ERR_FAILED; } - free(url); if(response_code != 201) { char *message = docker_parse_json_message(response); @@ -661,13 +690,12 @@ static int docker_container_create(const char *image, manager_network_function_i static int docker_container_start(manager_network_function_instance_t *instance) { assert(instance); - char *url = 0; - asprintf(&url, "http://v%s/containers/%s/start", framework_environment.docker_engine_version, instance->docker_id); + char url[512]; + sprintf(url, "http://v%s/containers/%s/start", framework_environment.docker_engine_version, instance->docker_id); char *response = 0; int response_code = 0; int rc = http_socket_request(url, DOCKER_SOCK_FNAME, "POST", "", &response_code, &response); - free(url); if(rc != NTS_ERR_OK) { log_error("http_socket_request failed"); return NTS_ERR_FAILED; @@ -694,12 +722,11 @@ static int docker_container_start(manager_network_function_instance_t *instance) static int docker_container_inspect(manager_network_function_instance_t *instance) { assert(instance); - char *url = 0; - asprintf(&url, "http://v%s/containers/%s/json", framework_environment.docker_engine_version, instance->docker_id); + char url[512]; + sprintf(url, "http://v%s/containers/%s/json", framework_environment.docker_engine_version, instance->docker_id); char *response = 0; int rc = http_socket_request(url, DOCKER_SOCK_FNAME, "GET", "", 0, &response); - free(url); if(rc != NTS_ERR_OK) { log_error("http_socket_request failed"); return NTS_ERR_FAILED; @@ -716,29 +743,26 @@ static int docker_container_inspect(manager_network_function_instance_t *instanc cJSON *main_node = cJSON_GetObjectItem(json_response, "NetworkSettings"); if(main_node == 0) { log_error("json parsing failed"); + cJSON_Delete(json_response); return NTS_ERR_FAILED; } cJSON *node = cJSON_GetObjectItem(main_node, "Networks"); if(node == 0) { log_error("json parsing failed"); + cJSON_Delete(json_response); return NTS_ERR_FAILED; } node = node->child; //get info from the first in array if(node == 0) { log_error("json parsing failed"); + cJSON_Delete(json_response); return NTS_ERR_FAILED; } - char *ipv6_env_var = getenv("IPv6_ENABLED"); - if(ipv6_env_var == 0) { - log_error("could not get the IPv6 Enabled env variable"); - return NTS_ERR_FAILED; - } - - cJSON *element = cJSON_GetObjectItem(node, "IPAddress"); - if(strcmp(ipv6_env_var, "true") == 0) { + cJSON *element; + if(framework_environment.ip_v6_enabled) { element = cJSON_GetObjectItem(node, "GlobalIPv6Address"); } else { @@ -747,8 +771,10 @@ static int docker_container_inspect(manager_network_function_instance_t *instanc if(element == 0) { log_error("json parsing failed"); + cJSON_Delete(json_response); return NTS_ERR_FAILED; } + instance->docker_ip = strdup(element->valuestring); cJSON_Delete(json_response);