2 ==================================================================================
4 Copyright (c) 2018-2019 AT&T Intellectual Property.
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
20 #include "adm-ctrl-xapp.hpp"
22 void get_environment_config(configuration & config_instance){
24 // Order of priority for setting variables
25 // So we start in reverse order
27 // -- environment variable
30 if (const char *env_schema = std::getenv("A1_SCHEMA_FILE")){
31 config_instance.a1_schema_file.assign(env_schema);
32 mdclog_write(MDCLOG_INFO, "Schema file set to %s from environment variable", config_instance.a1_schema_file.c_str());
35 config_instance.a1_schema_file.assign(DEFAULT_A1_SCHEMA_FILE);
36 mdclog_write(MDCLOG_INFO, "Using default schema file %s\n", config_instance.a1_schema_file.c_str());
39 if (const char *env_schema = std::getenv("VES_SCHEMA_FILE")){
40 config_instance.ves_schema_file.assign(env_schema);
41 mdclog_write(MDCLOG_INFO, "VES Schema file set to %s from environment variable", config_instance.ves_schema_file.c_str());
44 config_instance.ves_schema_file.assign(DEFAULT_VES_SCHEMA_FILE);
45 mdclog_write(MDCLOG_INFO, "Using default ves schema file %s\n", config_instance.ves_schema_file.c_str());
49 if (const char *env_schema = std::getenv("SAMPLES_FILE")){
50 config_instance.sample_file.assign(env_schema);
51 mdclog_write(MDCLOG_INFO, "JSON Sample file set to %s from environment variable", config_instance.sample_file.c_str());
54 config_instance.sample_file.assign(DEFAULT_SAMPLE_FILE);
55 mdclog_write(MDCLOG_INFO, "Using default sample file %s\n", config_instance.sample_file.c_str());
59 if (const char *env_schema = std::getenv("VES_COLLECTOR_URL")){
60 config_instance.ves_collector_url.assign(env_schema);
61 mdclog_write(MDCLOG_INFO, "VES Collector URL set to %s from environment variable", config_instance.ves_collector_url.c_str());
64 config_instance.ves_collector_url.assign(DEFAULT_VES_COLLECTOR_URL);
65 mdclog_write(MDCLOG_INFO, "Using default ves collector url %s\n", config_instance.ves_collector_url.c_str());
69 if (const char *env_schema = std::getenv("VES_MEASUREMENT_INTERVAL")){
70 config_instance.measurement_interval = atoi(env_schema);
71 if ( config_instance.measurement_interval < 1 || config_instance.measurement_interval > MAX_SLEEP){
72 throw std::runtime_error("Invalid measurmeent interval provided. Must between [1 and " + std::to_string(MAX_SLEEP) + "] seconds");
75 mdclog_write(MDCLOG_INFO, "Interval set to %d from environment variable", config_instance.measurement_interval);
78 config_instance.measurement_interval = DEFAULT_VES_MEASUREMENT_INTERVAL;
79 mdclog_write(MDCLOG_INFO, "Using default measurement interval %d\n", config_instance.measurement_interval);
84 if (char *env_gnodeb = std::getenv("GNODEB")){
85 config_instance.fill_gnodeb_list(env_gnodeb);
86 mdclog_write(MDCLOG_INFO, "gNodeB List set to %s from environment variable", env_gnodeb);
90 if (const char *env_opmode = std::getenv("OPERATING_MODE")){
91 config_instance.operating_mode.assign(env_opmode);
92 if ( config_instance.operating_mode != "REPORT" && config_instance.operating_mode != "CONTROL"){
93 throw std::runtime_error("Invalid operating mode: " + config_instance.operating_mode + " Must be REPORT or CONTROL");
95 mdclog_write(MDCLOG_INFO, "Operating mode set from environment variable to %s\n", config_instance.operating_mode.c_str());
99 if (const char *threads = std::getenv("THREADS")){
100 config_instance.num_threads = atoi(threads);
101 if ( config_instance.num_threads <= 0 or config_instance.num_threads > MAX_THREADS){
102 mdclog_write(MDCLOG_ERR, "Error :: %s, %d :: Must specify numnber of threads between [1 and %d]. Specified = %d\n", __FILE__, __LINE__, MAX_THREADS, config_instance.num_threads);
106 mdclog_write(MDCLOG_INFO, "Number of threads set to %d from environment variable\n", config_instance.num_threads);
110 if (const char *test= std::getenv("TEST_MODE")){
111 config_instance.test_mode = atoi(test);
112 mdclog_write(MDCLOG_INFO, "xAPP set to Test Mode state %d from Environment Variable", config_instance.test_mode);
115 if (const char *log_env = std::getenv("LOG_LEVEL")){
116 if (!strcmp(log_env, "MDCLOG_INFO")){
117 config_instance.log_level = MDCLOG_INFO;
119 else if (!strcmp(log_env, "MDCLOG_WARN")){
120 config_instance.log_level = MDCLOG_WARN;
122 else if (!strcmp(log_env, "MDCLOG_ERR")){
123 config_instance.log_level = MDCLOG_ERR;
125 else if (!strcmp(log_env, "MDCLOG_DEBUG")){
126 config_instance.log_level = MDCLOG_DEBUG;
129 config_instance.log_level = MDCLOG_WARN;
130 std::cerr <<"Error ! Illegal environment option for log level ignored. Setting log level to " << config_instance.log_level << std::endl;
136 void get_command_line_config(int argc, char **argv, configuration &config_instance){
138 // Parse command line options to over ride
139 static struct option long_options[] =
141 /* Thse options require arguments */
142 {"name", required_argument, 0, 'n'},
143 {"port", required_argument, 0, 'p'},
144 {"threads", required_argument, 0, 't'},
145 {"a1-schema", required_argument, 0, 'a'},
146 {"ves-schema", required_argument, 0, 'v'},
147 {"samples", required_argument, 0, 's'},
148 {"ves-url", required_argument, 0, 'u'},
149 {"interval", required_argument, 0, 'i'},
150 {"gNodeB", required_argument, 0, 'g'},
151 {"opmode", required_argument, 0, 'c'},
152 {"verbose", no_argument, &config_instance.log_level, MDCLOG_INFO},
153 {"test", no_argument, &config_instance.test_mode, 1},
160 int option_index = 0;
161 char c = getopt_long(argc, argv, "n:p:t:s:g:a:v:u:i:c:", long_options, &option_index);
171 /* An option flag was set.
172 Do nothing for now */
176 strcpy(config_instance.name, optarg);
180 strcpy(config_instance.port, optarg);
184 config_instance.num_threads = atoi(optarg);
185 mdclog_write(MDCLOG_INFO, "Number of threads set to %d from command line e\n", config_instance.num_threads);
189 config_instance.sample_file.assign(optarg);
190 mdclog_write(MDCLOG_INFO, "Samples JSON file set to %s from command line ", config_instance.sample_file.c_str());
194 config_instance.a1_schema_file.assign(optarg);
195 mdclog_write(MDCLOG_INFO, "Schema file set to %s from command line ", config_instance.a1_schema_file.c_str());
199 config_instance.ves_schema_file.assign(optarg);
200 mdclog_write(MDCLOG_INFO, "VES Schema file set to %s from command line ", config_instance.ves_schema_file.c_str());
204 config_instance.operating_mode.assign(optarg);
205 mdclog_write(MDCLOG_INFO, "Operating mode set from command line to %s\n", config_instance.operating_mode.c_str());
209 config_instance.ves_collector_url.assign(optarg);
210 mdclog_write(MDCLOG_INFO, "VES collector url set to %s from command line ", config_instance.ves_collector_url.c_str());
214 config_instance.measurement_interval = atoi(optarg);
215 if (config_instance.measurement_interval < 1 || config_instance.measurement_interval > MAX_SLEEP){
216 throw std::runtime_error("Invalid measurmeent interval provided. Must between [1 and " + std::to_string(MAX_SLEEP) + "] seconds");
218 mdclog_write(MDCLOG_INFO, "Measurement interval set to %d from command line\n", config_instance.measurement_interval);
222 config_instance.fill_gnodeb_list(optarg);
223 mdclog_write(MDCLOG_INFO, "gNodeB List set to %s from command line ", optarg);
239 void usage(char *command){
240 std::cout <<"Usage : " << command << " " << std::endl;
241 std::cout <<" --name[-n] xapp_instance_name "<< std::endl;
242 std::cout <<" --port[-p] port to listen on e.g tcp:4561 "<< std::endl;
243 std::cout << "--threads[-t] number of listener threads "<< std::endl ;
244 std::cout << "--a1-schema[-a] a1 schema file location" << std::endl;
245 std::cout << "--ves-schema[-v] ves schema file location" << std::endl;
246 std::cout << "--samples [-s] samples file location with samples for all jsons" << std::endl;
247 std::cout << "--ves-url [-u] ves collector url" << std::endl;
248 std::cout <<"[--gNodeB[][-g] gNodeB" << std::endl;
249 std::cout <<"--interval[-i] measurement interval to send to ves collector (in seconds)" << std::endl;
250 std::cout <<"--test puts xapp in test mode where it sends subscription, waits for interval and then sends delete subscription " << std::endl;
251 std::cout <<"--opmode [-c] type of operatoring mode : either REPORT or INSERT. In REPORT, does not send a control message back to gNodeB" << std::endl;
252 std::cout << "--verbose " << std::endl;