@@ -216,7 +216,7 @@ func CreateOrUpdateSTSSecretWithClients(setupLog logr.Logger, secretName string,
216
216
func CreateOrUpdateSTSSecretWithClientsAndWait (setupLog logr.Logger , secretName string , credStringData map [string ]string , secretNS string , clientInstance client.Client , clientset kubernetes.Interface , waitForSecret bool ) error {
217
217
// Create a secret with the appropriate credentials format for STS/WIF authentication
218
218
// Secret format follows standard patterns used by cloud providers
219
- secret := corev1.Secret {
219
+ desiredSecret := corev1.Secret {
220
220
ObjectMeta : metav1.ObjectMeta {
221
221
Name : secretName ,
222
222
Namespace : secretNS ,
@@ -226,48 +226,88 @@ func CreateOrUpdateSTSSecretWithClientsAndWait(setupLog logr.Logger, secretName
226
226
},
227
227
StringData : credStringData ,
228
228
}
229
+
230
+ // First, try to get the existing secret
231
+ existingSecret := corev1.Secret {}
232
+ err := clientInstance .Get (context .Background (), types.NamespacedName {Name : secretName , Namespace : secretNS }, & existingSecret )
233
+
229
234
verb := "created"
230
- if err := clientInstance .Create (context .Background (), & secret ); err != nil {
231
- if errors .IsAlreadyExists (err ) {
232
- verb = "updated"
233
- setupLog .Info ("Secret already exists, updating" )
234
- fromCluster := corev1.Secret {}
235
- err = clientInstance .Get (context .Background (), types.NamespacedName {Name : secret .Name , Namespace : secret .Namespace }, & fromCluster )
236
- if err != nil {
237
- setupLog .Error (err , "unable to get existing secret resource" )
235
+ if err != nil {
236
+ if errors .IsNotFound (err ) {
237
+ // Secret doesn't exist, create it
238
+ if err := clientInstance .Create (context .Background (), & desiredSecret ); err != nil {
239
+ setupLog .Error (err , "unable to create secret resource" )
238
240
return err
239
241
}
240
- // update StringData - preserve existing Data that's not being replaced
241
- // This is safe because STS credentials are only updated during install/reconfiguration,
242
- // and any BSL-specific patches (like region) should be preserved
243
- updatedFromCluster := fromCluster .DeepCopy ()
242
+ } else {
243
+ // Some other error occurred while getting the secret
244
+ setupLog .Error (err , "unable to get secret resource" )
245
+ return err
246
+ }
247
+ } else {
248
+ // Secret exists, check if update is needed
249
+ needsUpdate := false
250
+
251
+ // Check if labels need updating
252
+ if existingSecret .Labels == nil || existingSecret .Labels ["oadp.openshift.io/secret-type" ] != "sts-credentials" {
253
+ needsUpdate = true
254
+ }
255
+
256
+ // Check if data needs updating
257
+ // Convert existing Data to string for comparison
258
+ existingData := make (map [string ]string )
259
+ for key , value := range existingSecret .Data {
260
+ existingData [key ] = string (value )
261
+ }
262
+
263
+ // Compare each key in credStringData
264
+ for key , desiredValue := range credStringData {
265
+ if existingValue , exists := existingData [key ]; ! exists || existingValue != desiredValue {
266
+ needsUpdate = true
267
+ break
268
+ }
269
+ }
270
+
271
+ if needsUpdate {
272
+ verb = "updated"
273
+ setupLog .Info ("Secret content differs, updating" )
274
+
275
+ // Update the secret
276
+ updatedSecret := existingSecret .DeepCopy ()
277
+
244
278
// Initialize StringData if not present
245
- if updatedFromCluster .StringData == nil {
246
- updatedFromCluster .StringData = make (map [string ]string )
279
+ if updatedSecret .StringData == nil {
280
+ updatedSecret .StringData = make (map [string ]string )
247
281
}
282
+
248
283
// Update only the new StringData fields, preserving existing Data
249
- for key , value := range secret . StringData {
250
- updatedFromCluster .StringData [key ] = value
284
+ for key , value := range credStringData {
285
+ updatedSecret .StringData [key ] = value
251
286
}
287
+
252
288
// Ensure labels are set
253
- if updatedFromCluster .Labels == nil {
254
- updatedFromCluster .Labels = make (map [string ]string )
289
+ if updatedSecret .Labels == nil {
290
+ updatedSecret .Labels = make (map [string ]string )
255
291
}
256
- updatedFromCluster .Labels ["oadp.openshift.io/secret-type" ] = "sts-credentials"
257
- if err := clientInstance .Patch (context .Background (), updatedFromCluster , client .MergeFrom (& fromCluster )); err != nil {
292
+ updatedSecret .Labels ["oadp.openshift.io/secret-type" ] = "sts-credentials"
293
+
294
+ if err := clientInstance .Patch (context .Background (), updatedSecret , client .MergeFrom (& existingSecret )); err != nil {
258
295
setupLog .Error (err , fmt .Sprintf ("unable to update secret resource: %v" , err ))
259
296
return err
260
297
}
261
298
} else {
262
- setupLog . Error ( err , "unable to create secret resource" )
263
- return err
299
+ // No update needed
300
+ verb = "unchanged"
264
301
}
265
302
}
266
- setupLog .Info ("Secret " + secret .Name + " " + verb + " successfully" )
267
303
268
- if waitForSecret {
269
- // Wait for the Secret to be available
270
- setupLog .Info (fmt .Sprintf ("Waiting for %s Secret to be available" , secret .Name ))
304
+ if verb != "unchanged" {
305
+ setupLog .Info ("Secret " + desiredSecret .Name + " " + verb + " successfully" )
306
+ }
307
+
308
+ if waitForSecret && verb == "created" {
309
+ // Wait for the Secret to be available (only needed for newly created secrets)
310
+ setupLog .Info (fmt .Sprintf ("Waiting for %s Secret to be available" , desiredSecret .Name ))
271
311
_ , err := WaitForSecret (clientset , secretNS , secretName )
272
312
if err != nil {
273
313
setupLog .Error (err , "error waiting for credentials Secret" )
0 commit comments