Skip to content

Commit e80650d

Browse files
committed
Split parseCLI into header and definition
1 parent 8a622dc commit e80650d

6 files changed

Lines changed: 184 additions & 170 deletions

File tree

capio/server/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ target_sources(${TARGET_NAME} PRIVATE
3737
target_include_directories(${TARGET_NAME} PRIVATE
3838
${CMAKE_CURRENT_SOURCE_DIR}/include
3939
${MPI_INCLUDE_PATH}
40-
${args_SOURCE_DIR}
4140
${capio_cl_SOURCE_DIR}
4241
)
4342

@@ -55,7 +54,7 @@ ENDIF (MPI_LINK_FLAGS)
5554
#####################################
5655
# Link libraries
5756
#####################################
58-
target_link_libraries(${TARGET_NAME} PRIVATE ${MPI_LIBRARIES} pthread rt stdc++fs libcapio_cl)
57+
target_link_libraries(${TARGET_NAME} PRIVATE ${MPI_LIBRARIES} pthread rt stdc++fs libcapio_cl args)
5958

6059
#####################################
6160
# Install rules

capio/server/capio_server.cpp

Lines changed: 1 addition & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include <algorithm>
2-
#include <args.hxx>
32
#include <array>
43
#include <cstdio>
54
#include <cstring>
@@ -39,6 +38,7 @@ StorageManager *storage_manager;
3938
Backend *backend;
4039

4140
#include "handlers.hpp"
41+
#include "utils/cli_parser.hpp"
4242
#include "utils/location.hpp"
4343
#include "utils/signals.hpp"
4444

@@ -111,171 +111,6 @@ static constexpr std::array<CSHandler_t, CAPIO_NR_REQUESTS> build_request_handle
111111
}
112112
}
113113

