Skip to content

Commit

Permalink
feat: Introduce the Features Factory (#412)
Browse files Browse the repository at this point in the history
  • Loading branch information
clamoriniere committed Apr 29, 2022
1 parent 7bdd616 commit 88fe849
Show file tree
Hide file tree
Showing 83 changed files with 4,828 additions and 1,045 deletions.
14 changes: 13 additions & 1 deletion .golangci.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,19 @@
"wsl",
"godox",
"godot",
"nlreturn"
"nlreturn",
"varnamelen",
"tagliatelle",
"containedctx",
"contextcheck",
"nilnil",
"ireturn",
"maintidx",
"ifshort",
"gocritic",
"errchkjson",
"gofumpt",
"golint"
]

[issues]
Expand Down
10 changes: 8 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,14 @@ endef
##@ Deploy

.PHONY: manager
manager: generate lint ## Build manager binary
manager: generate lint managergobuild ## Build manager binary
go build -ldflags '${LDFLAGS}' -o bin/$(PLATFORM)/manager main.go
managergobuild: ## Builds only manager go binary
go build -ldflags '${LDFLAGS}' -o bin/$(PLATFORM)/manager main.go

##@ Deploy

manager: generate lint managergobuild ## Build manager binary

.PHONY: run
run: generate lint manifests ## Run against the configured Kubernetes cluster in ~/.kube/config
Expand Down Expand Up @@ -275,7 +281,7 @@ bin/$(PLATFORM)/yq: Makefile
hack/install-yq.sh 3.3.0

bin/$(PLATFORM)/golangci-lint: Makefile
hack/golangci-lint.sh -b "bin/$(PLATFORM)" v1.38.0
hack/golangci-lint.sh -b "bin/$(PLATFORM)" v1.45.2

bin/$(PLATFORM)/operator-sdk: Makefile
hack/install-operator-sdk.sh v1.13.1
Expand Down
60 changes: 60 additions & 0 deletions apis/datadoghq/common/const.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// 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 common

// Datadog const value
const (
// AgentDeploymentNameLabelKey label key use to link a Resource to a DatadogAgent
AgentDeploymentNameLabelKey = "agent.datadoghq.com/name"
// AgentDeploymentComponentLabelKey label key use to know with component is it
AgentDeploymentComponentLabelKey = "agent.datadoghq.com/component"
// MD5AgentDeploymentAnnotationKey annotation key used on a Resource in order to identify which AgentDeployment have been used to generate it.
MD5AgentDeploymentAnnotationKey = "agent.datadoghq.com/agentspechash"

// DefaultAgentResourceSuffix use as suffix for agent resource naming
DefaultAgentResourceSuffix = "agent"
// DefaultClusterAgentResourceSuffix use as suffix for cluster-agent resource naming
DefaultClusterAgentResourceSuffix = "cluster-agent"
// DefaultClusterChecksRunnerResourceSuffix use as suffix for cluster-checks-runner resource naming
DefaultClusterChecksRunnerResourceSuffix = "cluster-checks-runner"
// DefaultMetricsServerResourceSuffix use as suffix for cluster-agent metrics-server resource naming
DefaultMetricsServerResourceSuffix = "cluster-agent-metrics-server"
// DefaultAPPKeyKey default app-key key (use in secret for instance).
DefaultAPPKeyKey = "app_key"
// DefaultAPIKeyKey default api-key key (use in secret for instance).
DefaultAPIKeyKey = "api_key"
// DefaultTokenKey default token key (use in secret for instance).
DefaultTokenKey = "token"
// DefaultClusterAgentServicePort default cluster-agent service port
DefaultClusterAgentServicePort = 5005
// DefaultMetricsServerServicePort default metrics-server port
DefaultMetricsServerServicePort = 443
// DefaultMetricsServerTargetPort default metrics-server pod port
DefaultMetricsServerTargetPort = int(DefaultMetricsProviderPort)
// DefaultAdmissionControllerServicePort default admission controller service port
DefaultAdmissionControllerServicePort = 443
// DefaultAdmissionControllerTargetPort default admission controller pod port
DefaultAdmissionControllerTargetPort = 8000
// DefaultDogstatsdPort default dogstatsd port
DefaultDogstatsdPort = 8125
// DefaultDogstatsdPortName default dogstatsd port name
DefaultDogstatsdPortName = "dogstatsd"
// DefaultApmPortName default apm port name
DefaultApmPortName = "apm"
// DefaultMetricsProviderPort default metrics provider port
DefaultMetricsProviderPort int32 = 8443
// DefaultKubeStateMetricsCoreConf default ksm core ConfigMap name
DefaultKubeStateMetricsCoreConf string = "kube-state-metrics-core-config"
)

