From b1444c156738d642d55ad0eb5139b67ef97dca46 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Mon, 2 Apr 2018 01:32:40 -0400 Subject: [PATCH 1/6] Revamp config implementation mechanism. --- src/configuration.cc | 218 +++++++++++++++++-------------------------- src/configuration.h | 15 ++- 2 files changed, 94 insertions(+), 139 deletions(-) diff --git a/src/configuration.cc b/src/configuration.cc index 3be46a26..d36bf4d6 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -81,59 +81,87 @@ constexpr const int kDefaultHealthCheckMaxDataAgeSeconds = 5*60; } +namespace { + +class Option { + public: + virtual void Set(const YAML::Node& value) = 0; +}; + +template +class OptionDef : public Option { + public: + OptionDef(T& var, const D& default_) : var_(var) { + var = default_; + } + void Set(const YAML::Node& value) { var_ = value.as(var_); } + private: + T& var_; +}; + +template +std::pair option( + const std::string& name, T& var, const D& default_) { + return {name, new OptionDef(var, default_)}; +} + +} + +class Configuration::OptionMap + : public std::map> { + public: + OptionMap(std::vector>&& v) { + for (const auto& p : v) { + emplace(p.first, p.second); + } + } +}; + Configuration::Configuration() - : project_id_(kDefaultProjectId), - credentials_file_(kDefaultCredentialsFile), - verbose_logging_(false), - metadata_api_num_threads_(kMetadataApiDefaultNumThreads), - metadata_api_port_(kMetadataApiDefaultPort), - metadata_api_bind_address_(kMetadataApiDefaultBindAddress), - metadata_api_resource_type_separator_( - kMetadataApiDefaultResourceTypeSeparator), - metadata_reporter_interval_seconds_( - kMetadataReporterDefaultIntervalSeconds), - metadata_reporter_purge_deleted_( - kMetadataReporterDefaultPurgeDeleted), - metadata_reporter_user_agent_( - kMetadataReporterDefaultUserAgent), - metadata_ingestion_endpoint_format_( - kMetadataIngestionDefaultEndpointFormat), - metadata_ingestion_request_size_limit_bytes_( - kMetadataIngestionDefaultRequestSizeLimitBytes), - metadata_ingestion_request_size_limit_count_( - kMetadataIngestionDefaultRequestSizeLimitCount), - metadata_ingestion_raw_content_version_( - kMetadataIngestionDefaultRawContentVersion), - instance_updater_interval_seconds_( - kInstanceUpdaterDefaultIntervalSeconds), - instance_resource_type_(kDefaultInstanceResourceType), - docker_updater_interval_seconds_(kDockerUpdaterDefaultIntervalSeconds), - docker_endpoint_host_(kDockerDefaultEndpointHost), - docker_api_version_(kDockerDefaultApiVersion), - docker_container_filter_(kDockerDefaultContainerFilter), - kubernetes_updater_interval_seconds_( - kKubernetesUpdaterDefaultIntervalSeconds), - kubernetes_updater_watch_connection_retries_( - kKubernetesUpdaterDefaultWatchConnectionRetries), - kubernetes_endpoint_host_(kKubernetesDefaultEndpointHost), - kubernetes_pod_label_selector_(kKubernetesDefaultPodLabelSelector), - kubernetes_cluster_name_(kKubernetesDefaultClusterName), - kubernetes_cluster_location_(kKubernetesDefaultClusterLocation), - kubernetes_node_name_(kKubernetesDefaultNodeName), - kubernetes_use_watch_(kKubernetesDefaultUseWatch), - kubernetes_cluster_level_metadata_( - kKubernetesDefaultClusterLevelMetadata), - kubernetes_service_metadata_(kKubernetesDefaultServiceMetadata), - instance_id_(kDefaultInstanceId), - instance_zone_(kDefaultInstanceZone), - health_check_file_(kDefaultHealthCheckFile), - health_check_max_data_age_seconds_( - kDefaultHealthCheckMaxDataAgeSeconds) {} + : verbose_logging_(false), + options_(new OptionMap({ + option("ProjectId", project_id_, ""), + option("CredentialsFile", credentials_file_, ""), + option("MetadataApiNumThreads", metadata_api_num_threads_, 3), + option("MetadataApiPort", metadata_api_port_, 8000), + option("MetadataApiBindAddress", metadata_api_bind_address_, "0.0.0.0"), + option("MetadataApiResourceTypeSeparator", metadata_api_resource_type_separator_, "."), + option("MetadataReporterIntervalSeconds", metadata_reporter_interval_seconds_, 60), + option("MetadataReporterPurgeDeleted", metadata_reporter_purge_deleted_, false), + option("MetadataReporterUserAgent", metadata_reporter_user_agent_, "metadata-agent/" STRINGIFY(AGENT_VERSION)), + option("MetadataIngestionEndpointFormat", metadata_ingestion_endpoint_format_, "https://stackdriver.googleapis.com/v1beta2/projects/{{project_id}}/resourceMetadata:batchUpdate"), + option("MetadataIngestionRequestSizeLimitBytes", metadata_ingestion_request_size_limit_bytes_, 8*1024*1024), + option("MetadataIngestionRequestSizeLimitCount", metadata_ingestion_request_size_limit_count_, 1000), + option("MetadataIngestionRawContentVersion", metadata_ingestion_raw_content_version_, "0.1"), + option("InstanceUpdaterIntervalSeconds", instance_updater_interval_seconds_, 60*60), + // A blank value means "unspecified; detect via environment". + option("InstanceResourceType", instance_resource_type_, ""), + option("DockerUpdaterIntervalSeconds", docker_updater_interval_seconds_, 0), + option("DockerEndpointHost", docker_endpoint_host_, "unix://%2Fvar%2Frun%2Fdocker.sock/"), + option("DockerApiVersion", docker_api_version_, "1.23"), + option("DockerContainerFilter", docker_container_filter_, "limit=30"), + option("KubernetesUpdaterIntervalSeconds", kubernetes_updater_interval_seconds_, 0), + option("KubernetesUpdaterWatchConnectionRetries", kubernetes_updater_watch_connection_retries_, 15), + option("KubernetesEndpointHost", kubernetes_endpoint_host_, "https://kubernetes.default.svc"), + option("KubernetesPodLabelSelector", kubernetes_pod_label_selector_, ""), + option("KubernetesClusterName", kubernetes_cluster_name_, ""), + option("KubernetesClusterLocation", kubernetes_cluster_location_, ""), + option("KubernetesNodeName", kubernetes_node_name_, ""), + option("KubernetesUseWatch", kubernetes_use_watch_, false), + option("KubernetesClusterLevelMetadata", kubernetes_cluster_level_metadata_, false), + option("KubernetesServiceMetadata", kubernetes_service_metadata_, true), + option("InstanceId", instance_id_, ""), + option("InstanceZone", instance_zone_, ""), + option("HealthCheckFile", health_check_file_, "/var/run/metadata-agent/health/unhealthy"), + option("HealthCheckMaxDataAgeSeconds", health_check_max_data_age_seconds_, 5*60), + })) {} Configuration::Configuration(std::istream& input) : Configuration() { ParseConfiguration(input); } +Configuration::~Configuration() = default; + int Configuration::ParseArguments(int ac, char** av) { std::string config_file; boost::program_options::options_description flags_desc; @@ -219,93 +247,15 @@ void Configuration::ParseConfigFile(const std::string& filename) { void Configuration::ParseConfiguration(std::istream& input) { YAML::Node config = YAML::Load(input); std::lock_guard lock(mutex_); - project_id_ = - config["ProjectId"].as(project_id_); - credentials_file_ = - config["CredentialsFile"].as(credentials_file_); - metadata_api_num_threads_ = - config["MetadataApiNumThreads"].as(metadata_api_num_threads_); - metadata_api_port_ = - config["MetadataApiPort"].as(metadata_api_port_); - metadata_api_bind_address_ = - config["MetadataApiBindAddress"].as( - metadata_api_bind_address_); - metadata_api_resource_type_separator_ = - config["MetadataApiResourceTypeSeparator"].as( - metadata_api_resource_type_separator_); - metadata_reporter_interval_seconds_ = - config["MetadataReporterIntervalSeconds"].as( - metadata_reporter_interval_seconds_); - metadata_reporter_purge_deleted_ = - config["MetadataReporterPurgeDeleted"].as( - metadata_reporter_purge_deleted_); - metadata_reporter_user_agent_ = - config["MetadataReporterUserAgent"].as( - metadata_reporter_user_agent_); - metadata_ingestion_endpoint_format_ = - config["MetadataIngestionEndpointFormat"].as( - metadata_ingestion_endpoint_format_); - metadata_ingestion_request_size_limit_bytes_ = - config["MetadataIngestionRequestSizeLimitBytes"].as( - metadata_ingestion_request_size_limit_bytes_); - metadata_ingestion_request_size_limit_count_ = - config["MetadataIngestionRequestSizeLimitCount"].as( - metadata_ingestion_request_size_limit_count_); - metadata_ingestion_raw_content_version_ = - config["MetadataIngestionRawContentVersion"].as( - metadata_ingestion_raw_content_version_); - instance_updater_interval_seconds_ = - config["InstanceUpdaterIntervalSeconds"].as( - instance_updater_interval_seconds_); - 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_); - docker_container_filter_ = - config["DockerContainerFilter"].as( - docker_container_filter_); - kubernetes_updater_interval_seconds_ = - config["KubernetesUpdaterIntervalSeconds"].as( - kubernetes_updater_interval_seconds_); - kubernetes_updater_watch_connection_retries_ = - config["KubernetesUpdaterWatchConnectionRetries"].as( - kubernetes_updater_watch_connection_retries_); - kubernetes_endpoint_host_ = - config["KubernetesEndpointHost"].as( - kubernetes_endpoint_host_); - kubernetes_pod_label_selector_ = - config["KubernetesPodLabelSelector"].as( - kubernetes_pod_label_selector_); - kubernetes_cluster_name_ = - config["KubernetesClusterName"].as( - kubernetes_cluster_name_); - kubernetes_cluster_location_ = - config["KubernetesClusterLocation"].as( - kubernetes_cluster_location_); - kubernetes_node_name_ = - config["KubernetesNodeName"].as(kubernetes_node_name_); - kubernetes_use_watch_ = - config["KubernetesUseWatch"].as(kubernetes_use_watch_); - kubernetes_cluster_level_metadata_ = - config["KubernetesClusterLevelMetadata"].as( - kubernetes_cluster_level_metadata_); - kubernetes_service_metadata_ = - config["KubernetesServiceMetadata"].as( - kubernetes_service_metadata_); - instance_id_ = - config["InstanceId"].as(instance_id_); - instance_zone_ = - config["InstanceZone"].as(instance_zone_); - health_check_file_ = - config["HealthCheckFile"].as(health_check_file_); - health_check_max_data_age_seconds_ = - config["HealthCheckMaxDataAgeSeconds"].as( - health_check_max_data_age_seconds_); + for (const auto& kv : config) { + const std::string key = kv.first.as(); + auto option_it = options_->find(key); + if (option_it != options_->end()) { + option_it->second->Set(kv.second); + } else { + std::cerr << "Invalid option " << key << std::endl; + } + } } } // google diff --git a/src/configuration.h b/src/configuration.h index d7f1f5ca..927454cb 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -29,8 +29,13 @@ class Configuration { Configuration(std::istream& input); // Used to accept inline construction of streams. Configuration(std::istream&& input) : Configuration(input) {} + ~Configuration(); // Shared configuration. + bool VerboseLogging() const { + std::lock_guard lock(mutex_); + return verbose_logging_; + } const std::string& ProjectId() const { std::lock_guard lock(mutex_); return project_id_; @@ -39,10 +44,6 @@ class Configuration { std::lock_guard lock(mutex_); return credentials_file_; } - bool VerboseLogging() const { - std::lock_guard lock(mutex_); - return verbose_logging_; - } // Metadata API server configuration options. int MetadataApiNumThreads() const { std::lock_guard lock(mutex_); @@ -179,6 +180,8 @@ class Configuration { friend class ConfigurationArgumentParserTest; friend int ::main(int, char**); // Calls ParseArguments. + class OptionMap; // Internal helper class. + void ParseConfigFile(const std::string& filename); void ParseConfiguration(std::istream& input); // Parse the command line. @@ -189,9 +192,9 @@ class Configuration { int ParseArguments(int ac, char** av); mutable std::mutex mutex_; + bool verbose_logging_; std::string project_id_; std::string credentials_file_; - bool verbose_logging_; int metadata_api_num_threads_; int metadata_api_port_; std::string metadata_api_bind_address_; @@ -223,6 +226,8 @@ class Configuration { std::string instance_zone_; std::string health_check_file_; int health_check_max_data_age_seconds_; + + std::unique_ptr options_; }; } From 4c3ff9bcf3c4b6d9e0d459f4d25958fb00f0d632 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Mon, 2 Apr 2018 02:32:59 -0400 Subject: [PATCH 2/6] Make config map initialization nicer. Remove unused constants. --- src/configuration.cc | 144 ++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 83 deletions(-) diff --git a/src/configuration.cc b/src/configuration.cc index d36bf4d6..b2d0d6dd 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -35,53 +35,8 @@ namespace google { namespace { -constexpr const char kConfigFileFlag[] = "config-file"; - -constexpr const char kDefaultProjectId[] = ""; -constexpr const char kDefaultCredentialsFile[] = ""; -constexpr const int kMetadataApiDefaultNumThreads = 3; -constexpr const int kMetadataApiDefaultPort = 8000; -constexpr const char kMetadataApiDefaultBindAddress[] = "0.0.0.0"; -constexpr const char kMetadataApiDefaultResourceTypeSeparator[] = "."; -constexpr const int kMetadataReporterDefaultIntervalSeconds = 60; -constexpr const int kMetadataReporterDefaultPurgeDeleted = false; -constexpr const char kMetadataReporterDefaultUserAgent[] = - "metadata-agent/" STRINGIFY(AGENT_VERSION); -constexpr const char kMetadataIngestionDefaultEndpointFormat[] = - "https://stackdriver.googleapis.com/v1beta2/projects/{{project_id}}" - "/resourceMetadata:batchUpdate"; -constexpr const int kMetadataIngestionDefaultRequestSizeLimitBytes = - 8*1024*1024; -constexpr const int kMetadataIngestionDefaultRequestSizeLimitCount = 1000; -constexpr const char kMetadataIngestionDefaultRawContentVersion[] = "0.1"; -constexpr const int kInstanceUpdaterDefaultIntervalSeconds = 60*60; -constexpr const char kDefaultInstanceResourceType[] = - ""; // A blank value means "unspecified; detect via environment". -constexpr const int kDockerUpdaterDefaultIntervalSeconds = 0; -constexpr const char kDockerDefaultEndpointHost[] = - "unix://%2Fvar%2Frun%2Fdocker.sock/"; -constexpr const char kDockerDefaultApiVersion[] = "1.23"; -constexpr const char kDockerDefaultContainerFilter[] = "limit=30"; -constexpr const int kKubernetesUpdaterDefaultIntervalSeconds = 0; -constexpr const int kKubernetesUpdaterDefaultWatchConnectionRetries = 15; -constexpr const char kKubernetesDefaultEndpointHost[] = - "https://kubernetes.default.svc"; -constexpr const char kKubernetesDefaultPodLabelSelector[] = ""; -constexpr const char kKubernetesDefaultClusterName[] = ""; -constexpr const char kKubernetesDefaultClusterLocation[] = ""; -constexpr const char kKubernetesDefaultNodeName[] = ""; -constexpr const bool kKubernetesDefaultUseWatch = false; -constexpr const bool kKubernetesDefaultClusterLevelMetadata = false; -constexpr const bool kKubernetesDefaultServiceMetadata = true; -constexpr const char kDefaultInstanceId[] = ""; -constexpr const char kDefaultInstanceZone[] = ""; -constexpr const char kDefaultHealthCheckFile[] = - "/var/run/metadata-agent/health/unhealthy"; -constexpr const int kDefaultHealthCheckMaxDataAgeSeconds = 5*60; - -} -namespace { +constexpr const char kConfigFileFlag[] = "config-file"; class Option { public: @@ -100,9 +55,8 @@ class OptionDef : public Option { }; template -std::pair option( - const std::string& name, T& var, const D& default_) { - return {name, new OptionDef(var, default_)}; +Option* option(T& var, const D& default_) { + return new OptionDef(var, default_); } } @@ -110,7 +64,7 @@ std::pair option( class Configuration::OptionMap : public std::map> { public: - OptionMap(std::vector>&& v) { + OptionMap(std::vector>&& v) { for (const auto& p : v) { emplace(p.first, p.second); } @@ -120,40 +74,64 @@ class Configuration::OptionMap Configuration::Configuration() : verbose_logging_(false), options_(new OptionMap({ - option("ProjectId", project_id_, ""), - option("CredentialsFile", credentials_file_, ""), - option("MetadataApiNumThreads", metadata_api_num_threads_, 3), - option("MetadataApiPort", metadata_api_port_, 8000), - option("MetadataApiBindAddress", metadata_api_bind_address_, "0.0.0.0"), - option("MetadataApiResourceTypeSeparator", metadata_api_resource_type_separator_, "."), - option("MetadataReporterIntervalSeconds", metadata_reporter_interval_seconds_, 60), - option("MetadataReporterPurgeDeleted", metadata_reporter_purge_deleted_, false), - option("MetadataReporterUserAgent", metadata_reporter_user_agent_, "metadata-agent/" STRINGIFY(AGENT_VERSION)), - option("MetadataIngestionEndpointFormat", metadata_ingestion_endpoint_format_, "https://stackdriver.googleapis.com/v1beta2/projects/{{project_id}}/resourceMetadata:batchUpdate"), - option("MetadataIngestionRequestSizeLimitBytes", metadata_ingestion_request_size_limit_bytes_, 8*1024*1024), - option("MetadataIngestionRequestSizeLimitCount", metadata_ingestion_request_size_limit_count_, 1000), - option("MetadataIngestionRawContentVersion", metadata_ingestion_raw_content_version_, "0.1"), - option("InstanceUpdaterIntervalSeconds", instance_updater_interval_seconds_, 60*60), + {"ProjectId", option(project_id_, "")}, + {"CredentialsFile", option(credentials_file_, "")}, + {"MetadataApiNumThreads", option(metadata_api_num_threads_, 3)}, + {"MetadataApiPort", option(metadata_api_port_, 8000)}, + {"MetadataApiBindAddress", + option(metadata_api_bind_address_, "0.0.0.0")}, + {"MetadataApiResourceTypeSeparator", + option(metadata_api_resource_type_separator_, ".")}, + {"MetadataReporterIntervalSeconds", + option(metadata_reporter_interval_seconds_, 60)}, + {"MetadataReporterPurgeDeleted", + option(metadata_reporter_purge_deleted_, false)}, + {"MetadataReporterUserAgent", + option(metadata_reporter_user_agent_, + "metadata-agent/" STRINGIFY(AGENT_VERSION))}, + {"MetadataIngestionEndpointFormat", + option(metadata_ingestion_endpoint_format_, + "https://stackdriver.googleapis.com/v1beta2/projects/" + "{{project_id}}/resourceMetadata:batchUpdate")}, + {"MetadataIngestionRequestSizeLimitBytes", + option(metadata_ingestion_request_size_limit_bytes_, 8*1024*1024)}, + {"MetadataIngestionRequestSizeLimitCount", + option(metadata_ingestion_request_size_limit_count_, 1000)}, + {"MetadataIngestionRawContentVersion", + option(metadata_ingestion_raw_content_version_, "0.1")}, + {"InstanceUpdaterIntervalSeconds", + option(instance_updater_interval_seconds_, 60*60)}, // A blank value means "unspecified; detect via environment". - option("InstanceResourceType", instance_resource_type_, ""), - option("DockerUpdaterIntervalSeconds", docker_updater_interval_seconds_, 0), - option("DockerEndpointHost", docker_endpoint_host_, "unix://%2Fvar%2Frun%2Fdocker.sock/"), - option("DockerApiVersion", docker_api_version_, "1.23"), - option("DockerContainerFilter", docker_container_filter_, "limit=30"), - option("KubernetesUpdaterIntervalSeconds", kubernetes_updater_interval_seconds_, 0), - option("KubernetesUpdaterWatchConnectionRetries", kubernetes_updater_watch_connection_retries_, 15), - option("KubernetesEndpointHost", kubernetes_endpoint_host_, "https://kubernetes.default.svc"), - option("KubernetesPodLabelSelector", kubernetes_pod_label_selector_, ""), - option("KubernetesClusterName", kubernetes_cluster_name_, ""), - option("KubernetesClusterLocation", kubernetes_cluster_location_, ""), - option("KubernetesNodeName", kubernetes_node_name_, ""), - option("KubernetesUseWatch", kubernetes_use_watch_, false), - option("KubernetesClusterLevelMetadata", kubernetes_cluster_level_metadata_, false), - option("KubernetesServiceMetadata", kubernetes_service_metadata_, true), - option("InstanceId", instance_id_, ""), - option("InstanceZone", instance_zone_, ""), - option("HealthCheckFile", health_check_file_, "/var/run/metadata-agent/health/unhealthy"), - option("HealthCheckMaxDataAgeSeconds", health_check_max_data_age_seconds_, 5*60), + {"InstanceResourceType", option(instance_resource_type_, "")}, + {"DockerUpdaterIntervalSeconds", + option(docker_updater_interval_seconds_, 0)}, + {"DockerEndpointHost", + option(docker_endpoint_host_, "unix://%2Fvar%2Frun%2Fdocker.sock/")}, + {"DockerApiVersion", option(docker_api_version_, "1.23")}, + {"DockerContainerFilter", option(docker_container_filter_, "limit=30")}, + {"KubernetesUpdaterIntervalSeconds", + option(kubernetes_updater_interval_seconds_, 0)}, + {"KubernetesUpdaterWatchConnectionRetries", + option(kubernetes_updater_watch_connection_retries_, 15)}, + {"KubernetesEndpointHost", + option(kubernetes_endpoint_host_, "https://kubernetes.default.svc")}, + {"KubernetesPodLabelSelector", + option(kubernetes_pod_label_selector_, "")}, + {"KubernetesClusterName", option(kubernetes_cluster_name_, "")}, + {"KubernetesClusterLocation", option(kubernetes_cluster_location_, "")}, + {"KubernetesNodeName", option(kubernetes_node_name_, "")}, + {"KubernetesUseWatch", option(kubernetes_use_watch_, false)}, + {"KubernetesClusterLevelMetadata", + option(kubernetes_cluster_level_metadata_, false)}, + {"KubernetesServiceMetadata", + option(kubernetes_service_metadata_, true)}, + {"InstanceId", option(instance_id_, "")}, + {"InstanceZone", option(instance_zone_, "")}, + {"HealthCheckFile", + option(health_check_file_, + "/var/run/metadata-agent/health/unhealthy")}, + {"HealthCheckMaxDataAgeSeconds", + option(health_check_max_data_age_seconds_, 5*60)}, })) {} Configuration::Configuration(std::istream& input) : Configuration() { From 843e390f420c6f1c84e7173960afa3e09b1092fe Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Tue, 3 Apr 2018 21:12:51 -0400 Subject: [PATCH 3/6] Instruct the compiler to not inline config accessors. --- src/Makefile | 3 ++- src/configuration.h | 66 ++++++++++++++++++++++----------------------- test/Makefile | 6 ++++- 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/Makefile b/src/Makefile index 24bb4301..7df5e2eb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,6 +19,7 @@ CMAKE=cmake CPPFLAGS=\ -DAGENT_VERSION='$(PKG_VERSION)-$(PKG_RELEASE)' \ -DENABLE_DOCKER_METADATA \ + -DNOOPT= \ -I$(CPP_NETLIB_DIR) -I$(NETWORK_URI_DIR)/include -I$(YAML_CPP_DIR)/include CXXFLAGS=\ -std=c++11 -g -pthread -Wno-write-strings -Wno-deprecated @@ -31,7 +32,7 @@ SED_EXTRA=-e 's/-Wall/-Wall -Wno-deprecated/' UNAME_S=$(shell uname -s) ifeq ($(UNAME_S),Darwin) - CPPFLAGS+= -I/usr/local/include -I/usr/local/opt/openssl/include + CPPFLAGS+= -UNOOPT -DNOOPT='[[clang::optnone]]' -I/usr/local/include -I/usr/local/opt/openssl/include CXXFLAGS+= -Wno-deprecated-declarations -Wno-c++14-extensions LDFLAGS+= -L/usr/local/lib -L/usr/local/opt/openssl/lib SED_I+= '' diff --git a/src/configuration.h b/src/configuration.h index 927454cb..d881902c 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -32,124 +32,124 @@ class Configuration { ~Configuration(); // Shared configuration. - bool VerboseLogging() const { + NOOPT bool VerboseLogging() const { std::lock_guard lock(mutex_); return verbose_logging_; } - const std::string& ProjectId() const { + NOOPT const std::string& ProjectId() const { std::lock_guard lock(mutex_); return project_id_; } - const std::string& CredentialsFile() const { + NOOPT const std::string& CredentialsFile() const { std::lock_guard lock(mutex_); return credentials_file_; } // Metadata API server configuration options. - int MetadataApiNumThreads() const { + NOOPT int MetadataApiNumThreads() const { std::lock_guard lock(mutex_); return metadata_api_num_threads_; } - int MetadataApiPort() const { + NOOPT int MetadataApiPort() const { std::lock_guard lock(mutex_); return metadata_api_port_; } - const std::string& MetadataApiBindAddress() const { + NOOPT const std::string& MetadataApiBindAddress() const { std::lock_guard lock(mutex_); return metadata_api_bind_address_; } - const std::string& MetadataApiResourceTypeSeparator() const { + NOOPT const std::string& MetadataApiResourceTypeSeparator() const { std::lock_guard lock(mutex_); return metadata_api_resource_type_separator_; } // Metadata reporter options. - int MetadataReporterIntervalSeconds() const { + NOOPT int MetadataReporterIntervalSeconds() const { std::lock_guard lock(mutex_); return metadata_reporter_interval_seconds_; } - bool MetadataReporterPurgeDeleted() const { + NOOPT bool MetadataReporterPurgeDeleted() const { std::lock_guard lock(mutex_); return metadata_reporter_purge_deleted_; } - const std::string& MetadataReporterUserAgent() const { + NOOPT const std::string& MetadataReporterUserAgent() const { std::lock_guard lock(mutex_); return metadata_reporter_user_agent_; } - const std::string& MetadataIngestionEndpointFormat() const { + NOOPT const std::string& MetadataIngestionEndpointFormat() const { std::lock_guard lock(mutex_); return metadata_ingestion_endpoint_format_; } - int MetadataIngestionRequestSizeLimitBytes() const { + NOOPT int MetadataIngestionRequestSizeLimitBytes() const { std::lock_guard lock(mutex_); return metadata_ingestion_request_size_limit_bytes_; } - int MetadataIngestionRequestSizeLimitCount() const { + NOOPT int MetadataIngestionRequestSizeLimitCount() const { std::lock_guard lock(mutex_); return metadata_ingestion_request_size_limit_count_; } - const std::string& MetadataIngestionRawContentVersion() const { + NOOPT const std::string& MetadataIngestionRawContentVersion() const { std::lock_guard lock(mutex_); return metadata_ingestion_raw_content_version_; } // Instance metadata updater options. - int InstanceUpdaterIntervalSeconds() const { + NOOPT int InstanceUpdaterIntervalSeconds() const { std::lock_guard lock(mutex_); return instance_updater_interval_seconds_; } - const std::string& InstanceResourceType() const { + NOOPT const std::string& InstanceResourceType() const { std::lock_guard lock(mutex_); return instance_resource_type_; } // Docker metadata updater options. - int DockerUpdaterIntervalSeconds() const { + NOOPT int DockerUpdaterIntervalSeconds() const { std::lock_guard lock(mutex_); return docker_updater_interval_seconds_; } - const std::string& DockerEndpointHost() const { + NOOPT const std::string& DockerEndpointHost() const { std::lock_guard lock(mutex_); return docker_endpoint_host_; } - const std::string& DockerApiVersion() const { + NOOPT const std::string& DockerApiVersion() const { std::lock_guard lock(mutex_); return docker_api_version_; } - const std::string& DockerContainerFilter() const { + NOOPT const std::string& DockerContainerFilter() const { std::lock_guard lock(mutex_); return docker_container_filter_; } // GKE metadata updater options. - int KubernetesUpdaterIntervalSeconds() const { + NOOPT int KubernetesUpdaterIntervalSeconds() const { std::lock_guard lock(mutex_); return kubernetes_updater_interval_seconds_; } - int KubernetesUpdaterWatchConnectionRetries() const { + NOOPT int KubernetesUpdaterWatchConnectionRetries() const { std::lock_guard lock(mutex_); return kubernetes_updater_watch_connection_retries_; } - const std::string& KubernetesEndpointHost() const { + NOOPT const std::string& KubernetesEndpointHost() const { std::lock_guard lock(mutex_); return kubernetes_endpoint_host_; } - const std::string& KubernetesPodLabelSelector() const { + NOOPT const std::string& KubernetesPodLabelSelector() const { std::lock_guard lock(mutex_); return kubernetes_pod_label_selector_; } - const std::string& KubernetesClusterName() const { + NOOPT const std::string& KubernetesClusterName() const { std::lock_guard lock(mutex_); return kubernetes_cluster_name_; } - const std::string& KubernetesClusterLocation() const { + NOOPT const std::string& KubernetesClusterLocation() const { std::lock_guard lock(mutex_); return kubernetes_cluster_location_; } - const std::string& KubernetesNodeName() const { + NOOPT const std::string& KubernetesNodeName() const { std::lock_guard lock(mutex_); return kubernetes_node_name_; } - bool KubernetesUseWatch() const { + NOOPT bool KubernetesUseWatch() const { std::lock_guard lock(mutex_); return kubernetes_use_watch_; } - bool KubernetesClusterLevelMetadata() const { + NOOPT bool KubernetesClusterLevelMetadata() const { std::lock_guard lock(mutex_); return kubernetes_cluster_level_metadata_; } @@ -158,20 +158,20 @@ class Configuration { return kubernetes_service_metadata_; } // Common metadata updater options. - const std::string& InstanceId() const { + NOOPT const std::string& InstanceId() const { std::lock_guard lock(mutex_); return instance_id_; } - const std::string& InstanceZone() const { + NOOPT const std::string& InstanceZone() const { std::lock_guard lock(mutex_); return instance_zone_; } - const std::string& HealthCheckFile() const { + NOOPT const std::string& HealthCheckFile() const { std::lock_guard lock(mutex_); return health_check_file_; } - int HealthCheckMaxDataAgeSeconds() const { + NOOPT int HealthCheckMaxDataAgeSeconds() const { std::lock_guard lock(mutex_); return health_check_max_data_age_seconds_; } diff --git a/test/Makefile b/test/Makefile index 3e5e6b94..7ba85f9b 100644 --- a/test/Makefile +++ b/test/Makefile @@ -22,6 +22,7 @@ CPP_NETLIB_LIBS=\ YAML_CPP_LIBS=$(YAML_CPP_LIBDIR)/libyaml-cpp.a CPPFLAGS+= \ + -DNOOPT= \ -isystem $(GTEST_DIR)/include -I$(GMOCK_DIR)/include \ -I$(CPP_NETLIB_DIR) -I$(NETWORK_URI_DIR)/include -I$(YAML_CPP_DIR)/include CXXFLAGS=\ @@ -34,9 +35,12 @@ LDLIBS=\ UNAME_S=$(shell uname -s) ifeq ($(UNAME_S),Darwin) - CPPFLAGS+= -I/usr/local/include -I/usr/local/opt/openssl/include + CPPFLAGS+= -UNOOPT -DNOOPT='[[clang::optnone]]' -I/usr/local/include -I/usr/local/opt/openssl/include CXXFLAGS+= -Wno-deprecated-declarations -Wno-c++14-extensions LDFLAGS+= -L/usr/local/lib -L/usr/local/opt/openssl/lib + SED_I+= '' + SED_EXTRA+= -e \ + 's/-Wall/-Wall -Wno-deprecated-declarations -Wno-unused-local-typedef/' endif # Where to find code under test. From 1a88e639a8be2e0397030d4ed1d4d5a292e96846 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Thu, 24 May 2018 15:49:06 -0400 Subject: [PATCH 4/6] Some Linux build fixes. --- src/configuration.cc | 2 +- src/configuration.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/configuration.cc b/src/configuration.cc index b2d0d6dd..7e2d11f5 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -66,7 +66,7 @@ class Configuration::OptionMap public: OptionMap(std::vector>&& v) { for (const auto& p : v) { - emplace(p.first, p.second); + emplace(p.first, std::unique_ptr