Skip to content

Commit 67cbbfb

Browse files
committed
Delete snapshot request ConfigMap after 24h TTL
1 parent f59a621 commit 67cbbfb

File tree

4 files changed

+57
-11
lines changed

4 files changed

+57
-11
lines changed

pkg/snapshot/controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,12 @@ func (c *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
229229
case RequestPhasePartiallyFailed:
230230
fallthrough
231231
case RequestPhaseCompleted:
232-
err = c.reconcileCompletedRequest(ctx, &configMap)
232+
err = c.reconcileCompletedRequest(ctx, &configMap, snapshotRequest.RequestMetadata)
233233
if err != nil {
234234
return ctrl.Result{}, fmt.Errorf("failed to reconcile completed snapshot request %s/%s: %w", configMap.Namespace, configMap.Name, err)
235235
}
236236
case RequestPhaseFailed:
237-
err = c.reconcileFailedRequest(ctx, &configMap)
237+
err = c.reconcileFailedRequest(ctx, &configMap, snapshotRequest.RequestMetadata)
238238
if err != nil {
239239
return ctrl.Result{}, fmt.Errorf("failed to reconcile failed snapshot request %s/%s: %w", configMap.Namespace, configMap.Name, err)
240240
}

pkg/snapshot/controllerbase.go

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"strings"
8+
"time"
89

910
snapshotsv1 "github.com/kubernetes-csi/external-snapshotter/client/v8/clientset/versioned"
1011
"github.com/loft-sh/vcluster/pkg/config"
@@ -129,19 +130,19 @@ func (c *reconcilerBase) removeFinalizer(ctx context.Context, configMap *corev1.
129130
}
130131

131132
// reconcileCompletedRequest cleans up the completed snapshot/restore request resources.
132-
func (c *reconcilerBase) reconcileCompletedRequest(ctx context.Context, configMap *corev1.ConfigMap) error {
133+
func (c *reconcilerBase) reconcileCompletedRequest(ctx context.Context, configMap *corev1.ConfigMap, requestMetadata RequestMetadata) error {
133134
c.logger.Infof("%s request from ConfigMap %s/%s has been completed", c.kind.ToCapital(), configMap.Namespace, configMap.Name)
134-
err := c.reconcileDoneRequest(ctx, configMap)
135+
err := c.reconcileDoneRequest(ctx, configMap, requestMetadata)
135136
if err != nil {
136137
return fmt.Errorf("failed to delete %s request Secret %s/%s: %w", c.kind, configMap.Namespace, configMap.Name, err)
137138
}
138139
return nil
139140
}
140141

141142
// reconcileFailedRequest cleans up the failed snapshot/restore request resources.
142-
func (c *reconcilerBase) reconcileFailedRequest(ctx context.Context, configMap *corev1.ConfigMap) error {
143+
func (c *reconcilerBase) reconcileFailedRequest(ctx context.Context, configMap *corev1.ConfigMap, requestMetadata RequestMetadata) error {
143144
c.logger.Errorf("%s request from ConfigMap %s/%s has failed", c.kind.ToCapital(), configMap.Namespace, configMap.Name)
144-
err := c.reconcileDoneRequest(ctx, configMap)
145+
err := c.reconcileDoneRequest(ctx, configMap, requestMetadata)
145146
if err != nil {
146147
return fmt.Errorf("failed to delete %s request Secret %s/%s: %w", c.kind, configMap.Namespace, configMap.Name, err)
147148
}
@@ -153,17 +154,38 @@ func (c *reconcilerBase) reconcileFailedRequest(ctx context.Context, configMap *
153154
func (c *reconcilerBase) reconcileDeletedRequest(ctx context.Context, configMap *corev1.ConfigMap) (retErr error) {
154155
// snapshot/restore request ConfigMap deleted, so delete Secret as well
155156
c.logger.Infof("%s request ConfigMap %s/%s deleted", c.kind.ToCapital(), configMap.Namespace, configMap.Name)
157+
defer func() {
158+
if retErr != nil {
159+
// an error occurred, don't remove the finalizer
160+
return
161+
}
162+
err := c.removeFinalizer(ctx, configMap)
163+
if err != nil {
164+
retErr = fmt.Errorf(
165+
"failed to remove vCluster %s controller finalizer from the %s request ConfigMap %s/%s: %w",
166+
c.kind,
167+
c.kind,
168+
configMap.Namespace,
169+
configMap.Name,
170+
err)
171+
}
172+
}()
156173

157-
err := c.reconcileDoneRequest(ctx, configMap)
174+
err := c.deleteRequestSecret(ctx, configMap)
158175
if err != nil {
159-
return fmt.Errorf("failed to delete %s request Secret %s/%s: %w", c.kind, configMap.Namespace, configMap.Name, err)
176+
return fmt.Errorf(
177+
"failed to delete %s request Secret %s/%s: %w",
178+
c.kind,
179+
configMap.Namespace,
180+
configMap.Name,
181+
err)
160182
}
161183
return nil
162184
}
163185

164186
// reconcileDoneRequest deletes the snapshot/restore request Secret and removes the finalizer from the
165187
// snapshot/restore request ConfigMap.
166-
func (c *reconcilerBase) reconcileDoneRequest(ctx context.Context, configMap *corev1.ConfigMap) (retErr error) {
188+
func (c *reconcilerBase) reconcileDoneRequest(ctx context.Context, configMap *corev1.ConfigMap, requestMetadata RequestMetadata) (retErr error) {
167189
defer func() {
168190
if retErr != nil {
169191
// an error occurred, don't remove the finalizer
@@ -190,6 +212,27 @@ func (c *reconcilerBase) reconcileDoneRequest(ctx context.Context, configMap *co
190212
configMap.Name,
191213
err)
192214
}
215+
216+
if time.Since(requestMetadata.CreationTimestamp.Time) >= DefaultRequestTTL {
217+
err = c.deleteRequestConfigMap(ctx, configMap)
218+
if err != nil {
219+
return fmt.Errorf("failed to delete %s request ConfigMap %s/%s: %w", c.kind, configMap.Namespace, configMap.Name, err)
220+
}
221+
}
222+
return nil
223+
}
224+
225+
func (c *reconcilerBase) deleteRequestConfigMap(ctx context.Context, configMap *corev1.ConfigMap) error {
226+
// delete snapshot/restore request secret
227+
err := c.client().Delete(ctx, configMap)
228+
if kerrors.IsNotFound(err) {
229+
c.logger.Debugf("%s request ConfigMap %s/%s aleady deleted", c.kind.ToCapital(), configMap.Namespace, configMap.Name)
230+
return nil
231+
} else if err != nil {
232+
return fmt.Errorf("failed to delete %s request ConfigMap %s/%s: %w", c.kind, configMap.Namespace, configMap.Name, err)
233+
}
234+
235+
c.logger.Infof("Deleted %s request ConfigMap %s/%s", c.kind, configMap.Namespace, configMap.Name)
193236
return nil
194237
}
195238

pkg/snapshot/request.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package snapshot
33
import (
44
"encoding/json"
55
"fmt"
6+
"time"
67

78
"github.com/loft-sh/vcluster/pkg/config"
89
"github.com/loft-sh/vcluster/pkg/constants"
@@ -25,6 +26,8 @@ const (
2526
RequestPhaseCompleted RequestPhase = "Completed"
2627
RequestPhasePartiallyFailed RequestPhase = "PartiallyFailed"
2728
RequestPhaseFailed RequestPhase = "Failed"
29+
30+
DefaultRequestTTL = 24 * time.Hour
2831
)
2932

3033
type RequestPhase string

pkg/snapshot/restorecontroller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,12 @@ func (c *RestoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) (re
197197
return ctrl.Result{}, fmt.Errorf("unexpected volume snapshots request phase %s", volumesRestoreStatus.Phase)
198198
}
199199
case RequestPhaseCompleted:
200-
err = c.reconcileCompletedRequest(ctx, &configMap)
200+
err = c.reconcileCompletedRequest(ctx, &configMap, restoreRequest.RequestMetadata)
201201
if err != nil {
202202
return ctrl.Result{}, fmt.Errorf("failed to reconcile completed restore request %s/%s: %w", configMap.Namespace, configMap.Name, err)
203203
}
204204
case RequestPhaseFailed:
205-
err = c.reconcileFailedRequest(ctx, &configMap)
205+
err = c.reconcileFailedRequest(ctx, &configMap, restoreRequest.RequestMetadata)
206206
if err != nil {
207207
return ctrl.Result{}, fmt.Errorf("failed to reconcile failed restore request %s/%s: %w", configMap.Namespace, configMap.Name, err)
208208
}

0 commit comments

Comments
 (0)