From bfe756b145283813f7f1c6d6b0032ab6003c4e9a Mon Sep 17 00:00:00 2001 From: Supriya Garg Date: Fri, 30 Mar 2018 13:55:12 -0400 Subject: [PATCH 1/5] Add support for providing command line options. --- src/configuration.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/configuration.cc b/src/configuration.cc index 138ddb1d..2ae754ae 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -16,6 +16,7 @@ #include "configuration.h" +#include #include #include #include @@ -122,12 +123,17 @@ Configuration::Configuration(std::istream& input) : Configuration() { int Configuration::ParseArguments(int ac, char** av) { std::string config_file; + std::string command_line_options; boost::program_options::options_description flags_desc; flags_desc.add_options() ("help,h", "Print help message") ("version,V", "Print the agent version") ("verbose,v", boost::program_options::bool_switch(&verbose_logging_), "Enable verbose logging") + ("options,o", + boost::program_options::value>() + ->multitoken()->zero_tokens()->composing(), + "Command line options") ; boost::program_options::options_description hidden_desc; hidden_desc.add_options() @@ -156,6 +162,25 @@ int Configuration::ParseArguments(int ac, char** av) { << std::endl; return -1; } + if (flags.count("options")) { + std::string input_str; + const std::vector options = + flags["options"].as>(); + for (const std::string& option: options) { + std::vector key_value; + boost::algorithm::split(key_value, option, boost::is_any_of("=")); + if (key_value.size() != 2) { + std::cerr << "Invalid option " << option; + return 1; + } + input_str += key_value[0] + ": " + key_value[1] + "\n"; + } + if (verbose_logging_) { + std::cout << "Options:\n" << input_str; + } + std::istringstream input { input_str }; + ParseConfiguration(input); + } ParseConfigFile(config_file); return 0; From f8ee1a90684417036fdc4b33d50272953318e9e7 Mon Sep 17 00:00:00 2001 From: Supriya Garg Date: Fri, 30 Mar 2018 15:01:23 -0400 Subject: [PATCH 2/5] Address comments --- src/configuration.cc | 91 +++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/src/configuration.cc b/src/configuration.cc index 2ae754ae..5d37a635 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -130,10 +130,11 @@ int Configuration::ParseArguments(int ac, char** av) { ("version,V", "Print the agent version") ("verbose,v", boost::program_options::bool_switch(&verbose_logging_), "Enable verbose logging") - ("options,o", + ("option,o", boost::program_options::value>() ->multitoken()->zero_tokens()->composing(), - "Command line options") + "Explicit configuration option, e.g. " + "-o CredentialsFile=/tmp/token.json") ; boost::program_options::options_description hidden_desc; hidden_desc.add_options() @@ -162,27 +163,31 @@ int Configuration::ParseArguments(int ac, char** av) { << std::endl; return -1; } - if (flags.count("options")) { - std::string input_str; + ParseConfigFile(config_file); + + // Command line options overwrite the options provided in the config file. + if (flags.count("option")) { + std::stringstream input_stream; const std::vector options = - flags["options"].as>(); + flags["option"].as>(); for (const std::string& option: options) { - std::vector key_value; - boost::algorithm::split(key_value, option, boost::is_any_of("=")); - if (key_value.size() != 2) { + std::size_t separator_pos = option.find("="); + if (separator_pos == std::string::npos) { std::cerr << "Invalid option " << option; return 1; } - input_str += key_value[0] + ": " + key_value[1] + "\n"; - } - if (verbose_logging_) { - std::cout << "Options:\n" << input_str; + const std::string key = option.substr(0, separator_pos); + const std::string value = + option.substr(separator_pos + 1, std::string::npos); + input_stream << key << ": " << value << "\n"; } - std::istringstream input { input_str }; - ParseConfiguration(input); + +#ifdef VERBOSE + LOG(DEBUG) << "Options:\n" << input_stream.str(); +#endif + ParseConfiguration(input_stream); } - ParseConfigFile(config_file); return 0; } catch (const boost::program_options::error& arg_error) { std::cerr << arg_error.what() << std::endl; @@ -202,79 +207,79 @@ void Configuration::ParseConfiguration(std::istream& input) { YAML::Node config = YAML::Load(input); std::lock_guard lock(mutex_); project_id_ = - config["ProjectId"].as(kDefaultProjectId); + config["ProjectId"].as(project_id_); credentials_file_ = - config["CredentialsFile"].as(kDefaultCredentialsFile); + config["CredentialsFile"].as(credentials_file_); metadata_api_num_threads_ = - config["MetadataApiNumThreads"].as(kMetadataApiDefaultNumThreads); + config["MetadataApiNumThreads"].as(metadata_api_num_threads_); metadata_api_port_ = - config["MetadataApiPort"].as(kMetadataApiDefaultPort); + config["MetadataApiPort"].as(metadata_api_port_); metadata_api_resource_type_separator_ = config["MetadataApiResourceTypeSeparator"].as( - kMetadataApiDefaultResourceTypeSeparator); + metadata_api_resource_type_separator_); metadata_reporter_interval_seconds_ = config["MetadataReporterIntervalSeconds"].as( - kMetadataReporterDefaultIntervalSeconds); + metadata_reporter_interval_seconds_); metadata_reporter_purge_deleted_ = config["MetadataReporterPurgeDeleted"].as( - kMetadataReporterDefaultPurgeDeleted); + metadata_reporter_purge_deleted_); metadata_reporter_user_agent_ = config["MetadataReporterUserAgent"].as( - kMetadataReporterDefaultUserAgent); + metadata_reporter_user_agent_); metadata_ingestion_endpoint_format_ = config["MetadataIngestionEndpointFormat"].as( - kMetadataIngestionDefaultEndpointFormat); + metadata_ingestion_endpoint_format_); metadata_ingestion_request_size_limit_bytes_ = config["MetadataIngestionRequestSizeLimitBytes"].as( - kMetadataIngestionDefaultRequestSizeLimitBytes); + metadata_ingestion_request_size_limit_bytes_); metadata_ingestion_raw_content_version_ = config["MetadataIngestionRawContentVersion"].as( - kMetadataIngestionDefaultRawContentVersion); + metadata_ingestion_raw_content_version_); instance_updater_interval_seconds_ = config["InstanceUpdaterIntervalSeconds"].as( - kInstanceUpdaterDefaultIntervalSeconds); + instance_updater_interval_seconds_); instance_resource_type_ = config["InstanceResourceType"].as( - kDefaultInstanceResourceType); + instance_resource_type_); docker_updater_interval_seconds_ = config["DockerUpdaterIntervalSeconds"].as( - kDockerUpdaterDefaultIntervalSeconds); + docker_updater_interval_seconds_); docker_endpoint_host_ = - config["DockerEndpointHost"].as(kDockerDefaultEndpointHost); + config["DockerEndpointHost"].as(docker_endpoint_host_); docker_api_version_ = config["DockerApiVersion"].as( - kDockerDefaultApiVersion); + docker_api_version_); docker_container_filter_ = config["DockerContainerFilter"].as( - kDockerDefaultContainerFilter); + docker_container_filter_); kubernetes_updater_interval_seconds_ = config["KubernetesUpdaterIntervalSeconds"].as( - kKubernetesUpdaterDefaultIntervalSeconds); + kubernetes_updater_interval_seconds_); kubernetes_endpoint_host_ = config["KubernetesEndpointHost"].as( - kKubernetesDefaultEndpointHost); + kubernetes_endpoint_host_); kubernetes_pod_label_selector_ = config["KubernetesPodLabelSelector"].as( - kKubernetesDefaultPodLabelSelector); + kubernetes_pod_label_selector_); kubernetes_cluster_name_ = config["KubernetesClusterName"].as( - kKubernetesDefaultClusterName); + kubernetes_cluster_name_); kubernetes_cluster_location_ = config["KubernetesClusterLocation"].as( - kKubernetesDefaultClusterLocation); + kubernetes_cluster_location_); kubernetes_node_name_ = - config["KubernetesNodeName"].as(kKubernetesDefaultNodeName); + config["KubernetesNodeName"].as(kubernetes_node_name_); kubernetes_use_watch_ = - config["KubernetesUseWatch"].as(kKubernetesDefaultUseWatch); + config["KubernetesUseWatch"].as(kubernetes_use_watch_); kubernetes_cluster_level_metadata_ = config["KubernetesClusterLevelMetadata"].as( - kKubernetesDefaultClusterLevelMetadata); + kubernetes_cluster_level_metadata_); instance_id_ = - config["InstanceId"].as(kDefaultInstanceId); + config["InstanceId"].as(instance_id_); instance_zone_ = - config["InstanceZone"].as(kDefaultInstanceZone); + config["InstanceZone"].as(instance_zone_); health_check_file_ = - config["HealthCheckFile"].as(kDefaultHealthCheckFile); + config["HealthCheckFile"].as(health_check_file_); } } // google From 939a2dbe66be1596799acb45501926d09fe0757c Mon Sep 17 00:00:00 2001 From: Supriya Garg Date: Fri, 30 Mar 2018 15:24:37 -0400 Subject: [PATCH 3/5] Address comments 2 --- src/configuration.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/configuration.cc b/src/configuration.cc index 5d37a635..c11086fb 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -165,7 +166,7 @@ int Configuration::ParseArguments(int ac, char** av) { } ParseConfigFile(config_file); - // Command line options overwrite the options provided in the config file. + // Command line options override the options provided in the config file. if (flags.count("option")) { std::stringstream input_stream; const std::vector options = From 210b5be4e571becbfab353ae877f29cbb56f698a Mon Sep 17 00:00:00 2001 From: Supriya Garg Date: Fri, 30 Mar 2018 16:23:03 -0400 Subject: [PATCH 4/5] Clean up unused imports and variables --- src/configuration.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/configuration.cc b/src/configuration.cc index c11086fb..f57f7e5c 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -16,11 +16,10 @@ #include "configuration.h" -#include #include +#include #include #include -#include #include #include @@ -124,7 +123,6 @@ Configuration::Configuration(std::istream& input) : Configuration() { int Configuration::ParseArguments(int ac, char** av) { std::string config_file; - std::string command_line_options; boost::program_options::options_description flags_desc; flags_desc.add_options() ("help,h", "Print help message") @@ -168,7 +166,7 @@ int Configuration::ParseArguments(int ac, char** av) { // Command line options override the options provided in the config file. if (flags.count("option")) { - std::stringstream input_stream; + std::stringstream option_stream; const std::vector options = flags["option"].as>(); for (const std::string& option: options) { @@ -180,13 +178,13 @@ int Configuration::ParseArguments(int ac, char** av) { const std::string key = option.substr(0, separator_pos); const std::string value = option.substr(separator_pos + 1, std::string::npos); - input_stream << key << ": " << value << "\n"; + option_stream << key << ": " << value << "\n"; } #ifdef VERBOSE - LOG(DEBUG) << "Options:\n" << input_stream.str(); + LOG(DEBUG) << "Options:\n" << option_stream.str(); #endif - ParseConfiguration(input_stream); + ParseConfiguration(option_stream); } return 0; From 571afca32b327251afd16bd9fb6ed4bb9cd4620a Mon Sep 17 00:00:00 2001 From: igorpeshansky Date: Sat, 31 Mar 2018 11:29:05 -0400 Subject: [PATCH 5/5] Whitespace --- src/configuration.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/configuration.cc b/src/configuration.cc index f57f7e5c..90dc40bd 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -238,16 +238,14 @@ void Configuration::ParseConfiguration(std::istream& input) { config["InstanceUpdaterIntervalSeconds"].as( instance_updater_interval_seconds_); instance_resource_type_ = - config["InstanceResourceType"].as( - instance_resource_type_); + config["InstanceResourceType"].as(instance_resource_type_); docker_updater_interval_seconds_ = config["DockerUpdaterIntervalSeconds"].as( docker_updater_interval_seconds_); docker_endpoint_host_ = config["DockerEndpointHost"].as(docker_endpoint_host_); docker_api_version_ = - config["DockerApiVersion"].as( - docker_api_version_); + config["DockerApiVersion"].as(docker_api_version_); docker_container_filter_ = config["DockerContainerFilter"].as( docker_container_filter_);