@@ -224,21 +224,39 @@ func (r *HelmReleaseProxyReconciler) Reconcile(ctx context.Context, req ctrl.Req
224
224
return ctrl.Result {}, wrappedErr
225
225
}
226
226
227
- defer func () {
228
- if err := os .Remove (credentialsPath ); err != nil {
229
- log .Error (err , "failed to remove credentials file in path" , "credentialsPath" , credentialsPath )
230
- }
231
- }()
227
+ if credentialsPath != "" {
228
+ defer func () {
229
+ if err := os .Remove (credentialsPath ); err != nil {
230
+ log .Error (err , "failed to remove credentials file in path" , "credentialsPath" , credentialsPath )
231
+ }
232
+ }()
233
+ }
234
+
235
+ caFilePath , err := r .getCAFile (ctx , helmReleaseProxy )
236
+ if err != nil {
237
+ wrappedErr := errors .Wrapf (err , "failed to get CA certificate file for cluster" )
238
+ conditions .MarkFalse (helmReleaseProxy , addonsv1alpha1 .ClusterAvailableCondition , addonsv1alpha1 .GetCACertificateFailedReason , clusterv1 .ConditionSeverityError , wrappedErr .Error ())
239
+
240
+ return ctrl.Result {}, wrappedErr
241
+ }
242
+
243
+ if caFilePath != "" {
244
+ defer func () {
245
+ if err := os .Remove (caFilePath ); err != nil {
246
+ log .Error (err , "failed to remove CA certificate file in path" , "credentialsPath" , caFilePath )
247
+ }
248
+ }()
249
+ }
232
250
233
251
log .V (2 ).Info ("Reconciling HelmReleaseProxy" , "releaseProxyName" , helmReleaseProxy .Name )
234
- err = r .reconcileNormal (ctx , helmReleaseProxy , r .HelmClient , credentialsPath , kubeconfig )
252
+ err = r .reconcileNormal (ctx , helmReleaseProxy , r .HelmClient , credentialsPath , caFilePath , kubeconfig )
235
253
236
254
return ctrl.Result {}, err
237
255
}
238
256
239
257
// reconcileNormal handles HelmReleaseProxy reconciliation when it is not being deleted. This will install or upgrade the HelmReleaseProxy on the Cluster.
240
258
// It will set the ReleaseName on the HelmReleaseProxy if the name is generated and also set the release status and release revision.
241
- func (r * HelmReleaseProxyReconciler ) reconcileNormal (ctx context.Context , helmReleaseProxy * addonsv1alpha1.HelmReleaseProxy , client internal.Client , credentialsPath string , kubeconfig string ) error {
259
+ func (r * HelmReleaseProxyReconciler ) reconcileNormal (ctx context.Context , helmReleaseProxy * addonsv1alpha1.HelmReleaseProxy , client internal.Client , credentialsPath , caFilePath string , kubeconfig string ) error {
242
260
log := ctrl .LoggerFrom (ctx )
243
261
244
262
log .V (2 ).Info ("Reconciling HelmReleaseProxy on cluster" , "HelmReleaseProxy" , helmReleaseProxy .Name , "cluster" , helmReleaseProxy .Spec .ClusterRef .Name )
@@ -250,7 +268,7 @@ func (r *HelmReleaseProxyReconciler) reconcileNormal(ctx context.Context, helmRe
250
268
})
251
269
}
252
270
253
- release , err := client .InstallOrUpgradeHelmRelease (ctx , kubeconfig , credentialsPath , helmReleaseProxy .Spec )
271
+ release , err := client .InstallOrUpgradeHelmRelease (ctx , kubeconfig , credentialsPath , caFilePath , helmReleaseProxy .Spec )
254
272
if err != nil {
255
273
log .Error (err , fmt .Sprintf ("Failed to install or upgrade release '%s' on cluster %s" , helmReleaseProxy .Spec .ReleaseName , helmReleaseProxy .Spec .ClusterRef .Name ))
256
274
conditions .MarkFalse (helmReleaseProxy , addonsv1alpha1 .HelmReleaseReadyCondition , addonsv1alpha1 .HelmInstallOrUpgradeFailedReason , clusterv1 .ConditionSeverityError , err .Error ())
@@ -377,6 +395,31 @@ func (r *HelmReleaseProxyReconciler) getCredentials(ctx context.Context, helmRel
377
395
return credentialsPath , nil
378
396
}
379
397
398
+ // getCAFile fetches the CA certificate from a Secret and writes it to a temporary file, returning the path to the temporary file.
399
+ func (r * HelmReleaseProxyReconciler ) getCAFile (ctx context.Context , helmReleaseProxy * addonsv1alpha1.HelmReleaseProxy ) (string , error ) {
400
+ caFilePath := ""
401
+ if helmReleaseProxy .Spec .TLSConfig != nil && helmReleaseProxy .Spec .TLSConfig .CASecretRef .Name != "" {
402
+ // By default, the secret is in the same namespace as the HelmReleaseProxy
403
+ if helmReleaseProxy .Spec .TLSConfig .CASecretRef .Namespace == "" {
404
+ helmReleaseProxy .Spec .TLSConfig .CASecretRef .Namespace = helmReleaseProxy .Namespace
405
+ }
406
+ caSecretValues , err := r .getCACertificateFromSecret (ctx , helmReleaseProxy .Spec .TLSConfig .CASecretRef .Name , helmReleaseProxy .Spec .TLSConfig .CASecretRef .Namespace )
407
+ if err != nil {
408
+ return "" , err
409
+ }
410
+
411
+ // Write to a file
412
+ filename , err := writeCACertificateToFile (ctx , caSecretValues )
413
+ if err != nil {
414
+ return "" , err
415
+ }
416
+
417
+ caFilePath = filename
418
+ }
419
+
420
+ return caFilePath , nil
421
+ }
422
+
380
423
// getCredentialsFromSecret returns the OCI credentials from a Secret.
381
424
func (r * HelmReleaseProxyReconciler ) getCredentialsFromSecret (ctx context.Context , name , namespace , key string ) ([]byte , error ) {
382
425
secret := & corev1.Secret {}
@@ -407,3 +450,35 @@ func writeCredentialsToFile(ctx context.Context, credentials []byte) (string, er
407
450
408
451
return credentialsFile .Name (), nil
409
452
}
453
+
454
+ // getCredentialsFromSecret returns the OCI credentials from a Secret.
455
+ func (r * HelmReleaseProxyReconciler ) getCACertificateFromSecret (ctx context.Context , name , namespace string ) ([]byte , error ) {
456
+ secret := & corev1.Secret {}
457
+ if err := r .Client .Get (ctx , types.NamespacedName {Name : name , Namespace : namespace }, secret ); err != nil {
458
+ return nil , err
459
+ }
460
+
461
+ const key = "ca.crt"
462
+ credentials , ok := secret .Data [key ]
463
+ if ! ok {
464
+ return nil , errors .New (fmt .Sprintf ("key %s not found in secret %s/%s" , key , namespace , name ))
465
+ }
466
+
467
+ return credentials , nil
468
+ }
469
+
470
+ // writeCACertificateToFile writes the CA certificate to a temporary file.
471
+ func writeCACertificateToFile (ctx context.Context , caCertificate []byte ) (string , error ) {
472
+ log := ctrl .LoggerFrom (ctx )
473
+ log .V (2 ).Info ("Writing CA certficate to file" )
474
+ caCertFile , err := os .CreateTemp ("" , "ca-*.crt" )
475
+ if err != nil {
476
+ return "" , err
477
+ }
478
+
479
+ if _ , err := caCertFile .Write (caCertificate ); err != nil {
480
+ return "" , err
481
+ }
482
+
483
+ return caCertFile .Name (), nil
484
+ }
0 commit comments