114-
struct CapioParsedConfig {
115-
std::string backend_name;
116-
std::string capio_cl_config_path;
117-
std::string capio_cl_resolve_path;
118-
bool capio_cl_dynamic_config = false;
119-
bool store_all_in_memory = false;
120-
};
121-
122-
CapioParsedConfig parseCLI(int argc, char **argv) {
123-
CapioParsedConfig capio_config;
124-
Logger *log;
125-
126-
args::ArgumentParser parser(CAPIO_SERVER_ARG_PARSER_PRE, CAPIO_SERVER_ARG_PARSER_EPILOGUE);
127-
parser.LongSeparator(" ");
128-
parser.LongPrefix("--");
129-
parser.ShortPrefix("-");
130-
131-
args::Group arguments(parser, "Arguments");
132-
args::HelpFlag help(arguments, "help", "Display this help menu", {'h', "help"});
133-
args::ValueFlag<std::string> logfile_src(arguments, "filename",
134-
CAPIO_SERVER_ARG_PARSER_LOGILE_OPT_HELP, {'l', "log"});
135-
args::ValueFlag<std::string> logfile_folder(
136-
arguments, "filename", CAPIO_SERVER_ARG_PARSER_LOGILE_DIR_OPT_HELP, {'d', "log-dir"});
137-
args::ValueFlag<std::string> resolve_prefix(arguments, "resolve-prefix",
138-
CAPIO_SERVER_ARG_PARSER_RESOLVE_PREFIX_OPT_HELP,
139-
{'r', "resolve-prefix"});
140-
141-
args::ValueFlag<std::string> config(arguments, "filename",
142-
CAPIO_SERVER_ARG_PARSER_CONFIG_OPT_HELP, {'c', "config"});
143-
args::Flag noConfigFile(arguments, "no-config",
144-
CAPIO_SERVER_ARG_PARSER_CONFIG_NO_CONF_FILE_HELP, {"no-config"});
145-
args::ValueFlag<std::string> backend_flag(
146-
arguments, "backend", CAPIO_SERVER_ARG_PARSER_CONFIG_BACKEND_HELP, {'b', "backend"});
147-
148-
args::Flag continueOnErrorFlag(arguments, "continue-on-error",
149-
CAPIO_SERVER_ARG_PARSER_CONFIG_NCONTINUE_ON_ERROR_HELP,
150-
{"continue-on-error"});
151-
args::Flag mem_only_flag(arguments, "mem-only",
152-
CAPIO_SERVER_ARG_PARSER_STORE_ALL_IN_MEMORY_OPT_HELP, {"mem-only"});
153-
154-
try {
155-
parser.ParseCLI(argc, argv);
156-
} catch (args::Help &) {
157-
std::cout << parser;
158-
exit(EXIT_SUCCESS);
159-
} catch (args::ParseError &e) {
160-
std::cerr << e.what() << std::endl;
161-
std::cerr << parser;
162-
exit(EXIT_FAILURE);
163-
} catch (args::ValidationError &e) {
164-
std::cerr << e.what() << std::endl;
165-
std::cerr << parser;
166-
exit(EXIT_FAILURE);
167-
}
168-
169-
if (continueOnErrorFlag) {
170-
#ifdef CAPIO_LOG
171-
continue_on_error = true;
172-
for (const auto line : CAPIO_LOG_SERVER_CLI_CONT_ON_ERR_WARNING) {
173-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_ERROR, "parseCLI", line);
174-
}
175-
176-
#else
177-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
178-
"--continue-on-error flag given, but logger is not compiled into CAPIO. "
179-
"Flag is ignored.");
180-
#endif
181-
}
182-
183-
if (logfile_folder) {
184-
#ifdef CAPIO_LOG
185-
log_master_dir_name = args::get(logfile_folder);
186-
#else
187-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
188-
"Capio logfile folder, but logging capabilities not compiled into capio!");
189-
#endif
190-
}
191-
192-
if (logfile_src) {
193-
#ifdef CAPIO_LOG
194-
// log file was given
195-
std::string token = args::get(logfile_src);
196-
if (token.find(".log") != std::string::npos) {
197-
token.erase(token.length() - 4); // delete .log if for some reason
198-
// is given as parameter
199-
}
200-
logfile_prefix = token;
201-
#else
202-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
203-
"Capio logfile provided, but logging capabilities not compiled into capio!");
204-
#endif
205-
}
206-
#ifdef CAPIO_LOG
207-
auto logname = open_server_logfile();
208-
log = new Logger(__func__, __FILE__, __LINE__, gettid(), "Created new log file");
209-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
210-
"started logging to logfile " + logname.string());
211-
#endif
212-
213-
if (mem_only_flag) {
214-
capio_config.store_all_in_memory = args::get(mem_only_flag);
215-
}
216-
217-
if (config) {
218-
219-
capio_config.capio_cl_config_path = args::get(config);
220-
221-
if (std::string token = args::get(config); token == "dynamic") {
222-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
223-
"Starting CAPIO-CL engine with dynamic configuration");
224-
capio_config.capio_cl_dynamic_config = true;
225-
226-
} else {
227-
std::filesystem::path resolve_path = "";
228-
229-
if (resolve_prefix) {
230-
capio_config.capio_cl_resolve_path = args::get(resolve_prefix);
231-
}
232-
}
233-
234-
} else if (noConfigFile) {
235-
236-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
237-
"skipping config file parsing.");
238-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
239-
"Obtained from environment variable current workflow name: " +
240-
get_capio_workflow_name());
241-
} else {
242-
server_println(
243-
CAPIO_LOG_SERVER_CLI_LEVEL_ERROR, "parseCLI",
244-
"Error: no config file provided. To skip config file use --no-config option!");
245-
#ifdef CAPIO_LOG
246-
log->log("no config file provided, and --no-config not provided");
247-
#endif
248-
exit(EXIT_FAILURE);
249-
}
250-
251-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
252-
"CAPIO_DIR=" + get_capio_dir().string());
253-
254-
#ifdef CAPIO_LOG
255-
CAPIO_LOG_LEVEL = get_capio_log_level();
256-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
257-
"LOG_LEVEL set to: " + std::to_string(CAPIO_LOG_LEVEL));
258-
for (const auto &msg : CAPIO_LOG_SERVER_CLI_LOGGING_ENABLED_WARNING) {
259-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "Logger", msg);
260-
}
261-
262-
log->log("LOG_LEVEL set to: %d", CAPIO_LOG_LEVEL);
263-
delete log;
264-
#else
265-
if (std::getenv("CAPIO_LOG_LEVEL") != nullptr) {
266-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
267-
CAPIO_LOG_SERVER_CLI_LOGGING_NOT_AVAILABLE);
268-
}
269-
#endif
270-
271-
// Backend selection phase
272-
if (backend_flag) {
273-
capio_config.backend_name = args::get(backend_flag);
274-
}
275-
276-
return capio_config;
277-
}
278-
279114
int main(int argc, char **argv) {
280115

281116
Semaphore internal_server_sem(0);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef CAPIO_CLI_PARSER_HPP
2+
#define CAPIO_CLI_PARSER_HPP
3+
#include <string>
4+
5+
struct CapioParsedConfig {
6+
std::string backend_name;
7+
std::string capio_cl_config_path;
8+
std::string capio_cl_resolve_path;
9+
bool capio_cl_dynamic_config = false;
10+
bool store_all_in_memory = false;
11+
};
12+
13+
CapioParsedConfig parseCLI(int argc, char **argv);
14+
15+
#endif // CAPIO_CLI_PARSER_HPP

capio/server/src/cli_parser.cpp

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
#include "utils/cli_parser.hpp"
2+
3+
#include "common/constants.hpp"
4+
#include "common/logger.hpp"
5+
#include "utils/common.hpp"
6+
7+
#include <args.hxx>
8+
9+
CapioParsedConfig parseCLI(int argc, char **argv) {
10+
CapioParsedConfig capio_config;
11+
Logger *log;
12+
13+
args::ArgumentParser parser(CAPIO_SERVER_ARG_PARSER_PRE, CAPIO_SERVER_ARG_PARSER_EPILOGUE);
14+
parser.LongSeparator(" ");
15+
parser.LongPrefix("--");
16+
parser.ShortPrefix("-");
17+
18+
args::Group arguments(parser, "Arguments");
19+
args::HelpFlag help(arguments, "help", "Display this help menu", {'h', "help"});
20+
args::ValueFlag<std::string> logfile_src(arguments, "filename",
21+
CAPIO_SERVER_ARG_PARSER_LOGILE_OPT_HELP, {'l', "log"});
22+
args::ValueFlag<std::string> logfile_folder(
23+
arguments, "filename", CAPIO_SERVER_ARG_PARSER_LOGILE_DIR_OPT_HELP, {'d', "log-dir"});
24+
args::ValueFlag<std::string> resolve_prefix(arguments, "resolve-prefix",
25+
CAPIO_SERVER_ARG_PARSER_RESOLVE_PREFIX_OPT_HELP,
26+
{'r', "resolve-prefix"});
27+
28+
args::ValueFlag<std::string> config(arguments, "filename",
29+
CAPIO_SERVER_ARG_PARSER_CONFIG_OPT_HELP, {'c', "config"});
30+
args::Flag noConfigFile(arguments, "no-config",
31+
CAPIO_SERVER_ARG_PARSER_CONFIG_NO_CONF_FILE_HELP, {"no-config"});
32+
args::ValueFlag<std::string> backend_flag(
33+
arguments, "backend", CAPIO_SERVER_ARG_PARSER_CONFIG_BACKEND_HELP, {'b', "backend"});
34+
35+
args::Flag continueOnErrorFlag(arguments, "continue-on-error",
36+
CAPIO_SERVER_ARG_PARSER_CONFIG_NCONTINUE_ON_ERROR_HELP,
37+
{"continue-on-error"});
38+
args::Flag mem_only_flag(arguments, "mem-only",
39+
CAPIO_SERVER_ARG_PARSER_STORE_ALL_IN_MEMORY_OPT_HELP, {"mem-only"});
40+
41+
try {
42+
parser.ParseCLI(argc, argv);
43+
} catch (args::Help &) {
44+
std::cout << parser;
45+
exit(EXIT_SUCCESS);
46+
} catch (args::ParseError &e) {
47+
std::cerr << e.what() << std::endl;
48+
std::cerr << parser;
49+
exit(EXIT_FAILURE);
50+
} catch (args::ValidationError &e) {
51+
std::cerr << e.what() << std::endl;
52+
std::cerr << parser;
53+
exit(EXIT_FAILURE);
54+
}
55+
56+
if (continueOnErrorFlag) {
57+
#ifdef CAPIO_LOG
58+
continue_on_error = true;
59+
for (const auto line : CAPIO_LOG_SERVER_CLI_CONT_ON_ERR_WARNING) {
60+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_ERROR, "parseCLI", line);
61+
}
62+
63+
#else
64+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
65+
"--continue-on-error flag given, but logger is not compiled into CAPIO. "
66+
"Flag is ignored.");
67+
#endif
68+
}
69+
70+
if (logfile_folder) {
71+
#ifdef CAPIO_LOG
72+
log_master_dir_name = args::get(logfile_folder);
73+
#else
74+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
75+
"Capio logfile folder, but logging capabilities not compiled into capio!");
76+
#endif
77+
}
78+
79+
if (logfile_src) {
80+
#ifdef CAPIO_LOG
81+
// log file was given
82+
std::string token = args::get(logfile_src);
83+
if (token.find(".log") != std::string::npos) {
84+
token.erase(token.length() - 4); // delete .log if for some reason
85+
// is given as parameter
86+
}
87+
logfile_prefix = token;
88+
#else
89+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
90+
"Capio logfile provided, but logging capabilities not compiled into capio!");
91+
#endif
92+
}
93+
#ifdef CAPIO_LOG
94+
auto logname = open_server_logfile();
95+
log = new Logger(__func__, __FILE__, __LINE__, gettid(), "Created new log file");
96+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
97+
"started logging to logfile " + logname.string());
98+
#endif
99+
100+
if (mem_only_flag) {
101+
capio_config.store_all_in_memory = args::get(mem_only_flag);
102+
}
103+
104+
if (config) {
105+
106+
capio_config.capio_cl_config_path = args::get(config);
107+
108+
if (std::string token = args::get(config); token == "dynamic") {
109+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
110+
"Starting CAPIO-CL engine with dynamic configuration");
111+
capio_config.capio_cl_dynamic_config = true;
112+
113+
} else {
114+
std::filesystem::path resolve_path = "";
115+
116+
if (resolve_prefix) {
117+
capio_config.capio_cl_resolve_path = args::get(resolve_prefix);
118+
}
119+
}
120+
121+
} else if (noConfigFile) {
122+
123+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
124+
"skipping config file parsing.");
125+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
126+
"Obtained from environment variable current workflow name: " +
127+
get_capio_workflow_name());
128+
} else {
129+
server_println(
130+
CAPIO_LOG_SERVER_CLI_LEVEL_ERROR, "parseCLI",
131+
"Error: no config file provided. To skip config file use --no-config option!");
132+
#ifdef CAPIO_LOG
133+
log->log("no config file provided, and --no-config not provided");
134+
#endif
135+
exit(EXIT_FAILURE);
136+
}
137+
138+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
139+
"CAPIO_DIR=" + get_capio_dir().string());
140+
141+
#ifdef CAPIO_LOG
142+
CAPIO_LOG_LEVEL = get_capio_log_level();
143+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_INFO, "parseCLI",
144+
"LOG_LEVEL set to: " + std::to_string(CAPIO_LOG_LEVEL));
145+
for (const auto &msg : CAPIO_LOG_SERVER_CLI_LOGGING_ENABLED_WARNING) {
146+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "Logger", msg);
147+
}
148+
149+
log->log("LOG_LEVEL set to: %d", CAPIO_LOG_LEVEL);
150+
delete log;
151+
#else
152+
if (std::getenv("CAPIO_LOG_LEVEL") != nullptr) {
153+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_WARNING, "parseCLI",
154+
CAPIO_LOG_SERVER_CLI_LOGGING_NOT_AVAILABLE);
155+
}
156+
#endif
157+
158+
// Backend selection phase
159+
if (backend_flag) {
160+
capio_config.backend_name = args::get(backend_flag);
161+
}
162+
163+
return capio_config;
164+
}

capio/server/src/storage_manager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ void StorageManager::addDirectoryEntry(const pid_t tid, const std::filesystem::p
6767
}
6868
}
6969
StorageManager::StorageManager() {
70-
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_STATUS, "StorageManager", "initialization completed.");
70+
server_println(CAPIO_LOG_SERVER_CLI_LEVEL_STATUS, "StorageManager",
71+
"initialization completed.");
7172
}
7273

7374
StorageManager::~StorageManager() {

0 commit comments

Comments
 (0)