/
starter.go
210 lines (189 loc) · 7.63 KB
/
starter.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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
package operator
import (
"context"
kubeinformers "k8s.io/client-go/informers"
kubeclient "k8s.io/client-go/kubernetes"
restclient "k8s.io/client-go/rest"
"k8s.io/klog/v2"
configv1 "github.com/openshift/api/config/v1"
configclient "github.com/openshift/client-go/config/clientset/versioned"
configinformers "github.com/openshift/client-go/config/informers/externalversions"
imageclient "github.com/openshift/client-go/image/clientset/versioned"
imageinformers "github.com/openshift/client-go/image/informers/externalversions"
imageregistryclient "github.com/openshift/client-go/imageregistry/clientset/versioned"
imageregistryinformers "github.com/openshift/client-go/imageregistry/informers/externalversions"
routeclient "github.com/openshift/client-go/route/clientset/versioned"
routeinformers "github.com/openshift/client-go/route/informers/externalversions"
"github.com/openshift/library-go/pkg/operator/events"
"github.com/openshift/library-go/pkg/operator/loglevel"
"github.com/openshift/cluster-image-registry-operator/pkg/client"
"github.com/openshift/cluster-image-registry-operator/pkg/defaults"
)
func RunOperator(ctx context.Context, kubeconfig *restclient.Config) error {
kubeClient, err := kubeclient.NewForConfig(kubeconfig)
if err != nil {
return err
}
configClient, err := configclient.NewForConfig(kubeconfig)
if err != nil {
return err
}
imageregistryClient, err := imageregistryclient.NewForConfig(kubeconfig)
if err != nil {
return err
}
routeClient, err := routeclient.NewForConfig(kubeconfig)
if err != nil {
return err
}
imageClient, err := imageclient.NewForConfig(kubeconfig)
if err != nil {
return err
}
kubeInformers := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, defaultResyncDuration, kubeinformers.WithNamespace(defaults.ImageRegistryOperatorNamespace))
kubeInformersForOpenShiftConfig := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, defaultResyncDuration, kubeinformers.WithNamespace(defaults.OpenShiftConfigNamespace))
kubeInformersForOpenShiftConfigManaged := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, defaultResyncDuration, kubeinformers.WithNamespace(defaults.OpenShiftConfigManagedNamespace))
kubeInformersForKubeSystem := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, defaultResyncDuration, kubeinformers.WithNamespace(kubeSystemNamespace))
configInformers := configinformers.NewSharedInformerFactory(configClient, defaultResyncDuration)
imageregistryInformers := imageregistryinformers.NewSharedInformerFactory(imageregistryClient, defaultResyncDuration)
routeInformers := routeinformers.NewSharedInformerFactoryWithOptions(routeClient, defaultResyncDuration, routeinformers.WithNamespace(defaults.ImageRegistryOperatorNamespace))
imageInformers := imageinformers.NewSharedInformerFactory(imageClient, defaultResyncDuration)
configOperatorClient := client.NewConfigOperatorClient(
imageregistryClient.ImageregistryV1().Configs(),
imageregistryInformers.Imageregistry().V1().Configs(),
)
// library-go just logs a warning and continues
// https://github.com/openshift/library-go/blob/4362aa519714a4b62b00ab8318197ba2bba51cb7/pkg/controller/controllercmd/builder.go#L230
controllerRef, err := events.GetControllerReferenceForCurrentPod(ctx, kubeClient, defaults.ImageRegistryOperatorNamespace, nil)
if err != nil {
klog.Warningf("unable to get owner reference (falling back to namespace): %v", err)
}
eventRecorder := events.NewKubeRecorder(kubeClient.CoreV1().Events(defaults.ImageRegistryOperatorNamespace), "image-registry-operator", controllerRef)
controller, err := NewController(
eventRecorder,
kubeconfig,
kubeClient,
configClient,
imageregistryClient,
routeClient,
kubeInformers,
kubeInformersForOpenShiftConfig,
kubeInformersForOpenShiftConfigManaged,
kubeInformersForKubeSystem,
configInformers,
imageregistryInformers,
routeInformers,
)
if err != nil {
return err
}
imageConfigStatusController, err := NewImageConfigController(
configClient.ConfigV1(),
configOperatorClient,
routeInformers.Route().V1().Routes(),
kubeInformers.Core().V1().Services(),
)
if err != nil {
return err
}
clusterOperatorStatusController, err := NewClusterOperatorStatusController(
[]configv1.ObjectReference{
{Group: "imageregistry.operator.openshift.io", Resource: "configs", Name: "cluster"},
{Group: "imageregistry.operator.openshift.io", Resource: "imagepruners", Name: "cluster"},
{Group: "rbac.authorization.k8s.io", Resource: "clusterroles", Name: "system:registry"},
{Group: "rbac.authorization.k8s.io", Resource: "clusterrolebindings", Name: "registry-registry-role"},
{Group: "rbac.authorization.k8s.io", Resource: "clusterrolebindings", Name: "openshift-image-registry-pruner"},
{Resource: "namespaces", Name: defaults.ImageRegistryOperatorNamespace},
},
configClient.ConfigV1(),
configInformers.Config().V1().ClusterOperators(),
imageregistryInformers.Imageregistry().V1().Configs(),
imageregistryInformers.Imageregistry().V1().ImagePruners(),
kubeInformers.Apps().V1().Deployments(),
)
if err != nil {
return err
}
imageRegistryCertificatesController, err := NewImageRegistryCertificatesController(
kubeconfig,
kubeClient.CoreV1(),
configOperatorClient,
kubeInformers.Core().V1().ConfigMaps(),
kubeInformers.Core().V1().Secrets(),
kubeInformers.Core().V1().Services(),
configInformers.Config().V1().Images(),
configInformers.Config().V1().Infrastructures(),
kubeInformersForOpenShiftConfig.Core().V1().ConfigMaps(),
kubeInformersForOpenShiftConfigManaged.Core().V1().ConfigMaps(),
imageregistryInformers.Imageregistry().V1().Configs(),
)
if err != nil {
return err
}
nodeCADaemonController, err := NewNodeCADaemonController(
eventRecorder,
kubeClient.AppsV1(),
configOperatorClient,
kubeInformers.Apps().V1().DaemonSets(),
kubeInformers.Core().V1().Services(),
)
if err != nil {
return err
}
imagePrunerController, err := NewImagePrunerController(
kubeClient,
imageregistryClient,
kubeInformers,
imageregistryInformers,
configInformers.Config().V1().Images(),
)
if err != nil {
return err
}
loggingController := loglevel.NewClusterOperatorLoggingController(
configOperatorClient,
eventRecorder,
)
azureStackCloudController, err := NewAzureStackCloudController(
configOperatorClient,
kubeInformersForOpenShiftConfig.Core().V1().ConfigMaps(),
)
if err != nil {
return err
}
azurePathFixController, err := NewAzurePathFixController(
kubeconfig,
kubeClient.BatchV1(),
configOperatorClient,
kubeInformers.Batch().V1().Jobs(),
imageregistryInformers.Imageregistry().V1().Configs(),
configInformers.Config().V1().Infrastructures(),
kubeInformers.Core().V1().Secrets(),
configInformers.Config().V1().Proxies(),
kubeInformers.Core().V1().Pods(),
)
if err != nil {
return err
}
metricsController := NewMetricsController(imageInformers.Image().V1().ImageStreams())
kubeInformers.Start(ctx.Done())
kubeInformersForOpenShiftConfig.Start(ctx.Done())
kubeInformersForOpenShiftConfigManaged.Start(ctx.Done())
kubeInformersForKubeSystem.Start(ctx.Done())
configInformers.Start(ctx.Done())
imageregistryInformers.Start(ctx.Done())
routeInformers.Start(ctx.Done())
imageInformers.Start(ctx.Done())
go controller.Run(ctx.Done())
go clusterOperatorStatusController.Run(ctx.Done())
go nodeCADaemonController.Run(ctx.Done())
go imageRegistryCertificatesController.Run(ctx.Done())
go imageConfigStatusController.Run(ctx.Done())
go imagePrunerController.Run(ctx.Done())
go loggingController.Run(ctx, 1)
go azureStackCloudController.Run(ctx)
go azurePathFixController.Run(ctx.Done())
go metricsController.Run(ctx)
<-ctx.Done()
return nil
}