@@ -11,36 +11,34 @@ import (
11
11
"fmt"
12
12
"net/http"
13
13
"os"
14
- "time"
14
+ "path/filepath"
15
+ "strconv"
15
16
16
17
"github.com/spf13/pflag"
17
18
admissionv1 "k8s.io/api/admissionregistration/v1"
18
19
corev1 "k8s.io/api/core/v1"
20
+ apiv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
19
21
clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
20
22
apiclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
21
23
apierrors "k8s.io/apimachinery/pkg/api/errors"
22
24
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23
25
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
24
26
"k8s.io/apimachinery/pkg/runtime"
27
+ "k8s.io/apimachinery/pkg/runtime/serializer"
25
28
"k8s.io/client-go/kubernetes"
26
29
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
27
30
"k8s.io/client-go/tools/clientcmd"
28
31
"k8s.io/kubectl/pkg/util"
29
32
30
33
configv1alpha2 "github.com/openservicemesh/osm/pkg/apis/config/v1alpha2"
31
- "github.com/openservicemesh/osm/pkg/certificate"
32
34
configClientset "github.com/openservicemesh/osm/pkg/gen/client/config/clientset/versioned"
33
35
"github.com/openservicemesh/osm/pkg/health"
34
36
35
37
"github.com/openservicemesh/osm/pkg/certificate/providers"
36
- "github.com/openservicemesh/osm/pkg/configurator"
37
38
"github.com/openservicemesh/osm/pkg/constants"
38
- "github.com/openservicemesh/osm/pkg/crdconversion"
39
39
"github.com/openservicemesh/osm/pkg/httpserver"
40
40
"github.com/openservicemesh/osm/pkg/k8s/events"
41
- "github.com/openservicemesh/osm/pkg/k8s/informers"
42
41
"github.com/openservicemesh/osm/pkg/logger"
43
- "github.com/openservicemesh/osm/pkg/messaging"
44
42
"github.com/openservicemesh/osm/pkg/metricsstore"
45
43
"github.com/openservicemesh/osm/pkg/reconciler"
46
44
"github.com/openservicemesh/osm/pkg/signals"
68
66
certProviderKind string
69
67
enableMeshRootCertificate bool
70
68
71
- tresorOptions providers.TresorOptions
72
69
vaultOptions providers.VaultOptions
73
70
certManagerOptions providers.CertManagerOptions
74
71
@@ -124,21 +121,6 @@ func init() {
124
121
_ = admissionv1 .AddToScheme (scheme )
125
122
}
126
123
127
- // TODO(#4502): This function can be deleted once we get rid of cert options.
128
- func getCertOptions () (providers.Options , error ) {
129
- switch providers .Kind (certProviderKind ) {
130
- case providers .TresorKind :
131
- tresorOptions .SecretName = caBundleSecretName
132
- return tresorOptions , nil
133
- case providers .VaultKind :
134
- vaultOptions .VaultTokenSecretNamespace = osmNamespace
135
- return vaultOptions , nil
136
- case providers .CertManagerKind :
137
- return certManagerOptions , nil
138
- }
139
- return nil , fmt .Errorf ("unknown certificate provider kind: %s" , certProviderKind )
140
- }
141
-
142
124
func main () {
143
125
log .Info ().Msgf ("Starting osm-bootstrap %s; %s; %s" , version .Version , version .GitCommit , version .BuildDate )
144
126
if err := parseFlags (); err != nil {
@@ -175,6 +157,8 @@ func main() {
175
157
namespace : osmNamespace ,
176
158
}
177
159
160
+ applyOrUpdateCRDs (crdClient )
161
+
178
162
err = bootstrap .ensureMeshConfig ()
179
163
if err != nil {
180
164
log .Fatal ().Err (err ).Msgf ("Error setting up default MeshConfig %s from ConfigMap %s" , meshConfigName , presetMeshConfigName )
@@ -194,7 +178,7 @@ func main() {
194
178
log .Fatal ().Err (err ).Msg ("Error initializing Kubernetes events recorder" )
195
179
}
196
180
197
- ctx , cancel := context .WithCancel (context .Background ())
181
+ _ , cancel := context .WithCancel (context .Background ())
198
182
defer cancel ()
199
183
stop := signals .RegisterExitHandlers (cancel )
200
184
@@ -203,50 +187,22 @@ func main() {
203
187
metricsstore .DefaultMetricsStore .ErrCodeCounter ,
204
188
metricsstore .DefaultMetricsStore .HTTPResponseTotal ,
205
189
metricsstore .DefaultMetricsStore .HTTPResponseDuration ,
206
- metricsstore .DefaultMetricsStore .ConversionWebhookResourceTotal ,
207
190
metricsstore .DefaultMetricsStore .ReconciliationTotal ,
208
191
)
209
192
210
- msgBroker := messaging .NewBroker (stop )
211
-
212
- informerCollection , err := informers .NewInformerCollection (meshName , stop ,
213
- informers .WithKubeClient (kubeClient ),
214
- informers .WithConfigClient (configClient , osmMeshConfigName , osmNamespace ),
215
- )
216
-
217
- if err != nil {
218
- events .GenericEventRecorder ().FatalEvent (err , events .InitializationError , "Error creating informer collection" )
219
- }
220
-
221
- // Initialize Configurator to watch resources in the config.openservicemesh.io API group
222
- cfg := configurator .NewConfigurator (informerCollection , osmNamespace , osmMeshConfigName , msgBroker )
223
-
224
- certOpts , err := getCertOptions ()
225
- if err != nil {
226
- log .Fatal ().Err (err ).Msg ("Error getting certificate options" )
227
- }
228
-
229
- var certManager * certificate.Manager
230
- if enableMeshRootCertificate {
231
- certManager , err = providers .NewCertificateManagerFromMRC (ctx , kubeClient , kubeConfig , cfg , osmNamespace , certOpts , msgBroker , informerCollection , 5 * time .Second )
232
- if err != nil {
233
- events .GenericEventRecorder ().FatalEvent (err , events .InvalidCertificateManager ,
234
- "Error initializing certificate manager of kind %s from MRC" , certProviderKind )
235
- }
236
- } else {
237
- certManager , err = providers .NewCertificateManager (ctx , kubeClient , kubeConfig , cfg , osmNamespace , certOpts , msgBroker , 5 * time .Second , trustDomain )
193
+ version .SetMetric ()
194
+ /*
195
+ * Initialize osm-bootstrap's HTTP server
196
+ */
197
+ if enableReconciler {
198
+ log .Info ().Msgf ("OSM reconciler enabled for custom resource definitions" )
199
+ err = reconciler .NewReconcilerClient (kubeClient , apiServerClient , meshName , osmVersion , stop , reconciler .CrdInformerKey )
238
200
if err != nil {
239
- events .GenericEventRecorder ().FatalEvent (err , events .InvalidCertificateManager ,
240
- "Error initializing certificate manager of kind %s" , certProviderKind )
201
+ events .GenericEventRecorder ().FatalEvent (err , events .InitializationError , "Error creating reconciler client for custom resource definitions" )
202
+ log . Fatal (). Err ( err ). Msgf ( "Failed to create reconcile client for custom resource definitions" )
241
203
}
242
204
}
243
205
244
- // Initialize the crd conversion webhook server to support the conversion of OSM's CRDs
245
- if err := crdconversion .NewConversionWebhook (ctx , kubeClient , crdClient , certManager , osmNamespace , enableReconciler ); err != nil {
246
- events .GenericEventRecorder ().FatalEvent (err , events .InitializationError , "Error creating crd conversion webhook" )
247
- }
248
-
249
- version .SetMetric ()
250
206
/*
251
207
* Initialize osm-bootstrap's HTTP server
252
208
*/
@@ -264,19 +220,66 @@ func main() {
264
220
log .Fatal ().Err (err ).Msgf ("Failed to start OSM metrics/probes HTTP server" )
265
221
}
266
222
267
- if enableReconciler {
268
- log .Info ().Msgf ("OSM reconciler enabled for custom resource definitions" )
269
- err = reconciler .NewReconcilerClient (kubeClient , apiServerClient , meshName , osmVersion , stop , reconciler .CrdInformerKey )
270
- if err != nil {
271
- events .GenericEventRecorder ().FatalEvent (err , events .InitializationError , "Error creating reconciler client for custom resource definitions" )
272
- }
273
- }
274
-
275
223
<- stop
276
224
cancel ()
277
225
log .Info ().Msgf ("Stopping osm-bootstrap %s; %s; %s" , version .Version , version .GitCommit , version .BuildDate )
278
226
}
279
227
228
+ func applyOrUpdateCRDs (crdClient * apiclient.ApiextensionsV1Client ) {
229
+ crdFiles , err := filepath .Glob ("/osm-crds/*.yaml" )
230
+
231
+ if err != nil {
232
+ log .Fatal ().Err (err ).Msgf ("error reading files from /osm-crds" )
233
+ }
234
+
235
+ scheme = runtime .NewScheme ()
236
+ codecs := serializer .NewCodecFactory (scheme )
237
+ decode := codecs .UniversalDeserializer ().Decode
238
+
239
+ for _ , file := range crdFiles {
240
+ yaml , err := os .ReadFile (filepath .Clean (file ))
241
+ if err != nil {
242
+ log .Fatal ().Err (err ).Msgf ("Error reading CRD file %s" , file )
243
+ }
244
+
245
+ crd := & apiv1.CustomResourceDefinition {}
246
+ _ , _ , err = decode (yaml , nil , crd )
247
+ if err != nil {
248
+ log .Fatal ().Err (err ).Msgf ("Error decoding CRD file %s" , file )
249
+ }
250
+
251
+ crd .Labels [constants .ReconcileLabel ] = strconv .FormatBool (enableReconciler )
252
+
253
+ crdExisting , err := crdClient .CustomResourceDefinitions ().Get (context .Background (), crd .Name , metav1.GetOptions {})
254
+ if err != nil && ! apierrors .IsNotFound (err ) {
255
+ log .Fatal ().Err (err ).Msgf ("error getting CRD %s" , crd .Name )
256
+ }
257
+
258
+ if apierrors .IsNotFound (err ) {
259
+ log .Info ().Msgf ("crds %s not found, creating CRD" , crd .Name )
260
+ if err := util .CreateApplyAnnotation (crd , unstructured .UnstructuredJSONScheme ); err != nil {
261
+ log .Fatal ().Err (err ).Msgf ("Error applying annotation to CRD %s" , crd .Name )
262
+ }
263
+ if _ , err = crdClient .CustomResourceDefinitions ().Create (context .Background (), crd , metav1.CreateOptions {}); err != nil {
264
+ log .Fatal ().Err (err ).Msgf ("Error creating crd : %s" , crd .Name )
265
+ }
266
+ log .Info ().Msgf ("Successfully created crd: %s" , crd .Name )
267
+ } else {
268
+ log .Info ().Msgf ("Patching conversion webhook configuration for crd: %s, setting to \" None\" " , crd .Name )
269
+
270
+ crdExisting .Labels [constants .ReconcileLabel ] = strconv .FormatBool (enableReconciler )
271
+ crdExisting .Spec = crd .Spec
272
+ crdExisting .Spec .Conversion = & apiv1.CustomResourceConversion {
273
+ Strategy : apiv1 .NoneConverter ,
274
+ }
275
+ if _ , err = crdClient .CustomResourceDefinitions ().Update (context .Background (), crdExisting , metav1.UpdateOptions {}); err != nil {
276
+ log .Fatal ().Err (err ).Msgf ("Error updating conversion webhook configuration for crd : %s" , crd .Name )
277
+ }
278
+ log .Info ().Msgf ("successfully set conversion webhook configuration for crd : %s to \" None\" " , crd .Name )
279
+ }
280
+ }
281
+ }
282
+
280
283
func (b * bootstrap ) createDefaultMeshConfig () error {
281
284
// find presets config map to build the default MeshConfig from that
282
285
presetsConfigMap , err := b .kubeClient .CoreV1 ().ConfigMaps (b .namespace ).Get (context .TODO (), presetMeshConfigName , metav1.GetOptions {})
0 commit comments