@@ -16,6 +16,7 @@ import (
16
16
corev1 "k8s.io/api/core/v1"
17
17
kerrors "k8s.io/apimachinery/pkg/api/errors"
18
18
"k8s.io/apimachinery/pkg/labels"
19
+ "k8s.io/apimachinery/pkg/runtime"
19
20
"k8s.io/apimachinery/pkg/types"
20
21
"k8s.io/client-go/tools/record"
21
22
ctrl "sigs.k8s.io/controller-runtime"
@@ -171,54 +172,19 @@ func (c *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
171
172
return ctrl.Result {}, fmt .Errorf ("failed to reconcile new snapshot request %s/%s: %w" , configMap .Namespace , configMap .Name , err )
172
173
}
173
174
case RequestPhaseCreatingVolumeSnapshots :
174
- // reconcile volume snapshots
175
- volumeSnapshotsRequest := & snapshotRequest .Spec .VolumeSnapshots
176
- volumeSnapshotsStatus := & snapshotRequest .Status .VolumeSnapshots
177
- previousVolumeSnapshotsRequestPhase := volumeSnapshotsStatus .Phase
178
- err = c .volumeSnapshotter .Reconcile (ctx , & configMap , snapshotRequest .Name , volumeSnapshotsRequest , volumeSnapshotsStatus )
175
+ requeueAfter , err := c .reconcileCreatingVolumeSnapshots (ctx , & configMap , snapshotRequest )
179
176
if err != nil {
180
- return ctrl.Result {}, fmt .Errorf ("failed to reconcile volume snapshots: %w" , err )
177
+ return ctrl.Result {}, fmt .Errorf ("failed to reconcile volume snapshots for snapshot request %s/%s : %w" , configMap . Namespace , configMap . Name , err )
181
178
}
182
-
183
- // check volume snapshots' status
184
- switch volumeSnapshotsStatus .Phase {
185
- case volumes .RequestPhaseInProgress :
186
- if previousVolumeSnapshotsRequestPhase == volumes .RequestPhaseNotStarted {
187
- // volume snapshots request just got initialized and moved to in-progress
188
- return ctrl.Result {
189
- RequeueAfter : 5 * time .Second ,
190
- }, nil
191
- } else {
192
- // ongoing volume snapshots reconciliation, this may take some time, wait a bit before reconciling again
193
- return ctrl.Result {
194
- RequeueAfter : 30 * time .Second ,
195
- }, nil
196
- }
197
- case volumes .RequestPhaseCleaningUp :
198
- if previousVolumeSnapshotsRequestPhase == volumes .RequestPhaseInProgress {
199
- // volume snapshots got created and resources should be now cleaned up
200
- return ctrl.Result {
201
- RequeueAfter : 5 * time .Second ,
202
- }, nil
203
- } else {
204
- // ongoing volume snapshots cleanup in progress, wait a bit before reconciling again
205
- return ctrl.Result {
206
- RequeueAfter : 30 * time .Second ,
207
- }, nil
208
- }
209
- case volumes .RequestPhasePartiallyFailed :
210
- fallthrough
211
- case volumes .RequestPhaseCompleted :
212
- snapshotRequest .Status .Phase = RequestPhaseCreatingEtcdBackup
213
- case volumes .RequestPhaseFailed :
214
- snapshotRequest .Status .Phase = RequestPhaseFailed
215
- default :
216
- return ctrl.Result {}, fmt .Errorf ("unexpected volume snapshots request phase %s" , volumeSnapshotsStatus .Phase )
179
+ if requeueAfter > 0 {
180
+ return ctrl.Result {
181
+ RequeueAfter : requeueAfter ,
182
+ }, nil
217
183
}
218
184
case RequestPhaseCreatingEtcdBackup :
219
185
requeue , err := c .reconcileCreatingEtcdBackup (ctx , & configMap , snapshotRequest )
220
186
if err != nil {
221
- return ctrl.Result {}, fmt .Errorf ("failed to reconcile in-progress snapshot request %s/%s: %w" , configMap .Namespace , configMap .Name , err )
187
+ return ctrl.Result {}, fmt .Errorf ("failed to reconcile etcd backup creation for snapshot request %s/%s: %w" , configMap .Namespace , configMap .Name , err )
222
188
}
223
189
if requeue {
224
190
return ctrl.Result {
@@ -244,6 +210,38 @@ func (c *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
244
210
return ctrl.Result {}, nil
245
211
}
246
212
213
+ func (c * Reconciler ) reconcileCreatingVolumeSnapshots (ctx context.Context , snapshotRequestObj runtime.Object , snapshotRequest * Request ) (time.Duration , error ) {
214
+ volumeSnapshotsRequest := & snapshotRequest .Spec .VolumeSnapshots
215
+ volumeSnapshotsStatus := & snapshotRequest .Status .VolumeSnapshots
216
+ previousVolumeSnapshotsRequestPhase := volumeSnapshotsStatus .Phase
217
+ err := c .volumeSnapshotter .Reconcile (ctx , snapshotRequestObj , snapshotRequest .Name , volumeSnapshotsRequest , volumeSnapshotsStatus )
218
+ if err != nil {
219
+ return 0 , fmt .Errorf ("failed to reconcile volume snapshots: %w" , err )
220
+ }
221
+
222
+ // check volume snapshots' status
223
+ switch volumeSnapshotsStatus .Phase {
224
+ case volumes .RequestPhaseInProgress :
225
+ if previousVolumeSnapshotsRequestPhase == volumes .RequestPhaseNotStarted {
226
+ // volume snapshots request just got initialized and moved to in-progress
227
+ return 5 * time .Second , nil
228
+ } else {
229
+ // ongoing volume snapshots reconciliation, this may take some time, wait a bit before reconciling again
230
+ return 30 * time .Second , nil
231
+ }
232
+ case volumes .RequestPhasePartiallyFailed :
233
+ fallthrough
234
+ case volumes .RequestPhaseCompleted :
235
+ snapshotRequest .Status .Phase = RequestPhaseCreatingEtcdBackup
236
+ case volumes .RequestPhaseFailed :
237
+ snapshotRequest .Status .Phase = RequestPhaseFailed
238
+ default :
239
+ return 0 , fmt .Errorf ("unexpected volume snapshots request phase %s" , volumeSnapshotsStatus .Phase )
240
+ }
241
+
242
+ return 0 , nil
243
+ }
244
+
247
245
func (c * Reconciler ) Register () error {
248
246
isVolumeSnapshotsConfig := predicate .NewPredicateFuncs (func (obj client.Object ) bool {
249
247
if obj .GetNamespace () != c .getRequestNamespace () {
0 commit comments