// Datadog volume names and mount paths
const (
ConfdVolumeName = "confd"
ConfdVolumePath = "/conf.d"
ConfigVolumeName = "config"
ConfigVolumePath = "/etc/datadog-agent"
KubeStateMetricCoreVolumeName = "ksm-core-config"
)
13 changes: 13 additions & 0 deletions apis/datadoghq/common/envvar.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// 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 common

// Datadog env var names
const (
DDIgnoreAutoConf = "DD_IGNORE_AUTOCONF"
DDKubeStateMetricsCoreEnabled = "DD_KUBE_STATE_METRICS_CORE_ENABLED"
DDKubeStateMetricsCoreConfigMap = "DD_KUBE_STATE_METRICS_CORE_CONFIGMAP_NAME"
)
22 changes: 22 additions & 0 deletions apis/datadoghq/common/v1/customConfig.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// 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 common

import (
"fmt"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// GetConfName get the name of the Configmap for a CustomConfigSpec
func GetConfName(owner metav1.Object, conf *CustomConfig, defaultName string) string {
// `configData` and `configMap` can't be set together.
// Return the default if the conf is not overridden or if it is just overridden with the ConfigData.
if conf != nil && conf.ConfigMap != nil {
return conf.ConfigMap.Name
}
return fmt.Sprintf("%s-%s", owner.GetName(), defaultName)
}
11 changes: 11 additions & 0 deletions apis/datadoghq/common/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,17 @@ type ConfigMapConfig struct {
Items []corev1.KeyToPath `json:"items,omitempty"`
}

// CustomConfig Allow to put custom configuration for the agent
// +kubebuilder:object:generate=true
type CustomConfig struct {
// ConfigData corresponds to the configuration file content.
// +optional
ConfigData *string
// Enable to specify a reference to an already existing ConfigMap.
// +optional
ConfigMap *ConfigMapConfig
}

// KubeletConfig contains the kubelet configuration parameters.
// +kubebuilder:object:generate=true
type KubeletConfig struct {
Expand Down
25 changes: 25 additions & 0 deletions apis/datadoghq/common/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

162 changes: 15 additions & 147 deletions apis/datadoghq/v1alpha1/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,6 @@

package v1alpha1

const (
// AgentDeploymentNameLabelKey label key use to link a Resource to a DatadogAgent
AgentDeploymentNameLabelKey = "agent.datadoghq.com/name"
// AgentDeploymentComponentLabelKey label key use to know with component is it
AgentDeploymentComponentLabelKey = "agent.datadoghq.com/component"
// MD5AgentDeploymentAnnotationKey annotation key used on a Resource in order to identify which AgentDeployment have been used to generate it.
MD5AgentDeploymentAnnotationKey = "agent.datadoghq.com/agentspechash"

// DefaultAgentResourceSuffix use as suffix for agent resource naming
DefaultAgentResourceSuffix = "agent"
// DefaultClusterAgentResourceSuffix use as suffix for cluster-agent resource naming
DefaultClusterAgentResourceSuffix = "cluster-agent"
// DefaultClusterChecksRunnerResourceSuffix use as suffix for cluster-checks-runner resource naming
DefaultClusterChecksRunnerResourceSuffix = "cluster-checks-runner"
// DefaultMetricsServerResourceSuffix use as suffix for cluster-agent metrics-server resource naming
DefaultMetricsServerResourceSuffix = "cluster-agent-metrics-server"
// DefaultAPPKeyKey default app-key key (use in secret for instance).
DefaultAPPKeyKey = "app_key"
// DefaultAPIKeyKey default api-key key (use in secret for instance).
DefaultAPIKeyKey = "api_key"
// DefaultTokenKey default token key (use in secret for instance).
DefaultTokenKey = "token"
// DefaultClusterAgentServicePort default cluster-agent service port
DefaultClusterAgentServicePort = 5005
// DefaultMetricsServerServicePort default metrics-server port
DefaultMetricsServerServicePort = 443
// DefaultMetricsServerTargetPort default metrics-server pod port
DefaultMetricsServerTargetPort = int(defaultMetricsProviderPort)
// DefaultAdmissionControllerServicePort default admission controller service port
DefaultAdmissionControllerServicePort = 443
// DefaultAdmissionControllerTargetPort default admission controller pod port
DefaultAdmissionControllerTargetPort = 8000
// DefaultDogstatsdPort default dogstatsd port
DefaultDogstatsdPort = 8125
// DefaultDogstatsdPortName default dogstatsd port name
DefaultDogstatsdPortName = "dogstatsd"
// DefaultApmPortName default apm port name
DefaultApmPortName = "apm"
)

// Datadog env var names
const (
DatadogHost = "DATADOG_HOST"
Expand Down Expand Up @@ -80,9 +40,6 @@ const (
DDMetricsProviderWPAController = "DD_EXTERNAL_METRICS_PROVIDER_WPA_CONTROLLER"
DDAppKey = "DD_APP_KEY"
DDClusterChecksEnabled = "DD_CLUSTER_CHECKS_ENABLED"
DDIgnoreAutoConf = "DD_IGNORE_AUTOCONF"
DDKubeStateMetricsCoreEnabled = "DD_KUBE_STATE_METRICS_CORE_ENABLED"
DDKubeStateMetricsCoreConfigMap = "DD_KUBE_STATE_METRICS_CORE_CONFIGMAP_NAME"
DDClcRunnerEnabled = "DD_CLC_RUNNER_ENABLED"
DDClcRunnerHost = "DD_CLC_RUNNER_HOST"
DDClcRunnerID = "DD_CLC_RUNNER_ID"
Expand Down Expand Up @@ -137,24 +94,21 @@ const (

// Datadog volume names and mount paths

LogDatadogVolumeName = "logdatadog"
LogDatadogVolumePath = "/var/log/datadog"
TmpVolumeName = "tmp"
TmpVolumePath = "/tmp"
CertificatesVolumeName = "certificates"
CertificatesVolumePath = "/etc/datadog-agent/certificates"
APMSocketVolumeName = "apmsocket"
APMSocketVolumePath = "/var/run/datadog/apm"
InstallInfoVolumeName = "installinfo"
InstallInfoVolumeSubPath = "install_info"
InstallInfoVolumePath = "/etc/datadog-agent/install_info"
InstallInfoVolumeReadOnly = true
ConfdVolumeName = "confd"
ConfdVolumePath = "/conf.d"
ChecksdVolumeName = "checksd"
ChecksdVolumePath = "/checks.d"
ConfigVolumeName = "config"
ConfigVolumePath = "/etc/datadog-agent"
LogDatadogVolumeName = "logdatadog"
LogDatadogVolumePath = "/var/log/datadog"
TmpVolumeName = "tmp"
TmpVolumePath = "/tmp"
CertificatesVolumeName = "certificates"
CertificatesVolumePath = "/etc/datadog-agent/certificates"
APMSocketVolumeName = "apmsocket"
APMSocketVolumePath = "/var/run/datadog/apm"
InstallInfoVolumeName = "installinfo"
InstallInfoVolumeSubPath = "install_info"
InstallInfoVolumePath = "/etc/datadog-agent/install_info"
InstallInfoVolumeReadOnly = true
ChecksdVolumeName = "checksd"
ChecksdVolumePath = "/checks.d"

AuthVolumeName = "datadog-agent-auth"
AuthVolumePath = "/etc/datadog-agent/auth"
ProcVolumeName = "procdir"
Expand All @@ -175,7 +129,6 @@ const (
CriSocketVolumeReadOnly = true
DogstatsdSocketVolumeName = "dsdsocket"
DogstatsdSocketVolumePath = "/var/run/datadog/statsd"
KubeStateMetricCoreVolumeName = "ksm-core-config"
PointerVolumeName = "pointerdir"
PointerVolumePath = "/opt/datadog-agent/run"
LogPodVolumeName = "logpodpath"
Expand Down Expand Up @@ -239,76 +192,6 @@ const (
KubeEndpointsListener = "kube_endpoints"
KubeServicesAndEndpointsListeners = "kube_services kube_endpoints"

// Consts used to setup Rbac config
// API Groups

CoreAPIGroup = ""
ExtensionsAPIGroup = "extensions"
OpenShiftQuotaAPIGroup = "quota.openshift.io"
RbacAPIGroup = "rbac.authorization.k8s.io"
AutoscalingAPIGroup = "autoscaling"
CertificatesAPIGroup = "certificates.k8s.io"
StorageAPIGroup = "storage.k8s.io"
CoordinationAPIGroup = "coordination.k8s.io"
DatadogAPIGroup = "datadoghq.com"
AdmissionAPIGroup = "admissionregistration.k8s.io"
AppsAPIGroup = "apps"
BatchAPIGroup = "batch"
PolicyAPIGroup = "policy"
NetworkingAPIGroup = "networking.k8s.io"
AutoscalingK8sIoAPIGroup = "autoscaling.k8s.io"
AuthorizationAPIGroup = "authorization.k8s.io"

// Resources

ServicesResource = "services"
EventsResource = "events"
EndpointsResource = "endpoints"
PodsResource = "pods"
NodesResource = "nodes"
ComponentStatusesResource = "componentstatuses"
CertificatesSigningRequestsResource = "certificatesigningrequests"
ConfigMapsResource = "configmaps"
ResourceQuotasResource = "resourcequotas"
ReplicationControllersResource = "replicationcontrollers"
LimitRangesResource = "limitranges"
PersistentVolumeClaimsResource = "persistentvolumeclaims"
PersistentVolumesResource = "persistentvolumes"
LeasesResource = "leases"
ClusterResourceQuotasResource = "clusterresourcequotas"
NodeMetricsResource = "nodes/metrics"
NodeSpecResource = "nodes/spec"
NodeProxyResource = "nodes/proxy"
NodeStats = "nodes/stats"
HorizontalPodAutoscalersRecource = "horizontalpodautoscalers"
DatadogMetricsResource = "datadogmetrics"
DatadogMetricsStatusResource = "datadogmetrics/status"
WpaResource = "watermarkpodautoscalers"
MutatingConfigResource = "mutatingwebhookconfigurations"
ValidatingConfigResource = "validatingwebhookconfigurations"
SecretsResource = "secrets"
PodDisruptionBudgetsResource = "poddisruptionbudgets"
ReplicasetsResource = "replicasets"
DeploymentsResource = "deployments"
StatefulsetsResource = "statefulsets"
DaemonsetsResource = "daemonsets"
JobsResource = "jobs"
CronjobsResource = "cronjobs"
StorageClassesResource = "storageclasses"
VolumeAttachments = "volumeattachments"
ExtendedDaemonSetReplicaSetResource = "extendeddaemonsetreplicasets"
ServiceAccountResource = "serviceaccounts"
NamespaceResource = "namespaces"
PodSecurityPolicyResource = "podsecuritypolicies"
ClusterRoleResource = "clusterroles"
RoleResource = "roles"
ClusterRoleBindingResource = "clusterrolebindings"
RoleBindingResource = "rolebindings"
NetworkPolicyResource = "networkpolicies"
IngressesResource = "ingresses"
VPAResource = "verticalpodautoscalers"
SubjectAccessReviewResource = "subjectaccessreviews"

// Resource names

DatadogTokenResourceName = "datadogtoken"
Expand All @@ -318,21 +201,6 @@ const (
ExtensionAPIServerAuthResourceName = "extension-apiserver-authentication"
KubeSystemResourceName = "kube-system"

// Non resource URLs

VersionURL = "/version"
HealthzURL = "/healthz"
MetricsURL = "/metrics"

// Verbs

GetVerb = "get"
ListVerb = "list"
WatchVerb = "watch"
UpdateVerb = "update"
CreateVerb = "create"
DeleteVerb = "delete"

// Rbac resource kinds

ClusterRoleKind = "ClusterRole"
Expand Down

0 comments on commit 88fe849

Please sign in to comment.