Skip to content

Commit e5e55fe

Browse files
synaretemergify[bot]
authored andcommitted
resources: refine get-create logic for openshift elems
When doing reconcile logic of Get-or-Create for OpenShift's elements, treat AlreadyExists error as transient error and just Get the element once again from the API server. This may happen in cases where there is a skew between your apimachinery and client-go versions[1]. [1] kubernetes/client-go#89 Signed-off-by: Shachar Sharon <[email protected]>
1 parent d59635a commit e5e55fe

File tree

2 files changed

+70
-30
lines changed

2 files changed

+70
-30
lines changed

internal/resources/metrics.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,19 @@ func (m *SmbShareManager) getOrCreateMetricsService(
124124
}
125125
err = m.client.Create(ctx, srvWant, &rtclient.CreateOptions{})
126126
if err != nil {
127-
if errors.IsAlreadyExists(err) {
128-
m.logger.Info("Metrics Service already exists", "key", srvKey)
129-
} else {
127+
if !errors.IsAlreadyExists(err) {
130128
m.logger.Error(err, "Failed to create metrics Service",
131129
"key", srvKey)
130+
return nil, false, err
132131
}
133-
return nil, false, err
132+
m.logger.Info("Retry to get metrics Service", "key", srvKey)
133+
srvCurr, srvKey, err = m.getMetricsServiceOf(ctx, pl, ns)
134+
if err != nil {
135+
m.logger.Error(err, "Failed to get existing metrics Service",
136+
"key", srvKey)
137+
return nil, false, err
138+
}
139+
return srvCurr, false, err
134140
}
135141
return srvWant, true, nil
136142
}
@@ -201,14 +207,19 @@ func (m *SmbShareManager) getOrCreateMetricsServiceMonitor(
201207
}
202208
err = m.client.Create(ctx, smWant, &rtclient.CreateOptions{})
203209
if err != nil {
204-
if errors.IsAlreadyExists(err) {
205-
m.logger.Info("Metrics ServiceMonitor already exists",
206-
"key", smKey)
207-
} else {
210+
if !errors.IsAlreadyExists(err) {
208211
m.logger.Error(err, "Failed to create metrics ServiceMonitor",
209212
"key", smKey)
213+
return nil, false, err
210214
}
211-
return nil, false, err
215+
m.logger.Info("Retry to get metrics ServiceMonitor", "key", smKey)
216+
smCurr, smKey, err = m.getMetricsServiceMonitorOf(ctx, pl, ns)
217+
if err != nil {
218+
m.logger.Error(err, "Failed to get existing metrics ServiceMonitor",
219+
"key", smKey)
220+
return nil, false, err
221+
}
222+
return smCurr, false, nil
212223
}
213224
return smWant, true, nil
214225
}

