@@ -33,9 +33,11 @@ import (
3333 operator "github.com/minio/operator/pkg/apis/minio.min.io/v1"
3434 v1 "github.com/minio/operator/pkg/apis/minio.min.io/v1"
3535 corev1 "k8s.io/api/core/v1"
36+ k8sErrors "k8s.io/apimachinery/pkg/api/errors"
3637 "k8s.io/apimachinery/pkg/api/resource"
3738 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3839 "k8s.io/apimachinery/pkg/runtime"
40+ "k8s.io/apimachinery/pkg/runtime/schema"
3941 types "k8s.io/apimachinery/pkg/types"
4042 "k8s.io/client-go/kubernetes/fake"
4143)
@@ -335,12 +337,13 @@ func Test_TenantInfo(t *testing.T) {
335337
336338func Test_deleteTenantAction (t * testing.T ) {
337339 opClient := opClientMock {}
338-
339340 type args struct {
340341 ctx context.Context
341342 operatorClient OperatorClient
342343 nameSpace string
343344 tenantName string
345+ deletePvcs bool
346+ objs []runtime.Object
344347 mockTenantDelete func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error
345348 }
346349 tests := []struct {
@@ -355,6 +358,7 @@ func Test_deleteTenantAction(t *testing.T) {
355358 operatorClient : opClient ,
356359 nameSpace : "default" ,
357360 tenantName : "minio-tenant" ,
361+ deletePvcs : false ,
358362 mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
359363 return nil
360364 },
@@ -368,17 +372,155 @@ func Test_deleteTenantAction(t *testing.T) {
368372 operatorClient : opClient ,
369373 nameSpace : "default" ,
370374 tenantName : "minio-tenant" ,
375+ deletePvcs : false ,
371376 mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
372377 return errors .New ("something happened" )
373378 },
374379 },
375380 wantErr : true ,
376381 },
382+ {
383+ // Delete only PVCs of the defined tenant on the specific namespace
384+ name : "Delete PVCs on Tenant Deletion" ,
385+ args : args {
386+ ctx : context .Background (),
387+ operatorClient : opClient ,
388+ nameSpace : "minio-tenant" ,
389+ tenantName : "tenant1" ,
390+ deletePvcs : true ,
391+ objs : []runtime.Object {
392+ & corev1.PersistentVolumeClaim {
393+ ObjectMeta : metav1.ObjectMeta {
394+ Name : "PVC1" ,
395+ Namespace : "minio-tenant" ,
396+ Labels : map [string ]string {
397+ operator .TenantLabel : "tenant1" ,
398+ operator .ZoneLabel : "zone-1" ,
399+ },
400+ },
401+ },
402+ },
403+ mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
404+ return nil
405+ },
406+ },
407+ wantErr : false ,
408+ },
409+ {
410+ // Do not delete underlying pvcs
411+ name : "Don't Delete PVCs on Tenant Deletion" ,
412+ args : args {
413+ ctx : context .Background (),
414+ operatorClient : opClient ,
415+ nameSpace : "minio-tenant" ,
416+ tenantName : "tenant1" ,
417+ deletePvcs : false ,
418+ objs : []runtime.Object {
419+ & corev1.PersistentVolumeClaim {
420+ ObjectMeta : metav1.ObjectMeta {
421+ Name : "PVC1" ,
422+ Namespace : "minio-tenant" ,
423+ Labels : map [string ]string {
424+ operator .TenantLabel : "tenant1" ,
425+ operator .ZoneLabel : "zone-1" ,
426+ },
427+ },
428+ },
429+ },
430+ mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
431+ return nil
432+ },
433+ },
434+ wantErr : false ,
435+ },
436+ {
437+ // If error is different than NotFound, PVC deletion should not continue
438+ name : "Don't delete pvcs if error Deleting Tenant, return" ,
439+ args : args {
440+ ctx : context .Background (),
441+ operatorClient : opClient ,
442+ nameSpace : "minio-tenant" ,
443+ tenantName : "tenant1" ,
444+ deletePvcs : true ,
445+ objs : []runtime.Object {
446+ & corev1.PersistentVolumeClaim {
447+ ObjectMeta : metav1.ObjectMeta {
448+ Name : "PVC1" ,
449+ Namespace : "minio-tenant" ,
450+ Labels : map [string ]string {
451+ operator .TenantLabel : "tenant1" ,
452+ operator .ZoneLabel : "zone-1" ,
453+ },
454+ },
455+ },
456+ },
457+ mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
458+ return errors .New ("error returned" )
459+ },
460+ },
461+ wantErr : true ,
462+ },
463+ {
464+ // If error is NotFound while trying to Delete Tenant, PVC deletion should continue
465+ name : "Delete pvcs if tenant not found" ,
466+ args : args {
467+ ctx : context .Background (),
468+ operatorClient : opClient ,
469+ nameSpace : "minio-tenant" ,
470+ tenantName : "tenant1" ,
471+ deletePvcs : true ,
472+ objs : []runtime.Object {
473+ & corev1.PersistentVolumeClaim {
474+ ObjectMeta : metav1.ObjectMeta {
475+ Name : "PVC1" ,
476+ Namespace : "minio-tenant" ,
477+ Labels : map [string ]string {
478+ operator .TenantLabel : "tenant1" ,
479+ operator .ZoneLabel : "zone-1" ,
480+ },
481+ },
482+ },
483+ },
484+ mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
485+ return k8sErrors .NewNotFound (schema.GroupResource {}, "tenant1" )
486+ },
487+ },
488+ wantErr : false ,
489+ },
490+ {
491+ // If error is NotFound while trying to Delete Tenant and pvcdeletion=false,
492+ // error should be returned
493+ name : "Don't delete pvcs and return error if tenant not found" ,
494+ args : args {
495+ ctx : context .Background (),
496+ operatorClient : opClient ,
497+ nameSpace : "minio-tenant" ,
498+ tenantName : "tenant1" ,
499+ deletePvcs : false ,
500+ objs : []runtime.Object {
501+ & corev1.PersistentVolumeClaim {
502+ ObjectMeta : metav1.ObjectMeta {
503+ Name : "PVC1" ,
504+ Namespace : "minio-tenant" ,
505+ Labels : map [string ]string {
506+ operator .TenantLabel : "tenant1" ,
507+ operator .ZoneLabel : "zone-1" ,
508+ },
509+ },
510+ },
511+ },
512+ mockTenantDelete : func (ctx context.Context , namespace string , tenantName string , options metav1.DeleteOptions ) error {
513+ return k8sErrors .NewNotFound (schema.GroupResource {}, "tenant1" )
514+ },
515+ },
516+ wantErr : true ,
517+ },
377518 }
378519 for _ , tt := range tests {
379520 opClientTenantDeleteMock = tt .args .mockTenantDelete
521+ kubeClient := fake .NewSimpleClientset (tt .args .objs ... )
380522 t .Run (tt .name , func (t * testing.T ) {
381- if err := deleteTenantAction (tt .args .ctx , tt .args .operatorClient , tt .args .nameSpace , tt .args .tenantName ); (err != nil ) != tt .wantErr {
523+ if err := deleteTenantAction (tt .args .ctx , tt .args .operatorClient , kubeClient . CoreV1 (), tt .args .nameSpace , tt .args .tenantName , tt . args . deletePvcs ); (err != nil ) != tt .wantErr {
382524 t .Errorf ("deleteTenantAction() error = %v, wantErr %v" , err , tt .wantErr )
383525 }
384526 })
@@ -768,7 +910,7 @@ func Test_UpdateTenantAction(t *testing.T) {
768910 cnsClient := fake .NewSimpleClientset (tt .objs ... )
769911 t .Run (tt .name , func (t * testing.T ) {
770912 if err := updateTenantAction (tt .args .ctx , tt .args .operatorClient , cnsClient .CoreV1 (), tt .args .httpCl , tt .args .nameSpace , tt .args .params ); (err != nil ) != tt .wantErr {
771- t .Errorf ("deleteTenantAction () error = %v, wantErr %v" , err , tt .wantErr )
913+ t .Errorf ("updateTenantAction () error = %v, wantErr %v" , err , tt .wantErr )
772914 }
773915 })
774916 }
0 commit comments