@@ -23,11 +23,14 @@ import (
2323
2424 corev1 "k8s.io/api/core/v1"
2525 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+ "k8s.io/client-go/kubernetes/scheme"
2627 "k8s.io/klog/v2/klogr"
28+ "k8s.io/utils/pointer"
2729 capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
2830 "sigs.k8s.io/cluster-api/util"
2931 ctrl "sigs.k8s.io/controller-runtime"
3032 "sigs.k8s.io/controller-runtime/pkg/client"
33+ "sigs.k8s.io/controller-runtime/pkg/client/fake"
3134
3235 infrav1beta1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
3336 "sigs.k8s.io/cluster-api-provider-ibmcloud/cloud/scope"
@@ -165,6 +168,111 @@ func TestIBMPowerVSClusterReconciler_reconcile(t *testing.T) {
165168 }
166169}
167170
171+ func TestIBMPowerVSClusterReconciler_delete (t * testing.T ) {
172+ var (
173+ reconciler IBMPowerVSClusterReconciler
174+ clusterScope * scope.PowerVSClusterScope
175+ )
176+ reconciler = IBMPowerVSClusterReconciler {
177+ Client : testEnv .Client ,
178+ Log : klogr .New (),
179+ }
180+ t .Run ("Reconciling delete IBMPowerVSCluster" , func (t * testing.T ) {
181+ t .Run ("Should reconcile successfully if no descendants are found" , func (t * testing.T ) {
182+ g := NewWithT (t )
183+ clusterScope = & scope.PowerVSClusterScope {
184+ Logger : klogr .New (),
185+ IBMPowerVSCluster : & infrav1beta1.IBMPowerVSCluster {
186+ TypeMeta : metav1.TypeMeta {
187+ Kind : "IBMPowerVSCluster" ,
188+ APIVersion : "infrastructure.cluster.x-k8s.io/v1beta1" ,
189+ },
190+ ObjectMeta : metav1.ObjectMeta {
191+ Name : "capi-powervs-cluster" ,
192+ },
193+ Spec : infrav1beta1.IBMPowerVSClusterSpec {
194+ ServiceInstanceID : "service-instance-1" ,
195+ },
196+ },
197+ Client : fake .NewClientBuilder ().WithScheme (scheme .Scheme ).WithObjects ().Build (),
198+ }
199+ result , err := reconciler .reconcileDelete (ctx , clusterScope )
200+ g .Expect (err ).To (BeNil ())
201+ g .Expect (result .RequeueAfter ).To (BeZero ())
202+ })
203+ t .Run ("Should reconcile with requeue by deleting the cluster descendants" , func (t * testing.T ) {
204+ g := NewWithT (t )
205+ clusterScope = & scope.PowerVSClusterScope {
206+ Logger : klogr .New (),
207+ IBMPowerVSCluster : & infrav1beta1.IBMPowerVSCluster {
208+ TypeMeta : metav1.TypeMeta {
209+ Kind : "IBMPowerVSCluster" ,
210+ APIVersion : "infrastructure.cluster.x-k8s.io/v1beta1" ,
211+ },
212+ ObjectMeta : metav1.ObjectMeta {
213+ Name : "capi-powervs-cluster" ,
214+ },
215+ Spec : infrav1beta1.IBMPowerVSClusterSpec {
216+ ServiceInstanceID : "service-instance-1" ,
217+ },
218+ },
219+ Client : fake .NewClientBuilder ().WithScheme (scheme .Scheme ).WithObjects ().Build (),
220+ }
221+ powervsImage1 := & infrav1beta1.IBMPowerVSImage {
222+ ObjectMeta : metav1.ObjectMeta {
223+ Name : "capi-image" ,
224+ OwnerReferences : []metav1.OwnerReference {
225+ {
226+ APIVersion : infrav1beta1 .GroupVersion .String (),
227+ Kind : "IBMPowerVSCluster" ,
228+ Name : "capi-powervs-cluster" ,
229+ UID : "1" ,
230+ },
231+ },
232+ Labels : map [string ]string {capiv1beta1 .ClusterLabelName : "capi-powervs-cluster" },
233+ },
234+ Spec : infrav1beta1.IBMPowerVSImageSpec {
235+ ClusterName : "capi-powervs-cluster" ,
236+ Object : pointer .String ("capi-image.ova.gz" ),
237+ Region : pointer .String ("us-south" ),
238+ Bucket : pointer .String ("capi-bucket" ),
239+ },
240+ }
241+ powervsImage2 := & infrav1beta1.IBMPowerVSImage {
242+ ObjectMeta : metav1.ObjectMeta {
243+ Name : "capi-image2" ,
244+ OwnerReferences : []metav1.OwnerReference {
245+ {
246+ APIVersion : infrav1beta1 .GroupVersion .String (),
247+ Kind : "IBMPowerVSCluster" ,
248+ Name : "capi-powervs-cluster" ,
249+ UID : "1" ,
250+ },
251+ },
252+ Labels : map [string ]string {capiv1beta1 .ClusterLabelName : "capi-powervs-cluster" },
253+ },
254+ Spec : infrav1beta1.IBMPowerVSImageSpec {
255+ ClusterName : "capi-powervs-cluster" ,
256+ Object : pointer .String ("capi-image2.ova.gz" ),
257+ Region : pointer .String ("us-south" ),
258+ Bucket : pointer .String ("capi-bucket" ),
259+ },
260+ }
261+ createObject (g , powervsImage1 , "default" )
262+ defer cleanupObject (g , powervsImage1 )
263+ createObject (g , powervsImage2 , "default" )
264+ defer cleanupObject (g , powervsImage2 )
265+
266+ result , err := reconciler .reconcileDelete (ctx , clusterScope )
267+ g .Expect (err ).To (BeNil ())
268+ g .Expect (result .RequeueAfter ).To (Not (BeZero ()))
269+ // Updating the object should fail as it doesn't exist
270+ g .Expect (clusterScope .Client .Update (ctx , powervsImage1 )).To (Not (Succeed ()))
271+ g .Expect (clusterScope .Client .Update (ctx , powervsImage2 )).To (Not (Succeed ()))
272+ })
273+ })
274+ }
275+
168276func createCluster (g * WithT , powervsCluster * infrav1beta1.IBMPowerVSCluster , namespace string ) {
169277 if powervsCluster != nil {
170278 powervsCluster .Namespace = namespace
0 commit comments