diff --git a/api/datadoghq/common/envvar.go b/api/datadoghq/common/envvar.go index 94c26e8a7..cecab2524 100644 --- a/api/datadoghq/common/envvar.go +++ b/api/datadoghq/common/envvar.go @@ -150,6 +150,8 @@ const ( DDSBOMHostEnabled = "DD_SBOM_HOST_ENABLED" DDSBOMHostAnalyzers = "DD_SBOM_HOST_ANALYZERS" DDSecretBackendCommand = "DD_SECRET_BACKEND_COMMAND" + DDSecretBackendArguments = "DD_SECRET_BACKEND_ARGUMENTS" + DDSecretBackendTimeout = "DD_SECRET_BACKEND_TIMEOUT" DDSite = "DD_SITE" DDSystemProbeAgentEnabled = "DD_SYSTEM_PROBE_ENABLED" DDSystemProbeBPFDebugEnabled = DDSystemProbeEnvPrefix + "BPF_DEBUG" diff --git a/api/datadoghq/v2alpha1/const.go b/api/datadoghq/v2alpha1/const.go index 346c5c978..7fe87e8f9 100644 --- a/api/datadoghq/v2alpha1/const.go +++ b/api/datadoghq/v2alpha1/const.go @@ -108,6 +108,7 @@ const ( DefaultAgentImageName string = "agent" DefaultClusterAgentImageName string = "cluster-agent" DefaultImageRegistry string = "gcr.io/datadoghq" + DefaultAzureImageRegistry string = "datadoghq.azurecr.io" DefaultEuropeImageRegistry string = "eu.gcr.io/datadoghq" DefaultAsiaImageRegistry string = "asia.gcr.io/datadoghq" DefaultGovImageRegistry string = "public.ecr.aws/datadog" diff --git a/api/datadoghq/v2alpha1/datadogagent_default.go b/api/datadoghq/v2alpha1/datadogagent_default.go index cfc4194d6..2c641c7bb 100644 --- a/api/datadoghq/v2alpha1/datadogagent_default.go +++ b/api/datadoghq/v2alpha1/datadogagent_default.go @@ -16,6 +16,7 @@ const ( defaultSite string = "datadoghq.com" defaultEuropeSite string = "datadoghq.eu" defaultAsiaSite string = "ap1.datadoghq.com" + defaultAzureSite string = "us3.datadoghq.com" defaultGovSite string = "ddog-gov.com" defaultLogLevel string = "info" @@ -60,10 +61,12 @@ const ( defaultDogstatsdSocketEnabled bool = true defaultDogstatsdHostSocketPath string = apicommon.DogstatsdAPMSocketHostPath + "/" + apicommon.DogstatsdSocketName - defaultOTLPGRPCEnabled bool = false - defaultOTLPGRPCEndpoint string = "0.0.0.0:4317" - defaultOTLPHTTPEnabled bool = false - defaultOTLPHTTPEndpoint string = "0.0.0.0:4318" + defaultOTLPGRPCEnabled bool = false + defaultOTLPGRPCHostPortEnabled bool = true + defaultOTLPGRPCEndpoint string = "0.0.0.0:4317" + defaultOTLPHTTPEnabled bool = false + defaultOTLPHTTPHostPortEnabled bool = true + defaultOTLPHTTPEndpoint string = "0.0.0.0:4318" defaultRemoteConfigurationEnabled bool = true @@ -140,6 +143,8 @@ func defaultGlobalConfig(ddaSpec *DatadogAgentSpec) { ddaSpec.Global.Registry = apiutils.NewStringPointer(DefaultEuropeImageRegistry) case defaultAsiaSite: ddaSpec.Global.Registry = apiutils.NewStringPointer(DefaultAsiaImageRegistry) + case defaultAzureSite: + ddaSpec.Global.Registry = apiutils.NewStringPointer(DefaultAzureImageRegistry) case defaultGovSite: ddaSpec.Global.Registry = apiutils.NewStringPointer(DefaultGovImageRegistry) default: @@ -378,13 +383,31 @@ func defaultFeaturesConfig(ddaSpec *DatadogAgentSpec) { if ddaSpec.Features.OTLP.Receiver.Protocols.GRPC == nil { ddaSpec.Features.OTLP.Receiver.Protocols.GRPC = &OTLPGRPCConfig{} } + apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.OTLP.Receiver.Protocols.GRPC.Enabled, defaultOTLPGRPCEnabled) + + if apiutils.BoolValue(ddaSpec.Features.OTLP.Receiver.Protocols.GRPC.Enabled) { + if ddaSpec.Features.OTLP.Receiver.Protocols.GRPC.HostPortConfig == nil { + ddaSpec.Features.OTLP.Receiver.Protocols.GRPC.HostPortConfig = &HostPortConfig{} + } + apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.OTLP.Receiver.Protocols.GRPC.HostPortConfig.Enabled, defaultOTLPGRPCHostPortEnabled) + } + apiutils.DefaultStringIfUnset(&ddaSpec.Features.OTLP.Receiver.Protocols.GRPC.Endpoint, defaultOTLPGRPCEndpoint) if ddaSpec.Features.OTLP.Receiver.Protocols.HTTP == nil { ddaSpec.Features.OTLP.Receiver.Protocols.HTTP = &OTLPHTTPConfig{} } + apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.OTLP.Receiver.Protocols.HTTP.Enabled, defaultOTLPHTTPEnabled) + + if apiutils.BoolValue(ddaSpec.Features.OTLP.Receiver.Protocols.HTTP.Enabled) { + if ddaSpec.Features.OTLP.Receiver.Protocols.HTTP.HostPortConfig == nil { + ddaSpec.Features.OTLP.Receiver.Protocols.HTTP.HostPortConfig = &HostPortConfig{} + } + apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.OTLP.Receiver.Protocols.HTTP.HostPortConfig.Enabled, defaultOTLPHTTPHostPortEnabled) + } + apiutils.DefaultStringIfUnset(&ddaSpec.Features.OTLP.Receiver.Protocols.HTTP.Endpoint, defaultOTLPHTTPEndpoint) // RemoteConfiguration feature diff --git a/api/datadoghq/v2alpha1/datadogagent_default_test.go b/api/datadoghq/v2alpha1/datadogagent_default_test.go index 02a7ecc01..7533de7cb 100644 --- a/api/datadoghq/v2alpha1/datadogagent_default_test.go +++ b/api/datadoghq/v2alpha1/datadogagent_default_test.go @@ -68,6 +68,21 @@ func Test_defaultGlobal(t *testing.T) { }, }, }, + { + name: "test registry defaulting based on site - Azure", + ddaSpec: &DatadogAgentSpec{ + Global: &GlobalConfig{ + Site: apiutils.NewStringPointer(defaultAzureSite), + }, + }, + want: &DatadogAgentSpec{ + Global: &GlobalConfig{ + Site: apiutils.NewStringPointer(defaultAzureSite), + Registry: apiutils.NewStringPointer(DefaultAzureImageRegistry), + LogLevel: apiutils.NewStringPointer(defaultLogLevel), + }, + }, + }, { name: "test registry defaulting based on site - Gov", ddaSpec: &DatadogAgentSpec{ @@ -227,12 +242,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -415,12 +432,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, EventCollection: &EventCollectionFeatureConfig{ @@ -536,12 +555,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -666,12 +687,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -791,12 +814,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -918,12 +943,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1050,12 +1077,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(valueTrue), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(valueTrue), + HostPortConfig: &HostPortConfig{Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCHostPortEnabled)}, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(valueTrue), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(valueTrue), + HostPortConfig: &HostPortConfig{Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCHostPortEnabled)}, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1175,12 +1204,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1303,12 +1334,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1432,12 +1465,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1559,12 +1594,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1706,12 +1743,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ @@ -1844,12 +1883,14 @@ func Test_defaultFeatures(t *testing.T) { }, OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{ GRPC: &OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPGRPCEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPGRPCEndpoint), }, HTTP: &OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), - Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), + Enabled: apiutils.NewBoolPointer(defaultOTLPHTTPEnabled), + HostPortConfig: nil, + Endpoint: apiutils.NewStringPointer(defaultOTLPHTTPEndpoint), }, }}}, RemoteConfiguration: &RemoteConfigurationFeatureConfig{ diff --git a/api/datadoghq/v2alpha1/datadogagent_types.go b/api/datadoghq/v2alpha1/datadogagent_types.go index 2605ac972..213d2246d 100644 --- a/api/datadoghq/v2alpha1/datadogagent_types.go +++ b/api/datadoghq/v2alpha1/datadogagent_types.go @@ -549,10 +549,15 @@ type OTLPProtocolsConfig struct { // OTLPGRPCConfig contains configuration for the OTLP ingest OTLP/gRPC receiver. // +k8s:openapi-gen=true type OTLPGRPCConfig struct { - // Enable the OTLP/gRPC endpoint. + // Enable the OTLP/gRPC endpoint. Host port is enabled by default and can be disabled. // +optional Enabled *bool `json:"enabled,omitempty"` + // Enable hostPort for OTLP/gRPC + // Default: true + // +optional + HostPortConfig *HostPortConfig `json:"hostPortConfig,omitempty"` + // Endpoint for OTLP/gRPC. // gRPC supports several naming schemes: https://github.com/grpc/grpc/blob/master/doc/naming.md // The Datadog Operator supports only 'host:port' (usually `0.0.0.0:port`). @@ -564,10 +569,15 @@ type OTLPGRPCConfig struct { // OTLPHTTPConfig contains configuration for the OTLP ingest OTLP/HTTP receiver. // +k8s:openapi-gen=true type OTLPHTTPConfig struct { - // Enable the OTLP/HTTP endpoint. + // Enable the OTLP/HTTP endpoint. Host port is enabled by default and can be disabled. // +optional Enabled *bool `json:"enabled,omitempty"` + // Enable hostPorts for OTLP/HTTP + // Default: true + // +optional + HostPortConfig *HostPortConfig `json:"hostPortConfig,omitempty"` + // Endpoint for OTLP/HTTP. // Default: '0.0.0.0:4318'. // +optional @@ -967,7 +977,6 @@ type KubeletConfig struct { // HostPortConfig contains host port configuration. type HostPortConfig struct { // Enabled enables host port configuration - // Default: false // +optional Enabled *bool `json:"enabled,omitempty"` @@ -1158,6 +1167,10 @@ type GlobalConfig struct { // Registry is the image registry to use for all Agent images. // Use 'public.ecr.aws/datadog' for AWS ECR. + // Use 'datadoghq.azurecr.io' for Azure Container Registry. + // Use 'gcr.io/datadoghq' for Google Container Registry. + // Use 'eu.gcr.io/datadoghq' for Google Container Registry in the EU region. + // Use 'asia.gcr.io/datadoghq' for Google Container Registry in the Asia region. // Use 'docker.io/datadog' for DockerHub. // Default: 'gcr.io/datadoghq' // +optional @@ -1241,6 +1254,10 @@ type GlobalConfig struct { // FIPS contains configuration used to customize the FIPS proxy sidecar. FIPS *FIPSConfig `json:"fips,omitempty"` + + // Configure the secret backend feature https://docs.datadoghq.com/agent/guide/secrets-management + // See also: https://github.com/DataDog/datadog-operator/blob/main/docs/secret_management.md + SecretBackend *SecretBackendConfig `json:"secretBackend,omitempty"` } // DatadogCredentials is a generic structure that holds credentials to access Datadog. @@ -1267,13 +1284,47 @@ type DatadogCredentials struct { AppSecret *SecretConfig `json:"appSecret,omitempty"` } +// SecretBackendRolesConfig provides configuration of the secrets Datadog agents can read for the SecretBackend feature +// +k8s:openapi-gen=true +type SecretBackendRolesConfig struct { + // Namespace defines the namespace in which the secrets reside. + // +required + Namespace *string `json:"namespace,omitempty"` + + // Secrets defines the list of secrets for which a role should be created. + // +required + // +listType=set + Secrets []string `json:"secrets,omitempty"` +} + // SecretBackendConfig provides configuration for the secret backend. +// +k8s:openapi-gen=true type SecretBackendConfig struct { - // Command defines the secret backend command to use + // The secret backend command to use. Datadog provides a pre-defined binary `/readsecret_multiple_providers.sh`. + // Read more about `/readsecret_multiple_providers.sh` at https://docs.datadoghq.com/agent/configuration/secrets-management/?tab=linux#script-for-reading-from-multiple-secret-providers. Command *string `json:"command,omitempty"` - // Args defines the list of arguments to pass to the command - Args []string `json:"args,omitempty"` + // List of arguments to pass to the command (space-separated strings). + // +optional + Args *string `json:"args,omitempty"` + + // The command timeout in seconds. + // Default: `30`. + // +optional + Timeout *int32 `json:"timeout,omitempty"` + + // Whether to create a global permission allowing Datadog agents to read all Kubernetes secrets. + // Default: `false`. + // +optional + EnableGlobalPermissions *bool `json:"enableGlobalPermissions,omitempty"` + + // Roles for Datadog to read the specified secrets, replacing `enableGlobalPermissions`. + // They are defined as a list of namespace/secrets. + // Each defined namespace needs to be present in the DatadogAgent controller using `WATCH_NAMESPACE` or `DD_AGENT_WATCH_NAMESPACE`. + // See also: https://github.com/DataDog/datadog-operator/blob/main/docs/secret_management.md#how-to-deploy-the-agent-components-using-the-secret-backend-feature-with-datadogagent. + // +optional + // +listType=atomic + Roles []*SecretBackendRolesConfig `json:"roles,omitempty"` } // NetworkPolicyFlavor specifies which flavor of Network Policy to use. @@ -1380,6 +1431,11 @@ type DatadogAgentComponentOverride struct { // +listMapKey=name Env []corev1.EnvVar `json:"env,omitempty"` + // EnvFrom specifies the ConfigMaps and Secrets to expose as environment variables. + // Priority is env > envFrom. + // +optional + EnvFrom []corev1.EnvFromSource `json:"envFrom,omitempty"` + // CustomConfiguration allows to specify custom configuration files for `datadog.yaml`, `datadog-cluster.yaml`, `security-agent.yaml`, and `system-probe.yaml`. // The content is merged with configuration generated by the Datadog Operator, with priority given to custom configuration. // WARNING: It is possible to override values set in the `DatadogAgent`. diff --git a/api/datadoghq/v2alpha1/test/builder.go b/api/datadoghq/v2alpha1/test/builder.go index 9b4f0087e..ba7b4c7f8 100644 --- a/api/datadoghq/v2alpha1/test/builder.go +++ b/api/datadoghq/v2alpha1/test/builder.go @@ -602,19 +602,27 @@ func (builder *DatadogAgentBuilder) initOTLP() { } } -func (builder *DatadogAgentBuilder) WithOTLPGRPCSettings(enabled bool, endpoint string) *DatadogAgentBuilder { +func (builder *DatadogAgentBuilder) WithOTLPGRPCSettings(enabled bool, hostPortEnabled bool, customHostPort int32, endpoint string) *DatadogAgentBuilder { builder.initOTLP() builder.datadogAgent.Spec.Features.OTLP.Receiver.Protocols.GRPC = &v2alpha1.OTLPGRPCConfig{ - Enabled: apiutils.NewBoolPointer(enabled), + Enabled: apiutils.NewBoolPointer(enabled), + HostPortConfig: &v2alpha1.HostPortConfig{ + Enabled: apiutils.NewBoolPointer(hostPortEnabled), + Port: apiutils.NewInt32Pointer(customHostPort), + }, Endpoint: apiutils.NewStringPointer(endpoint), } return builder } -func (builder *DatadogAgentBuilder) WithOTLPHTTPSettings(enabled bool, endpoint string) *DatadogAgentBuilder { +func (builder *DatadogAgentBuilder) WithOTLPHTTPSettings(enabled bool, hostPortEnabled bool, customHostPort int32, endpoint string) *DatadogAgentBuilder { builder.initOTLP() builder.datadogAgent.Spec.Features.OTLP.Receiver.Protocols.HTTP = &v2alpha1.OTLPHTTPConfig{ - Enabled: apiutils.NewBoolPointer(enabled), + Enabled: apiutils.NewBoolPointer(enabled), + HostPortConfig: &v2alpha1.HostPortConfig{ + Enabled: apiutils.NewBoolPointer(hostPortEnabled), + Port: apiutils.NewInt32Pointer(customHostPort), + }, Endpoint: apiutils.NewStringPointer(endpoint), } return builder @@ -783,6 +791,34 @@ func (builder *DatadogAgentBuilder) WithRegistry(registry string) *DatadogAgentB return builder } +// Global SecretBackend + +func (builder *DatadogAgentBuilder) WithGlobalSecretBackendGlobalPerms(command string, args string, timeout int32) *DatadogAgentBuilder { + builder.datadogAgent.Spec.Global.SecretBackend = &v2alpha1.SecretBackendConfig{ + Command: apiutils.NewStringPointer(command), + Args: apiutils.NewStringPointer(args), + Timeout: apiutils.NewInt32Pointer(timeout), + EnableGlobalPermissions: apiutils.NewBoolPointer(true), + } + return builder +} + +func (builder *DatadogAgentBuilder) WithGlobalSecretBackendSpecificRoles(command string, args string, timeout int32, secretNs string, secretNames []string) *DatadogAgentBuilder { + builder.datadogAgent.Spec.Global.SecretBackend = &v2alpha1.SecretBackendConfig{ + Command: apiutils.NewStringPointer(command), + Args: apiutils.NewStringPointer(args), + Timeout: apiutils.NewInt32Pointer(timeout), + EnableGlobalPermissions: apiutils.NewBoolPointer(false), + Roles: []*v2alpha1.SecretBackendRolesConfig{ + { + Namespace: apiutils.NewStringPointer(secretNs), + Secrets: secretNames, + }, + }, + } + return builder +} + // Override func (builder *DatadogAgentBuilder) WithComponentOverride(componentName v2alpha1.ComponentName, override v2alpha1.DatadogAgentComponentOverride) *DatadogAgentBuilder { diff --git a/api/datadoghq/v2alpha1/zz_generated.deepcopy.go b/api/datadoghq/v2alpha1/zz_generated.deepcopy.go index 12861eca1..c6b27c8e4 100644 --- a/api/datadoghq/v2alpha1/zz_generated.deepcopy.go +++ b/api/datadoghq/v2alpha1/zz_generated.deepcopy.go @@ -650,6 +650,13 @@ func (in *DatadogAgentComponentOverride) DeepCopyInto(out *DatadogAgentComponent (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.EnvFrom != nil { + in, out := &in.EnvFrom, &out.EnvFrom + *out = make([]corev1.EnvFromSource, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.CustomConfigurations != nil { in, out := &in.CustomConfigurations, &out.CustomConfigurations *out = make(map[AgentConfigFileName]CustomConfig, len(*in)) @@ -1556,6 +1563,11 @@ func (in *GlobalConfig) DeepCopyInto(out *GlobalConfig) { *out = new(FIPSConfig) (*in).DeepCopyInto(*out) } + if in.SecretBackend != nil { + in, out := &in.SecretBackend, &out.SecretBackend + *out = new(SecretBackendConfig) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GlobalConfig. @@ -1953,6 +1965,11 @@ func (in *OTLPGRPCConfig) DeepCopyInto(out *OTLPGRPCConfig) { *out = new(bool) **out = **in } + if in.HostPortConfig != nil { + in, out := &in.HostPortConfig, &out.HostPortConfig + *out = new(HostPortConfig) + (*in).DeepCopyInto(*out) + } if in.Endpoint != nil { in, out := &in.Endpoint, &out.Endpoint *out = new(string) @@ -1978,6 +1995,11 @@ func (in *OTLPHTTPConfig) DeepCopyInto(out *OTLPHTTPConfig) { *out = new(bool) **out = **in } + if in.HostPortConfig != nil { + in, out := &in.HostPortConfig, &out.HostPortConfig + *out = new(HostPortConfig) + (*in).DeepCopyInto(*out) + } if in.Endpoint != nil { in, out := &in.Endpoint, &out.Endpoint *out = new(string) @@ -2338,8 +2360,29 @@ func (in *SecretBackendConfig) DeepCopyInto(out *SecretBackendConfig) { } if in.Args != nil { in, out := &in.Args, &out.Args - *out = make([]string, len(*in)) - copy(*out, *in) + *out = new(string) + **out = **in + } + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(int32) + **out = **in + } + if in.EnableGlobalPermissions != nil { + in, out := &in.EnableGlobalPermissions, &out.EnableGlobalPermissions + *out = new(bool) + **out = **in + } + if in.Roles != nil { + in, out := &in.Roles, &out.Roles + *out = make([]*SecretBackendRolesConfig, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(SecretBackendRolesConfig) + (*in).DeepCopyInto(*out) + } + } } } @@ -2353,6 +2396,31 @@ func (in *SecretBackendConfig) DeepCopy() *SecretBackendConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretBackendRolesConfig) DeepCopyInto(out *SecretBackendRolesConfig) { + *out = *in + if in.Namespace != nil { + in, out := &in.Namespace, &out.Namespace + *out = new(string) + **out = **in + } + if in.Secrets != nil { + in, out := &in.Secrets, &out.Secrets + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretBackendRolesConfig. +func (in *SecretBackendRolesConfig) DeepCopy() *SecretBackendRolesConfig { + if in == nil { + return nil + } + out := new(SecretBackendRolesConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SecretConfig) DeepCopyInto(out *SecretConfig) { *out = *in diff --git a/cmd/main.go b/cmd/main.go index 32a4ed84e..d551e3ece 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -37,6 +37,7 @@ import ( datadoghqv1alpha1 "github.com/DataDog/datadog-operator/api/datadoghq/v1alpha1" datadoghqv2alpha1 "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1" "github.com/DataDog/datadog-operator/internal/controller" + "github.com/DataDog/datadog-operator/internal/controller/metrics" "github.com/DataDog/datadog-operator/pkg/config" "github.com/DataDog/datadog-operator/pkg/controller/debug" @@ -203,6 +204,9 @@ func run(opts *options) error { } version.PrintVersionLogs(setupLog) + //submits the maximum go routine setting as a metric + metrics.MaxGoroutines.Set(float64(opts.maximumGoroutines)) + if opts.profilingEnabled { setupLog.Info("Starting datadog profiler") if err := profiler.Start( diff --git a/config/crd/bases/v1/datadoghq.com_datadogagents.yaml b/config/crd/bases/v1/datadoghq.com_datadogagents.yaml index eba6dad59..dca1e15b2 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagents.yaml +++ b/config/crd/bases/v1/datadoghq.com_datadogagents.yaml @@ -471,9 +471,7 @@ spec: Port Default: 8126 properties: enabled: - description: |- - Enabled enables host port configuration - Default: false + description: Enabled enables host port configuration type: boolean hostPort: description: |- @@ -777,9 +775,7 @@ spec: Port Default: 8125 properties: enabled: - description: |- - Enabled enables host port configuration - Default: false + description: Enabled enables host port configuration type: boolean hostPort: description: |- @@ -1287,7 +1283,7 @@ spec: description: GRPC contains configuration for the OTLP ingest OTLP/gRPC receiver. properties: enabled: - description: Enable the OTLP/gRPC endpoint. + description: Enable the OTLP/gRPC endpoint. Host port is enabled by default and can be disabled. type: boolean endpoint: description: |- @@ -1296,18 +1292,48 @@ spec: The Datadog Operator supports only 'host:port' (usually `0.0.0.0:port`). Default: `0.0.0.0:4317`. type: string + hostPortConfig: + description: |- + Enable hostPort for OTLP/gRPC + Default: true + properties: + enabled: + description: Enabled enables host port configuration + type: boolean + hostPort: + description: |- + Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) + If HostNetwork is enabled, this value must match the ContainerPort. + format: int32 + type: integer + type: object type: object http: description: HTTP contains configuration for the OTLP ingest OTLP/HTTP receiver. properties: enabled: - description: Enable the OTLP/HTTP endpoint. + description: Enable the OTLP/HTTP endpoint. Host port is enabled by default and can be disabled. type: boolean endpoint: description: |- Endpoint for OTLP/HTTP. Default: '0.0.0.0:4318'. type: string + hostPortConfig: + description: |- + Enable hostPorts for OTLP/HTTP + Default: true + properties: + enabled: + description: Enabled enables host port configuration + type: boolean + hostPort: + description: |- + Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) + If HostNetwork is enabled, this value must match the ContainerPort. + format: int32 + type: integer + type: object type: object type: object type: object @@ -2088,9 +2114,59 @@ spec: description: |- Registry is the image registry to use for all Agent images. Use 'public.ecr.aws/datadog' for AWS ECR. + Use 'datadoghq.azurecr.io' for Azure Container Registry. + Use 'gcr.io/datadoghq' for Google Container Registry. + Use 'eu.gcr.io/datadoghq' for Google Container Registry in the EU region. + Use 'asia.gcr.io/datadoghq' for Google Container Registry in the Asia region. Use 'docker.io/datadog' for DockerHub. Default: 'gcr.io/datadoghq' type: string + secretBackend: + description: |- + Configure the secret backend feature https://docs.datadoghq.com/agent/guide/secrets-management + See also: https://github.com/DataDog/datadog-operator/blob/main/docs/secret_management.md + properties: + args: + description: List of arguments to pass to the command (space-separated strings). + type: string + command: + description: |- + The secret backend command to use. Datadog provides a pre-defined binary `/readsecret_multiple_providers.sh`. + Read more about `/readsecret_multiple_providers.sh` at https://docs.datadoghq.com/agent/configuration/secrets-management/?tab=linux#script-for-reading-from-multiple-secret-providers. + type: string + enableGlobalPermissions: + description: |- + Whether to create a global permission allowing Datadog agents to read all Kubernetes secrets. + Default: `false`. + type: boolean + roles: + description: |- + Roles for Datadog to read the specified secrets, replacing `enableGlobalPermissions`. + They are defined as a list of namespace/secrets. + Each defined namespace needs to be present in the DatadogAgent controller using `WATCH_NAMESPACE` or `DD_AGENT_WATCH_NAMESPACE`. + See also: https://github.com/DataDog/datadog-operator/blob/main/docs/secret_management.md#how-to-deploy-the-agent-components-using-the-secret-backend-feature-with-datadogagent. + items: + description: SecretBackendRolesConfig provides configuration of the secrets Datadog agents can read for the SecretBackend feature + properties: + namespace: + description: Namespace defines the namespace in which the secrets reside. + type: string + secrets: + description: Secrets defines the list of secrets for which a role should be created. + items: + type: string + type: array + x-kubernetes-list-type: set + type: object + type: array + x-kubernetes-list-type: atomic + timeout: + description: |- + The command timeout in seconds. + Default: `30`. + format: int32 + type: integer + type: object site: description: |- Site is the Datadog intake site Agent data are sent to. @@ -4052,6 +4128,46 @@ spec: x-kubernetes-list-map-keys: - name x-kubernetes-list-type: map + envFrom: + description: |- + EnvFrom specifies the ConfigMaps and Secrets to expose as environment variables. + Priority is env > envFrom. + items: + description: EnvFromSource represents the source of a set of ConfigMaps + properties: + configMapRef: + description: The ConfigMap to select from + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + properties: + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid? + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array extraChecksd: description: |- Checksd configuration allowing to specify custom checks placed under /etc/datadog-agent/checks.d/ @@ -6869,9 +6985,7 @@ spec: Port Default: 8126 properties: enabled: - description: |- - Enabled enables host port configuration - Default: false + description: Enabled enables host port configuration type: boolean hostPort: description: |- @@ -7175,9 +7289,7 @@ spec: Port Default: 8125 properties: enabled: - description: |- - Enabled enables host port configuration - Default: false + description: Enabled enables host port configuration type: boolean hostPort: description: |- @@ -7685,7 +7797,7 @@ spec: description: GRPC contains configuration for the OTLP ingest OTLP/gRPC receiver. properties: enabled: - description: Enable the OTLP/gRPC endpoint. + description: Enable the OTLP/gRPC endpoint. Host port is enabled by default and can be disabled. type: boolean endpoint: description: |- @@ -7694,18 +7806,48 @@ spec: The Datadog Operator supports only 'host:port' (usually `0.0.0.0:port`). Default: `0.0.0.0:4317`. type: string + hostPortConfig: + description: |- + Enable hostPort for OTLP/gRPC + Default: true + properties: + enabled: + description: Enabled enables host port configuration + type: boolean + hostPort: + description: |- + Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) + If HostNetwork is enabled, this value must match the ContainerPort. + format: int32 + type: integer + type: object type: object http: description: HTTP contains configuration for the OTLP ingest OTLP/HTTP receiver. properties: enabled: - description: Enable the OTLP/HTTP endpoint. + description: Enable the OTLP/HTTP endpoint. Host port is enabled by default and can be disabled. type: boolean endpoint: description: |- Endpoint for OTLP/HTTP. Default: '0.0.0.0:4318'. type: string + hostPortConfig: + description: |- + Enable hostPorts for OTLP/HTTP + Default: true + properties: + enabled: + description: Enabled enables host port configuration + type: boolean + hostPort: + description: |- + Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) + If HostNetwork is enabled, this value must match the ContainerPort. + format: int32 + type: integer + type: object type: object type: object type: object diff --git a/config/e2e/kustomization.yaml b/config/e2e/kustomization.yaml index 7b9b80107..f54570abd 100644 --- a/config/e2e/kustomization.yaml +++ b/config/e2e/kustomization.yaml @@ -1,11 +1,16 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 images: - name: controller newName: gcr.io/datadoghq/operator - newTag: 1.7.0 -apiVersion: kustomize.config.k8s.io/v1beta1 + newTag: latest kind: Kustomization -namespace: system namePrefix: datadog-operator-e2e- +namespace: system +patches: +- path: rc-e2e-manager.yaml + target: + kind: Deployment + name: manager resources: - ../crd - ../rbac diff --git a/config/e2e/rc-e2e-manager.yaml b/config/e2e/rc-e2e-manager.yaml new file mode 100644 index 000000000..809ec7175 --- /dev/null +++ b/config/e2e/rc-e2e-manager.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: manager + namespace: system + labels: + app.kubernetes.io/name: datadog-operator + control-plane: controller-manager +spec: + selector: + matchLabels: + app.kubernetes.io/name: datadog-operator + replicas: 1 + template: + metadata: + labels: + app.kubernetes.io/name: datadog-operator + spec: + containers: + - command: + - /manager + args: + - --enable-leader-election + - --pprof + - --remoteConfigEnabled + image: controller:latest + imagePullPolicy: IfNotPresent + name: manager + env: + - name: DD_API_KEY + valueFrom: + secretKeyRef: + name: datadog-secret + key: api-key + - name: DD_APP_KEY + valueFrom: + secretKeyRef: + name: datadog-secret + key: app-key + - name: DD_CLUSTER_NAME + value: rc-updater-e2e-test-cluster + - name: DD_SITE + value: datadoghq.com + resources: + limits: + cpu: 100m + memory: 250Mi + requests: + cpu: 100m + memory: 250Mi + ports: + - name: metrics + containerPort: 8080 + protocol: TCP + livenessProbe: + httpGet: + path: /healthz/ + port: 8081 + periodSeconds: 10 + imagePullSecrets: + - name: registry-credentials + terminationGracePeriodSeconds: 10 + serviceAccountName: controller-manager diff --git a/docs/configuration.v2alpha1.md b/docs/configuration.v2alpha1.md index ecbe3432e..7c46c214b 100644 --- a/docs/configuration.v2alpha1.md +++ b/docs/configuration.v2alpha1.md @@ -54,7 +54,7 @@ spec: | features.admissionController.serviceName | ServiceName corresponds to the webhook service name. | | features.admissionController.webhookName | WebhookName is a custom name for the MutatingWebhookConfiguration. Default: "datadog-webhook" | | features.apm.enabled | Enabled enables Application Performance Monitoring. Default: true | -| features.apm.hostPortConfig.enabled | Enabled enables host port configuration Default: false | +| features.apm.hostPortConfig.enabled | Enabled enables host port configuration | | features.apm.hostPortConfig.hostPort | Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) If HostNetwork is enabled, this value must match the ContainerPort. | | features.apm.instrumentation.disabledNamespaces | DisabledNamespaces disables injecting the Datadog APM libraries into pods in specific namespaces. | | features.apm.instrumentation.enabled | Enabled enables injecting the Datadog APM libraries into all pods in the cluster. Default: false | @@ -83,7 +83,7 @@ spec: | features.cws.remoteConfiguration.enabled | Enabled enables Remote Configuration for Cloud Workload Security. Default: true | | features.cws.securityProfiles.enabled | Enabled enables Security Profiles collection for Cloud Workload Security. Default: true | | features.cws.syscallMonitorEnabled | SyscallMonitorEnabled enables Syscall Monitoring (recommended for troubleshooting only). Default: false | -| features.dogstatsd.hostPortConfig.enabled | Enabled enables host port configuration Default: false | +| features.dogstatsd.hostPortConfig.enabled | Enabled enables host port configuration | | features.dogstatsd.hostPortConfig.hostPort | Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) If HostNetwork is enabled, this value must match the ContainerPort. | | features.dogstatsd.mapperProfiles.configData | ConfigData corresponds to the configuration file content. | | features.dogstatsd.mapperProfiles.configMap.items | Items maps a ConfigMap data `key` to a file `path` mount. | @@ -139,10 +139,14 @@ spec: | features.orchestratorExplorer.enabled | Enabled enables the Orchestrator Explorer. Default: true | | features.orchestratorExplorer.extraTags | Additional tags to associate with the collected data in the form of `a b c`. This is a Cluster Agent option distinct from DD_TAGS that is used in the Orchestrator Explorer. | | features.orchestratorExplorer.scrubContainers | ScrubContainers enables scrubbing of sensitive container data (passwords, tokens, etc. ). Default: true | -| features.otlp.receiver.protocols.grpc.enabled | Enable the OTLP/gRPC endpoint. | +| features.otlp.receiver.protocols.grpc.enabled | Enable the OTLP/gRPC endpoint. Host port is enabled by default and can be disabled. | | features.otlp.receiver.protocols.grpc.endpoint | Endpoint for OTLP/gRPC. gRPC supports several naming schemes: https://github.com/grpc/grpc/blob/master/doc/naming.md The Datadog Operator supports only 'host:port' (usually `0.0.0.0:port`). Default: `0.0.0.0:4317`. | -| features.otlp.receiver.protocols.http.enabled | Enable the OTLP/HTTP endpoint. | +| features.otlp.receiver.protocols.grpc.hostPortConfig.enabled | Enabled enables host port configuration | +| features.otlp.receiver.protocols.grpc.hostPortConfig.hostPort | Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) If HostNetwork is enabled, this value must match the ContainerPort. | +| features.otlp.receiver.protocols.http.enabled | Enable the OTLP/HTTP endpoint. Host port is enabled by default and can be disabled. | | features.otlp.receiver.protocols.http.endpoint | Endpoint for OTLP/HTTP. Default: '0.0.0.0:4318'. | +| features.otlp.receiver.protocols.http.hostPortConfig.enabled | Enabled enables host port configuration | +| features.otlp.receiver.protocols.http.hostPortConfig.hostPort | Port takes a port number (0 < x < 65536) to expose on the host. (Most containers do not need this.) If HostNetwork is enabled, this value must match the ContainerPort. | | features.processDiscovery.enabled | Enabled enables the Process Discovery check in the Agent. Default: true | | features.prometheusScrape.additionalConfigs | AdditionalConfigs allows adding advanced Prometheus check configurations with custom discovery rules. | | features.prometheusScrape.enableServiceEndpoints | EnableServiceEndpoints enables generating dedicated checks for service endpoints. Default: false | @@ -222,7 +226,12 @@ spec: | global.originDetectionUnified.enabled | Enabled enables unified mechanism for origin detection. Default: false | | global.podAnnotationsAsTags | Provide a mapping of Kubernetes Annotations to Datadog Tags. : | | global.podLabelsAsTags | Provide a mapping of Kubernetes Labels to Datadog Tags. : | -| global.registry | Registry is the image registry to use for all Agent images. Use 'public.ecr.aws/datadog' for AWS ECR. Use 'docker.io/datadog' for DockerHub. Default: 'gcr.io/datadoghq' | +| global.registry | Registry is the image registry to use for all Agent images. Use 'public.ecr.aws/datadog' for AWS ECR. Use 'datadoghq.azurecr.io' for Azure Container Registry. Use 'gcr.io/datadoghq' for Google Container Registry. Use 'eu.gcr.io/datadoghq' for Google Container Registry in the EU region. Use 'asia.gcr.io/datadoghq' for Google Container Registry in the Asia region. Use 'docker.io/datadog' for DockerHub. Default: 'gcr.io/datadoghq' | +| global.secretBackend.args | List of arguments to pass to the command (space-separated strings). | +| global.secretBackend.command | The secret backend command to use. Datadog provides a pre-defined binary `/readsecret_multiple_providers.sh`. Read more about `/readsecret_multiple_providers.sh` at https://docs.datadoghq.com/agent/configuration/secrets-management/?tab=linux#script-for-reading-from-multiple-secret-providers. | +| global.secretBackend.enableGlobalPermissions | Whether to create a global permission allowing Datadog agents to read all Kubernetes secrets. Default: `false`. | +| global.secretBackend.roles | Roles for Datadog to read the specified secrets, replacing `enableGlobalPermissions`. They are defined as a list of namespace/secrets. Each defined namespace needs to be present in the DatadogAgent controller using `WATCH_NAMESPACE` or `DD_AGENT_WATCH_NAMESPACE`. See also: https://github.com/DataDog/datadog-operator/blob/main/docs/secret_management.md#how-to-deploy-the-agent-components-using-the-secret-backend-feature-with-datadogagent. | +| global.secretBackend.timeout | The command timeout in seconds. Default: `30`. | | global.site | Site is the Datadog intake site Agent data are sent to. Set to 'datadoghq.com' to send data to the US1 site (default). Set to 'datadoghq.eu' to send data to the EU site. Set to 'us3.datadoghq.com' to send data to the US3 site. Set to 'us5.datadoghq.com' to send data to the US5 site. Set to 'ddog-gov.com' to send data to the US1-FED site. Set to 'ap1.datadoghq.com' to send data to the AP1 site. Default: 'datadoghq.com' | | global.tags | Tags contains a list of tags to attach to every metric, event and service check collected. Learn more about tagging: https://docs.datadoghq.com/tagging/ | | override | Override the default configurations of the agents | @@ -344,6 +353,7 @@ In the table, `spec.override.nodeAgent.image.name` and `spec.override.nodeAgent. | [key].dnsConfig.searches | A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed. | | [key].dnsPolicy | Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. | | [key].env `[]object` | Specify additional environment variables for all containers in this component Priority is Container > Component. See also: https://docs.datadoghq.com/agent/kubernetes/?tab=helm#environment-variables | +| [key].envFrom `[]object` | EnvFrom specifies the ConfigMaps and Secrets to expose as environment variables. Priority is env > envFrom. | | [key].extraChecksd.configDataMap | ConfigDataMap corresponds to the content of the configuration files. The key should be the filename the contents get mounted to; for instance check.py or check.yaml. | | [key].extraChecksd.configMap.items | Items maps a ConfigMap data `key` to a file `path` mount. | | [key].extraChecksd.configMap.name | Name is the name of the ConfigMap. | diff --git a/docs/datadog_dashboard.md b/docs/datadog_dashboard.md new file mode 100644 index 000000000..2e9df479e --- /dev/null +++ b/docs/datadog_dashboard.md @@ -0,0 +1,136 @@ +# Datadog Dashboards +This feature is in Preview. + +## Overview +The `DatadogDashboard` Custom Resource Definition (CRD) allows users to create [dashboards][1] using the Operator and manage them as Kubernetes resources. + +## Prerequisites + +- Datadog Operator v1.9+ +- [Helm][2], to deploy the Datadog Operator +- The [kubectl CLI][3], to install a `DatadogDashboard` + + +## Adding a DatadogDashboard + +To deploy a `DatadogDashboard` with the Datadog Operator, use the [`datadog-operator` Helm chart][4]. + +1. To install the [Datadog Operator][5], first add the Datadog Helm chart using the following command: + + ```shell + helm repo add datadog https://helm.datadoghq.com + ``` + +1. Choose one of the following options: + + * Run the install command, substituting your [Datadog API and application keys][6]: + + ```shell + helm install my-datadog-operator datadog/datadog-operator --set apiKey= --set appKey= --set datadogDashboard.enabled=true + ``` + + * Create an override [`values.yaml`][7] file that includes your [Datadog API and application keys][6] and enables the `DatadogDashboard` controller. Then run the install command: + + ```shell + helm install my-datadog-operator datadog/datadog-operator -f values.yaml + ``` + +2. Create a file with the spec of your `DatadogDashboard` deployment configuration. An example configuration is: + + + ``` + apiVersion: datadoghq.com/v1alpha1 + kind: DatadogDashboard + metadata: + name: example-dashboard + spec: + title: Test Dashboard + layoutType: ordered + tags: + - "team:my_team" + templateVariables: + - availableValues: + - host1 + - host2 + - host3 + name: first + prefix: bar-foo + notifyList: + - foobar@example.com + widgets: '[{ + "id": 2639892738901474, + "definition": { + "title": "", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "type": "timeseries", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "metrics", + "query": "avg:system.cpu.user{*} by {host}" + } + ], + "response_format": "timeseries", + "style": { + "palette": "dog_classic", + "order_by": "values", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + } + ] + }, + "layout": { + "x": 0, + "y": 0, + "width": 4, + "height": 2 + } + }]' + ``` + +3. Deploy the `DatadogDashboard` with the above configuration file: + + ```shell + kubectl apply -f /path/to/your/datadog-dashboard.yaml + ``` + + This automatically creates a new dashboard in Datadog. You can find it on the [Dashboards][8] page of your Datadog account. + + +## Cleanup + +The following commands delete the dashboard from your Datadog account as well as all of the Kubernetes resources created by the previous instructions: + +```shell +kubectl delete datadogdashboard example-dashboard +helm delete my-datadog-operator +``` + + +[1]: https://docs.datadoghq.com/dashboards/ +[2]: https://helm.sh +[3]: https://kubernetes.io/docs/tasks/tools/install-kubectl/ +[4]: https://github.com/DataDog/helm-charts/tree/main/charts/datadog-operator +[5]: https://artifacthub.io/packages/helm/datadog/datadog-operator +[6]: https://app.datadoghq.com/account/settings#api +[7]: https://github.com/DataDog/helm-charts/blob/main/charts/datadog-operator/values.yaml +[8]: https://app.datadoghq.com/dashboard/lists diff --git a/docs/datadog_monitor.md b/docs/datadog_monitor.md index 7b3bab91c..edb8d386f 100644 --- a/docs/datadog_monitor.md +++ b/docs/datadog_monitor.md @@ -79,7 +79,7 @@ The following commands delete the monitor from your Datadog account and all the ```shell kubectl delete datadogmonitor datadog-monitor-test -helm delete datadog +helm delete my-datadog-operator ``` ## Usage and Troubleshooting diff --git a/docs/how-to-contribute.md b/docs/how-to-contribute.md index 2a1356b07..0225c0051 100644 --- a/docs/how-to-contribute.md +++ b/docs/how-to-contribute.md @@ -126,6 +126,14 @@ $ K8S_VERSION=1.25 IMG=your-dockerhub/operator:tag aws-vault exec sso-agent-sand # Run E2E tests with K8S_VERSION, IMG, and IMAGE_PULL_PASSWORD environment variables (for pulling operator image from a private registry). $ K8S_VERSION=1.25 IMG=669783387624.dkr.ecr.us-east-1.amazonaws.com/operator:PIPELINE_ID-COMMIT_HASH IMAGE_PULL_PASSWORD=$(aws-vault exec sso-agent-qa-read-only -- aws ecr get-login-password) aws-vault exec sso-agent-sandbox-account-admin -- make e2e-tests ``` +> **NOTE:** The remote configuration updater test requires the owner of the API Key to have the permission `Fleet Policies Write`. +> To get the permission: +>- Log in the ddev org +>- Go to the [roles page](https://dddev.datadoghq.com/organization-settings/roles) +>- Search for `Fleet Policies Write`, Click on it +>- Click on `request role` +>- It should be added after few minutes. + [pulumi]:https://www.pulumi.com/ diff --git a/go.mod b/go.mod index c3e2c74df..629b47e70 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( k8s.io/cli-runtime v0.31.1 k8s.io/client-go v0.31.1 k8s.io/klog/v2 v2.130.1 - k8s.io/kube-aggregator v0.24.2 + k8s.io/kube-aggregator v0.31.1 k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 sigs.k8s.io/controller-runtime v0.19.0 sigs.k8s.io/yaml v1.4.0 @@ -42,6 +42,7 @@ require ( github.com/DataDog/datadog-agent/pkg/config/model v0.55.0-rc.10 github.com/DataDog/datadog-agent/pkg/config/remote v0.55.0-rc.10 github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.55.0-rc.10 + github.com/cenkalti/backoff v2.2.1+incompatible github.com/prometheus/client_golang v1.19.1 golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 k8s.io/kubectl v0.31.1 @@ -68,7 +69,6 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect diff --git a/go.sum b/go.sum index 4a338d863..622c4f047 100644 --- a/go.sum +++ b/go.sum @@ -1,57 +1,12 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= github.com/DataDog/datadog-agent/pkg/config/model v0.55.0-rc.10 h1:mdghFUdxwDH74GDT+wy1v4IrAyeRRCDI1I8klmx8COY= @@ -103,48 +58,32 @@ github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -154,28 +93,16 @@ github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1 github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -184,37 +111,23 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ebitengine/purego v0.6.0-alpha.5 h1:EYID3JOAdmQ4SNZYJHu9V6IqOeRQDBYxqKAg9PyoHFY= github.com/ebitengine/purego v0.6.0-alpha.5/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -223,40 +136,23 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= @@ -269,7 +165,6 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -277,26 +172,16 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -304,32 +189,23 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -339,20 +215,6 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= @@ -361,12 +223,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= @@ -382,53 +240,23 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -441,11 +269,8 @@ github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A= github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -460,34 +285,18 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -501,14 +310,11 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -517,15 +323,12 @@ github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6jJVXYjt8IE48G2eWl6BjwU5Gj0gqY84fy78= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= @@ -533,7 +336,6 @@ github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16A github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -550,21 +352,15 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -577,18 +373,12 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -602,10 +392,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= @@ -616,29 +403,21 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -648,8 +427,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -660,7 +437,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -677,7 +453,6 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -693,123 +468,53 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zorkian/go-datadog-api v2.30.0+incompatible h1:R4ryGocppDqZZbnNc5EDR8xGWF/z/MxzWnqTUijDQes= github.com/zorkian/go-datadog-api v2.30.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= @@ -817,152 +522,65 @@ golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -979,23 +597,14 @@ golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1004,62 +613,16 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= @@ -1072,79 +635,14 @@ golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSm golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= @@ -1152,29 +650,14 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1185,11 +668,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= @@ -1199,7 +679,6 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -1209,9 +688,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1225,73 +702,43 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU= k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI= k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40= k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U= k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= k8s.io/cli-runtime v0.31.1 h1:/ZmKhmZ6hNqDM+yf9s3Y4KEYakNXUn5sod2LWGGwCuk= k8s.io/cli-runtime v0.31.1/go.mod h1:pKv1cDIaq7ehWGuXQ+A//1OIF+7DI+xudXtExMCbe9U= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0= k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-aggregator v0.24.2 h1:vaKw45vFA5fIT0wdSehPIL7idjVxgLqz6iedOHedLG4= -k8s.io/kube-aggregator v0.24.2/go.mod h1:Ju2jNDixn+vqeeKEBfjfpc204bO1pbdXX0N9knCxeMQ= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-aggregator v0.31.1 h1:vrYBTTs3xMrpiEsmBjsLETZE9uuX67oQ8B3i1BFfMPw= +k8s.io/kube-aggregator v0.31.1/go.mod h1:+aW4NX50uneozN+BtoCxI4g7ND922p8Wy3tWKFDiWVk= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/kubectl v0.31.1 h1:ih4JQJHxsEggFqDJEHSOdJ69ZxZftgeZvYo7M/cpp24= k8s.io/kubectl v0.31.1/go.mod h1:aNuQoR43W6MLAtXQ/Bu4GDmoHlbhHKuyD49lmTC8eJM= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/controller/datadogagent/controller.go b/internal/controller/datadogagent/controller.go index f604a5752..25af3d1ec 100644 --- a/internal/controller/datadogagent/controller.go +++ b/internal/controller/datadogagent/controller.go @@ -11,7 +11,6 @@ import ( "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -71,7 +70,6 @@ type ReconcilerOptions struct { type Reconciler struct { options ReconcilerOptions client client.Client - versionInfo *version.Info platformInfo kubernetes.PlatformInfo scheme *runtime.Scheme log logr.Logger @@ -80,13 +78,12 @@ type Reconciler struct { } // NewReconciler returns a reconciler for DatadogAgent -func NewReconciler(options ReconcilerOptions, client client.Client, versionInfo *version.Info, platformInfo kubernetes.PlatformInfo, +func NewReconciler(options ReconcilerOptions, client client.Client, platformInfo kubernetes.PlatformInfo, scheme *runtime.Scheme, log logr.Logger, recorder record.EventRecorder, metricForwarder datadog.MetricForwardersManager, ) (*Reconciler, error) { return &Reconciler{ options: options, client: client, - versionInfo: versionInfo, platformInfo: platformInfo, scheme: scheme, log: log, diff --git a/internal/controller/datadogagent/controller_reconcile_v2.go b/internal/controller/datadogagent/controller_reconcile_v2.go index 862c2027f..940867d71 100644 --- a/internal/controller/datadogagent/controller_reconcile_v2.go +++ b/internal/controller/datadogagent/controller_reconcile_v2.go @@ -106,7 +106,6 @@ func (r *Reconciler) reconcileInstanceV2(ctx context.Context, logger logr.Logger // ----------------------- storeOptions := &store.StoreOptions{ SupportCilium: r.options.SupportCilium, - VersionInfo: r.versionInfo, PlatformInfo: r.platformInfo, Logger: logger, Scheme: r.scheme, diff --git a/internal/controller/datadogagent/feature/apm/feature.go b/internal/controller/datadogagent/feature/apm/feature.go index 0b76d7be6..0bb94d65b 100644 --- a/internal/controller/datadogagent/feature/apm/feature.go +++ b/internal/controller/datadogagent/feature/apm/feature.go @@ -176,8 +176,9 @@ func (f *apmFeature) shouldEnableLanguageDetection() bool { // ManageDependencies allows a feature to manage its dependencies. // Feature's dependencies should be added in the store. func (f *apmFeature) ManageDependencies(managers feature.ResourceManagers, components feature.RequiredComponents) error { + platformInfo := managers.Store().GetPlatformInfo() // agent local service - if common.ShouldCreateAgentLocalService(managers.Store().GetVersionInfo(), f.forceEnableLocalService) { + if common.ShouldCreateAgentLocalService(platformInfo.GetVersionInfo(), f.forceEnableLocalService) { apmPort := &corev1.ServicePort{ Protocol: corev1.ProtocolTCP, TargetPort: intstr.FromInt(int(v2alpha1.DefaultApmPort)), diff --git a/internal/controller/datadogagent/feature/dogstatsd/feature.go b/internal/controller/datadogagent/feature/dogstatsd/feature.go index ce014755c..d19be704d 100644 --- a/internal/controller/datadogagent/feature/dogstatsd/feature.go +++ b/internal/controller/datadogagent/feature/dogstatsd/feature.go @@ -101,8 +101,9 @@ func (f *dogstatsdFeature) Configure(dda *v2alpha1.DatadogAgent) (reqComp featur // ManageDependencies allows a feature to manage its dependencies. // Feature's dependencies should be added in the store. func (f *dogstatsdFeature) ManageDependencies(managers feature.ResourceManagers, components feature.RequiredComponents) error { + platformInfo := managers.Store().GetPlatformInfo() // agent local service - if common.ShouldCreateAgentLocalService(managers.Store().GetVersionInfo(), f.forceEnableLocalService) { + if common.ShouldCreateAgentLocalService(platformInfo.GetVersionInfo(), f.forceEnableLocalService) { dsdPort := &corev1.ServicePort{ Protocol: corev1.ProtocolUDP, TargetPort: intstr.FromInt(int(v2alpha1.DefaultDogstatsdPort)), diff --git a/internal/controller/datadogagent/feature/externalmetrics/feature.go b/internal/controller/datadogagent/feature/externalmetrics/feature.go index 5488f06bf..6c17bb93f 100644 --- a/internal/controller/datadogagent/feature/externalmetrics/feature.go +++ b/internal/controller/datadogagent/feature/externalmetrics/feature.go @@ -200,7 +200,8 @@ func (f *externalMetricsFeature) ManageDependencies(managers feature.ResourceMan } // RBAC - if err := managers.RBACManager().AddClusterPolicyRules("kube-system", componentdca.GetExternalMetricsReaderClusterRoleName(f.owner, managers.Store().GetVersionInfo()), "horizontal-pod-autoscaler", getExternalMetricsReaderPolicyRules()); err != nil { + platformInfo := managers.Store().GetPlatformInfo() + if err := managers.RBACManager().AddClusterPolicyRules("kube-system", componentdca.GetExternalMetricsReaderClusterRoleName(f.owner, platformInfo.GetVersionInfo()), "horizontal-pod-autoscaler", getExternalMetricsReaderPolicyRules()); err != nil { return fmt.Errorf("error adding external metrics provider external metrics reader clusterrole and clusterrolebinding to store: %w", err) } } diff --git a/internal/controller/datadogagent/feature/fake/PodTemplateManagers.go b/internal/controller/datadogagent/feature/fake/PodTemplateManagers.go index 3575c4e41..90876396c 100644 --- a/internal/controller/datadogagent/feature/fake/PodTemplateManagers.go +++ b/internal/controller/datadogagent/feature/fake/PodTemplateManagers.go @@ -13,6 +13,7 @@ import ( type PodTemplateManagers struct { Tpl v1.PodTemplateSpec EnvVarMgr *mergerfake.EnvVarManager + EnvFromVarMgr *mergerfake.EnvFromVarManager VolumeMgr *mergerfake.VolumeManager VolumeMountMgr *mergerfake.VolumeMountManager SecurityContextMgr *mergerfake.SecurityContextManager @@ -25,6 +26,11 @@ func (_m *PodTemplateManagers) EnvVar() merger.EnvVarManager { return _m.EnvVarMgr } +// EnvFromVar provides a mock function with given fields: +func (_m *PodTemplateManagers) EnvFromVar() merger.EnvFromVarManager { + return _m.EnvFromVarMgr +} + // PodTemplateSpec provides a mock function with given fields: func (_m *PodTemplateManagers) PodTemplateSpec() *v1.PodTemplateSpec { return &_m.Tpl @@ -60,6 +66,7 @@ func NewPodTemplateManagers(t testing.TB, podTpl v1.PodTemplateSpec) *PodTemplat return &PodTemplateManagers{ Tpl: podTpl, EnvVarMgr: mergerfake.NewFakeEnvVarManager(t), + EnvFromVarMgr: mergerfake.NewFakeEnvFromVarManager(t), VolumeMgr: mergerfake.NewFakeVolumeManager(t), VolumeMountMgr: mergerfake.NewFakeVolumeMountManager(t), SecurityContextMgr: mergerfake.NewFakeSecurityContextManager(t), diff --git a/internal/controller/datadogagent/feature/otlp/feature.go b/internal/controller/datadogagent/feature/otlp/feature.go index 7139b70ff..fde79fc6b 100644 --- a/internal/controller/datadogagent/feature/otlp/feature.go +++ b/internal/controller/datadogagent/feature/otlp/feature.go @@ -44,11 +44,15 @@ func buildOTLPFeature(options *feature.Options) feature.Feature { type otlpFeature struct { logger logr.Logger - grpcEnabled bool - grpcEndpoint string + grpcEnabled bool + grpcHostPortEnabled bool + grpcCustomHostPort int32 + grpcEndpoint string - httpEnabled bool - httpEndpoint string + httpEnabled bool + httpHostPortEnabled bool + httpCustomHostPort int32 + httpEndpoint string usingAPM bool @@ -70,6 +74,12 @@ func (f *otlpFeature) Configure(dda *v2alpha1.DatadogAgent) (reqComp feature.Req if apiutils.BoolValue(otlp.Receiver.Protocols.GRPC.Enabled) { f.grpcEnabled = true } + if otlp.Receiver.Protocols.GRPC.HostPortConfig != nil { + f.grpcHostPortEnabled = apiutils.BoolValue(otlp.Receiver.Protocols.GRPC.HostPortConfig.Enabled) + if otlp.Receiver.Protocols.GRPC.HostPortConfig.Port != nil { + f.grpcCustomHostPort = *otlp.Receiver.Protocols.GRPC.HostPortConfig.Port + } + } if otlp.Receiver.Protocols.GRPC.Endpoint != nil { f.grpcEndpoint = *otlp.Receiver.Protocols.GRPC.Endpoint } @@ -77,6 +87,12 @@ func (f *otlpFeature) Configure(dda *v2alpha1.DatadogAgent) (reqComp feature.Req if apiutils.BoolValue(otlp.Receiver.Protocols.HTTP.Enabled) { f.httpEnabled = true } + if otlp.Receiver.Protocols.HTTP.HostPortConfig != nil { + f.httpHostPortEnabled = apiutils.BoolValue(otlp.Receiver.Protocols.HTTP.HostPortConfig.Enabled) + if otlp.Receiver.Protocols.HTTP.HostPortConfig.Port != nil { + f.httpCustomHostPort = *otlp.Receiver.Protocols.HTTP.HostPortConfig.Port + } + } if otlp.Receiver.Protocols.HTTP.Endpoint != nil { f.httpEndpoint = *otlp.Receiver.Protocols.HTTP.Endpoint } @@ -112,8 +128,10 @@ func (f *otlpFeature) Configure(dda *v2alpha1.DatadogAgent) (reqComp feature.Req // ManageDependencies allows a feature to manage its dependencies. // Feature's dependencies should be added in the store. func (f *otlpFeature) ManageDependencies(managers feature.ResourceManagers, components feature.RequiredComponents) error { + platformInfo := managers.Store().GetPlatformInfo() + versionInfo := platformInfo.GetVersionInfo() if f.grpcEnabled { - if common.ShouldCreateAgentLocalService(managers.Store().GetVersionInfo(), f.forceEnableLocalService) { + if common.ShouldCreateAgentLocalService(versionInfo, f.forceEnableLocalService) { port, err := extractPortEndpoint(f.grpcEndpoint) if err != nil { f.logger.Error(err, "failed to extract port from OTLP/gRPC endpoint") @@ -134,7 +152,7 @@ func (f *otlpFeature) ManageDependencies(managers feature.ResourceManagers, comp } } if f.httpEnabled { - if common.ShouldCreateAgentLocalService(managers.Store().GetVersionInfo(), f.forceEnableLocalService) { + if common.ShouldCreateAgentLocalService(versionInfo, f.forceEnableLocalService) { port, err := extractPortEndpoint(f.httpEndpoint) if err != nil { f.logger.Error(err, "failed to extract port from OTLP/HTTP endpoint") @@ -203,7 +221,6 @@ func (f *otlpFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplat f.logger.Error(err, "invalid OTLP/gRPC endpoint") return fmt.Errorf("invalid OTLP/gRPC endpoint: %w", err) } - port, err := extractPortEndpoint(f.grpcEndpoint) if err != nil { f.logger.Error(err, "failed to extract port from OTLP/gRPC endpoint") @@ -212,9 +229,14 @@ func (f *otlpFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplat otlpgrpcPort := &corev1.ContainerPort{ Name: apicommon.OTLPGRPCPortName, ContainerPort: port, - HostPort: port, Protocol: corev1.ProtocolTCP, } + if f.grpcHostPortEnabled { + otlpgrpcPort.HostPort = f.grpcCustomHostPort + if f.grpcCustomHostPort == 0 { + otlpgrpcPort.HostPort = port + } + } envVar := &corev1.EnvVar{ Name: apicommon.DDOTLPgRPCEndpoint, Value: f.grpcEndpoint, @@ -232,9 +254,14 @@ func (f *otlpFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplat otlphttpPort := &corev1.ContainerPort{ Name: apicommon.OTLPHTTPPortName, ContainerPort: port, - HostPort: port, Protocol: corev1.ProtocolTCP, } + if f.httpHostPortEnabled { + otlphttpPort.HostPort = f.httpCustomHostPort + if f.httpCustomHostPort == 0 { + otlphttpPort.HostPort = port + } + } envVar := &corev1.EnvVar{ Name: apicommon.DDOTLPHTTPEndpoint, Value: f.httpEndpoint, @@ -254,7 +281,6 @@ func (f *otlpFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov f.logger.Error(err, "invalid OTLP/gRPC endpoint") return fmt.Errorf("invalid OTLP/gRPC endpoint: %w", err) } - port, err := extractPortEndpoint(f.grpcEndpoint) if err != nil { f.logger.Error(err, "failed to extract port from OTLP/gRPC endpoint") @@ -263,9 +289,14 @@ func (f *otlpFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov otlpgrpcPort := &corev1.ContainerPort{ Name: apicommon.OTLPGRPCPortName, ContainerPort: port, - HostPort: port, Protocol: corev1.ProtocolTCP, } + if f.grpcHostPortEnabled { + otlpgrpcPort.HostPort = port + if f.grpcCustomHostPort != 0 { + otlpgrpcPort.HostPort = f.grpcCustomHostPort + } + } envVar := &corev1.EnvVar{ Name: apicommon.DDOTLPgRPCEndpoint, Value: f.grpcEndpoint, @@ -286,9 +317,14 @@ func (f *otlpFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov otlphttpPort := &corev1.ContainerPort{ Name: apicommon.OTLPHTTPPortName, ContainerPort: port, - HostPort: port, Protocol: corev1.ProtocolTCP, } + if f.httpHostPortEnabled { + otlphttpPort.HostPort = port + if f.httpCustomHostPort != 0 { + otlphttpPort.HostPort = f.httpCustomHostPort + } + } envVar := &corev1.EnvVar{ Name: apicommon.DDOTLPHTTPEndpoint, Value: f.httpEndpoint, diff --git a/internal/controller/datadogagent/feature/otlp/feature_test.go b/internal/controller/datadogagent/feature/otlp/feature_test.go index 3202e8cce..0869bf6d4 100644 --- a/internal/controller/datadogagent/feature/otlp/feature_test.go +++ b/internal/controller/datadogagent/feature/otlp/feature_test.go @@ -26,11 +26,15 @@ func TestOTLPFeature(t *testing.T) { { Name: "gRPC and HTTP enabled, APM", DDA: newAgent(Settings{ - EnabledGRPC: true, - EndpointGRPC: "0.0.0.0:4317", - EnabledHTTP: true, - EndpointHTTP: "0.0.0.0:4318", - APM: true, + EnabledGRPC: true, + EnabledGRPCHostPort: true, + CustomGRPCHostPort: 4317, + EndpointGRPC: "0.0.0.0:4317", + EnabledHTTP: true, + EnabledHTTPHostPort: true, + CustomHTTPHostPort: 4318, + EndpointHTTP: "0.0.0.0:4318", + APM: true, }), WantConfigure: true, Agent: testExpected(Expected{ @@ -64,11 +68,13 @@ func TestOTLPFeature(t *testing.T) { { Name: "[single container] gRPC and HTTP enabled, APM", DDA: newAgentSingleContainer(Settings{ - EnabledGRPC: true, - EndpointGRPC: "0.0.0.0:4317", - EnabledHTTP: true, - EndpointHTTP: "0.0.0.0:4318", - APM: true, + EnabledGRPC: true, + EnabledGRPCHostPort: true, + EndpointGRPC: "0.0.0.0:4317", + EnabledHTTP: true, + EnabledHTTPHostPort: true, + EndpointHTTP: "0.0.0.0:4318", + APM: true, }), WantConfigure: true, Agent: testExpectedSingleContainer(Expected{ @@ -99,11 +105,173 @@ func TestOTLPFeature(t *testing.T) { }, }), }, + { + Name: "gRPC and HTTP enabled, hostPorts disabled", + DDA: newAgent(Settings{ + EnabledGRPC: true, + EnabledGRPCHostPort: false, + EndpointGRPC: "0.0.0.0:4317", + EnabledHTTP: true, + EnabledHTTPHostPort: false, + EndpointHTTP: "0.0.0.0:4318", + APM: true, + }), + WantConfigure: true, + Agent: testExpected(Expected{ + EnvVars: []*corev1.EnvVar{ + { + Name: apicommon.DDOTLPgRPCEndpoint, + Value: "0.0.0.0:4317", + }, + { + Name: apicommon.DDOTLPHTTPEndpoint, + Value: "0.0.0.0:4318", + }, + }, + CheckTraceAgent: true, + Ports: []*corev1.ContainerPort{ + { + Name: apicommon.OTLPGRPCPortName, + ContainerPort: 4317, + Protocol: corev1.ProtocolTCP, + }, + { + Name: apicommon.OTLPHTTPPortName, + ContainerPort: 4318, + Protocol: corev1.ProtocolTCP, + }, + }, + }), + }, + { + Name: "[single container] gRPC and HTTP enabled, hostPorts disabled", + DDA: newAgentSingleContainer(Settings{ + EnabledGRPC: true, + EnabledGRPCHostPort: false, + EndpointGRPC: "0.0.0.0:4317", + EnabledHTTP: true, + EnabledHTTPHostPort: false, + EndpointHTTP: "0.0.0.0:4318", + APM: true, + }), + WantConfigure: true, + Agent: testExpectedSingleContainer(Expected{ + EnvVars: []*corev1.EnvVar{ + { + Name: apicommon.DDOTLPgRPCEndpoint, + Value: "0.0.0.0:4317", + }, + { + Name: apicommon.DDOTLPHTTPEndpoint, + Value: "0.0.0.0:4318", + }, + }, + CheckTraceAgent: true, + Ports: []*corev1.ContainerPort{ + { + Name: apicommon.OTLPGRPCPortName, + ContainerPort: 4317, + Protocol: corev1.ProtocolTCP, + }, + { + Name: apicommon.OTLPHTTPPortName, + ContainerPort: 4318, + Protocol: corev1.ProtocolTCP, + }, + }, + }), + }, + { + Name: "gRPC and HTTP enabled, custom hostports", + DDA: newAgent(Settings{ + EnabledGRPC: true, + EnabledGRPCHostPort: true, + CustomGRPCHostPort: 4315, + EndpointGRPC: "0.0.0.0:4317", + EnabledHTTP: true, + EnabledHTTPHostPort: true, + CustomHTTPHostPort: 4316, + EndpointHTTP: "0.0.0.0:4318", + APM: true, + }), + WantConfigure: true, + Agent: testExpected(Expected{ + EnvVars: []*corev1.EnvVar{ + { + Name: apicommon.DDOTLPgRPCEndpoint, + Value: "0.0.0.0:4317", + }, + { + Name: apicommon.DDOTLPHTTPEndpoint, + Value: "0.0.0.0:4318", + }, + }, + CheckTraceAgent: true, + Ports: []*corev1.ContainerPort{ + { + Name: apicommon.OTLPGRPCPortName, + ContainerPort: 4317, + HostPort: 4315, + Protocol: corev1.ProtocolTCP, + }, + { + Name: apicommon.OTLPHTTPPortName, + ContainerPort: 4318, + HostPort: 4316, + Protocol: corev1.ProtocolTCP, + }, + }, + }), + }, + { + Name: "[single container] gRPC and HTTP enabled, custom hostports", + DDA: newAgentSingleContainer(Settings{ + EnabledGRPC: true, + EnabledGRPCHostPort: true, + CustomGRPCHostPort: 4315, + EndpointGRPC: "0.0.0.0:4317", + EnabledHTTP: true, + EnabledHTTPHostPort: true, + CustomHTTPHostPort: 4316, + EndpointHTTP: "0.0.0.0:4318", + APM: true, + }), + WantConfigure: true, + Agent: testExpectedSingleContainer(Expected{ + EnvVars: []*corev1.EnvVar{ + { + Name: apicommon.DDOTLPgRPCEndpoint, + Value: "0.0.0.0:4317", + }, + { + Name: apicommon.DDOTLPHTTPEndpoint, + Value: "0.0.0.0:4318", + }, + }, + CheckTraceAgent: true, + Ports: []*corev1.ContainerPort{ + { + Name: apicommon.OTLPGRPCPortName, + ContainerPort: 4317, + HostPort: 4315, + Protocol: corev1.ProtocolTCP, + }, + { + Name: apicommon.OTLPHTTPPortName, + ContainerPort: 4318, + HostPort: 4316, + Protocol: corev1.ProtocolTCP, + }, + }, + }), + }, { Name: "gRPC enabled, no APM", DDA: newAgent(Settings{ - EnabledGRPC: true, - EndpointGRPC: "0.0.0.0:4317", + EnabledGRPC: true, + EnabledGRPCHostPort: true, + CustomGRPCHostPort: 0, + EndpointGRPC: "0.0.0.0:4317", }), WantConfigure: true, Agent: testExpected(Expected{ @@ -126,8 +294,10 @@ func TestOTLPFeature(t *testing.T) { { Name: "[single container] gRPC enabled, no APM", DDA: newAgentSingleContainer(Settings{ - EnabledGRPC: true, - EndpointGRPC: "0.0.0.0:4317", + EnabledGRPC: true, + EnabledGRPCHostPort: true, + CustomGRPCHostPort: 0, + EndpointGRPC: "0.0.0.0:4317", }), WantConfigure: true, Agent: testExpectedSingleContainer(Expected{ @@ -150,9 +320,11 @@ func TestOTLPFeature(t *testing.T) { { Name: "HTTP enabled, APM", DDA: newAgent(Settings{ - EnabledHTTP: true, - EndpointHTTP: "somehostname:4318", - APM: true, + EnabledHTTP: true, + EnabledHTTPHostPort: true, + CustomHTTPHostPort: 0, + EndpointHTTP: "somehostname:4318", + APM: true, }), WantConfigure: true, Agent: testExpected(Expected{ @@ -176,9 +348,11 @@ func TestOTLPFeature(t *testing.T) { { Name: "[single container] HTTP enabled, APM", DDA: newAgentSingleContainer(Settings{ - EnabledHTTP: true, - EndpointHTTP: "somehostname:4318", - APM: true, + EnabledHTTP: true, + EnabledHTTPHostPort: true, + CustomHTTPHostPort: 0, + EndpointHTTP: "somehostname:4318", + APM: true, }), WantConfigure: true, Agent: testExpectedSingleContainer(Expected{ @@ -205,26 +379,30 @@ func TestOTLPFeature(t *testing.T) { } type Settings struct { - EnabledGRPC bool - EndpointGRPC string - EnabledHTTP bool - EndpointHTTP string + EnabledGRPC bool + CustomGRPCHostPort int32 + EnabledGRPCHostPort bool + EndpointGRPC string + EnabledHTTP bool + CustomHTTPHostPort int32 + EnabledHTTPHostPort bool + EndpointHTTP string APM bool } func newAgent(set Settings) *v2alpha1.DatadogAgent { return v2alpha1test.NewDatadogAgentBuilder(). - WithOTLPGRPCSettings(set.EnabledGRPC, set.EndpointGRPC). - WithOTLPHTTPSettings(set.EnabledHTTP, set.EndpointHTTP). + WithOTLPGRPCSettings(set.EnabledGRPC, set.EnabledGRPCHostPort, set.CustomGRPCHostPort, set.EndpointGRPC). + WithOTLPHTTPSettings(set.EnabledHTTP, set.EnabledHTTPHostPort, set.CustomHTTPHostPort, set.EndpointHTTP). WithAPMEnabled(set.APM). Build() } func newAgentSingleContainer(set Settings) *v2alpha1.DatadogAgent { return v2alpha1test.NewDatadogAgentBuilder(). - WithOTLPGRPCSettings(set.EnabledGRPC, set.EndpointGRPC). - WithOTLPHTTPSettings(set.EnabledHTTP, set.EndpointHTTP). + WithOTLPGRPCSettings(set.EnabledGRPC, set.EnabledGRPCHostPort, set.CustomGRPCHostPort, set.EndpointGRPC). + WithOTLPHTTPSettings(set.EnabledHTTP, set.EnabledHTTPHostPort, set.CustomHTTPHostPort, set.EndpointHTTP). WithAPMEnabled(set.APM). WithSingleContainerStrategy(true). Build() diff --git a/internal/controller/datadogagent/feature/types.go b/internal/controller/datadogagent/feature/types.go index 1d4d1bdd1..a6a6ffafc 100644 --- a/internal/controller/datadogagent/feature/types.go +++ b/internal/controller/datadogagent/feature/types.go @@ -241,6 +241,8 @@ type PodTemplateManagers interface { PodTemplateSpec() *corev1.PodTemplateSpec // EnvVar used to access the EnvVarManager to manage the Environment variable defined in the PodTemplateSpec. EnvVar() merger.EnvVarManager + // EnvVarFrom used to access the EnvVarFromManager to manage the Environment variable defined in the PodTemplateSpec. + EnvFromVar() merger.EnvFromVarManager // Volume used to access the VolumeManager to manage the Volume defined in the PodTemplateSpec. Volume() merger.VolumeManager // VolumeMount used to access the VolumeMountManager to manage the VolumeMount defined in the PodTemplateSpec. @@ -259,6 +261,7 @@ func NewPodTemplateManagers(podTmpl *corev1.PodTemplateSpec) PodTemplateManagers return &podTemplateManagerImpl{ podTmpl: podTmpl, envVarManager: merger.NewEnvVarManager(podTmpl), + envFromVarManager: merger.NewEnvFromVarManager(podTmpl), volumeManager: merger.NewVolumeManager(podTmpl), volumeMountManager: merger.NewVolumeMountManager(podTmpl), securityContextManager: merger.NewSecurityContextManager(podTmpl), @@ -270,6 +273,7 @@ func NewPodTemplateManagers(podTmpl *corev1.PodTemplateSpec) PodTemplateManagers type podTemplateManagerImpl struct { podTmpl *corev1.PodTemplateSpec envVarManager merger.EnvVarManager + envFromVarManager merger.EnvFromVarManager volumeManager merger.VolumeManager volumeMountManager merger.VolumeMountManager securityContextManager merger.SecurityContextManager @@ -285,6 +289,10 @@ func (impl *podTemplateManagerImpl) EnvVar() merger.EnvVarManager { return impl.envVarManager } +func (impl *podTemplateManagerImpl) EnvFromVar() merger.EnvFromVarManager { + return impl.envFromVarManager +} + func (impl *podTemplateManagerImpl) Volume() merger.VolumeManager { return impl.volumeManager } diff --git a/internal/controller/datadogagent/merger/envvarfrom.go b/internal/controller/datadogagent/merger/envvarfrom.go index 88df1aec2..212ca49cd 100644 --- a/internal/controller/datadogagent/merger/envvarfrom.go +++ b/internal/controller/datadogagent/merger/envvarfrom.go @@ -6,9 +6,93 @@ package merger import ( + "github.com/DataDog/datadog-operator/api/datadoghq/common" corev1 "k8s.io/api/core/v1" ) +// EnvFromVarManager use to manage adding Environment variable to container in a PodTemplateSpec +type EnvFromVarManager interface { + // AddEnvFromVar use to add an envFromSource variable to all containers present in the Pod. + AddEnvFromVar(newEnvVar *corev1.EnvFromSource) + // AddEnvFromVarWithMergeFunc is used to add an envFromSource variable to all containers present in the Pod. + // The way the EnvFromVar is merged with an existing EnvFromVar can be tuned thanks to the EnvFromSourceFromMergeFunction parameter. + AddEnvFromVarWithMergeFunc(newEnvFromVar *corev1.EnvFromSource, mergeFunc EnvFromSourceFromMergeFunction) error + // AddEnvFromVarToContainer is used to add an envFromSource to a specific container present in the Pod. + AddEnvFromVarToContainer(containerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource) + // AddEnvFromVarToContainers is used to add an envFromSource variable to specified containers present in the Pod. + AddEnvFromVarToContainers(containerNames []common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource) + // AddEnvFromVarToInitContainer is used to add an envFromSource variable to a specific init container present in the Pod. + AddEnvFromVarToInitContainer(containerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource) + // AddEnvFromVarToContainerWithMergeFunc use to add an envFromSource variable to a specific container present in the Pod. + // The way the EnvFromVar is merged with an existing EnvFromVar can be tuned thanks to the EnvFromSourceFromMergeFunction parameter. + AddEnvFromVarToContainerWithMergeFunc(containerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource, mergeFunc EnvFromSourceFromMergeFunction) error +} + +// NewEnvFromManager returns new instance of the EnvFromVarManager +func NewEnvFromVarManager(podTmpl *corev1.PodTemplateSpec) EnvFromVarManager { + return &envFromVarManagerImpl{ + podTmpl: podTmpl, + } +} + +type envFromVarManagerImpl struct { + podTmpl *corev1.PodTemplateSpec +} + +func (impl *envFromVarManagerImpl) AddEnvFromVar(newEnvFromVar *corev1.EnvFromSource) { + _ = impl.AddEnvFromVarWithMergeFunc(newEnvFromVar, DefaultEnvFromSourceFromMergeFunction) +} + +func (impl *envFromVarManagerImpl) AddEnvFromVarWithMergeFunc(newEnvFromVar *corev1.EnvFromSource, mergeFunc EnvFromSourceFromMergeFunction) error { + for id, cont := range impl.podTmpl.Spec.Containers { + if _, ok := AllAgentContainers[common.AgentContainerName(cont.Name)]; ok { + _, err := AddEnvFromSourceFromToContainer(&impl.podTmpl.Spec.Containers[id], newEnvFromVar, mergeFunc) + if err != nil { + return err + } + } + } + return nil +} + +func (impl *envFromVarManagerImpl) AddEnvFromVarToContainer(containerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource) { + _ = impl.AddEnvFromVarToContainerWithMergeFunc(containerName, newEnvFromVar, DefaultEnvFromSourceFromMergeFunction) +} + +func (impl *envFromVarManagerImpl) AddEnvFromVarToContainers(containerNames []common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource) { + for _, containerName := range containerNames { + _ = impl.AddEnvFromVarToContainerWithMergeFunc(containerName, newEnvFromVar, DefaultEnvFromSourceFromMergeFunction) + } +} + +func (impl *envFromVarManagerImpl) AddEnvFromVarToInitContainer(initContainerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource) { + _ = impl.AddEnvFromVarToInitContainerWithMergeFunc(initContainerName, newEnvFromVar, DefaultEnvFromSourceFromMergeFunction) +} + +func (impl *envFromVarManagerImpl) AddEnvFromVarToContainerWithMergeFunc(containerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource, mergeFunc EnvFromSourceFromMergeFunction) error { + for id := range impl.podTmpl.Spec.Containers { + if impl.podTmpl.Spec.Containers[id].Name == string(containerName) { + _, err := AddEnvFromSourceFromToContainer(&impl.podTmpl.Spec.Containers[id], newEnvFromVar, mergeFunc) + if err != nil { + return err + } + } + } + return nil +} + +func (impl *envFromVarManagerImpl) AddEnvFromVarToInitContainerWithMergeFunc(initContainerName common.AgentContainerName, newEnvFromVar *corev1.EnvFromSource, mergeFunc EnvFromSourceFromMergeFunction) error { + for id := range impl.podTmpl.Spec.InitContainers { + if impl.podTmpl.Spec.InitContainers[id].Name == string(initContainerName) { + _, err := AddEnvFromSourceFromToContainer(&impl.podTmpl.Spec.InitContainers[id], newEnvFromVar, mergeFunc) + if err != nil { + return err + } + } + } + return nil +} + // EnvFromSourceFromMergeFunction signature for corev1.EnvFromSource merge function type EnvFromSourceFromMergeFunction func(current, newEnv *corev1.EnvFromSource) (*corev1.EnvFromSource, error) @@ -23,16 +107,6 @@ func OverrideCurrentEnvFromSourceFromMergeFunction(current, newEnv *corev1.EnvFr return newEnv.DeepCopy(), nil } -// IgnoreNewEnvFromSourceFromMergeFunction used when the existing corev1.EnvFromSource needs to be kept. -func IgnoreNewEnvFromSourceFromMergeFunction(current, newEnv *corev1.EnvFromSource) (*corev1.EnvFromSource, error) { - return current.DeepCopy(), nil -} - -// ErrorOnMergeAttemptdEnvFromSourceFromMergeFunction used to avoid replacing an existing corev1.EnvFromSource -func ErrorOnMergeAttemptdEnvFromSourceFromMergeFunction(current, newEnv *corev1.EnvFromSource) (*corev1.EnvFromSource, error) { - return nil, errMergeAttempted -} - // AddEnvFromSourceFromToContainer use to add an EnvFromSource to container. func AddEnvFromSourceFromToContainer(container *corev1.Container, envFromSource *corev1.EnvFromSource, mergeFunc EnvFromSourceFromMergeFunction) ([]corev1.EnvFromSource, error) { var found bool diff --git a/internal/controller/datadogagent/merger/envvarfrom_test.go b/internal/controller/datadogagent/merger/envvarfrom_test.go index d9e2aaf25..4f9a0110e 100644 --- a/internal/controller/datadogagent/merger/envvarfrom_test.go +++ b/internal/controller/datadogagent/merger/envvarfrom_test.go @@ -9,6 +9,8 @@ import ( "reflect" "testing" + "github.com/DataDog/datadog-operator/api/datadoghq/common" + "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" ) @@ -87,36 +89,6 @@ func TestAddEnvFromSourceFromToContainer(t *testing.T) { }, wantErr: false, }, - { - name: "Container.EnvFrom already present, ignore override", - args: args{ - container: &corev1.Container{ - EnvFrom: []corev1.EnvFromSource{ - *envFromSourceFoo, - }, - }, - envFromSource: envFromSourceFoo2, - mergeFunc: IgnoreNewEnvFromSourceFromMergeFunction, - }, - want: []corev1.EnvFromSource{ - *envFromSourceFoo, - }, - wantErr: false, - }, - { - name: "Container.EnvFrom already present, avoid override", - args: args{ - container: &corev1.Container{ - EnvFrom: []corev1.EnvFromSource{ - *envFromSourceFoo, - }, - }, - envFromSource: envFromSourceFoo2, - mergeFunc: ErrorOnMergeAttemptdEnvFromSourceFromMergeFunction, - }, - want: nil, - wantErr: true, - }, // secret { name: "Container.EnvFrom(secret) already present, allow override", @@ -134,36 +106,6 @@ func TestAddEnvFromSourceFromToContainer(t *testing.T) { }, wantErr: false, }, - { - name: "Container.EnvFrom(secret) already present, ignore override", - args: args{ - container: &corev1.Container{ - EnvFrom: []corev1.EnvFromSource{ - *envFromSourceBar, - }, - }, - envFromSource: envFromSourceBar2, - mergeFunc: IgnoreNewEnvFromSourceFromMergeFunction, - }, - want: []corev1.EnvFromSource{ - *envFromSourceBar, - }, - wantErr: false, - }, - { - name: "Container.EnvFrom(secret) already present, avoid override", - args: args{ - container: &corev1.Container{ - EnvFrom: []corev1.EnvFromSource{ - *envFromSourceBar, - }, - }, - envFromSource: envFromSourceBar2, - mergeFunc: ErrorOnMergeAttemptdEnvFromSourceFromMergeFunction, - }, - want: nil, - wantErr: true, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -182,3 +124,76 @@ func TestAddEnvFromSourceFromToContainer(t *testing.T) { }) } } + +func TestAddEnvFromVarWithMergeFunc(t *testing.T) { + podTmpl := corev1.PodTemplateSpec{} + envFromVarFoo := &corev1.EnvFromSource{ + Prefix: "FOO", + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "foo", + }, + }, + } + tests := []struct { + name string + description string + containers []corev1.Container + want []corev1.EnvFromSource + }{ + { + name: "overrides for nodeAgent, clusterAgent, clusterChecks", + description: "all containers should have env var added", + containers: []corev1.Container{ + { + Name: string(common.ClusterChecksRunnersContainerName), + }, + { + Name: string(common.CoreAgentContainerName), + }, + { + Name: string(common.ClusterAgentContainerName), + }, + }, + want: []corev1.EnvFromSource{*envFromVarFoo}, + }, + { + name: "extra containers shouldn't be overridden", + description: "only agent containers should have env var added", + containers: []corev1.Container{ + { + Name: string(common.ClusterChecksRunnersContainerName), + }, + { + Name: string(common.CoreAgentContainerName), + }, + { + Name: string(common.ClusterAgentContainerName), + }, + { + Name: string(common.InitVolumeContainerName), + }, + }, + want: []corev1.EnvFromSource{*envFromVarFoo}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Logf("description: %s", tt.description) + podTmpl.Spec.Containers = tt.containers + manager := &envFromVarManagerImpl{ + podTmpl: &podTmpl, + } + err := manager.AddEnvFromVarWithMergeFunc(envFromVarFoo, DefaultEnvFromSourceFromMergeFunction) + assert.NoError(t, err) + + for _, cont := range manager.podTmpl.Spec.Containers { + if cont.Name == string(common.InitVolumeContainerName) { + assert.Len(t, cont.EnvFrom, 0) + } else { + assert.ElementsMatch(t, cont.EnvFrom, tt.want) + } + } + }) + } +} diff --git a/internal/controller/datadogagent/merger/envvars_test.go b/internal/controller/datadogagent/merger/envvars_test.go index ce5f7d9c8..937231b20 100644 --- a/internal/controller/datadogagent/merger/envvars_test.go +++ b/internal/controller/datadogagent/merger/envvars_test.go @@ -250,6 +250,7 @@ func TestAddEnvVarWithMergeFunc(t *testing.T) { manager := &envVarManagerImpl{ podTmpl: &podTmpl, } + manager.podTmpl.Spec.Containers = tt.containers err := manager.AddEnvVarWithMergeFunc(envvarFoo, DefaultEnvVarMergeFunction) assert.NoError(t, err) @@ -257,7 +258,7 @@ func TestAddEnvVarWithMergeFunc(t *testing.T) { if cont.Name == string(common.FIPSProxyContainerName) { assert.Len(t, cont.Env, 0) } else { - assert.Contains(t, cont.Env, tt.want) + assert.ElementsMatch(t, cont.Env, tt.want) } } }) diff --git a/internal/controller/datadogagent/merger/fake/envfromvar_manager.go b/internal/controller/datadogagent/merger/fake/envfromvar_manager.go new file mode 100644 index 000000000..8af5bc69b --- /dev/null +++ b/internal/controller/datadogagent/merger/fake/envfromvar_manager.go @@ -0,0 +1,90 @@ +package fake + +import ( + "testing" + + "github.com/DataDog/datadog-operator/api/datadoghq/common" + merger "github.com/DataDog/datadog-operator/internal/controller/datadogagent/merger" + + v1 "k8s.io/api/core/v1" +) + +// EnvVarManager is an autogenerated mock type for the EnvVarManager type +type EnvFromVarManager struct { + EnvFromVarsByC map[common.AgentContainerName][]*v1.EnvFromSource + + t testing.TB +} + +// AddEnvVar provides a mock function with given fields: newEnvFromVar +func (_m *EnvFromVarManager) AddEnvFromVar(newEnvFromVar *v1.EnvFromSource) { + _m.t.Logf("AddEnvFromVar %s", newEnvFromVar.SecretRef.Name) + _m.EnvFromVarsByC[AllContainers] = append(_m.EnvFromVarsByC[AllContainers], newEnvFromVar) +} + +// AddEnvFromVarToContainer provides a mock function with given fields: containerName, newEnvFromVar +func (_m *EnvFromVarManager) AddEnvFromVarToContainer(containerName common.AgentContainerName, newEnvFromVar *v1.EnvFromSource) { + isInitContainer := false + for _, initContainerName := range initContainerNames { + if containerName == initContainerName { + isInitContainer = true + break + } + } + if !isInitContainer { + _m.t.Logf("AddEnvFromVar %s", newEnvFromVar.SecretRef.Name) + _m.EnvFromVarsByC[containerName] = append(_m.EnvFromVarsByC[containerName], newEnvFromVar) + } +} + +// AddEnvFromVarToContainers provides a mock function with given fields: containerNames, newEnvFromVar +func (_m *EnvFromVarManager) AddEnvFromVarToContainers(containerNames []common.AgentContainerName, newEnvFromVar *v1.EnvFromSource) { + for _, containerName := range containerNames { + _m.AddEnvFromVarToContainer(containerName, newEnvFromVar) + } +} + +// AddEnvFromVarToInitContainer provides a mock function with given fields: containerName, newEnvFromVar +func (_m *EnvFromVarManager) AddEnvFromVarToInitContainer(containerName common.AgentContainerName, newEnvFromVar *v1.EnvFromSource) { + for _, initContainerName := range initContainerNames { + if containerName == initContainerName { + _m.t.Logf("AddEnvVar to container %s name:%s", containerName, newEnvFromVar.SecretRef.Name) + _m.EnvFromVarsByC[containerName] = append(_m.EnvFromVarsByC[containerName], newEnvFromVar) + } + } +} + +// AddEnvFromVarToContainerWithMergeFunc provides a mock function with given fields: containerName, newEnvFromVar, mergeFunc +func (_m *EnvFromVarManager) AddEnvFromVarToContainerWithMergeFunc(containerName common.AgentContainerName, newEnvFromVar *v1.EnvFromSource, mergeFunc merger.EnvFromSourceFromMergeFunction) error { + found := false + idFound := 0 + for id, envVar := range _m.EnvFromVarsByC[containerName] { + if envVar.SecretRef.Name == newEnvFromVar.SecretRef.Name { + found = true + idFound = id + } + } + + if found { + var err error + newEnvFromVar, err = mergeFunc(_m.EnvFromVarsByC[containerName][idFound], newEnvFromVar) + _m.EnvFromVarsByC[containerName][idFound] = newEnvFromVar + return err + } + + _m.EnvFromVarsByC[containerName] = append(_m.EnvFromVarsByC[containerName], newEnvFromVar) + return nil +} + +// AddEnvVarWithMergeFunc provides a mock function with given fields: newEnvFromVar, mergeFunc +func (_m *EnvFromVarManager) AddEnvFromVarWithMergeFunc(newEnvFromVar *v1.EnvFromSource, mergeFunc merger.EnvFromSourceFromMergeFunction) error { + return _m.AddEnvFromVarToContainerWithMergeFunc(AllContainers, newEnvFromVar, mergeFunc) +} + +// NewFakeEnvVarFromManager creates a new instance of EnvFromVarManager. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewFakeEnvFromVarManager(t testing.TB) *EnvFromVarManager { + return &EnvFromVarManager{ + EnvFromVarsByC: make(map[common.AgentContainerName][]*v1.EnvFromSource), + t: t, + } +} diff --git a/internal/controller/datadogagent/merger/rbac.go b/internal/controller/datadogagent/merger/rbac.go index 4f47724ba..139a85aab 100644 --- a/internal/controller/datadogagent/merger/rbac.go +++ b/internal/controller/datadogagent/merger/rbac.go @@ -21,7 +21,7 @@ import ( type RBACManager interface { AddServiceAccount(namespace string, name string) error AddServiceAccountByComponent(namespace, name, component string) error - AddPolicyRules(namespace string, roleName string, saName string, policies []rbacv1.PolicyRule) error + AddPolicyRules(namespace string, roleName string, saName string, policies []rbacv1.PolicyRule, saNamespace ...string) error AddPolicyRulesByComponent(namespace string, roleName string, saName string, policies []rbacv1.PolicyRule, component string) error AddRoleBinding(roleNamespace, roleName, saNamespace, saName string, roleRef rbacv1.RoleRef) error AddClusterPolicyRules(namespace string, roleName string, saName string, policies []rbacv1.PolicyRule) error @@ -87,7 +87,7 @@ func (m *rbacManagerImpl) DeleteServiceAccountByComponent(component, namespace s } // AddPolicyRules is used to add PolicyRules to a Role. It also creates the RoleBinding. -func (m *rbacManagerImpl) AddPolicyRules(namespace string, roleName string, saName string, policies []rbacv1.PolicyRule) error { +func (m *rbacManagerImpl) AddPolicyRules(namespace string, roleName string, saName string, policies []rbacv1.PolicyRule, saNamespace ...string) error { obj, _ := m.store.GetOrCreate(kubernetes.RolesKind, namespace, roleName) role, ok := obj.(*rbacv1.Role) if !ok { @@ -106,7 +106,13 @@ func (m *rbacManagerImpl) AddPolicyRules(namespace string, roleName string, saNa Name: roleName, } - return m.AddRoleBinding(namespace, roleName, namespace, saName, roleRef) + // If saNamespace is not provided, defaults to using role namespace. + targetSaNamespace := namespace + if len(saNamespace) > 0 { + targetSaNamespace = saNamespace[0] + } + + return m.AddRoleBinding(namespace, roleName, targetSaNamespace, saName, roleRef) } // AddPolicyRulesByComponent is used to add PolicyRules to a Role, create a RoleBinding, and associate them with a component diff --git a/internal/controller/datadogagent/override/global.go b/internal/controller/datadogagent/override/global.go index 2ed3bf94e..675bc41a2 100644 --- a/internal/controller/datadogagent/override/global.go +++ b/internal/controller/datadogagent/override/global.go @@ -10,6 +10,8 @@ import ( "fmt" "path/filepath" + "strconv" + apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common" "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1" apiutils "github.com/DataDog/datadog-operator/api/utils" @@ -17,6 +19,8 @@ import ( "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature" "github.com/DataDog/datadog-operator/internal/controller/datadogagent/object/volume" "github.com/DataDog/datadog-operator/pkg/defaulting" + "github.com/DataDog/datadog-operator/pkg/kubernetes/rbac" + rbacv1 "k8s.io/api/rbac/v1" "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" @@ -313,6 +317,80 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers } } + // Apply SecretBackend config + if config.SecretBackend != nil { + // Set secret backend command + manager.EnvVar().AddEnvVar(&corev1.EnvVar{ + Name: apicommon.DDSecretBackendCommand, + Value: apiutils.StringValue(config.SecretBackend.Command), + }) + + // Set secret backend arguments + manager.EnvVar().AddEnvVar(&corev1.EnvVar{ + Name: apicommon.DDSecretBackendArguments, + Value: apiutils.StringValue(config.SecretBackend.Args), + }) + + // Set secret backend timeout + if config.SecretBackend.Timeout != nil { + manager.EnvVar().AddEnvVar(&corev1.EnvVar{ + Name: apicommon.DDSecretBackendTimeout, + Value: strconv.FormatInt(int64(*config.SecretBackend.Timeout), 10), + }) + } + + var componentSaName string + switch componentName { + case v2alpha1.ClusterAgentComponentName: + componentSaName = v2alpha1.GetClusterAgentServiceAccount(dda) + case v2alpha1.NodeAgentComponentName: + componentSaName = v2alpha1.GetAgentServiceAccount(dda) + case v2alpha1.ClusterChecksRunnerComponentName: + componentSaName = v2alpha1.GetClusterChecksRunnerServiceAccount(dda) + } + + agentName := dda.GetName() + agentNs := dda.GetNamespace() + rbacSuffix := "secret-backend" + + // Set global RBAC config (only if specific roles are not defined) + if apiutils.BoolValue(config.SecretBackend.EnableGlobalPermissions) && config.SecretBackend.Roles == nil { + + var secretBackendGlobalRBACPolicyRules = []rbacv1.PolicyRule{ + { + APIGroups: []string{rbac.CoreAPIGroup}, + Resources: []string{rbac.SecretsResource}, + Verbs: []string{rbac.GetVerb}, + }, + } + + roleName := fmt.Sprintf("%s-%s-%s", agentNs, agentName, rbacSuffix) + + if err := resourcesManager.RBACManager().AddClusterPolicyRules(agentNs, roleName, componentSaName, secretBackendGlobalRBACPolicyRules); err != nil { + logger.Error(err, "Error adding cluster-wide secrets RBAC policy") + } + } + + // Set specific roles for the secret backend + if config.SecretBackend.Roles != nil { + for _, role := range config.SecretBackend.Roles { + secretNs := apiutils.StringValue(role.Namespace) + roleName := fmt.Sprintf("%s-%s-%s", secretNs, agentName, rbacSuffix) + policyRule := []rbacv1.PolicyRule{ + { + APIGroups: []string{rbac.CoreAPIGroup}, + Resources: []string{rbac.SecretsResource}, + ResourceNames: role.Secrets, + Verbs: []string{rbac.GetVerb}, + }, + } + if err := resourcesManager.RBACManager().AddPolicyRules(secretNs, roleName, componentSaName, policyRule, agentNs); err != nil { + logger.Error(err, "Error adding secrets RBAC policy") + } + } + } + } + // Apply FIPS config if config.FIPS != nil && apiutils.BoolValue(config.FIPS.Enabled) { applyFIPSConfig(logger, manager, dda, resourcesManager) diff --git a/internal/controller/datadogagent/override/global_test.go b/internal/controller/datadogagent/override/global_test.go index 95e8e94f0..cc153baa3 100644 --- a/internal/controller/datadogagent/override/global_test.go +++ b/internal/controller/datadogagent/override/global_test.go @@ -6,8 +6,12 @@ package override import ( + "fmt" "testing" + "github.com/DataDog/datadog-operator/pkg/kubernetes" + "github.com/DataDog/datadog-operator/pkg/kubernetes/rbac" + apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common" "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1" v2alpha1test "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1/test" @@ -19,16 +23,25 @@ import ( "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/fake" "github.com/DataDog/datadog-operator/internal/controller/datadogagent/store" corev1 "k8s.io/api/core/v1" + rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" ) const ( - hostCAPath = "/host/ca/path/ca.crt" - agentCAPath = "/agent/ca/path/ca.crt" - dockerSocketPath = "/docker/socket/path/docker.sock" + hostCAPath = "/host/ca/path/ca.crt" + agentCAPath = "/agent/ca/path/ca.crt" + dockerSocketPath = "/docker/socket/path/docker.sock" + secretBackendCommand = "foo.sh" + secretBackendArgs = "bar baz" + secretBackendTimeout = 60 + ddaName = "datadog" + ddaNamespace = "system" + secretNamespace = "postgres" ) +var secretNames = []string{"db-username", "db-password"} + func TestNodeAgentComponenGlobalSettings(t *testing.T) { logger := logf.Log.WithName("TestRequiredComponents") @@ -49,6 +62,7 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) { wantVolumes []*corev1.Volume wantEnvVars []*corev1.EnvVar want func(t testing.TB, mgrInterface feature.PodTemplateManagers, expectedEnvVars []*corev1.EnvVar, expectedVolumes []*corev1.Volume, expectedVolumeMounts []*corev1.VolumeMount) + wantDependency func(t testing.TB, resourcesManager feature.ResourceManagers) }{ { name: "Kubelet volume configured", @@ -143,6 +157,64 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) { wantVolumes: emptyVolumes, want: assertAll, }, + { + name: "Secret backend - global permissions", + singleContainerStrategyEnabled: false, + dda: addNameNamespaceToDDA( + ddaName, + ddaNamespace, + v2alpha1test.NewDatadogAgentBuilder(). + WithGlobalSecretBackendGlobalPerms(secretBackendCommand, secretBackendArgs, secretBackendTimeout). + BuildWithDefaults(), + ), + wantEnvVars: getExpectedEnvVars([]*corev1.EnvVar{ + { + Name: apicommon.DDSecretBackendCommand, + Value: secretBackendCommand, + }, + { + Name: apicommon.DDSecretBackendArguments, + Value: secretBackendArgs, + }, + { + Name: apicommon.DDSecretBackendTimeout, + Value: "60", + }, + }...), + wantVolumeMounts: emptyVolumeMounts, + wantVolumes: emptyVolumes, + want: assertAll, + wantDependency: assertSecretBackendGlobalPerms, + }, + { + name: "Secret backend - specific secret permissions", + singleContainerStrategyEnabled: false, + dda: addNameNamespaceToDDA( + ddaName, + ddaNamespace, + v2alpha1test.NewDatadogAgentBuilder(). + WithGlobalSecretBackendSpecificRoles(secretBackendCommand, secretBackendArgs, secretBackendTimeout, secretNamespace, secretNames). + BuildWithDefaults(), + ), + wantEnvVars: getExpectedEnvVars([]*corev1.EnvVar{ + { + Name: apicommon.DDSecretBackendCommand, + Value: secretBackendCommand, + }, + { + Name: apicommon.DDSecretBackendArguments, + Value: secretBackendArgs, + }, + { + Name: apicommon.DDSecretBackendTimeout, + Value: "60", + }, + }...), + wantVolumeMounts: emptyVolumeMounts, + wantVolumes: emptyVolumes, + want: assertAll, + wantDependency: assertSecretBackendSpecificPerms, + }, } for _, tt := range tests { @@ -154,6 +226,10 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) { ApplyGlobalSettingsNodeAgent(logger, podTemplateManager, tt.dda, resourcesManager, tt.singleContainerStrategyEnabled) tt.want(t, podTemplateManager, tt.wantEnvVars, tt.wantVolumes, tt.wantVolumeMounts) + // Assert dependencies if and only if a dependency is expected + if tt.wantDependency != nil { + tt.wantDependency(t, resourcesManager) + } }) } } @@ -240,3 +316,125 @@ func getExpectedVolumeMounts() []*corev1.VolumeMount { }, } } + +func addNameNamespaceToDDA(name string, namespace string, dda *v2alpha1.DatadogAgent) *v2alpha1.DatadogAgent { + dda.Name = name + dda.Namespace = namespace + return dda +} + +func assertSecretBackendGlobalPerms(t testing.TB, resourcesManager feature.ResourceManagers) { + store := resourcesManager.Store() + // ClusterRole and ClusterRoleBinding use the same name + expectedName := fmt.Sprintf("%s-%s-%s", ddaNamespace, ddaName, "secret-backend") + expectedPolicyRules := []rbacv1.PolicyRule{ + { + APIGroups: []string{rbac.CoreAPIGroup}, + Resources: []string{rbac.SecretsResource}, + Verbs: []string{rbac.GetVerb}, + }, + } + crObj, found := store.Get(kubernetes.ClusterRolesKind, "", expectedName) + if !found { + t.Error("Should have created ClusterRole") + } else { + cr := crObj.(*rbacv1.ClusterRole) + assert.True( + t, + apiutils.IsEqualStruct(cr.Rules, expectedPolicyRules), + "ClusterRole Policy Rules \ndiff = %s", cmp.Diff(cr.Rules, expectedPolicyRules), + ) + } + + expectedRoleRef := rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, + Kind: rbac.ClusterRoleKind, + Name: expectedName, + } + + expectedSubject := []rbacv1.Subject{ + { + Kind: "ServiceAccount", + Name: ddaName + "-" + v2alpha1.DefaultAgentResourceSuffix, + Namespace: ddaNamespace, + }, + } + + crbObj, found := store.Get(kubernetes.ClusterRoleBindingKind, "", expectedName) + if !found { + t.Error("Should have created ClusterRoleBinding") + } else { + crb := crbObj.(*rbacv1.ClusterRoleBinding) + // Validate ClusterRoleBinding roleRef name + assert.True( + t, + apiutils.IsEqualStruct(crb.RoleRef, expectedRoleRef), + "ClusterRoleBinding Role Ref \ndiff = %s", cmp.Diff(crb.RoleRef, expectedRoleRef), + ) + // Validate ClusterRoleBinding subject + assert.True( + t, + apiutils.IsEqualStruct(crb.Subjects, expectedSubject), + "ClusterRoleBinding Subject \ndiff = %s", cmp.Diff(crb.Subjects, expectedSubject), + ) + } +} + +func assertSecretBackendSpecificPerms(t testing.TB, resourcesManager feature.ResourceManagers) { + store := resourcesManager.Store() + + // Role and RoleBinding use the same name + expectedName := fmt.Sprintf("%s-%s-%s", secretNamespace, ddaName, "secret-backend") + expectedPolicyRules := []rbacv1.PolicyRule{ + { + APIGroups: []string{rbac.CoreAPIGroup}, + Resources: []string{rbac.SecretsResource}, + ResourceNames: secretNames, + Verbs: []string{rbac.GetVerb}, + }, + } + rObj, found := store.Get(kubernetes.RolesKind, secretNamespace, expectedName) + if !found { + t.Error("Should have created Role") + } else { + r := rObj.(*rbacv1.Role) + assert.True( + t, + apiutils.IsEqualStruct(r.Rules, expectedPolicyRules), + "Role Policy Rules \ndiff = %s", cmp.Diff(r.Rules, expectedPolicyRules), + ) + } + + expectedRoleRef := rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, + Kind: rbac.RoleKind, + Name: expectedName, + } + + expectedSubject := []rbacv1.Subject{ + { + Kind: "ServiceAccount", + Name: ddaName + "-" + v2alpha1.DefaultAgentResourceSuffix, + Namespace: ddaNamespace, + }, + } + + rbObj, found := store.Get(kubernetes.RoleBindingKind, secretNamespace, expectedName) + if !found { + t.Error("Should have created RoleBinding") + } else { + rb := rbObj.(*rbacv1.RoleBinding) + // Validate RoleBinding roleRef name + assert.True( + t, + apiutils.IsEqualStruct(rb.RoleRef, expectedRoleRef), + "RoleBinding Role Ref \ndiff = %s", cmp.Diff(rb.RoleRef, expectedRoleRef), + ) + // Validate RoleBinding subject + assert.True( + t, + apiutils.IsEqualStruct(rb.Subjects, expectedSubject), + "RoleBinding Subject \ndiff = %s", cmp.Diff(rb.Subjects, expectedSubject), + ) + } +} diff --git a/internal/controller/datadogagent/override/podtemplatespec.go b/internal/controller/datadogagent/override/podtemplatespec.go index c51bc33a2..42337b90c 100644 --- a/internal/controller/datadogagent/override/podtemplatespec.go +++ b/internal/controller/datadogagent/override/podtemplatespec.go @@ -60,6 +60,11 @@ func PodTemplateSpec(logger logr.Logger, manager feature.PodTemplateManagers, ov manager.EnvVar().AddEnvVar(&e) } + for _, envFrom := range override.EnvFrom { + e := envFrom + manager.EnvFromVar().AddEnvFromVar(&e) + } + // Override agent configurations such as datadog.yaml, system-probe.yaml, etc. overrideCustomConfigVolumes(logger, manager, override.CustomConfigurations, componentName, ddaName) diff --git a/internal/controller/datadogagent/store/store.go b/internal/controller/datadogagent/store/store.go index 42df1e0dd..bd9181adf 100644 --- a/internal/controller/datadogagent/store/store.go +++ b/internal/controller/datadogagent/store/store.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -40,7 +39,6 @@ type StoreClient interface { AddOrUpdate(kind kubernetes.ObjectKind, obj client.Object) error Get(kind kubernetes.ObjectKind, namespace, name string) (client.Object, bool) GetOrCreate(kind kubernetes.ObjectKind, namespace, name string) (client.Object, bool) - GetVersionInfo() *version.Info GetPlatformInfo() kubernetes.PlatformInfo Delete(kind kubernetes.ObjectKind, namespace string, name string) bool DeleteAll(ctx context.Context, k8sClient client.Client) []error @@ -55,7 +53,6 @@ func NewStore(owner metav1.Object, options *StoreOptions) *Store { } if options != nil { store.supportCilium = options.SupportCilium - store.versionInfo = options.VersionInfo store.platformInfo = options.PlatformInfo store.logger = options.Logger store.scheme = options.Scheme @@ -71,7 +68,6 @@ type Store struct { mutex sync.RWMutex supportCilium bool - versionInfo *version.Info platformInfo kubernetes.PlatformInfo scheme *runtime.Scheme @@ -82,7 +78,6 @@ type Store struct { // StoreOptions use to provide to NewStore() function some Store creation options. type StoreOptions struct { SupportCilium bool - VersionInfo *version.Info PlatformInfo kubernetes.PlatformInfo Scheme *runtime.Scheme @@ -285,11 +280,6 @@ func (ds *Store) Cleanup(ctx context.Context, k8sClient client.Client) []error { return errs } -// GetVersionInfo returns the Kubernetes version -func (ds *Store) GetVersionInfo() *version.Info { - return ds.versionInfo -} - // GetPlatformInfo returns api-resources info func (ds *Store) GetPlatformInfo() kubernetes.PlatformInfo { return ds.platformInfo diff --git a/internal/controller/datadogagent_controller.go b/internal/controller/datadogagent_controller.go index fc9589871..d0dc81f45 100644 --- a/internal/controller/datadogagent_controller.go +++ b/internal/controller/datadogagent_controller.go @@ -18,7 +18,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" ctrlbuilder "sigs.k8s.io/controller-runtime/pkg/builder" @@ -42,7 +41,6 @@ import ( // DatadogAgentReconciler reconciles a DatadogAgent object. type DatadogAgentReconciler struct { client.Client - VersionInfo *version.Info PlatformInfo kubernetes.PlatformInfo Log logr.Logger Scheme *runtime.Scheme @@ -263,7 +261,7 @@ func (r *DatadogAgentReconciler) SetupWithManager(mgr ctrl.Manager) error { return err } - internal, err := datadogagent.NewReconciler(r.Options, r.Client, r.VersionInfo, r.PlatformInfo, r.Scheme, r.Log, r.Recorder, metricForwarder) + internal, err := datadogagent.NewReconciler(r.Options, r.Client, r.PlatformInfo, r.Scheme, r.Log, r.Recorder, metricForwarder) if err != nil { return err } diff --git a/internal/controller/datadogdashboard/controller.go b/internal/controller/datadogdashboard/controller.go index c9f9cd753..48dbaf116 100644 --- a/internal/controller/datadogdashboard/controller.go +++ b/internal/controller/datadogdashboard/controller.go @@ -18,7 +18,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -39,18 +38,16 @@ type Reconciler struct { client client.Client datadogClient *datadogV1.DashboardsApi datadogAuth context.Context - versionInfo *version.Info scheme *runtime.Scheme log logr.Logger recorder record.EventRecorder } -func NewReconciler(client client.Client, ddClient datadogclient.DatadogDashboardClient, versionInfo *version.Info, scheme *runtime.Scheme, log logr.Logger, recorder record.EventRecorder) *Reconciler { +func NewReconciler(client client.Client, ddClient datadogclient.DatadogDashboardClient, scheme *runtime.Scheme, log logr.Logger, recorder record.EventRecorder) *Reconciler { return &Reconciler{ client: client, datadogClient: ddClient.Client, datadogAuth: ddClient.Auth, - versionInfo: versionInfo, scheme: scheme, log: log, recorder: recorder, @@ -63,7 +60,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) ( func (r *Reconciler) internalReconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { logger := r.log.WithValues("datadogdashboard", req.NamespacedName) - logger.Info("Reconciling Datadog Dashboard", "version", r.versionInfo.String()) + logger.Info("Reconciling Datadog Dashboard") now := metav1.NewTime(time.Now()) instance := &v1alpha1.DatadogDashboard{} diff --git a/internal/controller/datadogdashboard/controller_test.go b/internal/controller/datadogdashboard/controller_test.go index fe7c04550..6e4b611ce 100644 --- a/internal/controller/datadogdashboard/controller_test.go +++ b/internal/controller/datadogdashboard/controller_test.go @@ -10,7 +10,6 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" "k8s.io/kubectl/pkg/scheme" ctrl "sigs.k8s.io/controller-runtime" @@ -188,7 +187,6 @@ func TestReconcileDatadogDashboard_Reconcile(t *testing.T) { scheme: s, recorder: recorder, log: logf.Log.WithName(tt.name), - versionInfo: &version.Info{}, } // First dashboard action diff --git a/internal/controller/datadogdashboard_controller.go b/internal/controller/datadogdashboard_controller.go index 03180ce6d..97b261835 100644 --- a/internal/controller/datadogdashboard_controller.go +++ b/internal/controller/datadogdashboard_controller.go @@ -9,7 +9,6 @@ import ( "context" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -23,13 +22,12 @@ import ( // DatadogDashboardReconciler reconciles a DatadogDashboard object type DatadogDashboardReconciler struct { - Client client.Client - DDClient datadogclient.DatadogDashboardClient - VersionInfo *version.Info - Log logr.Logger - Scheme *runtime.Scheme - Recorder record.EventRecorder - internal *datadogdashboard.Reconciler + Client client.Client + DDClient datadogclient.DatadogDashboardClient + Log logr.Logger + Scheme *runtime.Scheme + Recorder record.EventRecorder + internal *datadogdashboard.Reconciler } //+kubebuilder:rbac:groups=datadoghq.com,resources=datadogdashboards,verbs=get;list;watch;create;update;patch;delete @@ -43,7 +41,7 @@ func (r *DatadogDashboardReconciler) Reconcile(ctx context.Context, req ctrl.Req // SetupWithManager sets up the controller with the Manager. func (r *DatadogDashboardReconciler) SetupWithManager(mgr ctrl.Manager) error { - r.internal = datadogdashboard.NewReconciler(r.Client, r.DDClient, r.VersionInfo, r.Scheme, r.Log, r.Recorder) + r.internal = datadogdashboard.NewReconciler(r.Client, r.DDClient, r.Scheme, r.Log, r.Recorder) builder := ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.DatadogDashboard{}). diff --git a/internal/controller/datadogmonitor/controller.go b/internal/controller/datadogmonitor/controller.go index bc5744972..5e821927d 100644 --- a/internal/controller/datadogmonitor/controller.go +++ b/internal/controller/datadogmonitor/controller.go @@ -18,7 +18,6 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -63,19 +62,17 @@ type Reconciler struct { client client.Client datadogClient *datadogV1.MonitorsApi datadogAuth context.Context - versionInfo *version.Info log logr.Logger scheme *runtime.Scheme recorder record.EventRecorder } // NewReconciler returns a new Reconciler object -func NewReconciler(client client.Client, ddClient datadogclient.DatadogMonitorClient, versionInfo *version.Info, scheme *runtime.Scheme, log logr.Logger, recorder record.EventRecorder) (*Reconciler, error) { +func NewReconciler(client client.Client, ddClient datadogclient.DatadogMonitorClient, scheme *runtime.Scheme, log logr.Logger, recorder record.EventRecorder) (*Reconciler, error) { return &Reconciler{ client: client, datadogClient: ddClient.Client, datadogAuth: ddClient.Auth, - versionInfo: versionInfo, scheme: scheme, log: log, recorder: recorder, diff --git a/internal/controller/datadogmonitor_controller.go b/internal/controller/datadogmonitor_controller.go index 667b4b2bc..11f81a9da 100644 --- a/internal/controller/datadogmonitor_controller.go +++ b/internal/controller/datadogmonitor_controller.go @@ -10,7 +10,6 @@ import ( "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -23,13 +22,12 @@ import ( // DatadogMonitorReconciler reconciles a DatadogMonitor object. type DatadogMonitorReconciler struct { - Client client.Client - DDClient datadogclient.DatadogMonitorClient - VersionInfo *version.Info - Log logr.Logger - Scheme *runtime.Scheme - Recorder record.EventRecorder - internal *datadogmonitor.Reconciler + Client client.Client + DDClient datadogclient.DatadogMonitorClient + Log logr.Logger + Scheme *runtime.Scheme + Recorder record.EventRecorder + internal *datadogmonitor.Reconciler } // +kubebuilder:rbac:groups=datadoghq.com,resources=datadogmonitors,verbs=get;list;watch;create;update;patch;delete @@ -43,7 +41,7 @@ func (r *DatadogMonitorReconciler) Reconcile(ctx context.Context, req ctrl.Reque // SetupWithManager creates a new DatadogMonitor controller. func (r *DatadogMonitorReconciler) SetupWithManager(mgr ctrl.Manager) error { - internal, err := datadogmonitor.NewReconciler(r.Client, r.DDClient, r.VersionInfo, r.Scheme, r.Log, r.Recorder) + internal, err := datadogmonitor.NewReconciler(r.Client, r.DDClient, r.Scheme, r.Log, r.Recorder) if err != nil { return err } diff --git a/internal/controller/datadogslo/controller.go b/internal/controller/datadogslo/controller.go index 1a4307780..ad47ea877 100644 --- a/internal/controller/datadogslo/controller.go +++ b/internal/controller/datadogslo/controller.go @@ -17,7 +17,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -48,17 +47,15 @@ type Reconciler struct { client client.Client datadogClient *datadogV1.ServiceLevelObjectivesApi datadogAuth context.Context - versionInfo *version.Info log logr.Logger recorder record.EventRecorder } -func NewReconciler(client client.Client, ddClient datadogclient.DatadogSLOClient, versionInfo *version.Info, log logr.Logger, recorder record.EventRecorder) *Reconciler { +func NewReconciler(client client.Client, ddClient datadogclient.DatadogSLOClient, log logr.Logger, recorder record.EventRecorder) *Reconciler { return &Reconciler{ client: client, datadogClient: ddClient.Client, datadogAuth: ddClient.Auth, - versionInfo: versionInfo, log: log, recorder: recorder, } @@ -73,7 +70,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (reco func (r *Reconciler) internalReconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { logger := r.log.WithValues("datadogslo", req.NamespacedName) - logger.Info("Reconciling Datadog SLO", "version", r.versionInfo.String()) + logger.Info("Reconciling Datadog SLO") now := metav1.NewTime(time.Now()) // Get instance diff --git a/internal/controller/datadogslo/controller_test.go b/internal/controller/datadogslo/controller_test.go index 2e6b65beb..85d73667c 100644 --- a/internal/controller/datadogslo/controller_test.go +++ b/internal/controller/datadogslo/controller_test.go @@ -19,7 +19,6 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" @@ -147,7 +146,6 @@ func TestReconciler_Reconcile(t *testing.T) { datadogAuth: testAuth, recorder: recorder, log: testLogger, - versionInfo: &version.Info{}, } res, _ := r.Reconcile(ctx, tt.request) diff --git a/internal/controller/datadogslo_controller.go b/internal/controller/datadogslo_controller.go index 8e1b1da0a..77a93f08e 100644 --- a/internal/controller/datadogslo_controller.go +++ b/internal/controller/datadogslo_controller.go @@ -13,7 +13,6 @@ import ( "github.com/DataDog/datadog-operator/internal/controller/datadogslo" "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -24,13 +23,12 @@ import ( ) type DatadogSLOReconciler struct { - Client client.Client - DDClient datadogclient.DatadogSLOClient - VersionInfo *version.Info - Log logr.Logger - Scheme *runtime.Scheme - Recorder record.EventRecorder - internal *datadogslo.Reconciler + Client client.Client + DDClient datadogclient.DatadogSLOClient + Log logr.Logger + Scheme *runtime.Scheme + Recorder record.EventRecorder + internal *datadogslo.Reconciler } // +kubebuilder:rbac:groups=datadoghq.com,resources=datadogslos,verbs=get;list;watch;create;update;patch;delete @@ -43,7 +41,7 @@ func (r *DatadogSLOReconciler) Reconcile(ctx context.Context, req reconcile.Requ } func (r *DatadogSLOReconciler) SetupWithManager(mgr ctrl.Manager) error { - r.internal = datadogslo.NewReconciler(r.Client, r.DDClient, r.VersionInfo, r.Log, r.Recorder) + r.internal = datadogslo.NewReconciler(r.Client, r.DDClient, r.Log, r.Recorder) builder := ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.DatadogSLO{}). diff --git a/internal/controller/metrics/datadogoperator.go b/internal/controller/metrics/datadogoperator.go new file mode 100644 index 000000000..9f628a2fa --- /dev/null +++ b/internal/controller/metrics/datadogoperator.go @@ -0,0 +1,26 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" + "sigs.k8s.io/controller-runtime/pkg/metrics" +) + +var ( + // maximum goroutines + MaxGoroutines = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "max_goroutines", + Help: "reports the maximum number of goroutines set in the datadog operator", + }, + ) +) + +func init() { + // Register custom metrics with the global prometheus registry + metrics.Registry.MustRegister(MaxGoroutines) +} diff --git a/internal/controller/setup.go b/internal/controller/setup.go index 2bab071bc..c701409b5 100644 --- a/internal/controller/setup.go +++ b/internal/controller/setup.go @@ -22,7 +22,6 @@ import ( "github.com/DataDog/datadog-operator/pkg/utils" "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/discovery" "k8s.io/client-go/rest" ) @@ -67,7 +66,7 @@ type ExtendedDaemonsetOptions struct { CanaryAutoPauseMaxSlowStartDuration time.Duration } -type starterFunc func(logr.Logger, manager.Manager, *version.Info, kubernetes.PlatformInfo, SetupOptions) error +type starterFunc func(logr.Logger, manager.Manager, kubernetes.PlatformInfo, SetupOptions) error var controllerStarters = map[string]starterFunc{ agentControllerName: startDatadogAgent, @@ -107,7 +106,7 @@ func SetupControllers(logger logr.Logger, mgr manager.Manager, options SetupOpti platformInfo := kubernetes.NewPlatformInfo(versionInfo, groups, resources) for controller, starter := range controllerStarters { - if err := starter(logger, mgr, versionInfo, platformInfo, options); err != nil { + if err := starter(logger, mgr, platformInfo, options); err != nil { logger.Error(err, "Couldn't start controller", "controller", controller) } } @@ -126,7 +125,7 @@ func getServerGroupsAndResources(log logr.Logger, discoveryClient *discovery.Dis return groups, resources, nil } -func startDatadogAgent(logger logr.Logger, mgr manager.Manager, vInfo *version.Info, pInfo kubernetes.PlatformInfo, options SetupOptions) error { +func startDatadogAgent(logger logr.Logger, mgr manager.Manager, pInfo kubernetes.PlatformInfo, options SetupOptions) error { if !options.DatadogAgentEnabled { logger.Info("Feature disabled, not starting the controller", "controller", agentControllerName) @@ -135,7 +134,6 @@ func startDatadogAgent(logger logr.Logger, mgr manager.Manager, vInfo *version.I return (&DatadogAgentReconciler{ Client: mgr.GetClient(), - VersionInfo: vInfo, PlatformInfo: pInfo, Log: ctrl.Log.WithName("controllers").WithName(agentControllerName), Scheme: mgr.GetScheme(), @@ -163,7 +161,7 @@ func startDatadogAgent(logger logr.Logger, mgr manager.Manager, vInfo *version.I }).SetupWithManager(mgr) } -func startDatadogMonitor(logger logr.Logger, mgr manager.Manager, vInfo *version.Info, pInfo kubernetes.PlatformInfo, options SetupOptions) error { +func startDatadogMonitor(logger logr.Logger, mgr manager.Manager, pInfo kubernetes.PlatformInfo, options SetupOptions) error { if !options.DatadogMonitorEnabled { logger.Info("Feature disabled, not starting the controller", "controller", monitorControllerName) @@ -176,16 +174,15 @@ func startDatadogMonitor(logger logr.Logger, mgr manager.Manager, vInfo *version } return (&DatadogMonitorReconciler{ - Client: mgr.GetClient(), - DDClient: ddClient, - VersionInfo: vInfo, - Log: ctrl.Log.WithName("controllers").WithName(monitorControllerName), - Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor(monitorControllerName), + Client: mgr.GetClient(), + DDClient: ddClient, + Log: ctrl.Log.WithName("controllers").WithName(monitorControllerName), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor(monitorControllerName), }).SetupWithManager(mgr) } -func startDatadogDashboard(logger logr.Logger, mgr manager.Manager, vInfo *version.Info, pInfo kubernetes.PlatformInfo, options SetupOptions) error { +func startDatadogDashboard(logger logr.Logger, mgr manager.Manager, pInfo kubernetes.PlatformInfo, options SetupOptions) error { if !options.DatadogDashboardEnabled { logger.Info("Feature disabled, not starting the controller", "controller", dashboardControllerName) return nil @@ -197,16 +194,15 @@ func startDatadogDashboard(logger logr.Logger, mgr manager.Manager, vInfo *versi } return (&DatadogDashboardReconciler{ - Client: mgr.GetClient(), - DDClient: ddClient, - VersionInfo: vInfo, - Log: ctrl.Log.WithName("controllers").WithName(dashboardControllerName), - Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor(dashboardControllerName), + Client: mgr.GetClient(), + DDClient: ddClient, + Log: ctrl.Log.WithName("controllers").WithName(dashboardControllerName), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor(dashboardControllerName), }).SetupWithManager(mgr) } -func startDatadogSLO(logger logr.Logger, mgr manager.Manager, info *version.Info, pInfo kubernetes.PlatformInfo, options SetupOptions) error { +func startDatadogSLO(logger logr.Logger, mgr manager.Manager, pInfo kubernetes.PlatformInfo, options SetupOptions) error { if !options.DatadogSLOEnabled { logger.Info("Feature disabled, not starting the controller", "controller", sloControllerName) return nil @@ -218,18 +214,17 @@ func startDatadogSLO(logger logr.Logger, mgr manager.Manager, info *version.Info } controller := &DatadogSLOReconciler{ - Client: mgr.GetClient(), - DDClient: ddClient, - VersionInfo: info, - Log: ctrl.Log.WithName("controllers").WithName(sloControllerName), - Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor(sloControllerName), + Client: mgr.GetClient(), + DDClient: ddClient, + Log: ctrl.Log.WithName("controllers").WithName(sloControllerName), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor(sloControllerName), } return controller.SetupWithManager(mgr) } -func startDatadogAgentProfiles(logger logr.Logger, mgr manager.Manager, vInfo *version.Info, pInfo kubernetes.PlatformInfo, options SetupOptions) error { +func startDatadogAgentProfiles(logger logr.Logger, mgr manager.Manager, pInfo kubernetes.PlatformInfo, options SetupOptions) error { if !options.DatadogAgentProfileEnabled { logger.Info("Feature disabled, not starting the controller", "controller", profileControllerName) return nil diff --git a/pkg/kubernetes/platforminfo.go b/pkg/kubernetes/platforminfo.go index b2737ac67..c04e8ead7 100644 --- a/pkg/kubernetes/platforminfo.go +++ b/pkg/kubernetes/platforminfo.go @@ -120,3 +120,7 @@ func (platformInfo *PlatformInfo) GetApiVersions(name string) (preferred string, other = platformInfo.apiOtherVersions[name] return preferred, other } + +func (platformInfo *PlatformInfo) GetVersionInfo() *version.Info { + return platformInfo.versionInfo +} diff --git a/pkg/remoteconfig/updater.go b/pkg/remoteconfig/updater.go index 938eec01c..7e865f499 100644 --- a/pkg/remoteconfig/updater.go +++ b/pkg/remoteconfig/updater.go @@ -15,6 +15,7 @@ import ( "strings" "time" + "github.com/cenkalti/backoff" "github.com/go-logr/logr" "github.com/google/uuid" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -241,7 +242,7 @@ func (r *RemoteConfigUpdater) agentConfigUpdateCallback(updates map[string]state r.logger.Info("Merged", "update", mergedUpdate) } - dda, err := r.getDatadogAgentInstance(ctx) + dda, err := r.getDatadogAgentWithRetry(ctx) if err != nil { r.logger.Error(err, "Failed to get updatable agents") return @@ -394,6 +395,34 @@ func (r *RemoteConfigUpdater) getDatadogAgentInstance(ctx context.Context) (v2al return ddaList.Items[0], nil } +func (r *RemoteConfigUpdater) getDatadogAgentWithRetry(ctx context.Context) (v2alpha1.DatadogAgent, error) { + var dda v2alpha1.DatadogAgent + var err error + + operation := func() error { + dda, err = r.getDatadogAgentInstance(ctx) + if err != nil { + r.logger.Error(err, "Failed to get updatable agents, retrying...") + return err + } + return nil + } + + // Create a backoff strategy + expBackoff := backoff.NewExponentialBackOff() + expBackoff.InitialInterval = 1 * time.Second + expBackoff.MaxInterval = 10 * time.Second + expBackoff.MaxElapsedTime = 3 * time.Minute + + err = backoff.Retry(operation, expBackoff) + if err != nil { + r.logger.Error(err, "Failed to get updatable agents after retries") + return dda, err + } + + return dda, nil +} + func (r *RemoteConfigUpdater) updateInstanceStatus(dda v2alpha1.DatadogAgent, cfg DatadogAgentRemoteConfig) error { newddaStatus := dda.Status.DeepCopy() diff --git a/test/e2e/common.go b/test/e2e/common.go index f5b669c82..c3695da1c 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -17,6 +17,7 @@ import ( "github.com/gruntwork-io/terratest/modules/k8s" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/resid" "sigs.k8s.io/yaml" "github.com/DataDog/datadog-operator/pkg/plugin/common" @@ -173,16 +174,16 @@ func updateKustomization(kustomizeDirPath string, kustomizeResourcePaths []strin } // Update resources with target e2e-manager resource yaml - for _, res := range kustomizeResourcePaths { - exists := false - for _, r := range k.Resources { - if r == res { - exists = true - break - } - } - if !exists { - k.Resources = append(k.Resources, res) + if kustomizeResourcePaths != nil { + // We empty slice to avoid accumulating patches from previous tests + k.Patches = k.Patches[:0] + for _, res := range kustomizeResourcePaths { + k.Patches = append(k.Patches, types.Patch{ + Path: res, + Target: &types.Selector{ + ResId: resid.NewResIdKindOnly("Deployment", "manager"), + }, + }) } } diff --git a/test/e2e/kind_test.go b/test/e2e/kind_test.go index 88e53a2de..a01369cee 100644 --- a/test/e2e/kind_test.go +++ b/test/e2e/kind_test.go @@ -138,9 +138,6 @@ func kindProvisioner(k8sVersion string, extraKustomizeResources []string) e2e.Pr return err } - if extraKustomizeResources == nil { - extraKustomizeResources = []string{defaultMgrFileName} - } updateKustomization(kustomizeDirPath, extraKustomizeResources) e2eKustomize, err := kustomize.NewDirectory(ctx, "e2e-manager", diff --git a/test/e2e/manifests/datadog-agent-rc-updater.yaml b/test/e2e/manifests/datadog-agent-rc-updater.yaml new file mode 100644 index 000000000..a9be915ab --- /dev/null +++ b/test/e2e/manifests/datadog-agent-rc-updater.yaml @@ -0,0 +1,58 @@ +apiVersion: datadoghq.com/v2alpha1 +kind: DatadogAgent +metadata: + name: datadog +spec: + features: + clusterChecks: + enabled: true + useClusterChecksRunners: true + liveContainerCollection: + enabled: true + cws: + enabled: false + usm: + enabled: false + cspm: + enabled: false + sbom: + enabled: false + global: + credentials: + apiSecret: + secretName: datadog-secret + keyName: api-key + appSecret: + secretName: datadog-secret + keyName: app-key + clusterName: rc-updater-e2e-test-cluster + site: datadoghq.com + kubelet: + tlsVerify: false + override: + nodeAgent: + labels: + agent.datadoghq.com/e2e-test: datadog-agent-rc + containers: + agent: + env: + - name: DD_SKIP_SSL_VALIDATION + value: "false" + clusterAgent: + labels: + agent.datadoghq.com/e2e-test: datadog-agent-minimum + env: + - name: DD_CLUSTER_NAME + valueFrom: + configMapKeyRef: + name: datadog-cluster-name + key: DD_CLUSTER_NAME + clusterChecksRunner: + labels: + agent.datadoghq.com/e2e-test: datadog-agent-minimum + env: + - name: DD_CLUSTER_NAME + valueFrom: + configMapKeyRef: + name: datadog-cluster-name + key: DD_CLUSTER_NAME diff --git a/test/e2e/rc-updater/api/client.go b/test/e2e/rc-updater/api/client.go new file mode 100644 index 000000000..8841b1c0c --- /dev/null +++ b/test/e2e/rc-updater/api/client.go @@ -0,0 +1,73 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +// Package api provides test helpers to interact with the Datadog API +package api + +import ( + "context" + "fmt" + "net/http" + + "github.com/DataDog/datadog-api-client-go/v2/api/datadog" + + "github.com/DataDog/datadog-agent/test/new-e2e/pkg/runner" + "github.com/DataDog/datadog-agent/test/new-e2e/pkg/runner/parameters" +) + +// Client represents the datadog API context +type Client struct { + api *datadog.APIClient + ctx context.Context + http http.Client + apiKey string + appKey string +} + +// NewClient initialise a client with the API and APP keys +func NewClient() *Client { + apiKey, _ := runner.GetProfile().SecretStore().Get(parameters.APIKey) + appKey, _ := runner.GetProfile().SecretStore().Get(parameters.APPKey) + ctx := context.WithValue( + context.Background(), + datadog.ContextAPIKeys, + map[string]datadog.APIKey{ + "apiKeyAuth": { + Key: apiKey, + }, + "appKeyAuth": { + Key: appKey, + }, + }, + ) + + cfg := datadog.NewConfiguration() + + return &Client{ + api: datadog.NewAPIClient(cfg), + ctx: ctx, + http: http.Client{}, + apiKey: apiKey, + appKey: appKey, + } +} + +// GetAPIKey returns the APIKey +func GetAPIKey() (string, error) { + apiKey, err := runner.GetProfile().SecretStore().Get(parameters.APIKey) + if err != nil { + return "", fmt.Errorf("could not get APIKey") + } + return apiKey, nil +} + +// GetAPPKey returns the APPKey +func GetAPPKey() (string, error) { + appKey, err := runner.GetProfile().SecretStore().Get(parameters.APPKey) + if err != nil { + return "", fmt.Errorf("could not get APPKey") + } + return appKey, nil +} diff --git a/test/e2e/rc-updater/api/ddsql.go b/test/e2e/rc-updater/api/ddsql.go new file mode 100644 index 000000000..30bdb0d45 --- /dev/null +++ b/test/e2e/rc-updater/api/ddsql.go @@ -0,0 +1,106 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package api + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "time" +) + +// JSONAPIPayload is a struct that represents the body of a JSON API request +type JSONAPIPayload[Attr any] struct { + Data JSONAPIPayloadData[Attr] `json:"data"` +} + +// JSONAPIPayloadData is a struct that represents the data field of a JSON API request +type JSONAPIPayloadData[Attr any] struct { + Type string `json:"type"` + Attribute Attr `json:"attributes"` +} + +// DDSQLTableQueryParams is a struct that represents a DDSQL table query +type DDSQLTableQueryParams struct { + DefaultStart int `json:"default_start"` + DefaultEnd int `json:"default_end"` + DefaultInterval int `json:"default_interval"` + Query string `json:"query"` +} + +// DDSQLTableResponse is a struct that represents a DDSQL table response +type DDSQLTableResponse struct { + Data []DataEntry `json:"data"` +} + +// DataEntry is a struct that represents a data entry in a DDSQL table response +type DataEntry struct { + Type string `json:"type"` + Attributes Attributes `json:"attributes"` +} + +// Attributes is a struct that represents the attributes of a data entry in a DDSQL table response +type Attributes struct { + Columns []Column `json:"columns"` +} + +// Column is a struct that represents a column of a data entry in a DDSQL table response +type Column struct { + Name string `json:"name"` + Type string `json:"type"` + Values []interface{} `json:"values"` +} + +// TableQuery executes a DDSQL query, returning a DDSQL table response +func (c *Client) TableQuery(query string) (*DDSQLTableResponse, error) { + now := time.Now() + params := DDSQLTableQueryParams{ + DefaultStart: int(now.Add(-1 * time.Hour).UnixMilli()), + DefaultEnd: int(now.UnixMilli()), + DefaultInterval: 20000, + Query: query, + } + payload := JSONAPIPayload[DDSQLTableQueryParams]{ + Data: JSONAPIPayloadData[DDSQLTableQueryParams]{ + Type: "ddsql_table_request", + Attribute: params, + }, + } + + reqData, err := json.Marshal(payload) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", "https://app.datadoghq.com/api/v2/ddql/table", bytes.NewBuffer(reqData)) + if err != nil { + return nil, err + } + req.Header.Add("accept", "application/json") + req.Header.Add("content-type", "application/json") + req.Header.Add("DD-API-KEY", c.apiKey) + req.Header.Add("DD-APPLICATION-KEY", c.appKey) + + resp, err := c.http.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var ddSQLResp DDSQLTableResponse + err = json.Unmarshal(data, &ddSQLResp) + if err != nil { + return nil, err + } + + return &ddSQLResp, nil +} diff --git a/test/e2e/rc-updater/api/updater.go b/test/e2e/rc-updater/api/updater.go new file mode 100644 index 000000000..481c56bc8 --- /dev/null +++ b/test/e2e/rc-updater/api/updater.go @@ -0,0 +1,249 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package api + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" +) + +type ConfigurationRequest struct { + Data ConfigurationData `json:"data"` +} + +type ConfigurationData struct { + Type string `json:"type"` + Attributes ConfigurationAttrs `json:"attributes"` +} + +type ConfigurationAttrs struct { + Name string `json:"name"` + Scope string `json:"scope"` + Parameters ConfigurationParams `json:"parameters"` + Enabled bool `json:"enabled"` +} + +type ConfigurationParams struct { + CloudWorkloadSecurity bool `json:"csm_cloud_workload_security"` + CloudSecurityPostureManagement bool `json:"csm_cloud_security_posture_management"` + HostsVulnerabilityManagement bool `json:"csm_hosts_vulnerability_management"` + ContainersVulnerabilityManagement bool `json:"csm_containers_vulnerability_management"` + UniversalServiceMonitoring bool `json:"universal_service_monitoring"` +} + +type ConfigurationResponse struct { + Data ResponseData `json:"data"` +} + +type ResponseData struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes ResponseAttrs `json:"attributes"` +} + +type ResponseAttrs struct { + Creator string `json:"creator"` + Updater string `json:"updater"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Name string `json:"name"` + Parameters ResponseParams `json:"parameters"` + Scope string `json:"scope"` + Status string `json:"status"` + Content ResponseContent `json:"content"` +} + +type ResponseParams struct { + CloudWorkloadSecurity bool `json:"csm_cloud_workload_security"` + CloudSecurityPostureManagement bool `json:"csm_cloud_security_posture_management"` + HostsVulnerabilityManagement bool `json:"csm_hosts_vulnerability_management"` + ContainersVulnerabilityManagement bool `json:"csm_containers_vulnerability_management"` + UniversalServiceMonitoring bool `json:"universal_service_monitoring"` +} + +type ResponseContent struct { + Config ConfigContent `json:"config"` + SecurityAgent SecurityAgentContent `json:"security_agent"` + SystemProbe SystemProbeContent `json:"system_probe"` +} + +type ConfigContent struct { + SBOM SBOMContent `json:"sbom"` +} + +type ErrorDetail struct { + Title string `json:"title"` +} + +type ErrorResponse struct { + Errors []ErrorDetail `json:"errors"` +} + +type SBOMContent struct { + Enabled bool `json:"enabled"` + Host HostContent `json:"host"` + ContainerImage ContainerImageContent `json:"container_image"` +} + +type HostContent struct { + Enabled bool `json:"enabled"` +} + +type ContainerImageContent struct { + Enabled bool `json:"enabled"` +} + +type SecurityAgentContent struct { + RuntimeSecurityConfig RuntimeSecurityConfig `json:"runtime_security_config"` + ComplianceConfig ComplianceConfig `json:"compliance_config"` +} + +type RuntimeSecurityConfig struct { + Enabled bool `json:"enabled"` +} + +type ComplianceConfig struct { + Enabled bool `json:"enabled"` +} + +type SystemProbeContent struct { + RuntimeSecurityConfig RuntimeSecurityConfig `json:"runtime_security_config"` + ServiceMonitoringConfig ServiceMonitoringConfig `json:"service_monitoring_config"` +} + +type ServiceMonitoringConfig struct { + Enabled bool `json:"enabled"` +} + +func extractIDFromError(title string) string { + // Assuming the ID is always after the last ": " in the title + parts := strings.Split(title, ": ") + if len(parts) > 1 { + return parts[len(parts)-1] // Return the part after the last ": " + } + return "" +} + +func (c *Client) ApplyConfig(configRequest ConfigurationRequest) (*ConfigurationResponse, error) { + var resp *http.Response + var err error + + // Create + resp, err = c.makeRequest(configRequest, "POST", "") + if err != nil { + return nil, err + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("error reading response: %v", err) + } + + if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusBadRequest { + return nil, fmt.Errorf("failed to create config, status code: %d, response: %s", resp.StatusCode, string(respBody)) + } + + if resp.StatusCode == http.StatusBadRequest { + var errorResponse ErrorResponse + err := json.Unmarshal(respBody, &errorResponse) + if err != nil { + fmt.Println("Error unmarshalling JSON:", err) + return nil, err + } + if strings.HasPrefix(errorResponse.Errors[0].Title, "configuration already exists") { + // Extract the ID from the error message + existingID := extractIDFromError(errorResponse.Errors[0].Title) + fmt.Println("using the policy that already exists:", existingID) + resp, err = c.makeRequest(configRequest, "PATCH", existingID) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + respBody, err = io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("error reading response: %v", err) + } + } else { + return nil, fmt.Errorf("failed to create config, status code: %d, response: %s", resp.StatusCode, string(respBody)) + } + } + + var configResp ConfigurationResponse + err = json.Unmarshal(respBody, &configResp) + if err != nil { + return nil, err + } + + return &configResp, nil + +} + +func (c *Client) makeRequest(configRequest ConfigurationRequest, method string, existingPolicyID string) (*http.Response, error) { + var err error + var req *http.Request + url := "https://app.datadoghq.com/api/unstable/remote_config/products/configurator/configurations" + reqBody, err := json.Marshal(configRequest) + if err != nil { + return nil, fmt.Errorf("error marshalling JSON: %v", err) + } + + // create new config + if method == "POST" { + req, err = http.NewRequest(method, url, bytes.NewBuffer(reqBody)) + if err != nil { + return nil, fmt.Errorf("error creating request: %v", err) + } + } else { + url = fmt.Sprintf("%s/%s", url, existingPolicyID) + req, err = http.NewRequest(method, url, bytes.NewBuffer(reqBody)) + if err != nil { + return nil, fmt.Errorf("error creating request: %v", err) + } + } + + req.Header.Add("accept", "application/json") + req.Header.Add("content-type", "application/json") + req.Header.Add("origin", "https://app.datadoghq.com") + req.Header.Add("DD-API-KEY", c.apiKey) + req.Header.Add("DD-APPLICATION-KEY", c.appKey) + + resp, err := c.http.Do(req) + if err != nil { + return nil, fmt.Errorf("error sending request: %v", err) + } + return resp, nil +} + +func (c *Client) DeleteConfig(configID string) error { + url := fmt.Sprintf("https://app.datadoghq.com/api/unstable/remote_config/products/configurator/configurations/%s", configID) + + req, err := http.NewRequest("DELETE", url, nil) + if err != nil { + return fmt.Errorf("error creating request: %v", err) + } + + req.Header.Set("DD-API-KEY", c.apiKey) + req.Header.Set("DD-APPLICATION-KEY", c.appKey) + + resp, err := c.http.Do(req) + if err != nil { + return fmt.Errorf("error sending request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("failed to delete configuration, status code: %d", resp.StatusCode) + } + + return nil +} diff --git a/test/e2e/rc-updater/common.go b/test/e2e/rc-updater/common.go new file mode 100644 index 000000000..c2a16b810 --- /dev/null +++ b/test/e2e/rc-updater/common.go @@ -0,0 +1,58 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +// Package api provides test helpers to interact with the Datadog API +package updater + +import ( + "fmt" + + "github.com/DataDog/datadog-operator/e2e/rc-updater/api" + "github.com/stretchr/testify/assert" +) + +type testSuite interface { + Client() *api.Client +} + +func CheckFeaturesState(u testSuite, c assert.TestingT, clusterName string, state bool) { + query := fmt.Sprintf("SELECT DISTINCT cluster_name, feature_cws_enabled, feature_cspm_enabled,feature_csm_vm_containers_enabled,feature_csm_vm_hosts_enabled,feature_usm_enabled FROM datadog_agent LEFT JOIN host USING(datadog_agent_key) WHERE cluster_name='%s'", clusterName) + resp, err := u.Client().TableQuery(query) + if !assert.NoErrorf(c, err, "ddsql query failed") { + return + } + if !assert.Len(c, resp.Data, 1, "ddsql query didn't returned a single row") { + return + } + if !assert.Len(c, resp.Data[0].Attributes.Columns, 6, "ddsql query didn't returned six columns") { + return + } + for _, column := range resp.Data[0].Attributes.Columns[1:] { + if !assert.True(c, len(column.Values) != 0, "Feature should be set", column.Name) { + return + } + if !assert.Equal(c, column.Values[0].(bool), state, "Feature", column.Name, "should be", state) { + return + } + } +} + +func TestConfigsContent(t assert.TestingT, content api.ResponseContent) { + if !assert.Truef(t, content.SystemProbe.RuntimeSecurityConfig.Enabled, "CWS should be enabled") { + return + } + if !assert.Truef(t, content.SecurityAgent.ComplianceConfig.Enabled, "CSPM should be enabled") { + return + } + if !assert.Truef(t, content.Config.SBOM.Host.Enabled, "Vuln Host should be enabled") { + return + } + if !assert.Truef(t, content.Config.SBOM.Host.Enabled, "Vuln container should be enabled") { + return + } + if !assert.Truef(t, content.SystemProbe.ServiceMonitoringConfig.Enabled, "USM should be enabled") { + return + } +} diff --git a/test/e2e/rc_updater_test.go b/test/e2e/rc_updater_test.go new file mode 100644 index 000000000..98292b460 --- /dev/null +++ b/test/e2e/rc_updater_test.go @@ -0,0 +1,125 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +//go:build e2e +// +build e2e + +package e2e + +import ( + "fmt" + "path/filepath" + "testing" + "time" + + "github.com/DataDog/datadog-agent/test/new-e2e/pkg/e2e" + updater "github.com/DataDog/datadog-operator/e2e/rc-updater" + "github.com/DataDog/datadog-operator/e2e/rc-updater/api" + "github.com/gruntwork-io/terratest/modules/k8s" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type updaterSuite struct { + e2e.BaseSuite[kindEnv] + apiClient *api.Client + kubectlOptions *k8s.KubectlOptions + cleanUpContext func() + ddaConfigPath string + clusterName string + configID string +} + +func TestUpdaterSuite(t *testing.T) { + + e2eParams := []e2e.SuiteOption{ + e2e.WithStackName(fmt.Sprintf("operator-kind-rc-%s", k8sVersion)), + e2e.WithProvisioner(kindProvisioner(k8sVersion, []string{"rc-e2e-manager.yaml"})), + } + + apiKey, _ := api.GetAPIKey() + appKey, _ := api.GetAPPKey() + require.NotEmpty(t, apiKey, "Could not get APIKey") + require.NotEmpty(t, appKey, "Could not get APPKey") + e2e.Run[kindEnv](t, &updaterSuite{clusterName: "rc-updater-e2e-test-cluster"}, e2eParams...) + +} + +func (u *updaterSuite) SetupSuite() { + u.BaseSuite.SetupSuite() + u.apiClient = api.NewClient() + cleanUpContext, err := contextConfig(u.Env().Kind.ClusterOutput.KubeConfig) + u.Assert().NoError(err, "Error retrieving E2E kubeconfig.") + u.cleanUpContext = cleanUpContext + u.kubectlOptions = k8s.NewKubectlOptions("", kubeConfigPath, namespaceName) + ddaManifest := filepath.Join(manifestsPath, "datadog-agent-rc-updater.yaml") + ddaConfigPath, err := getAbsPath(ddaManifest) + u.Assert().NoError(err, "Error retrieving dda config.") + u.ddaConfigPath = ddaConfigPath + +} + +func (u *updaterSuite) TearDownSuite() { + deleteDda(u.T(), u.kubectlOptions, u.ddaConfigPath) + u.cleanUpContext() + if u.configID != "" { + u.Client().DeleteConfig(u.configID) + } + u.BaseSuite.TearDownSuite() + +} + +func (u *updaterSuite) Clustername() string { + return u.clusterName +} + +func (u *updaterSuite) Client() *api.Client { + return u.apiClient +} + +func (u *updaterSuite) TestOperatorDeployed() { + verifyOperator(u.T(), u.kubectlOptions) + +} + +func (u *updaterSuite) TestAgentReady() { + k8s.KubectlApply(u.T(), u.kubectlOptions, u.ddaConfigPath) + verifyAgentPods(u.T(), u.kubectlOptions, nodeAgentSelector+",agent.datadoghq.com/e2e-test=datadog-agent-rc") +} + +func (u *updaterSuite) TestEnableFeatures() { + // Wait for the agent to be deployed + time.Sleep(3 * time.Minute) + + configRequest := api.ConfigurationRequest{ + Data: api.ConfigurationData{ + Type: "configuration", + Attributes: api.ConfigurationAttrs{ + Name: "Enable All", + Scope: fmt.Sprintf("cluster_name:%s", u.Clustername()), + Parameters: api.ConfigurationParams{ + CloudWorkloadSecurity: true, + CloudSecurityPostureManagement: true, + HostsVulnerabilityManagement: true, + ContainersVulnerabilityManagement: true, + UniversalServiceMonitoring: true, + }, + Enabled: true, + }, + }, + } + + resp, err := u.Client().ApplyConfig(configRequest) + require.NoError(u.T(), err, "Failed to apply config") + u.configID = resp.Data.ID + updater.TestConfigsContent(u.T(), resp.Data.Attributes.Content) + +} + +func (u *updaterSuite) TestFeaturesEnabled() { + u.EventuallyWithTf(func(c *assert.CollectT) { + updater.CheckFeaturesState(u, c, u.Clustername(), true) + }, 20*time.Minute, 30*time.Second, "Checking if features were enabled timed out") +}