diff --git a/src/configuration.cc b/src/configuration.cc index 3be46a26..7e2d11f5 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -35,105 +35,111 @@ 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; +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 +Option* option(T& var, const D& default_) { + return new OptionDef(var, default_); } +} + +class Configuration::OptionMap + : public std::map> { + public: + OptionMap(std::vector>&& v) { + for (const auto& p : v) { + emplace(p.first, std::unique_ptr