-
Notifications
You must be signed in to change notification settings - Fork 136
/
oneagent.go
141 lines (107 loc) · 4.79 KB
/
oneagent.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package dynakube
import (
"context"
"fmt"
dynatracev1beta1 "github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta1/dynakube"
"github.com/Dynatrace/dynatrace-operator/pkg/util/kubeobjects/env"
"k8s.io/apimachinery/pkg/labels"
)
const (
errorConflictingOneagentMode = `The DynaKube's specification tries to use multiple oneagent modes at the same time, which is not supported.
`
errorImageFieldSetWithoutCSIFlag = `The DynaKube's specification tries to enable ApplicationMonitoring mode and get the respective image, but the CSI driver is not enabled.`
errorNodeSelectorConflict = `The DynaKube's specification tries to specify a nodeSelector conflicts with an another Dynakube's nodeSelector, which is not supported.
The conflicting Dynakube: %s
`
errorVolumeStorageReadOnlyModeConflict = `The DynaKube's specification specifies a read-only host file system and OneAgent has volume storage enabled.`
warningOneAgentInstallerEnvVars = `Environment variables ONEAGENT_INSTALLER_SCRIPT_URL and ONEAGENT_INSTALLER_TOKEN are only relevant for an unsupported image type. Please make sure you are using a supported image.`
warningHostGroupConflict = `DynaKube's specification sets the host group using --set-host-group parameter. Instead, specify the new spec.oneagent.hostGroup field. If you use both settings, the new field precedes the parameter.`
)
func conflictingOneAgentConfiguration(_ context.Context, _ *dynakubeValidator, dynakube *dynatracev1beta1.DynaKube) string {
counter := 0
if dynakube.ApplicationMonitoringMode() {
counter += 1
}
if dynakube.CloudNativeFullstackMode() {
counter += 1
}
if dynakube.ClassicFullStackMode() {
counter += 1
}
if dynakube.HostMonitoringMode() {
counter += 1
}
if counter > 1 {
log.Info("requested dynakube has conflicting one agent configuration", "name", dynakube.Name, "namespace", dynakube.Namespace)
return errorConflictingOneagentMode
}
return ""
}
func conflictingNodeSelector(ctx context.Context, dv *dynakubeValidator, dynakube *dynatracev1beta1.DynaKube) string {
if !dynakube.NeedsOneAgent() || dynakube.FeatureEnableMultipleOsAgentsOnNode() {
return ""
}
validDynakubes := &dynatracev1beta1.DynaKubeList{}
if err := dv.clt.List(ctx, validDynakubes); err != nil {
log.Info("error occurred while listing dynakubes", "err", err.Error())
return ""
}
for _, item := range validDynakubes.Items {
if !item.NeedsOneAgent() {
continue
}
nodeSelectorMap := dynakube.NodeSelector()
validNodeSelectorMap := item.NodeSelector()
if item.Name != dynakube.Name {
if hasConflictingMatchLabels(nodeSelectorMap, validNodeSelectorMap) {
log.Info("requested dynakube has conflicting nodeSelector", "name", dynakube.Name, "namespace", dynakube.Namespace)
return fmt.Sprintf(errorNodeSelectorConflict, item.Name)
}
}
}
return ""
}
func imageFieldSetWithoutCSIFlag(_ context.Context, _ *dynakubeValidator, dynakube *dynatracev1beta1.DynaKube) string {
if dynakube.ApplicationMonitoringMode() {
if !dynakube.NeedsCSIDriver() && len(dynakube.Spec.OneAgent.ApplicationMonitoring.CodeModulesImage) > 0 {
return errorImageFieldSetWithoutCSIFlag
}
}
return ""
}
func hasConflictingMatchLabels(labelMap, otherLabelMap map[string]string) bool {
if labelMap == nil || otherLabelMap == nil {
return true
}
labelSelector := labels.SelectorFromSet(labelMap)
otherLabelSelector := labels.SelectorFromSet(otherLabelMap)
labelSelectorLabels := labels.Set(labelMap)
otherLabelSelectorLabels := labels.Set(otherLabelMap)
return labelSelector.Matches(otherLabelSelectorLabels) || otherLabelSelector.Matches(labelSelectorLabels)
}
func hasOneAgentVolumeStorageEnabled(dynakube *dynatracev1beta1.DynaKube) (isEnabled bool, isSet bool) {
envVar := env.FindEnvVar(dynakube.GetOneAgentEnvironment(), oneagentEnableVolumeStorageEnvVarName)
isSet = envVar != nil
isEnabled = isSet && envVar.Value == "true"
return
}
func unsupportedOneAgentImage(_ context.Context, _ *dynakubeValidator, dynakube *dynatracev1beta1.DynaKube) string {
if env.FindEnvVar(dynakube.GetOneAgentEnvironment(), oneagentInstallerScriptUrlEnvVarName) != nil ||
env.FindEnvVar(dynakube.GetOneAgentEnvironment(), oneagentInstallerTokenEnvVarName) != nil {
return warningOneAgentInstallerEnvVars
}
return ""
}
func conflictingOneAgentVolumeStorageSettings(_ context.Context, _ *dynakubeValidator, dynakube *dynatracev1beta1.DynaKube) string {
volumeStorageEnabled, volumeStorageSet := hasOneAgentVolumeStorageEnabled(dynakube)
if dynakube.NeedsReadOnlyOneAgents() && volumeStorageSet && !volumeStorageEnabled {
return errorVolumeStorageReadOnlyModeConflict
}
return ""
}
func conflictingHostGroupSettings(_ context.Context, _ *dynakubeValidator, dynakube *dynatracev1beta1.DynaKube) string {
if dynakube.HostGroupAsParam() != "" {
return warningHostGroupConflict
}
return ""
}