Add VES stndDefined PM and subscription for O-DU.
[sim/o1-interface.git] / ntsimulator / ntsim-ng / core / framework.c
index 23a958a..75b6217 100644 (file)
@@ -45,7 +45,7 @@ static struct argp_option options[] = {
     { "supervisor", 's', 0, 0, "Run as supervisor; manager/network-function is chosen via config.json"},
     { "manager", 'm', 0, 0, "Run the daemon as manager." },
     { "network-function", 'f', 0, 0, "Run the daemon as network function." },
-    { "generate", 'g', 0, 0, "Generate population data without commiting." },
+    { "blank", 'b', 0, 0, "Run the deamon as a blank network function." },
     { "test-mode", 't', 0, 0, "Test mode." },
     
     // tools
@@ -68,8 +68,93 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state);
 
 int framework_init(int argc, char **argv) {
     //environment vars
-    framework_environment.nts.version = getenv(ENV_VAR_NTS_BUILD_VERSION) ? strdup(getenv(ENV_VAR_NTS_BUILD_VERSION)) : strdup("N/A");
-    framework_environment.nts.build_time = getenv(ENV_VAR_NTS_BUILD_TIME) ? strdup(getenv(ENV_VAR_NTS_BUILD_TIME)) : strdup("N/A");
+    framework_environment.nts.version = (getenv(ENV_VAR_NTS_BUILD_VERSION) && strlen(getenv(ENV_VAR_NTS_BUILD_VERSION))) ? strdup(getenv(ENV_VAR_NTS_BUILD_VERSION)) : strdup(NTS_VERSION_FALLBACK"!");
+    if(getenv(ENV_VAR_NTS_BUILD_TIME) && strlen(getenv(ENV_VAR_NTS_BUILD_TIME))) {
+        framework_environment.nts.build_time = strdup(getenv(ENV_VAR_NTS_BUILD_TIME));
+    }
+    else {
+        if(__DATE__[0] == '?') {
+            framework_environment.nts.build_time = strdup("1970-01-01T00:00:00Z");
+        }
+        else {
+            //01234567890
+            //May  4 2021
+            int year = 0;
+            int month = 1;
+            int day = 0;
+            
+            year = (__DATE__[10] - '0') + (__DATE__[9] - '0')*10 + (__DATE__[8] - '0')*100 + (__DATE__[7] - '0')*1000;
+            day = (__DATE__[5] - '0');
+            if(__DATE__[4] != ' ') {
+                day += (__DATE__[4] - '0')*10;
+            }
+            
+            switch(__DATE__[0]) {
+                case 'J':
+                    switch(__DATE__[1]) {
+                        case 'a':
+                            month = 1;
+                            break;
+                        
+                        case 'u':
+                            if(__DATE__[2] == 'n') {
+                                month = 6;
+                            }
+                            else {
+                                month = 7;
+                            }
+                            break;
+                    }
+                    break;
+                    
+                case 'F':
+                    month = 2;
+                    break;
+                    
+                case 'M':
+                    switch(__DATE__[2]) {
+                        case 'r':
+                            month = 3;
+                            break;
+                            
+                        case 'y':
+                            month = 5;
+                            break;
+                    }
+                    break;
+                
+                case 'A':
+                    switch(__DATE__[1]) {
+                        case 'p':
+                            month = 4;
+                            break;
+                            
+                        case 'u':
+                            month = 8;
+                            break;
+                    }
+                    break;
+                    
+                case 'S':
+                    month = 9;
+                    break;
+                    
+                case 'O':
+                    month = 10;
+                    break;
+                    
+                case 'N':
+                    month = 11;
+                    break;
+                    
+                case 'D':
+                    month = 12;
+                    break;
+            }
+            
+            asprintf(&framework_environment.nts.build_time, "%04d-%02d-%02dT%sZ", year, month, day, __TIME__);
+        }
+    }
 
     //set argp_version
     char *version = 0;
@@ -116,16 +201,16 @@ int framework_init(int argc, char **argv) {
             stderr_file = "log/stderr-install.txt";
             break;
 
+        case NTS_MODE_BLANK:
+            log_file = "log/log-blank.txt";
+            stderr_file = "log/stderr-blank.txt";
+            break;
+
         case NTS_MODE_SUPERVISOR:
             log_file = "log/log-supervisor.txt";
             stderr_file = "log/stderr-supervisor.txt";
             break;
 
-        case NTS_MODE_GENERATE_DATA:
-            log_file = "log/log-generate.txt";
-            stderr_file = "log/stderr-generate.txt";
-            break;
-
         default:
             log_file = "log/log.txt";
             stderr_file = "log/stderr.txt";
@@ -179,7 +264,14 @@ static int framework_env_init(void) {
     framework_environment.nts.manual = getenv(ENV_VAR_NTS_MANUAL) ? true : false;
     framework_environment.nts.function_type = getenv(ENV_VAR_NTS_FUNCTION_TYPE) ? strdup(getenv(ENV_VAR_NTS_FUNCTION_TYPE)) : strdup("");
     framework_environment.nts.nf_standalone_start_features = getenv(ENV_VAR_NTS_NF_STANDALONE_START_FEATURES) ? strdup(getenv(ENV_VAR_NTS_NF_STANDALONE_START_FEATURES)) : strdup("");
+    framework_environment.nts.nf_mount_point_addressing_method = getenv(ENV_VAR_NTS_NF_MOUNT_POINT_ADDRESSING_METHOD) ? strdup(getenv(ENV_VAR_NTS_NF_MOUNT_POINT_ADDRESSING_METHOD)) : strdup("docker-mapping");
 
+    framework_environment.settings.docker_repository = getenv(ENV_VAR_DOCKER_REPOSITORY) ? strdup(getenv(ENV_VAR_DOCKER_REPOSITORY)) : strdup("");
+    if(strlen(framework_environment.settings.docker_repository)) {
+        if(framework_environment.settings.docker_repository[strlen(framework_environment.settings.docker_repository) - 1] == '/') {
+            framework_environment.settings.docker_repository[strlen(framework_environment.settings.docker_repository) - 1] = 0;
+        }
+    }
     framework_environment.settings.docker_engine_version = getenv(ENV_VAR_DOCKER_ENGINE_VERSION) ? strdup(getenv(ENV_VAR_DOCKER_ENGINE_VERSION)) : strdup("1.40");
     framework_environment.settings.hostname = getenv(ENV_VAR_HOSTNAME) ? strdup(getenv(ENV_VAR_HOSTNAME)) : strdup("localhost");
 
@@ -209,9 +301,11 @@ static int framework_env_init(void) {
     framework_environment.sdn_controller.protocol = getenv(ENV_VAR_SDN_CONTROLLER_IP) ? strdup(getenv(ENV_VAR_SDN_CONTROLLER_PROTOCOL)) : strdup("https");
     framework_environment.sdn_controller.ip = getenv(ENV_VAR_SDN_CONTROLLER_IP) ? strdup(getenv(ENV_VAR_SDN_CONTROLLER_IP)) : strdup("127.0.0.1");
     framework_environment.sdn_controller.port = get_int_from_string_with_default(getenv(ENV_VAR_SDN_CONTROLLER_PORT), 8181);
+    framework_environment.sdn_controller.callhome_ip = getenv(ENV_VAR_SDN_CONTROLLER_CALLHOME_IP) ? strdup(getenv(ENV_VAR_SDN_CONTROLLER_CALLHOME_IP)) : strdup("127.0.0.1");
     framework_environment.sdn_controller.callhome_port = get_int_from_string_with_default(getenv(ENV_VAR_SDN_CONTROLLER_CALLHOME_PORT), 6666);
     framework_environment.sdn_controller.username = getenv(ENV_VAR_SDN_CONTROLLER_USERNAME) ? strdup(getenv(ENV_VAR_SDN_CONTROLLER_USERNAME)) : strdup("admin");
     framework_environment.sdn_controller.password = getenv(ENV_VAR_SDN_CONTROLLER_PASSWORD) ? strdup(getenv(ENV_VAR_SDN_CONTROLLER_PASSWORD)) : strdup("admin");
+    framework_environment.sdn_controller.port_absent = (getenv(ENV_VAR_SDN_CONTROLLER_PORT) == 0) ? true : false;
 
     framework_environment.ves_endpoint.common_header_version = getenv(ENV_VAR_VES_COMMON_HEADER_VERSION) ? strdup(getenv(ENV_VAR_VES_COMMON_HEADER_VERSION)) : strdup("7.2");
     framework_environment.ves_endpoint.protocol = getenv(ENV_VAR_VES_ENDPOINT_PROTOCOL) ? strdup(getenv(ENV_VAR_VES_ENDPOINT_PROTOCOL)) : strdup("https");
@@ -221,14 +315,17 @@ static int framework_env_init(void) {
     framework_environment.ves_endpoint.username = getenv(ENV_VAR_VES_ENDPOINT_USERNAME) ? strdup(getenv(ENV_VAR_VES_ENDPOINT_USERNAME)) : strdup("admin");
     framework_environment.ves_endpoint.password = getenv(ENV_VAR_VES_ENDPOINT_PASSWORD) ? strdup(getenv(ENV_VAR_VES_ENDPOINT_PASSWORD)) : strdup("admin");
     framework_environment.ves_endpoint.certificate = getenv(ENV_VAR_VES_ENDPOINT_CERTIFICATE) ? strdup(getenv(ENV_VAR_VES_ENDPOINT_CERTIFICATE)) : strdup("");
+    framework_environment.ves_endpoint.port_absent = (getenv(ENV_VAR_VES_ENDPOINT_PORT) == 0) ? true : false;
 
     log_add_verbose(2, "[framework-env] nts.manual = %d\n", framework_environment.nts.manual);
     log_add_verbose(2, "[framework-env] nts.version = %s\n", framework_environment.nts.version);
     log_add_verbose(2, "[framework-env] nts.build_time = %s\n", framework_environment.nts.build_time);
     log_add_verbose(2, "[framework-env] nts.function_type = %s\n", framework_environment.nts.function_type);
     log_add_verbose(2, "[framework-env] nts.nf_standalone_start_features = %s\n", framework_environment.nts.nf_standalone_start_features);
+    log_add_verbose(2, "[framework-env] nts.nf_mount_point_addressing_method = %s\n", framework_environment.nts.nf_mount_point_addressing_method);
 
     log_add_verbose(2, "[framework-env] settings.docker_engine_version = %s\n", framework_environment.settings.docker_engine_version);
+    log_add_verbose(2, "[framework-env] settings.docker_repository = %s\n", framework_environment.settings.docker_repository);
     log_add_verbose(2, "[framework-env] settings.hostname = %s\n", framework_environment.settings.hostname);
     log_add_verbose(2, "[framework-env] settings.ip_v4 = %s\n", framework_environment.settings.ip_v4);
     log_add_verbose(2, "[framework-env] settings.ip_v6 = %s\n", framework_environment.settings.ip_v6);
@@ -290,11 +387,13 @@ static int framework_env_init(void) {
     if(framework_environment.settings.ip_v6_enabled) {
         if(strstr(framework_environment.host.ip, ".")) {
             log_error("[framework-env] host.ip is an invalid IP v6\n");
+            return NTS_ERR_FAILED;
         }
     }
     else {
         if(strstr(framework_environment.host.ip, ":")) {
             log_error("[framework-env] host.ip is an invalid IP v4\n");
+            return NTS_ERR_FAILED;
         }
     }
 
@@ -307,9 +406,11 @@ static int framework_env_init(void) {
     log_add_verbose(2, "[framework-env] sdn_controller.protocol = %s\n", framework_environment.sdn_controller.protocol);
     log_add_verbose(2, "[framework-env] sdn_controller.ip = %s\n", framework_environment.sdn_controller.ip);
     log_add_verbose(2, "[framework-env] sdn_controller.port = %d\n", framework_environment.sdn_controller.port);
+    log_add_verbose(2, "[framework-env] sdn_controller.callhome_ip = %s\n", framework_environment.sdn_controller.callhome_ip);
     log_add_verbose(2, "[framework-env] sdn_controller.callhome_port = %d\n", framework_environment.sdn_controller.callhome_port);
     log_add_verbose(2, "[framework-env] sdn_controller.username = %s\n", framework_environment.sdn_controller.username);
     log_add_verbose(2, "[framework-env] sdn_controller.password = %s\n", framework_environment.sdn_controller.password);
+    log_add_verbose(2, "[framework-env] sdn_controller.port_absent = %d\n", framework_environment.sdn_controller.port_absent);
 
     log_add_verbose(2, "[framework-env] ves_endpoint.common_header_version = %s\n", framework_environment.ves_endpoint.common_header_version);
     log_add_verbose(2, "[framework-env] ves_endpoint.protocol = %s\n", framework_environment.ves_endpoint.protocol);
@@ -319,6 +420,7 @@ static int framework_env_init(void) {
     log_add_verbose(2, "[framework-env] ves_endpoint.username = %s\n", framework_environment.ves_endpoint.username);
     log_add_verbose(2, "[framework-env] ves_endpoint.password = %s\n", framework_environment.ves_endpoint.password);
     log_add_verbose(2, "[framework-env] ves_endpoint.certificate = %s\n", framework_environment.ves_endpoint.certificate);
+    log_add_verbose(2, "[framework-env] ves_endpoint.port_absent = %d\n", framework_environment.ves_endpoint.port_absent);
 
     log_add_verbose(2, "[framework-env] finished\n");
     return NTS_ERR_OK;
@@ -352,18 +454,25 @@ static int framework_config_init(void) {
     framework_config.datastore_populate.preg_running = 0;
 
     //config init
-    if(!dir_exists("config")) {
-        log_add_verbose(2, "[framework-config] config/ folder wasn't found; created.\n");
-        mkdir("config", 0777);
+    char *config_file = "config/config.json";
+    if(file_exists("/opt/dev/config/config.json")) {
+        config_file = "/opt/dev/config/config.json";
+        log_add_verbose(1, LOG_COLOR_BOLD_MAGENTA"config.json is loaded from external volume!\n"LOG_COLOR_RESET);
     }
+    else {
+        if(!dir_exists("config")) {
+            log_add_verbose(2, "[framework-config] config/ folder wasn't found; created.\n");
+            mkdir("config", 0777);
+        }
 
-    if(!file_exists("config/config.json")) {
-        log_add_verbose(2, "[framework-config] config.json file missing; created.\n");
-        file_touch("config/config.json", "{}");
-    }    
+        if(!file_exists("config/config.json")) {
+            log_add_verbose(2, "[framework-config] config.json file missing; created.\n");
+            file_touch("config/config.json", "{}");
+        }
+    }
 
-    log_add_verbose(2, "[framework-config] parsing config.json\n");
-    char *config_contents = file_read_content("config/config.json");
+    log_add_verbose(2, "[framework-config] parsing config.json from %s\n", config_file);
+    char *config_contents = file_read_content(config_file);
     cJSON *json = cJSON_Parse(config_contents);
     free(config_contents);
     if(!json) {
@@ -693,13 +802,16 @@ void framework_free(void) {
     free(framework_environment.nts.build_time);
     free(framework_environment.nts.function_type);
     free(framework_environment.nts.nf_standalone_start_features);
+    free(framework_environment.nts.nf_mount_point_addressing_method);
     free(framework_environment.settings.ip_v4);
     free(framework_environment.settings.ip_v6);
     free(framework_environment.settings.docker_engine_version);
+    free(framework_environment.settings.docker_repository);
     free(framework_environment.settings.hostname);
     free(framework_environment.host.ip);
     free(framework_environment.sdn_controller.protocol);
     free(framework_environment.sdn_controller.ip);
+    free(framework_environment.sdn_controller.callhome_ip);
     free(framework_environment.sdn_controller.username);
     free(framework_environment.sdn_controller.password);
     free(framework_environment.ves_endpoint.common_header_version);
@@ -795,8 +907,8 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
             iter_arguments->nts_mode = NTS_MODE_NETWORK_FUNCTION;
             break;
 
-        case 'g':
-            iter_arguments->nts_mode = NTS_MODE_GENERATE_DATA;
+        case 'b':
+            iter_arguments->nts_mode = NTS_MODE_BLANK;
             break;
 
         case 't':