@@ -27,6 +27,8 @@ import (
2727 "k8s.io/apimachinery/pkg/runtime"
2828 "sigs.k8s.io/controller-runtime/pkg/client"
2929 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
30+
31+ "github.com/devfile/devworkspace-operator/pkg/provision/sync"
3032)
3133
3234// GetRegistryAuthSecret retrieves the registry authentication secret for accessing backup images
@@ -78,21 +80,8 @@ func HandleRegistryAuthSecret(ctx context.Context, c client.Client, workspace *d
7880
7981// CopySecret copies the given secret from the operator namespace to the workspace namespace.
8082func CopySecret (ctx context.Context , c client.Client , workspace * dw.DevWorkspace , sourceSecret * corev1.Secret , scheme * runtime.Scheme , log logr.Logger ) (namespaceSecret * corev1.Secret , err error ) {
81- existingNamespaceSecret := & corev1.Secret {}
82- err = c .Get (ctx , client.ObjectKey {
83- Name : constants .DevWorkspaceBackupAuthSecretName ,
84- Namespace : workspace .Namespace }, existingNamespaceSecret )
85- if client .IgnoreNotFound (err ) != nil {
86- log .Error (err , "Failed to check for existing registry auth secret in workspace namespace" , "namespace" , workspace .Namespace )
87- return nil , err
88- }
89- if err == nil {
90- err = c .Delete (ctx , existingNamespaceSecret )
91- if err != nil {
92- return nil , err
93- }
94- }
95- namespaceSecret = & corev1.Secret {
83+ // Construct the desired secret state
84+ desiredSecret := & corev1.Secret {
9685 ObjectMeta : metav1.ObjectMeta {
9786 Name : constants .DevWorkspaceBackupAuthSecretName ,
9887 Namespace : workspace .Namespace ,
@@ -104,12 +93,32 @@ func CopySecret(ctx context.Context, c client.Client, workspace *dw.DevWorkspace
10493 Data : sourceSecret .Data ,
10594 Type : sourceSecret .Type ,
10695 }
107- if err := controllerutil .SetControllerReference (workspace , namespaceSecret , scheme ); err != nil {
96+
97+ if err := controllerutil .SetControllerReference (workspace , desiredSecret , scheme ); err != nil {
10898 return nil , err
10999 }
110- err = c .Create (ctx , namespaceSecret )
111- if err == nil {
112- log .Info ("Successfully created secret" , "name" , namespaceSecret .Name , "namespace" , workspace .Namespace )
100+
101+ // Use the sync mechanism
102+ clusterAPI := sync.ClusterAPI {
103+ Client : c ,
104+ Scheme : scheme ,
105+ Logger : log ,
106+ Ctx : ctx ,
107+ }
108+
109+ syncedObj , err := sync .SyncObjectWithCluster (desiredSecret , clusterAPI )
110+ if err != nil {
111+ if _ , ok := err .(* sync.NotInSyncError ); ! ok {
112+ return nil , err
113+ }
114+ // NotInSyncError means the sync operation was successful but triggered a change
115+ log .Info ("Successfully synced secret" , "name" , desiredSecret .Name , "namespace" , workspace .Namespace )
113116 }
114- return namespaceSecret , err
117+
118+ // If syncedObj is nil (due to NotInSyncError), return the desired object
119+ if syncedObj == nil {
120+ return desiredSecret , nil
121+ }
122+
123+ return syncedObj .(* corev1.Secret ), nil
115124}
0 commit comments