@@ -92,6 +92,7 @@ func (r *Reconciler) syncRemoteObjects(
92
92
remoteObjects []client.Object ,
93
93
) (bool , ctrl.Result , error ) {
94
94
r .Log .Info ("running step syncRemoteObjects" )
95
+
95
96
for _ , remoteObj := range remoteObjects {
96
97
// Determine actual GVK for generic client.Object
97
98
remoteObjGVK , err := apiutil .GVKForObject (remoteObj , r .Scheme )
@@ -111,6 +112,7 @@ func (r *Reconciler) syncRemoteObjects(
111
112
Namespace : remoteObj .GetNamespace (),
112
113
}, remoteObj )
113
114
if err != nil {
115
+ // Resource not found on remote cluster but we should retry
114
116
if apierrors .IsNotFound (err ) {
115
117
r .Recorder .Event (
116
118
remoteDatabaseNodeSet ,
@@ -144,13 +146,13 @@ func (r *Reconciler) syncRemoteObjects(
144
146
// Create client.Object from api.RemoteResource struct
145
147
localObj := resources .CreateResource (remoteObj )
146
148
remoteDatabaseNodeSet .SetPrimaryResourceAnnotations (localObj )
149
+
147
150
// Check object existence in local cluster
148
- err = r .Client .Get (ctx , types.NamespacedName {
151
+ objExist := false
152
+ if err = r .Client .Get (ctx , types.NamespacedName {
149
153
Name : remoteObj .GetName (),
150
154
Namespace : remoteObj .GetNamespace (),
151
- }, localObj )
152
- //nolint:nestif
153
- if err != nil {
155
+ }, localObj ); err != nil {
154
156
if ! apierrors .IsNotFound (err ) {
155
157
r .Recorder .Event (
156
158
remoteDatabaseNodeSet ,
@@ -160,30 +162,16 @@ func (r *Reconciler) syncRemoteObjects(
160
162
)
161
163
return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
162
164
}
163
- // Object does not exist in local cluster
164
- // Try to create resource in remote cluster
165
- if err := r .Client .Create (ctx , localObj ); err != nil {
166
- r .Recorder .Event (
167
- remoteDatabaseNodeSet ,
168
- corev1 .EventTypeWarning ,
169
- "ControllerError" ,
170
- fmt .Sprintf ("Failed to create resource %s with name %s: %s" , remoteObjGVK .Kind , remoteObj .GetName (), err ),
171
- )
172
- return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, nil
173
- }
174
- r .Recorder .Event (
175
- remoteDatabaseNodeSet ,
176
- corev1 .EventTypeNormal ,
177
- "Provisioning" ,
178
- fmt .Sprintf ("RemoteSync CREATE resource %s with name %s" , remoteObjGVK .Kind , remoteObj .GetName ()),
179
- )
180
- } else {
165
+ objExist = true
166
+ }
167
+
168
+ if objExist {
181
169
// Update client.Object for local object with spec from remote object
182
170
updatedObj := resources .UpdateResource (localObj , remoteObj )
183
171
remoteDatabaseNodeSet .SetPrimaryResourceAnnotations (updatedObj )
184
172
// Remote object existing in local cluster, сheck the need for an update
185
173
// Get diff resources and compare bytes by k8s-objectmatcher PatchMaker
186
- updated , err := r .patchObject (ctx , localObj , updatedObj )
174
+ patched , err := r .patchObject (ctx , localObj , updatedObj )
187
175
if err != nil {
188
176
r .Recorder .Event (
189
177
remoteDatabaseNodeSet ,
@@ -192,19 +180,38 @@ func (r *Reconciler) syncRemoteObjects(
192
180
fmt .Sprintf ("Failed to patch resource %s with name %s: %s" , remoteObjGVK .Kind , remoteObj .GetName (), err ),
193
181
)
194
182
}
195
- // Send event with information about updated resource
196
- if updated {
183
+ if patched {
197
184
r .Recorder .Event (
198
185
remoteDatabaseNodeSet ,
199
186
corev1 .EventTypeNormal ,
200
187
"Provisioning" ,
201
188
fmt .Sprintf ("RemoteSync UPDATE resource %s with name %s resourceVersion %s" , remoteObjGVK .Kind , remoteObj .GetName (), remoteObj .GetResourceVersion ()),
202
189
)
203
190
}
191
+ } else {
192
+ // Object does not exist in local cluster
193
+ // Try to create resource in remote cluster
194
+ if err := r .Client .Create (ctx , localObj ); err != nil {
195
+ r .Recorder .Event (
196
+ remoteDatabaseNodeSet ,
197
+ corev1 .EventTypeWarning ,
198
+ "ControllerError" ,
199
+ fmt .Sprintf ("Failed to create resource %s with name %s: %s" , remoteObjGVK .Kind , remoteObj .GetName (), err ),
200
+ )
201
+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, nil
202
+ }
203
+ r .Recorder .Event (
204
+ remoteDatabaseNodeSet ,
205
+ corev1 .EventTypeNormal ,
206
+ "Provisioning" ,
207
+ fmt .Sprintf ("RemoteSync CREATE resource %s with name %s" , remoteObjGVK .Kind , remoteObj .GetName ()),
208
+ )
204
209
}
205
- // Set status for remote resource in RemoteDatabaseNodeSet object
210
+
211
+ // Update status for remote resource in RemoteStorageNodeSet object
206
212
remoteDatabaseNodeSet .SetRemoteResourceStatus (localObj , remoteObjGVK )
207
213
}
214
+
208
215
return r .updateRemoteResourcesStatus (ctx , remoteDatabaseNodeSet )
209
216
}
210
217
@@ -214,13 +221,13 @@ func (r *Reconciler) removeUnusedRemoteObjects(
214
221
remoteObjects []client.Object ,
215
222
) (bool , ctrl.Result , error ) {
216
223
r .Log .Info ("running step removeUnusedRemoteObjects" )
217
-
218
224
// We should check every remote resource to need existence in cluster
225
+ // Get processed remote resources from object Status
219
226
candidatesToDelete := []v1alpha1.RemoteResource {}
220
227
221
228
// Check RemoteResource usage in local DatabaseNodeSet object
222
229
for _ , remoteResource := range remoteDatabaseNodeSet .Status .RemoteResources {
223
- exist , err := r .checkRemoteResourceUsage (remoteDatabaseNodeSet , & remoteResource , remoteObjects )
230
+ exist , err := r .checkRemoteResourceUsage (remoteDatabaseNodeSet , remoteResource , remoteObjects )
224
231
if err != nil {
225
232
r .Recorder .Event (
226
233
remoteDatabaseNodeSet ,
@@ -236,6 +243,7 @@ func (r *Reconciler) removeUnusedRemoteObjects(
236
243
}
237
244
238
245
// Сhecking to avoid unnecessary List request
246
+ //nolint:nestif
239
247
if len (candidatesToDelete ) > 0 {
240
248
// Get remote objects from another DatabaseNodeSet spec
241
249
remoteObjectsFromAnother , err := r .getRemoteObjectsFromAnother (ctx , remoteDatabaseNodeSet )
@@ -277,7 +285,7 @@ func (r *Reconciler) removeUnusedRemoteObjects(
277
285
return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
278
286
}
279
287
280
- existInDatabase , err := r .checkRemoteResourceUsage (remoteDatabaseNodeSet , & remoteResource , remoteObjectsFromAnother )
288
+ existInDatabase , err := r .checkRemoteResourceUsage (remoteDatabaseNodeSet , remoteResource , remoteObjectsFromAnother )
281
289
if err != nil {
282
290
r .Recorder .Event (
283
291
remoteDatabaseNodeSet ,
@@ -361,7 +369,7 @@ func (r *Reconciler) updateRemoteResourcesStatus(
361
369
remoteDatabaseNodeSet ,
362
370
corev1 .EventTypeWarning ,
363
371
"ControllerError" ,
364
- fmt .Sprintf ("Failed fetching RemoteDatabaseNodeSet before status update : %s" , err ),
372
+ fmt .Sprintf ("Failed to update status for remote resources : %s" , err ),
365
373
)
366
374
return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
367
375
}
@@ -385,7 +393,7 @@ func (r *Reconciler) updateRemoteResourcesStatus(
385
393
386
394
func (r * Reconciler ) checkRemoteResourceUsage (
387
395
remoteDatabaseNodeSet * resources.RemoteDatabaseNodeSetResource ,
388
- remoteResource * v1alpha1.RemoteResource ,
396
+ remoteResource v1alpha1.RemoteResource ,
389
397
remoteObjects []client.Object ,
390
398
) (bool , error ) {
391
399
for _ , remoteObj := range remoteObjects {
@@ -394,7 +402,7 @@ func (r *Reconciler) checkRemoteResourceUsage(
394
402
return false , err
395
403
}
396
404
if resources .EqualRemoteResourceWithObject (
397
- remoteResource ,
405
+ & remoteResource ,
398
406
remoteDatabaseNodeSet .Namespace ,
399
407
remoteObj ,
400
408
remoteObjGVK ,
0 commit comments