X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=sim%2Fo1-interface.git;a=blobdiff_plain;f=ntsimulator%2Fntsim-ng%2Fcore%2Fapp%2Fnetwork_function.c;h=85d0409e60f7b0cffb4bfda8c3e022dd23b2589b;hp=5a66d18125879bb7a4447034a2eda29b12a582d3;hb=3bbf9d8a3c81afebcffb2b926cef219336dd53d6;hpb=312a154cc4d60a09596fba8fd1259345e048cdc2 diff --git a/ntsimulator/ntsim-ng/core/app/network_function.c b/ntsimulator/ntsim-ng/core/app/network_function.c index 5a66d18..85d0409 100644 --- a/ntsimulator/ntsim-ng/core/app/network_function.c +++ b/ntsimulator/ntsim-ng/core/app/network_function.c @@ -20,6 +20,7 @@ #include "network_function.h" #include "utils/log_utils.h" #include "utils/sys_utils.h" +#include "utils/nts_utils.h" #include #include #include @@ -42,6 +43,10 @@ #include "features/netconf_call_home/netconf_call_home.h" #include "features/web_cut_through/web_cut_through.h" +#include "app_common.h" + +#define NF_FUNCTION_CONTROL_BUFFER_LENGTH 32 + #define IETF_NETCONF_MONITORING_MODULE "ietf-netconf-monitoring" #define IETF_NETCONF_MONITORING_STATE_SCHEMAS_SCHEMA_XPATH "/ietf-netconf-monitoring:netconf-state/schemas" @@ -51,7 +56,7 @@ #define NTS_NETWORK_FUNCTION_MODULE "nts-network-function" #define NTS_NETWORK_FUNCTION_SCHEMA_XPATH "/nts-network-function:simulation/network-function" -#define POPULATE_RPC_SCHEMA_XPATH "/nts-network-function:datastore-random-populate" +#define POPULATE_RPC_SCHEMA_XPATH "/nts-network-function:datastore-populate" #define FEATURE_CONTROL_SCHEMA_XPATH "/nts-network-function:feature-control" #define FAULTS_CLEAR_SCHEMA_XPATH "/nts-network-function:clear-fault-counters" #define FAULTS_LIST_SCHEMA_XPATH "/nts-network-function:simulation/network-function/fault-generation" @@ -59,6 +64,8 @@ #define FAULTS_NC_ENABLED_SCHEMA_XPATH "/nts-network-function:simulation/network-function/netconf/faults-enabled" #define FAULTS_VES_ENABLED_SCHEMA_XPATH "/nts-network-function:simulation/network-function/ves/faults-enabled" +#define STARTED_FEATURES_LIST_SCHEMA_XPATH "/nts-network-function:info/started-features" + static int netconf_monitoring_state_schemas_cb(sr_session_ctx_t *session, const char *module_name, const char *path, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data); static int notifications_streams_cb(sr_session_ctx_t *session, const char *module_name, const char *path, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data); @@ -68,58 +75,73 @@ static int network_function_faults_clear_cb(sr_session_ctx_t *session, const cha static int network_function_faults_change_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, sr_event_t event, uint32_t request_id, void *private_data); static int network_function_faults_count_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data); +static int network_function_started_features_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data); + static int network_function_change_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, sr_event_t event, uint32_t request_id, void *private_data); static int faults_update_config(sr_session_ctx_t *session); //not protected by lock static void *faults_thread_routine(void *arg); static pthread_mutex_t nf_function_control_lock; -static char *nf_function_control_string = 0; +static char *nf_function_control_buffer[NF_FUNCTION_CONTROL_BUFFER_LENGTH]; +static int nf_function_control_buffer_in; +static int nf_function_control_buffer_out; static pthread_t faults_thread; static pthread_mutex_t faults_lock; -static pthread_mutex_t network_function_change_lock; -static char *function_type_default = 0; -static char *function_type_val = 0; -static char *mount_point_addressing_method_default = 0; -static char *mount_point_addressing_method_val = 0; - int network_function_run(void) { assert_session(); - log_message(1, LOG_COLOR_BOLD_YELLOW"\nrunning as NETWORK FUNCTION daemon...\n"LOG_COLOR_RESET); + nf_function_control_buffer_in = 0; + nf_function_control_buffer_out = 0; + + log_add_verbose(1, LOG_COLOR_BOLD_YELLOW"running as NETWORK FUNCTION daemon...\n"LOG_COLOR_RESET); + + int rc = app_common_init(); + if(rc != NTS_ERR_OK) { + log_error("app_common_init failed\n"); + return NTS_ERR_FAILED; + } + + if(strlen(framework_environment.nts.nf_standalone_start_features)) { + rc = nts_utils_populate_info(session_running, framework_environment.nts.function_type); + if(rc != NTS_ERR_OK) { + log_error("nts_utils_populate_info failed\n"); + return NTS_ERR_FAILED; + } + } if(pthread_mutex_init(&nf_function_control_lock, NULL) != 0) { - log_error("mutex init has failed"); + log_error("mutex init has failed\n"); return NTS_ERR_FAILED; } //ietf-netconf-monitoring schemas populate with modules and submodules (overwrite default Netopeer2 behaviour) - int rc = sr_oper_get_items_subscribe(session_running, IETF_NETCONF_MONITORING_MODULE, IETF_NETCONF_MONITORING_STATE_SCHEMAS_SCHEMA_XPATH, netconf_monitoring_state_schemas_cb, 0, SR_SUBSCR_DEFAULT, &session_subscription); + rc = sr_oper_get_items_subscribe(session_running, IETF_NETCONF_MONITORING_MODULE, IETF_NETCONF_MONITORING_STATE_SCHEMAS_SCHEMA_XPATH, netconf_monitoring_state_schemas_cb, 0, SR_SUBSCR_DEFAULT, &session_subscription); if(rc != SR_ERR_OK) { - log_error("error from sr_oper_get_items_subscribe: %s", sr_strerror(rc)); + log_error("error from sr_oper_get_items_subscribe: %s\n", sr_strerror(rc)); return 0; } //nc-notifications overwrite rc = sr_oper_get_items_subscribe(session_running, NC_NOTIFICATIONS_MODULE, NC_NOTIFICATIONS_STREAMS_SCHEMA_XPATH, notifications_streams_cb, 0, SR_SUBSCR_DEFAULT, &session_subscription); if(rc != SR_ERR_OK) { - log_error("error from sr_oper_get_items_subscribe: %s", sr_strerror(rc)); + log_error("error from sr_oper_get_items_subscribe: %s\n", sr_strerror(rc)); return 0; } //populate rc = sr_rpc_subscribe(session_running, POPULATE_RPC_SCHEMA_XPATH, network_function_populate_cb, 0, 0, SR_SUBSCR_CTX_REUSE, &session_subscription); if(rc != SR_ERR_OK) { - log_error("error from sr_rpc_subscribe: %s", sr_strerror(rc)); + log_error("error from sr_rpc_subscribe: %s\n", sr_strerror(rc)); return NTS_ERR_FAILED; } //feature control rc = sr_rpc_subscribe(session_running, FEATURE_CONTROL_SCHEMA_XPATH, network_function_feature_control_cb, 0, 0, SR_SUBSCR_CTX_REUSE, &session_subscription); if(rc != SR_ERR_OK) { - log_error("error from sr_rpc_subscribe: %s", sr_strerror(rc)); + log_error("error from sr_rpc_subscribe: %s\n", sr_strerror(rc)); return NTS_ERR_FAILED; } @@ -132,122 +154,190 @@ int network_function_run(void) { rc = sr_oper_get_items_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, FAULTS_COUNT_LIST_SCHEMA_XPATH, network_function_faults_count_get_items_cb, NULL, SR_SUBSCR_CTX_REUSE, &session_subscription); if(rc != SR_ERR_OK) { - log_error("could not subscribe to oper faults: %s", sr_strerror(rc)); + log_error("could not subscribe to oper faults: %s\n", sr_strerror(rc)); return 0; } rc = sr_rpc_subscribe(session_running, FAULTS_CLEAR_SCHEMA_XPATH, network_function_faults_clear_cb, 0, 0, SR_SUBSCR_CTX_REUSE, &session_subscription); if(rc != SR_ERR_OK) { - log_error("error from sr_rpc_subscribe: %s", sr_strerror(rc)); + log_error("error from sr_rpc_subscribe: %s\n", sr_strerror(rc)); return NTS_ERR_FAILED; } + rc = sr_oper_get_items_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, STARTED_FEATURES_LIST_SCHEMA_XPATH, network_function_started_features_get_items_cb, NULL, SR_SUBSCR_CTX_REUSE, &session_subscription); + if(rc != SR_ERR_OK) { + log_error("could not subscribe to oper started-features: %s\n", sr_strerror(rc)); + return 0; + } + + //subscribe to any changes on the main - rc = sr_module_change_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NETWORK_FUNCTION_SCHEMA_XPATH, network_function_change_cb, NULL, 0, SR_SUBSCR_CTX_REUSE, &session_subscription); + rc = sr_module_change_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NETWORK_FUNCTION_SCHEMA_XPATH, network_function_change_cb, NULL, 0, SR_SUBSCR_CTX_REUSE | SR_SUBSCR_UPDATE, &session_subscription); if(rc != SR_ERR_OK) { - log_error("could not subscribe to simulation changes"); + log_error("could not subscribe to simulation changes\n"); return NTS_ERR_FAILED; } rc = faults_init(); if(rc != NTS_ERR_OK) { - log_error("faults_init error", sr_strerror(rc)); + log_error("faults_init error\n", sr_strerror(rc)); return NTS_ERR_FAILED; } if(pthread_mutex_init(&faults_lock, NULL) != 0) { - log_error("mutex init has failed"); + log_error("mutex init has failed\n"); return NTS_ERR_FAILED; } if(pthread_create(&faults_thread, 0, faults_thread_routine, 0)) { - log_error("could not create thread for heartbeat"); + log_error("could not create thread for heartbeat\n"); return NTS_ERR_FAILED; } - if(pthread_mutex_init(&network_function_change_lock, NULL) != 0) { - log_error("mutex init has failed"); - return NTS_ERR_FAILED; - } - - while(!framework_sigint) { - pthread_mutex_lock(&network_function_change_lock); - if(function_type_val) { - rc = sr_set_item_str(session_running, NTS_NETWORK_FUNCTION_SCHEMA_XPATH"/function-type", function_type_val, 0, 0); - if(rc != SR_ERR_OK) { - log_error("sr_set_item_str failed"); - } + //check standalone mode + if(strlen(framework_environment.nts.nf_standalone_start_features)) { + char *start_features = 0; - rc = sr_apply_changes(session_running, 0, 0); - if(rc != SR_ERR_OK) { - log_error("sr_apply_changes failed"); - } + asprintf(&start_features, "1 %s", framework_environment.nts.nf_standalone_start_features); + nf_function_control_buffer[nf_function_control_buffer_in] = start_features; + nf_function_control_buffer_in++; + if(nf_function_control_buffer_in >= NF_FUNCTION_CONTROL_BUFFER_LENGTH) { + nf_function_control_buffer_in = 0; + } - function_type_val = 0; + log_add_verbose(1, LOG_COLOR_BOLD_YELLOW"running in NETWORK FUNCTION STANDALONE mode!\n"LOG_COLOR_RESET); + log_add_verbose(1, "Currently enabled features are: %s\n", framework_environment.nts.nf_standalone_start_features); + log_add_verbose(1, LOG_COLOR_BOLD_YELLOW"Docker IP:"LOG_COLOR_RESET" %s\n", framework_environment.settings.ip_v6_enabled ? framework_environment.settings.ip_v6 : framework_environment.settings.ip_v4); + log_add_verbose(1, LOG_COLOR_BOLD_YELLOW"Docker ports"LOG_COLOR_RESET": "); + if(framework_environment.settings.ssh_connections) { + log_add(1, "NETCONF SSH: %d (%d)", STANDARD_NETCONF_PORT, framework_environment.settings.ssh_connections); + } + else { + log_add(1, "NETCONF SSH: disabled"); + } + if(framework_environment.settings.tls_connections) { + log_add(1, " | NETCONF TLS: %d (%d)", STANDARD_NETCONF_PORT + framework_environment.settings.ssh_connections, framework_environment.settings.tls_connections); } + else { + log_add(1, " | NETCONF TLS: disabled"); + } + if(framework_environment.settings.ftp_connections) { + log_add(1, " | FTP: %d (%d)", STANDARD_FTP_PORT, framework_environment.settings.ftp_connections); + } + else { + log_add(1, " | FTP: disabled"); + } + if(framework_environment.settings.sftp_connections) { + log_add(1, " | SFTP: %d (%d)", STANDARD_SFTP_PORT, framework_environment.settings.sftp_connections); + } + else { + log_add(1, " | SFTP: disabled"); + } + log_add(1,"\n"); + } - if(mount_point_addressing_method_val) { - rc = sr_set_item_str(session_running, NTS_NETWORK_FUNCTION_SCHEMA_XPATH"/mount-point-addressing-method", mount_point_addressing_method_val, 0, 0); - if(rc != SR_ERR_OK) { - log_error("sr_set_item_str failed"); + while(!framework_sigint) { + pthread_mutex_lock(&nf_function_control_lock); + while(nf_function_control_buffer_in != nf_function_control_buffer_out) { + //get current function control string + char *nf_function_control_string = nf_function_control_buffer[nf_function_control_buffer_out]; + nf_function_control_buffer_out++; + if(nf_function_control_buffer_out >= NF_FUNCTION_CONTROL_BUFFER_LENGTH) { + nf_function_control_buffer_out = 0; } - rc = sr_apply_changes(session_running, 0, 0); - if(rc != SR_ERR_OK) { - log_error("sr_apply_changes failed"); + if(strstr(nf_function_control_string, "datastore-populate") != 0) { + rc = datastore_populate(3); + if(rc != NTS_ERR_OK) { + log_error("datastore_populate() failed\n"); + } } - mount_point_addressing_method_val = 0; - } - pthread_mutex_unlock(&network_function_change_lock); - - pthread_mutex_lock(&nf_function_control_lock); - if(nf_function_control_string) { if(strstr(nf_function_control_string, "ves-file-ready") != 0) { - // start feature for handling the fileReady VES message - rc = ves_file_ready_feature_start(session_running); - if(rc != 0) { - log_error("ves_file_ready_feature_start() failed"); + if(nf_function_control_string[0] == '1') { + // start feature for handling the fileReady VES message + rc = ves_file_ready_feature_start(session_running); + if(rc != 0) { + log_error("ves_file_ready_feature_start() failed\n"); + } + } + else if(nf_function_control_string[0] == '0') { + // stop feature for handling the fileReady VES message + rc = ves_file_ready_feature_stop(); + if(rc != 0) { + log_error("ves_file_ready_feature_stop() failed\n"); + } } } if(strstr(nf_function_control_string, "ves-pnf-registration") != 0) { - // check if PNF registration is enabled and send PNF registration message if so - rc = ves_pnf_registration_feature_start(session_running); - if(rc != 0) { - log_error("ves_pnf_registration_feature_start() failed"); + if(nf_function_control_string[0] == '1') { + // check if PNF registration is enabled and send PNF registration message if so + rc = ves_pnf_registration_feature_start(session_running); + if(rc != 0) { + log_error("ves_pnf_registration_feature_start() failed\n"); + } } } if(strstr(nf_function_control_string, "ves-heartbeat") != 0) { - // start feature for handling the heartbeat VES message - rc = ves_heartbeat_feature_start(session_running); - if(rc != 0) { - log_error("ves_heartbeat_feature_start() failed"); + if(nf_function_control_string[0] == '1') { + // start feature for handling the heartbeat VES message + rc = ves_heartbeat_feature_start(session_running); + if(rc != 0) { + log_error("ves_heartbeat_feature_start() failed\n"); + } + } + else if(nf_function_control_string[0] == '0') { + // stop feature for handling the heartbeat VES message + rc = ves_heartbeat_feature_stop(); + if(rc != 0) { + log_error("ves_heartbeat_feature_stop() failed\n"); + } } } if(strstr(nf_function_control_string, "manual-notification-generation") != 0) { - // start feature for manual notification - rc = manual_notification_feature_start(session_running); - if(rc != 0) { - log_error("manual_notification_feature_start() failed"); + if(nf_function_control_string[0] == '1') { + // start feature for manual notification + rc = manual_notification_feature_start(session_running); + if(rc != 0) { + log_error("manual_notification_feature_start() failed\n"); + } + } + else if(nf_function_control_string[0] == '0') { + // stop feature for manual notification + rc = manual_notification_feature_stop(); + if(rc != 0) { + log_error("manual_notification_feature_stop() failed\n"); + } } } if(strstr(nf_function_control_string, "netconf-call-home") != 0) { - // start feature for NETCONF Call Home - rc = netconf_call_home_feature_start(session_running); - if(rc != 0) { - log_error("netconf_call_home_feature_start() failed"); + if(nf_function_control_string[0] == '1') { + // start feature for NETCONF Call Home + rc = netconf_call_home_feature_start(session_running); + if(rc != 0) { + log_error("netconf_call_home_feature_start() failed\n"); + } } } if(strstr(nf_function_control_string, "web-cut-through") != 0) { - // start feature for NETCONF Call Home - rc = web_cut_through_feature_start(session_running); - if(rc != 0) { - log_error("web_cut_through_feature_start() failed"); + if(nf_function_control_string[0] == '1') { + // start feature for web cut-through + rc = web_cut_through_feature_start(session_running); + if(rc != 0) { + log_error("web_cut_through_feature_start() failed\n"); + } + } + else if(nf_function_control_string[0] == '0') { + // stop feature for web cut-through + rc = web_cut_through_feature_stop(session_running); + if(rc != 0) { + log_error("web_cut_through_feature_stop() failed\n"); + } } } @@ -275,6 +365,11 @@ static int netconf_monitoring_state_schemas_cb(sr_session_ctx_t *session, const // get all modules from context while ((mod = ly_ctx_get_module_iter(session_context, &i))) { + // we skip the internal sysrepo modules + if (!strcmp("sysrepo", mod->name) || !strcmp("sysrepo-monitoring", mod->name) || !strcmp("sysrepo-plugind", mod->name)) { + continue; + } + list = lyd_new(root, NULL, "schema"); lyd_new_leaf(list, NULL, "identifier", mod->name); lyd_new_leaf(list, NULL, "version", (mod->rev ? mod->rev[0].date : NULL)); @@ -312,7 +407,7 @@ static int notifications_streams_cb(sr_session_ctx_t *session, const char *modul /* go through all the sysrepo modules */ int rc = sr_get_module_info(session_connection, &sr_data); if(rc != SR_ERR_OK) { - log_error("sr_get_module_info failed"); + log_error("sr_get_module_info failed\n"); return SR_ERR_OPERATION_FAILED; } @@ -370,14 +465,15 @@ static int network_function_populate_cb(sr_session_ctx_t *session, const char *p return rc; } - rc = schema_populate(); - if(rc != NTS_ERR_OK) { - rc = sr_val_build_str_data(output[0], SR_ENUM_T, "%s", "ERROR"); - } - else { - rc = sr_val_build_str_data(output[0], SR_ENUM_T, "%s", "SUCCESS"); + pthread_mutex_lock(&nf_function_control_lock); + nf_function_control_buffer[nf_function_control_buffer_in] = strdup("datastore-populate"); + nf_function_control_buffer_in++; + if(nf_function_control_buffer_in >= NF_FUNCTION_CONTROL_BUFFER_LENGTH) { + nf_function_control_buffer_in = 0; } + pthread_mutex_unlock(&nf_function_control_lock); + rc = sr_val_build_str_data(output[0], SR_ENUM_T, "%s", "SUCCESS"); return rc; } @@ -385,6 +481,55 @@ static int network_function_feature_control_cb(sr_session_ctx_t *session, const int rc; int total_errors = 0; + char start_features[16][64]; + int start_features_cnt = 0; + + char stop_features[16][64]; + int stop_features_cnt = 0; + + char *start_input = 0; + char *stop_input = 0; + + for(int i = 0; i < input_cnt; i++) { + if(input[i].data.bits_val == 0) { + continue; + } + + char *val = strdup(input[i].data.bits_val); + + if(strstr(input[i].xpath, "start")) { + start_input = input[i].data.bits_val; + + const char *tok = " "; + char *token = strtok(val, tok); + while(token) { + strcpy(start_features[start_features_cnt++], token); + token = strtok(0, tok); + } + } + + if(strstr(input[i].xpath, "stop")) { + stop_input = input[i].data.bits_val; + + const char *tok = " "; + char *token = strtok(val, tok); + while(token) { + strcpy(stop_features[stop_features_cnt++], token); + token = strtok(0, tok); + } + } + + free(val); + } + + for(int i = 0; i < start_features_cnt; i++) { + for(int j = 0; j < stop_features_cnt; j++) { + if(strcmp(start_features[i], stop_features[j]) == 0) { + total_errors++; + } + } + } + *output_cnt = 1; rc = sr_new_values(*output_cnt, output); if(SR_ERR_OK != rc) { @@ -401,11 +546,27 @@ static int network_function_feature_control_cb(sr_session_ctx_t *session, const } else { rc = sr_val_build_str_data(output[0], SR_ENUM_T, "%s", "SUCCESS"); + + pthread_mutex_lock(&nf_function_control_lock); + if(start_features_cnt) { + asprintf(&nf_function_control_buffer[nf_function_control_buffer_in], "1 %s", start_input); + nf_function_control_buffer_in++; + if(nf_function_control_buffer_in >= NF_FUNCTION_CONTROL_BUFFER_LENGTH) { + nf_function_control_buffer_in = 0; + } + } + + if(stop_features_cnt) { + asprintf(&nf_function_control_buffer[nf_function_control_buffer_in], "0 %s", stop_input); + nf_function_control_buffer_in++; + if(nf_function_control_buffer_in >= NF_FUNCTION_CONTROL_BUFFER_LENGTH) { + nf_function_control_buffer_in = 0; + } + } + pthread_mutex_unlock(&nf_function_control_lock); } - pthread_mutex_lock(&nf_function_control_lock); - nf_function_control_string = strdup(input[0].data.bits_val); - pthread_mutex_unlock(&nf_function_control_lock); + return rc; } @@ -440,7 +601,7 @@ static int network_function_faults_change_cb(sr_session_ctx_t *session, const ch rc = faults_update_config(session); pthread_mutex_unlock(&faults_lock); if(rc != NTS_ERR_OK) { - log_error("faults_update_config failed"); + log_error("faults_update_config failed\n"); return SR_ERR_VALIDATION_FAILED; } } @@ -456,31 +617,78 @@ static int network_function_faults_count_get_items_cb(sr_session_ctx_t *session, *parent = lyd_new_path(NULL, sr_get_context(sr_session_get_connection(session)), FAULTS_COUNT_LIST_SCHEMA_XPATH, 0, 0, 0); if(*parent == 0) { + log_error("lyd_new_path failed\n"); return SR_ERR_OPERATION_FAILED; } sprintf(value, "%d", counters.normal); if(lyd_new_path(*parent, NULL, FAULTS_COUNT_LIST_SCHEMA_XPATH"/normal", value, 0, 0) == 0) { + log_error("lyd_new_path failed\n"); return SR_ERR_OPERATION_FAILED; } sprintf(value, "%d", counters.warning); if(lyd_new_path(*parent, NULL, FAULTS_COUNT_LIST_SCHEMA_XPATH"/warning", value, 0, 0) == 0) { + log_error("lyd_new_path failed\n"); return SR_ERR_OPERATION_FAILED; } sprintf(value, "%d", counters.minor); if(lyd_new_path(*parent, NULL, FAULTS_COUNT_LIST_SCHEMA_XPATH"/minor", value, 0, 0) == 0) { + log_error("lyd_new_path failed\n"); return SR_ERR_OPERATION_FAILED; } sprintf(value, "%d", counters.major); if(lyd_new_path(*parent, NULL, FAULTS_COUNT_LIST_SCHEMA_XPATH"/major", value, 0, 0) == 0) { + log_error("lyd_new_path failed\n"); return SR_ERR_OPERATION_FAILED; } sprintf(value, "%d", counters.critical); if(lyd_new_path(*parent, NULL, FAULTS_COUNT_LIST_SCHEMA_XPATH"/critical", value, 0, 0) == 0) { + log_error("lyd_new_path failed\n"); + return SR_ERR_OPERATION_FAILED; + } + + return SR_ERR_OK; +} + +static int network_function_started_features_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data) { + char value[1024]; + value[0] = 0; + + if(ves_file_ready_feature_get_status()) { + strcat(value, "ves-file-ready "); + } + + if(ves_pnf_registration_feature_get_status()) { + strcat(value, "ves-pnf-registration "); + } + + if(ves_heartbeat_feature_get_status()) { + strcat(value, "ves-heartbeat "); + } + + if(manual_notification_feature_get_status()) { + strcat(value, "manual-notification-generation "); + } + + if(netconf_call_home_feature_get_status()) { + strcat(value, "netconf-call-home "); + } + + if(web_cut_through_feature_get_status()) { + strcat(value, "web-cut-through "); + } + + if(strlen(value)) { + value[strlen(value) - 1] = 0; + } + + *parent = lyd_new_path(NULL, sr_get_context(sr_session_get_connection(session)), STARTED_FEATURES_LIST_SCHEMA_XPATH, value, 0, 0); + if(*parent == 0) { + log_error("lyd_new_path failed\n"); return SR_ERR_OPERATION_FAILED; } @@ -497,12 +705,16 @@ static int faults_update_config(sr_session_ctx_t *session) { struct lyd_node *data; rc = sr_get_subtree(session, FAULTS_LIST_SCHEMA_XPATH, 0, &data); if(rc != SR_ERR_OK) { - log_error("sr_get_subtree failed"); - ret = NTS_ERR_FAILED; + log_error("sr_get_subtree failed\n"); + return NTS_ERR_FAILED; } faults_fault_list_clear(); faults_counters_clear(); + if(data == 0) { + return NTS_ERR_OK; + } + if(data->child == 0) { goto faults_update_config_free; } @@ -515,7 +727,7 @@ static int faults_update_config(sr_session_ctx_t *session) { if(strcmp(delay_list_entry->schema->name, "delay-period") == 0) { rc = faults_fault_list_add(((const struct lyd_node_leaf_list *)delay_list_entry)->value.uint16); if(rc != NTS_ERR_OK) { - log_error("faults_fault_list_add failed"); + log_error("faults_fault_list_add failed\n"); ret = NTS_ERR_FAILED; goto faults_update_config_free; } @@ -537,21 +749,21 @@ static void *faults_thread_routine(void *arg) { sr_session_ctx_t *current_session_running = 0; rc = sr_session_start(session_connection, SR_DS_RUNNING, ¤t_session_running); if (rc != SR_ERR_OK) { - log_error("sr_session_start failed"); + log_error("sr_session_start failed\n"); return 0; } sr_session_ctx_t *current_session_operational = 0; rc = sr_session_start(session_connection, SR_DS_OPERATIONAL, ¤t_session_operational); if (rc != SR_ERR_OK) { - log_error("sr_session_start failed"); + log_error("sr_session_start failed\n"); return 0; } pthread_mutex_lock(&faults_lock); rc = faults_update_config(current_session_running); if(rc != NTS_ERR_OK) { - log_error("faults_update_config failed"); + log_error("faults_update_config failed\n"); return 0; } pthread_mutex_unlock(&faults_lock); @@ -563,7 +775,7 @@ static void *faults_thread_routine(void *arg) { fault_details_t *fault = faults_generate_fault(); if(fault == 0) { - log_error("faults_generate_fault failed"); + log_error("faults_generate_fault failed\n"); pthread_mutex_unlock(&faults_lock); sleep(1); continue; @@ -571,7 +783,7 @@ static void *faults_thread_routine(void *arg) { rc = faults_counters_increase(fault->severity); if(rc != NTS_ERR_OK) { - log_error("faults_counters_increase failed"); + log_error("faults_counters_increase failed\n"); } pthread_mutex_unlock(&faults_lock); @@ -593,16 +805,17 @@ static void *faults_thread_routine(void *arg) { if(nc_fault_enabled) { struct lyd_node *notif = 0; + log_add_verbose(1, "[faults] notification is '%s'\n", fault->yang_notif_processed); notif = lyd_parse_mem(session_context, fault->yang_notif_processed, LYD_XML, LYD_OPT_NOTIF, 0); if(notif == 0) { - log_error("lyd_parse_mem failed"); + log_error("lyd_parse_mem failed\n"); goto fault_send_ves; } rc = sr_event_notif_send_tree(current_session_running, notif); lyd_free(notif); if(rc != SR_ERR_OK) { - log_error("sr_event_notif_send_tree failed"); + log_error("sr_event_notif_send_tree failed\n"); } } @@ -610,10 +823,11 @@ static void *faults_thread_routine(void *arg) { if(ves_fault_enabled) { rc = faults_ves_message_send(current_session_running, fault->condition, fault->object, fault->severity, fault->date_time, fault->specific_problem); if(rc != NTS_ERR_OK) { - log_error("faults_ves_message_send failed"); + log_error("faults_ves_message_send failed\n"); } } + log_add_verbose(1, "[faults] delaying %d sec\n", new_delay); sleep(new_delay); } else { @@ -635,44 +849,31 @@ static int network_function_change_cb(sr_session_ctx_t *session, const char *mod sr_val_t *old_value = 0; sr_val_t *new_value = 0; - static bool function_type_set = false; - static bool mount_point_addressing_method_set = false; - - if(event == SR_EV_DONE) { + if(event == SR_EV_UPDATE) { rc = sr_get_changes_iter(session, NTS_NETWORK_FUNCTION_SCHEMA_XPATH"//.", &it); if(rc != SR_ERR_OK) { - log_error("sr_get_changes_iter failed"); + log_error("sr_get_changes_iter failed\n"); return SR_ERR_VALIDATION_FAILED; } while((rc = sr_get_change_next(session, it, &oper, &old_value, &new_value)) == SR_ERR_OK) { if(new_value->xpath && (strcmp(new_value->xpath, NTS_NETWORK_FUNCTION_SCHEMA_XPATH"/function-type") == 0)) { - if(function_type_set == false) { - function_type_set = true; - function_type_default = strdup(new_value->data.string_val); - } - else { - //prevent changing function_type - if(strcmp(new_value->data.string_val, function_type_default) != 0) { - pthread_mutex_lock(&network_function_change_lock); - function_type_val = function_type_default; - pthread_mutex_unlock(&network_function_change_lock); + if(old_value && !old_value->dflt) { + rc = sr_set_item(session, old_value->xpath, old_value, 0); + if(rc != SR_ERR_OK) { + log_error("sr_set_item failed\n"); + return SR_ERR_VALIDATION_FAILED; } } } if(new_value->xpath && (strcmp(new_value->xpath, NTS_NETWORK_FUNCTION_SCHEMA_XPATH"/mount-point-addressing-method") == 0)) { - if(mount_point_addressing_method_set == false) { - mount_point_addressing_method_set = true; - mount_point_addressing_method_default = strdup(new_value->data.string_val); - } - else { - //prevent changing mount_point_addressing_method - if(strcmp(new_value->data.string_val, mount_point_addressing_method_default) != 0) { - pthread_mutex_lock(&network_function_change_lock); - mount_point_addressing_method_val = mount_point_addressing_method_default; - pthread_mutex_unlock(&network_function_change_lock); + if(old_value && !old_value->dflt) { + rc = sr_set_item(session, old_value->xpath, old_value, 0); + if(rc != SR_ERR_OK) { + log_error("sr_set_item failed\n"); + return SR_ERR_VALIDATION_FAILED; } } }