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) {
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;
}
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;
}
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);
}
}
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;
}
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;
message = cJSON_GetObjectItem(json_response, "message");
if(message == 0) {
log_error("json parsing failed");
+ cJSON_Delete(json_response);
return 0;
}
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;
}
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;
}
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;
+ }
}
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);
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);
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;
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;
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 {
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);