internal/resources/openshift.go

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,19 @@ func (m *SmbShareManager) getOrCreateServiceAccountOf(
325325
}
326326
err = m.client.Create(ctx, saWant, &rtclient.CreateOptions{})
327327
if err != nil {
328-
if errors.IsAlreadyExists(err) {
329-
m.logger.Info("ServiceAccount already exists", "key", saKey)
330-
} else {
328+
if !errors.IsAlreadyExists(err) {
331329
m.logger.Error(err, "Failed to create ServiceAccount",
332330
"key", saKey)
331+
return nil, false, err
333332
}
334-
return nil, false, err
333+
m.logger.Info("Retry to get ServiceAccount", "key", saKey)
334+
saCurr, saKey, err = m.getServiceAccountOf(ctx, smbshare)
335+
if err != nil {
336+
m.logger.Error(err, "Failed to get existing ServiceAccount",
337+
"key", saKey)
338+
return nil, false, err
339+
}
340+
return saCurr, false, err
335341
}
336342
return saWant, true, nil
337343
}
@@ -393,12 +399,18 @@ func (m *SmbShareManager) getOrCreateSCCRoleOf(
393399
}
394400
err = m.client.Create(ctx, roleWant, &rtclient.CreateOptions{})
395401
if err != nil {
396-
if errors.IsAlreadyExists(err) {
397-
m.logger.Info("SCC Role already exists", "key", roleKey)
398-
} else {
402+
if !errors.IsAlreadyExists(err) {
399403
m.logger.Error(err, "Failed to create SCC Role", "key", roleKey)
404+
return nil, false, err
400405
}
401-
return nil, false, err
406+
m.logger.Info("Retry to get SCC Role", "key", roleKey)
407+
roleCurr, roleKey, err = m.getSCCRoleOf(ctx, smbshare)
408+
if err != nil {
409+
m.logger.Error(err, "Failed to get existing SCC Role",
410+
"key", roleKey)
411+
return nil, false, err
412+
}
413+
return roleCurr, false, err
402414
}
403415
return roleWant, true, nil
404416
}
@@ -450,13 +462,19 @@ func (m *SmbShareManager) getOrCreateSCCRoleBindingOf(
450462
}
451463
err = m.client.Create(ctx, roleBindWant, &rtclient.CreateOptions{})
452464
if err != nil {
453-
if errors.IsAlreadyExists(err) {
454-
m.logger.Info("SCC RoleBinding already exists", "key", roleBindKey)
455-
} else {
465+
if !errors.IsAlreadyExists(err) {
456466
m.logger.Error(err, "Failed to create RoleBinding",
457467
"key", roleBindKey)
468+
return nil, false, err
458469
}
459-
return nil, false, err
470+
m.logger.Info("Retry to get RoleBinding", "key", roleBindKey)
471+
roleBindCurr, roleBindKey, err = m.getSCCRoleBindingOf(ctx, smbshare)
472+
if err != nil {
473+
m.logger.Error(err, "Failed to get existing RoleBinding",
474+
"key", roleBindKey)
475+
return nil, false, err
476+
}
477+
return roleBindCurr, false, nil
460478
}
461479
return roleBindWant, true, nil
462480
}
@@ -517,13 +535,19 @@ func (m *SmbShareManager) getOrCreateMetricsRoleOf(
517535
}
518536
err = m.client.Create(ctx, roleWant, &rtclient.CreateOptions{})
519537
if err != nil {
520-
if errors.IsAlreadyExists(err) {
521-
m.logger.Info("Metrics Role already exists", "key", roleKey)
522-
} else {
538+
if !errors.IsAlreadyExists(err) {
523539
m.logger.Error(err, "Failed to create Metrics Role",
524540
"key", roleKey)
541+
return nil, false, err
525542
}
526-
return nil, false, err
543+
m.logger.Info("Retry to get Metrics Role", "key", roleKey)
544+
roleCurr, roleKey, err = m.getMetricsRoleOf(ctx, smbshare)
545+
if err != nil {
546+
m.logger.Error(err, "Failed to get existing Metrics Role",
547+
"key", roleKey)
548+
return nil, false, err
549+
}
550+
return roleCurr, false, err
527551
}
528552
return roleWant, true, nil
529553
}
@@ -576,14 +600,19 @@ func (m *SmbShareManager) getOrCreateMetricsRoleBindingOf(
576600
}
577601
err = m.client.Create(ctx, roleBindWant, &rtclient.CreateOptions{})
578602
if err != nil {
579-
if errors.IsAlreadyExists(err) {
580-
m.logger.Info("Metrics RoleBinding already exists",
581-
"key", roleBindKey)
582-
} else {
603+
if !errors.IsAlreadyExists(err) {
583604
m.logger.Error(err, "Failed to create Metrics RoleBinding",
584605
"key", roleBindKey)
606+
return nil, false, err
585607
}
586-
return nil, false, err
608+
m.logger.Info("Retry to get Metrics RoleBinding", "key", roleBindKey)
609+
roleBindCurr, roleBindKey, err = m.getMetricsRoleBindingOf(ctx, smbshare)
610+
if err != nil {
611+
m.logger.Error(err, "Failed to get existing Metrics RoleBinding",
612+
"key", roleBindKey)
613+
return nil, false, err
614+
}
615+
return roleBindCurr, false, err
587616
}
588617
return roleBindWant, true, nil
589618
}

0 commit comments

Comments
 (0)