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 mdclog_write(MDCLOG_INFO, "Operating mode set from environment variable to %s\n", config_instance.operating_mode.c_str());
96 if (const char *threads = std::getenv("THREADS")){
97 config_instance.num_threads = atoi(threads);
98 if ( config_instance.num_threads <= 0 or config_instance.num_threads > MAX_THREADS){
99 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);
103 mdclog_write(MDCLOG_INFO, "Number of threads set to %d from environment variable\n", config_instance.num_threads);
107 if (const char *test= std::getenv("TEST_MODE")){
108 config_instance.test_mode = atoi(test);
109 mdclog_write(MDCLOG_INFO, "xAPP set to Test Mode state %d from Environment Variable", config_instance.test_mode);
112 if (const char *id = std::getenv("XAPP_ID")){
113 config_instance.xapp_id.assign(id);
114 mdclog_write(MDCLOG_INFO, "xAPP ID set to Test Mode state %d from Environment Variable", config_instance.xapp_id);
117 if (const char *log_env = std::getenv("LOG_LEVEL")){
118 if (!strcmp(log_env, "MDCLOG_INFO")){
119 config_instance.log_level = MDCLOG_INFO;
121 else if (!strcmp(log_env, "MDCLOG_WARN")){
122 config_instance.log_level = MDCLOG_WARN;
124 else if (!strcmp(log_env, "MDCLOG_ERR")){
125 config_instance.log_level = MDCLOG_ERR;
127 else if (!strcmp(log_env, "MDCLOG_DEBUG")){
128 config_instance.log_level = MDCLOG_DEBUG;
131 config_instance.log_level = MDCLOG_WARN;
132 std::cerr <<"Error ! Illegal environment option for log level ignored. Setting log level to " << config_instance.log_level << std::endl;
138 void get_command_line_config(int argc, char **argv, configuration &config_instance){
140 // Parse command line options to over ride
141 static struct option long_options[] =
143 /* Thse options require arguments */
144 {"name", required_argument, 0, 'n'},
145 {"port", required_argument, 0, 'p'},
146 {"threads", required_argument, 0, 't'},
147 {"a1-schema", required_argument, 0, 'a'},
148 {"ves-schema", required_argument, 0, 'v'},
149 {"samples", required_argument, 0, 's'},
150 {"ves-url", required_argument, 0, 'u'},
151 {"interval", required_argument, 0, 'i'},
152 {"gNodeB", required_argument, 0, 'g'},
153 {"opmode", required_argument, 0, 'c'},
154 {"xappid", required_argument, 0, 'x'},
155 {"verbose", no_argument, &config_instance.log_level, MDCLOG_DEBUG},
156 {"test", no_argument, &config_instance.test_mode, 1},
163 int option_index = 0;
164 char c = getopt_long(argc, argv, "n:p:t:s:g:a:v:u:i:c:x:", long_options, &option_index);
174 /* An option flag was set.
175 Do nothing for now */
179 strcpy(config_instance.name, optarg);
183 strcpy(config_instance.port, optarg);
187 config_instance.num_threads = atoi(optarg);
188 mdclog_write(MDCLOG_INFO, "Number of threads set to %d from command line e\n", config_instance.num_threads);
192 config_instance.sample_file.assign(optarg);
193 mdclog_write(MDCLOG_INFO, "Samples JSON file set to %s from command line ", config_instance.sample_file.c_str());
197 config_instance.a1_schema_file.assign(optarg);
198 mdclog_write(MDCLOG_INFO, "Schema file set to %s from command line ", config_instance.a1_schema_file.c_str());
202 config_instance.ves_schema_file.assign(optarg);
203 mdclog_write(MDCLOG_INFO, "VES Schema file set to %s from command line ", config_instance.ves_schema_file.c_str());
207 config_instance.operating_mode.assign(optarg);
208 mdclog_write(MDCLOG_INFO, "Operating mode set from command line to %s\n", config_instance.operating_mode.c_str());
212 config_instance.ves_collector_url.assign(optarg);
213 mdclog_write(MDCLOG_INFO, "VES collector url set to %s from command line ", config_instance.ves_collector_url.c_str());
217 config_instance.xapp_id.assign(optarg);
218 mdclog_write(MDCLOG_INFO, "XAPP ID set to %s from command line ", config_instance.xapp_id.c_str());
222 config_instance.measurement_interval = atoi(optarg);
223 if (config_instance.measurement_interval < 1 || config_instance.measurement_interval > MAX_SLEEP){
224 throw std::runtime_error("Invalid measurmeent interval provided. Must between [1 and " + std::to_string(MAX_SLEEP) + "] seconds");
226 mdclog_write(MDCLOG_INFO, "Measurement interval set to %d from command line\n", config_instance.measurement_interval);
230 config_instance.fill_gnodeb_list(optarg);
231 mdclog_write(MDCLOG_INFO, "gNodeB List set to %s from command line ", optarg);
247 void usage(char *command){
248 std::cout <<"Usage : " << command << " " << std::endl;
249 std::cout <<" --name[-n] xapp_instance_name "<< std::endl;
250 std::cout <<" --port[-p] port to listen on e.g tcp:4561 "<< std::endl;
251 std::cout << "--threads[-t] number of listener threads "<< std::endl ;
252 std::cout << "--a1-schema[-a] a1 schema file location" << std::endl;
253 std::cout << "--ves-schema[-v] ves schema file location" << std::endl;
254 std::cout << "--samples [-s] samples file location with samples for all jsons" << std::endl;
255 std::cout << "--ves-url [-u] ves collector url" << std::endl;
256 std::cout <<"[--gNodeB[][-g] gNodeB" << std::endl;
257 std::cout <<"--interval[-i] measurement interval to send to ves collector (in seconds)" << std::endl;
258 std::cout <<"--test puts xapp in test mode where it sends subscription, waits for interval and then sends delete subscription " << std::endl;
259 std::cout <<"--opmode [-c] type of operatoring mode : either REPORT or CONTROL. In REPORT, does not send a control message back to gNodeB" << std::endl;
260 std::cout << "--verbose " << std::endl;