-
Notifications
You must be signed in to change notification settings - Fork 348
/
Copy pathcontroller.go
140 lines (120 loc) · 4.29 KB
/
controller.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
package strategy
import (
"context"
"fmt"
"strings"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
batchv1 "k8s.io/api/batch/v1"
"k8s.io/apimachinery/pkg/runtime"
"github.com/jaegertracing/jaeger-operator/pkg/apis/io/v1alpha1"
"github.com/jaegertracing/jaeger-operator/pkg/cronjob"
"github.com/jaegertracing/jaeger-operator/pkg/storage"
)
// S knows what type of deployments to build based on a given spec
type S interface {
Dependencies() []batchv1.Job
Create() []runtime.Object
Update() []runtime.Object
}
// For returns the appropriate Strategy for the given Jaeger instance
func For(ctx context.Context, jaeger *v1alpha1.Jaeger) S {
if strings.ToLower(jaeger.Spec.Strategy) == "all-in-one" {
logrus.Warnf("Strategy 'all-in-one' is no longer supported, please use 'allInOne'")
jaeger.Spec.Strategy = "allInOne"
}
normalize(jaeger)
logrus.Debugf("Jaeger strategy: %s", jaeger.Spec.Strategy)
if strings.ToLower(jaeger.Spec.Strategy) == "allinone" {
return newAllInOneStrategy(ctx, jaeger)
}
if strings.ToLower(jaeger.Spec.Strategy) == "streaming" {
return newStreamingStrategy(ctx, jaeger)
}
return newProductionStrategy(ctx, jaeger)
}
// normalize changes the incoming Jaeger object so that the defaults are applied when
// needed and incompatible options are cleaned
func normalize(jaeger *v1alpha1.Jaeger) {
// we need a name!
if jaeger.Name == "" {
logrus.Infof("This Jaeger instance was created without a name. Setting it to 'my-jaeger'")
jaeger.Name = "my-jaeger"
}
// normalize the storage type
if jaeger.Spec.Storage.Type == "" {
logrus.Infof("Storage type wasn't provided for the Jaeger instance '%v'. Falling back to 'memory'", jaeger.Name)
jaeger.Spec.Storage.Type = "memory"
}
if unknownStorage(jaeger.Spec.Storage.Type) {
logrus.Infof(
"The provided storage type for the Jaeger instance '%v' is unknown ('%v'). Falling back to 'memory'. Known options: %v",
jaeger.Name,
jaeger.Spec.Storage.Type,
storage.ValidTypes(),
)
jaeger.Spec.Storage.Type = "memory"
}
// normalize the deployment strategy
if strings.ToLower(jaeger.Spec.Strategy) != "production" && strings.ToLower(jaeger.Spec.Strategy) != "streaming" {
jaeger.Spec.Strategy = "allInOne"
}
// check for incompatible options
// if the storage is `memory`, then the only possible strategy is `all-in-one`
if strings.ToLower(jaeger.Spec.Storage.Type) == "memory" && strings.ToLower(jaeger.Spec.Strategy) != "allinone" {
logrus.Warnf(
"No suitable storage was provided for the Jaeger instance '%v'. Falling back to all-in-one. Storage type: '%v'",
jaeger.Name,
jaeger.Spec.Storage.Type,
)
jaeger.Spec.Strategy = "allInOne"
}
// we always set the value to None, except when we are on OpenShift *and* the user has not explicitly set to 'none'
if viper.GetString("platform") == v1alpha1.FlagPlatformOpenShift && jaeger.Spec.Ingress.Security != v1alpha1.IngressSecurityNoneExplicit {
jaeger.Spec.Ingress.Security = v1alpha1.IngressSecurityOAuthProxy
} else {
// cases:
// - omitted on Kubernetes
// - 'none' on any platform
jaeger.Spec.Ingress.Security = v1alpha1.IngressSecurityNone
}
normalizeSparkDependencies(&jaeger.Spec.Storage.SparkDependencies, jaeger.Spec.Storage.Type)
normalizeIndexCleaner(&jaeger.Spec.Storage.EsIndexCleaner, jaeger.Spec.Storage.Type)
}
func normalizeSparkDependencies(spec *v1alpha1.JaegerDependenciesSpec, storage string) {
// auto enable only for supported storages
if cronjob.SupportedStorage(storage) && spec.Enabled == nil {
trueVar := true
spec.Enabled = &trueVar
}
if spec.Image == "" {
spec.Image = fmt.Sprintf("%s", viper.GetString("jaeger-spark-dependencies-image"))
}
if spec.Schedule == "" {
spec.Schedule = "55 23 * * *"
}
}
func normalizeIndexCleaner(spec *v1alpha1.JaegerEsIndexCleanerSpec, storage string) {
// auto enable only for supported storages
if storage == "elasticsearch" && spec.Enabled == nil {
trueVar := true
spec.Enabled = &trueVar
}
if spec.Image == "" {
spec.Image = fmt.Sprintf("%s", viper.GetString("jaeger-es-index-cleaner-image"))
}
if spec.Schedule == "" {
spec.Schedule = "55 23 * * *"
}
if spec.NumberOfDays == 0 {
spec.NumberOfDays = 7
}
}
func unknownStorage(typ string) bool {
for _, k := range storage.ValidTypes() {
if strings.ToLower(typ) == k {
return false
}
}
return true
}