[PATCH] cloud-init: replace boost program_options with light options utility functions

7 views
Skip to first unread message

Waldemar Kozaczuk

unread,
Mar 13, 2020, 9:17:04 PM3/13/20
to osv...@googlegroups.com, Waldemar Kozaczuk
Signed-off-by: Waldemar Kozaczuk <jwkoz...@gmail.com>
---
modules/cloud-init/cloud-init.cc | 5 ++-
modules/cloud-init/main.cc | 77 ++++++++++++++++++++------------
2 files changed, 53 insertions(+), 29 deletions(-)

diff --git a/modules/cloud-init/cloud-init.cc b/modules/cloud-init/cloud-init.cc
index 5e05c820..95b84cc3 100644
--- a/modules/cloud-init/cloud-init.cc
+++ b/modules/cloud-init/cloud-init.cc
@@ -171,7 +171,10 @@ void script_module::handle(const YAML::Node& doc)
yaml_to_request(node, req);
if (req.uri == "/open-rest-api") {
should_wait = true;
- t = std::thread([=] {boost::program_options::variables_map c; httpserver::global_server::run(c); });
+ t = std::thread([=] {
+ std::map<std::string,std::vector<std::string>> c;
+ httpserver::global_server::run(c);
+ });
} else if (!req.uri.empty()) {
do_api(req);
}
diff --git a/modules/cloud-init/main.cc b/modules/cloud-init/main.cc
index 5af23f09..5861dc36 100644
--- a/modules/cloud-init/main.cc
+++ b/modules/cloud-init/main.cc
@@ -13,16 +13,13 @@
#include "server-module.hh"
#include "cassandra-module.hh"
#include "monitor-agent-module.hh"
-#include <boost/program_options/variables_map.hpp>
-#include <boost/program_options/options_description.hpp>
-#include <boost/program_options/parsers.hpp>
#include <osv/debug.hh>
#include <osv/exception_utils.hh>
#include <osv/run.hh>
+#include <osv/options.hh>

using namespace std;
using namespace init;
-namespace po = boost::program_options;

// config_disk() allows to use NoCloud VM configuration method - see
// http://cloudinit.readthedocs.io/en/0.7.9/topics/datasources/nocloud.html.
@@ -80,30 +77,40 @@ static bool config_disk(const char* outfile) {
return false;
}

+static void usage()
+{
+ std::cout << "Allowed options:\n";
+ std::cout << " --help produce help message\n";
+ std::cout << " --skip-error do not stop on error\n";
+ std::cout << " --force-probe force data source probing\n";
+ std::cout << " --file args an init file\n";
+ std::cout << " --server arg a server to read the file from. must come with a --url\n";
+ std::cout << " --url arg a url at the server\n";
+ std::cout << " --port arg (=80) a port at the server\n\n";
+}
+
+static void handle_parse_error(const std::string &message)
+{
+ std::cout << message << std::endl;
+ usage();
+ exit(1);
+}
+
int main(int argc, char* argv[])
{
try {
- po::options_description desc("Allowed options");
- desc.add_options()
- ("help", "produce help message")
- ("skip-error", "do not stop on error")
- ("force-probe", "force data source probing")
- ("file", po::value<std::string>(), "an init file")
- ("server", po::value<std::string>(), "a server to read the file from. must come with a --url")
- ("url", po::value<std::string>(), "a url at the server")
- ("port", po::value<std::string>()->default_value("80"), "a port at the server")
- ;
-
- po::variables_map config;
- po::store(po::parse_command_line(argc, argv, desc), config);
- po::notify(config);
-
- if (config.count("help")) {
- std::cerr << desc << "\n";
+ auto options_values = options::parse_options_values(argc - 1, argv + 1, handle_parse_error);
+
+ if (options::extract_option_flag(options_values, "help", handle_parse_error)) {
+ usage();
return 1;
}

- osvinit init(config.count("skip-error") > 0, config.count("force-probe") > 0);
+ osvinit init(
+ options::extract_option_flag(options_values, "skip-error", handle_parse_error),
+ options::extract_option_flag(options_values, "force-probe", handle_parse_error)
+ );
+
auto scripts = make_shared<script_module>();
init.add_module(scripts);
init.add_module(make_shared<mount_module>());
@@ -114,18 +121,32 @@ int main(int argc, char* argv[])
init.add_module(make_shared<cassandra_module>());
init.add_module(make_shared<monitor_agent_module>());

- if (config.count("file")) {
- init.load_file(config["file"].as<std::string>());
- } else if (config.count("server") > 0 && config.count("url") > 0) {
- init.load_url(config["server"].as<std::string>(),
- config["url"].as<std::string>(),
- config["port"].as<std::string>());
+ std::string port("80");
+ if (options::option_value_exists(options_values, "port")) {
+ port = options::extract_option_value(options_values, "port");
+ }
+
+ if (options::option_value_exists(options_values, "file")) {
+ init.load_file(options::extract_option_value(options_values, "file"));
+ } else if (options::option_value_exists(options_values, "server") &&
+ options::option_value_exists(options_values, "url")) {
+ init.load_url(options::extract_option_value(options_values, "server"),
+ options::extract_option_value(options_values, "url"),
+ port);
} else if(config_disk("/tmp/config.yaml")) {
init.load_file("/tmp/config.yaml");
} else {
init.load_from_cloud();
}

+ if (!options_values.empty()) {
+ for (auto other_option : options_values) {
+ std::cout << "Unrecognized option: " << other_option.first << std::endl;
+ }
+
+ usage();
+ }
+
scripts->wait();
} catch (...) {
std::cerr << "cloud-init failed: " << what(std::current_exception()) << "\n";
--
2.20.1

Commit Bot

unread,
Mar 15, 2020, 3:23:20 AM3/15/20
to osv...@googlegroups.com, Waldemar Kozaczuk
From: Waldemar Kozaczuk <jwkoz...@gmail.com>
Committer: Nadav Har'El <n...@scylladb.com>
Branch: master

cloud-init: replace boost program_options with light options utility functions

Signed-off-by: Waldemar Kozaczuk <jwkoz...@gmail.com>
Message-Id: <20200314011653.1...@gmail.com>

---
diff --git a/modules/cloud-init/cloud-init.cc b/modules/cloud-init/cloud-init.cc
--- a/modules/cloud-init/cloud-init.cc
+++ b/modules/cloud-init/cloud-init.cc
@@ -171,7 +171,10 @@ void script_module::handle(const YAML::Node& doc)
yaml_to_request(node, req);
if (req.uri == "/open-rest-api") {
should_wait = true;
- t = std::thread([=] {boost::program_options::variables_map c; httpserver::global_server::run(c); });
+ t = std::thread([=] {
+ std::map<std::string,std::vector<std::string>> c;
+ httpserver::global_server::run(c);
+ });
} else if (!req.uri.empty()) {
do_api(req);
}
diff --git a/modules/cloud-init/main.cc b/modules/cloud-init/main.cc
Reply all
Reply to author
Forward
0 new messages