5
5
"errors"
6
6
"fmt"
7
7
"strings"
8
+ "time"
8
9
9
10
snapshotsv1 "github.com/kubernetes-csi/external-snapshotter/client/v8/clientset/versioned"
10
11
"github.com/loft-sh/vcluster/pkg/config"
@@ -129,19 +130,19 @@ func (c *reconcilerBase) removeFinalizer(ctx context.Context, configMap *corev1.
129
130
}
130
131
131
132
// 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 {
133
134
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 )
135
136
if err != nil {
136
137
return fmt .Errorf ("failed to delete %s request Secret %s/%s: %w" , c .kind , configMap .Namespace , configMap .Name , err )
137
138
}
138
139
return nil
139
140
}
140
141
141
142
// 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 {
143
144
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 )
145
146
if err != nil {
146
147
return fmt .Errorf ("failed to delete %s request Secret %s/%s: %w" , c .kind , configMap .Namespace , configMap .Name , err )
147
148
}
@@ -153,17 +154,38 @@ func (c *reconcilerBase) reconcileFailedRequest(ctx context.Context, configMap *
153
154
func (c * reconcilerBase ) reconcileDeletedRequest (ctx context.Context , configMap * corev1.ConfigMap ) (retErr error ) {
154
155
// snapshot/restore request ConfigMap deleted, so delete Secret as well
155
156
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
+ }()
156
173
157
- err := c .reconcileDoneRequest (ctx , configMap )
174
+ err := c .deleteRequestSecret (ctx , configMap )
158
175
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 )
160
182
}
161
183
return nil
162
184
}
163
185
164
186
// reconcileDoneRequest deletes the snapshot/restore request Secret and removes the finalizer from the
165
187
// 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 ) {
167
189
defer func () {
168
190
if retErr != nil {
169
191
// an error occurred, don't remove the finalizer
@@ -190,6 +212,27 @@ func (c *reconcilerBase) reconcileDoneRequest(ctx context.Context, configMap *co
190
212
configMap .Name ,
191
213
err )
192
214
}
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 )
193
236
return nil
194
237
}
195
238
0 commit comments