@@ -210,13 +210,8 @@ func (r *BackupCronJobReconciler) stopCron(log logr.Logger) {
210210func (r * BackupCronJobReconciler ) executeBackupSync (ctx context.Context , dwOperatorConfig * controllerv1alpha1.DevWorkspaceOperatorConfig , log logr.Logger ) error {
211211 log .Info ("Executing backup sync for all DevWorkspaces" )
212212
213- registryAuthSecret , err := r .getRegistryAuthSecret (ctx , dwOperatorConfig , log )
214- if err != nil {
215- log .Error (err , "Failed to get registry auth secret for backup job" )
216- return err
217- }
218213 devWorkspaces := & dw.DevWorkspaceList {}
219- err = r .List (ctx , devWorkspaces )
214+ err : = r .List (ctx , devWorkspaces )
220215 if err != nil {
221216 log .Error (err , "Failed to list DevWorkspaces" )
222217 return err
@@ -239,7 +234,7 @@ func (r *BackupCronJobReconciler) executeBackupSync(ctx context.Context, dwOpera
239234 continue
240235 }
241236
242- if err : = r .createBackupJob (& dw , ctx , dwOperatorConfig , registryAuthSecret , log ); err != nil {
237+ if err = r .createBackupJob (& dw , ctx , dwOperatorConfig , log ); err != nil {
243238 log .Error (err , "Failed to create backup Job for DevWorkspace" , "id" , dwID )
244239 continue
245240 }
@@ -260,23 +255,6 @@ func (r *BackupCronJobReconciler) executeBackupSync(ctx context.Context, dwOpera
260255 return nil
261256}
262257
263- func (r * BackupCronJobReconciler ) getRegistryAuthSecret (ctx context.Context , dwOperatorConfig * controllerv1alpha1.DevWorkspaceOperatorConfig , log logr.Logger ) (* corev1.Secret , error ) {
264- registryAuthSecret := & corev1.Secret {}
265- if dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret != "" {
266- err := r .NonCachingClient .Get (ctx , client.ObjectKey {
267- Name : dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret ,
268- Namespace : dwOperatorConfig .Namespace ,
269- }, registryAuthSecret )
270- if err != nil {
271- log .Error (err , "Failed to get registry auth secret for backup job" , "secretName" , dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret )
272- return nil , err
273- }
274- log .Info ("Successfully retrieved registry auth secret for backup job" , "secretName" , dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret )
275- return registryAuthSecret , nil
276- }
277- return nil , nil
278- }
279-
280258// wasStoppedSinceLastBackup checks if the DevWorkspace was stopped since the last backup time.
281259func (r * BackupCronJobReconciler ) wasStoppedSinceLastBackup (workspace * dw.DevWorkspace , lastBackupTime * metav1.Time , log logr.Logger ) bool {
282260 if workspace .Status .Phase != dw .DevWorkspaceStatusStopped {
@@ -310,12 +288,17 @@ func (r *BackupCronJobReconciler) createBackupJob(
310288 workspace * dw.DevWorkspace ,
311289 ctx context.Context ,
312290 dwOperatorConfig * controllerv1alpha1.DevWorkspaceOperatorConfig ,
313- registryAuthSecret * corev1.Secret ,
314291 log logr.Logger ,
315292) error {
316293 dwID := workspace .Status .DevWorkspaceId
317294 backUpConfig := dwOperatorConfig .Config .Workspace .BackupCronJob
318295
296+ registryAuthSecret , err := r .handleRegistryAuthSecret (workspace , ctx , dwOperatorConfig , log )
297+ if err != nil {
298+ log .Error (err , "Failed to handle registry auth secret for DevWorkspace" , "devworkspace" , workspace .Name )
299+ return err
300+ }
301+
319302 // Find a PVC with the name "claim-devworkspace" or based on the name from the operator config
320303 pvcName , workspacePath , err := r .getWorkspacePVCName (workspace , dwOperatorConfig , ctx , log )
321304 if err != nil {
@@ -413,15 +396,11 @@ func (r *BackupCronJobReconciler) createBackupJob(
413396 },
414397 }
415398 if registryAuthSecret != nil {
416- secret , err := r .copySecret (workspace , ctx , registryAuthSecret , log )
417- if err != nil {
418- return err
419- }
420399 job .Spec .Template .Spec .Volumes = append (job .Spec .Template .Spec .Volumes , corev1.Volume {
421400 Name : "registry-auth-secret" ,
422401 VolumeSource : corev1.VolumeSource {
423402 Secret : & corev1.SecretVolumeSource {
424- SecretName : secret .Name ,
403+ SecretName : registryAuthSecret .Name ,
425404 },
426405 },
427406 })
@@ -474,6 +453,47 @@ func (r *BackupCronJobReconciler) getWorkspacePVCName(workspace *dw.DevWorkspace
474453 return "" , "" , nil
475454}
476455
456+ func (r * BackupCronJobReconciler ) handleRegistryAuthSecret (workspace * dw.DevWorkspace ,
457+ ctx context.Context ,
458+ dwOperatorConfig * controllerv1alpha1.DevWorkspaceOperatorConfig , log logr.Logger ,
459+ ) (* corev1.Secret , error ) {
460+ if dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret == "" {
461+ // No auth secret configured - anonymous access to registry
462+ return nil , nil
463+ }
464+ secretName := dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret
465+
466+ // First check the workspace namespace for the secret
467+ registryAuthSecret := & corev1.Secret {}
468+ err := r .NonCachingClient .Get (ctx , client.ObjectKey {
469+ Name : secretName ,
470+ Namespace : workspace .Namespace }, registryAuthSecret )
471+ if err == nil {
472+ log .Info ("Successfully retrieved registry auth secret for backup from workspace namespace" , "secretName" , secretName )
473+ return registryAuthSecret , nil
474+ }
475+ if client .IgnoreNotFound (err ) != nil {
476+ return nil , err
477+ }
478+
479+ log .Info ("Registry auth secret not found in workspace namespace, checking operator namespace" , "secretName" , secretName )
480+
481+ // If the secret is not found in the workspace namespace, check the operator namespace as fallback
482+ if dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret != "" {
483+ err := r .NonCachingClient .Get (ctx , client.ObjectKey {
484+ Name : dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret ,
485+ Namespace : dwOperatorConfig .Namespace ,
486+ }, registryAuthSecret )
487+ if err != nil {
488+ log .Error (err , "Failed to get registry auth secret for backup job" , "secretName" , dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret )
489+ return nil , err
490+ }
491+ log .Info ("Successfully retrieved registry auth secret for backup job" , "secretName" , dwOperatorConfig .Config .Workspace .BackupCronJob .Registry .AuthSecret )
492+ return r .copySecret (workspace , ctx , registryAuthSecret , log )
493+ }
494+ return nil , nil
495+ }
496+
477497func (r * BackupCronJobReconciler ) copySecret (workspace * dw.DevWorkspace , ctx context.Context , sourceSecret * corev1.Secret , log logr.Logger ) (namespaceSecret * corev1.Secret , err error ) {
478498 existingNamespaceSecret := & corev1.Secret {}
479499 err = r .NonCachingClient .Get (ctx , client.ObjectKey {
@@ -484,12 +504,10 @@ func (r *BackupCronJobReconciler) copySecret(workspace *dw.DevWorkspace, ctx con
484504 return nil , err
485505 }
486506 if err == nil {
487- log .Info ("Deleting existing registry auth secret in workspace namespace" , "namespace" , workspace .Namespace )
488507 err = r .Delete (ctx , existingNamespaceSecret )
489508 if err != nil {
490509 return nil , err
491510 }
492- log .Info ("Successfully deleted existing registry auth secret in workspace namespace" , "namespace" , workspace .Namespace )
493511 }
494512 namespaceSecret = & corev1.Secret {
495513 ObjectMeta : metav1.ObjectMeta {
@@ -507,5 +525,8 @@ func (r *BackupCronJobReconciler) copySecret(workspace *dw.DevWorkspace, ctx con
507525 return nil , err
508526 }
509527 err = r .Create (ctx , namespaceSecret )
528+ if err == nil {
529+ log .Info ("Sucesfully created secret" , "name" , namespaceSecret .Name , "namespace" , workspace .Namespace )
530+ }
510531 return namespaceSecret , err
511532}
0 commit comments