@@ -18,6 +18,7 @@ import (
1818 "context"
1919 "fmt"
2020 "reflect"
21+ "time"
2122
2223 "github.com/awslabs/kubernetes-iteration-toolkit/operator/pkg/apis/controlplane/v1alpha1"
2324 "github.com/awslabs/kubernetes-iteration-toolkit/operator/pkg/errors"
@@ -81,7 +82,26 @@ func (c *GenericController) reconcile(ctx context.Context, resource Object, pers
8182 existingFinalizers := resource .GetFinalizers ()
8283 existingFinalizerSet := sets .NewString (existingFinalizers ... )
8384 finalizerStr := sets .NewString (fmt .Sprintf (FinalizerForAWSResources , c .Name ()))
84- if resource .GetDeletionTimestamp () == nil {
85+ if resource .GetDeletionTimestamp () == nil && ttlExpiredForControlPlane (resource ) {
86+ // when ttl expires for the cluster, finalize all sub resources
87+ if result , err = c .finalizeSubResources (ctx , resource , existingFinalizerSet .Difference (finalizerStr ).UnsortedList ()); err != nil {
88+ return * results .Failed , fmt .Errorf ("finalizing resource controller %w" , err )
89+ }
90+ if result .Requeue || result .RequeueAfter > 0 {
91+ return * result , nil
92+ }
93+ // delete the CP object since it doesn't get auto deleted.
94+ if err := c .Delete (ctx , resource ); err != nil {
95+ return * results .Failed , fmt .Errorf ("deleting CP object, %w" , err )
96+ }
97+ // once the object is deleted we don't need to merge patch anymore
98+ return reconcile.Result {}, nil
99+ }
100+ if resource .GetDeletionTimestamp () != nil {
101+ if result , err = c .finalizeSubResources (ctx , resource , existingFinalizerSet .Difference (finalizerStr ).UnsortedList ()); err != nil {
102+ return * results .Failed , fmt .Errorf ("finalizing resource controller %v, %w" , c .Controller .Name (), err )
103+ }
104+ } else {
85105 // Add finalizer for this controller
86106 resource .SetFinalizers (existingFinalizerSet .Union (finalizerStr ).UnsortedList ())
87107 result , err = c .Controller .Reconcile (ctx , resource )
@@ -90,13 +110,6 @@ func (c *GenericController) reconcile(ctx context.Context, resource Object, pers
90110 return * results .Failed , fmt .Errorf ("reconciling resource, %w" , err )
91111 }
92112 resource .StatusConditions ().MarkTrue (v1alpha1 .Active )
93- } else {
94- if result , err = c .Controller .Finalize (ctx , resource ); err != nil {
95- return * results .Failed , fmt .Errorf ("finalizing resource controller %v, %w" , c .Controller .Name (), err )
96- }
97- // Remove finalizer for this controller
98- resource .SetFinalizers (existingFinalizerSet .Difference (finalizerStr ).UnsortedList ())
99- zap .S ().Infof ("[%s] Successfully deleted" , resource .GetName ())
100113 }
101114 // If the finalizers have changed merge patch the object
102115 if ! reflect .DeepEqual (existingFinalizers , resource .GetFinalizers ()) {
@@ -106,3 +119,34 @@ func (c *GenericController) reconcile(ctx context.Context, resource Object, pers
106119 }
107120 return * result , nil
108121}
122+
123+ func (c * GenericController ) finalizeSubResources (ctx context.Context , resource Object , finalizers []string ) (* reconcile.Result , error ) {
124+ result , err := c .Controller .Finalize (ctx , resource )
125+ if err != nil {
126+ return result , fmt .Errorf ("finalizing resource controller %v, %w" , c .Controller .Name (), err )
127+ }
128+ // Remove finalizer for this controller
129+ resource .SetFinalizers (finalizers )
130+ zap .S ().Infof ("[%s] Successfully deleted resources" , resource .GetName ())
131+ return result , nil
132+ }
133+
134+ func ttlExpiredForControlPlane (resource Object ) bool {
135+ cp , ok := resource .(* v1alpha1.ControlPlane )
136+ if ! ok {
137+ return false
138+ }
139+ if cp .Spec .TTL != "" {
140+ duration , err := time .ParseDuration (cp .Spec .TTL )
141+ if err != nil {
142+ zap .S ().Errorf ("parsing TTL duration, %w" , err )
143+ return false
144+ }
145+ deleteAfter := resource .GetCreationTimestamp ().Add (duration )
146+ if time .Now ().After (deleteAfter ) {
147+ zap .S ().Infof ("[%v] control plane TTL expired, deleting cluster resources" , cp .ClusterName ())
148+ return true
149+ }
150+ }
151+ return false
152+ }
0 commit comments