@@ -420,7 +420,7 @@ describe('noobaa nc - lifecycle versioning DISABLED', () => {
420
420
}
421
421
} ) ;
422
422
423
- describe ( 'noobaa nc - lifecycle versioning ENABLE ' , ( ) => {
423
+ describe ( 'noobaa nc - lifecycle versioning ENABLED ' , ( ) => {
424
424
const test_bucket_path = `${ root_path } /${ test_bucket } ` ;
425
425
const test_key1_regular = 'test_key1' ;
426
426
const test_key2_regular = 'test_key2' ;
@@ -461,7 +461,7 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
461
461
await fs_utils . folder_delete ( config_root ) ;
462
462
} , TEST_TIMEOUT ) ;
463
463
464
- describe ( 'noobaa nc - lifecycle versioning ENABLE - noncurrent expiration rule' , ( ) => {
464
+ describe ( 'noobaa nc - lifecycle versioning ENABLED - noncurrent expiration rule' , ( ) => {
465
465
it . each ( test_cases ) ( 'nc lifecycle - noncurrent expiration rule - expire older versions - $description' , async ( { description, test_key1, test_key2, test_key3, test_prefix_key } ) => {
466
466
const lifecycle_rule = [ {
467
467
"id" : "keep 2 noncurrent versions" ,
@@ -550,7 +550,10 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
550
550
} ) ;
551
551
} ) ;
552
552
553
- it ( 'nc lifecycle - noncurrent expiration rule - expire versioning enabled bucket - regular key' , async ( ) => {
553
+ } ) ;
554
+
555
+ describe ( 'noobaa nc - lifecycle versioning ENABLED - expiration rule - delete marker' , ( ) => {
556
+ it ( 'nc lifecycle - expiration rule - expire versioning ENABLED bucket - regular key' , async ( ) => {
554
557
const date = new Date ( ) ;
555
558
date . setDate ( date . getDate ( ) - 1 ) ; // yesterday
556
559
const lifecycle_rule = [ {
@@ -578,9 +581,7 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
578
581
} ) ;
579
582
expect ( has_delete_marker ) . toBe ( true ) ;
580
583
} ) ;
581
- } ) ;
582
584
583
- describe ( 'noobaa nc - lifecycle versioning ENABLE - expiration rule - delete marker' , ( ) => {
584
585
it . each ( test_cases ) ( 'nc lifecycle - expiration rule - expire delete marker - $description' , async ( { description, test_key1, test_key2, test_key3, test_prefix_key } ) => {
585
586
const lifecycle_rule = [ {
586
587
"id" : "expired_object_delete_marker no filters" ,
@@ -601,7 +602,7 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
601
602
602
603
await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
603
604
const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
604
- expect ( object_list . objects . length ) . toBe ( 2 ) ;
605
+ expect ( object_list . objects . length ) . toBe ( 2 ) ; // test_prefix_key as older version and a delete marker, hence it doesn't considered expired
605
606
object_list . objects . forEach ( element => {
606
607
expect ( element . key ) . toBe ( test_prefix_key ) ;
607
608
} ) ;
@@ -619,7 +620,6 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
619
620
"expired_object_delete_marker" : true
620
621
}
621
622
} ] ;
622
- await object_sdk . set_bucket_versioning ( { name : test_bucket , versioning : "ENABLED" } ) ;
623
623
await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
624
624
625
625
await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
@@ -643,7 +643,6 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
643
643
"expired_object_delete_marker" : true
644
644
}
645
645
} ] ;
646
- await object_sdk . set_bucket_versioning ( { name : test_bucket , versioning : "ENABLED" } ) ;
647
646
await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
648
647
649
648
await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
@@ -669,7 +668,6 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
669
668
NC_LIFECYCLE_LIST_BATCH_SIZE : 3 ,
670
669
NC_LIFECYCLE_BUCKET_BATCH_SIZE : 3 ,
671
670
} ) ) ;
672
- await object_sdk . set_bucket_versioning ( { name : test_bucket , versioning : "ENABLED" } ) ;
673
671
await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
674
672
675
673
await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
@@ -689,6 +687,240 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
689
687
} ) ;
690
688
} ) ;
691
689
690
+ describe ( 'noobaa nc - lifecycle versioning SUSPENDED' , ( ) => {
691
+ const test_bucket_path = `${ root_path } /${ test_bucket } ` ;
692
+ const test_key1_regular = 'test_key1' ;
693
+ const test_key2_regular = 'test_key2' ;
694
+ const test_key3_regular = 'test_key3' ;
695
+ const test_key1_nested = 'nested/test_key1' ;
696
+ const test_key2_nested = 'nested/test_key2' ;
697
+ const test_key3_nested = 'nested/test_key3' ;
698
+ const prefix = 'test/' ;
699
+ const test_prefix_key_regular = `${ prefix } ${ test_key1_regular } ` ;
700
+ const test_prefix_key_nested = `${ prefix } ${ test_key1_nested } ` ;
701
+ const test_cases = [
702
+ { description : 'regular key' , test_key1 : test_key1_regular , test_key2 : test_key2_regular , test_key3 : test_key3_regular , test_prefix_key : test_prefix_key_regular } ,
703
+ { description : 'nested key' , test_key1 : test_key1_nested , test_key2 : test_key2_nested , test_key3 : test_key3_nested , test_prefix_key : test_prefix_key_nested } ,
704
+ ] ;
705
+ let object_sdk ;
706
+
707
+ beforeAll ( async ( ) => {
708
+ await fs_utils . create_fresh_path ( config_root , 0o777 ) ;
709
+ set_nc_config_dir_in_config ( config_root ) ;
710
+ await fs_utils . create_fresh_path ( root_path , 0o777 ) ;
711
+ const res = await exec_manage_cli ( TYPES . ACCOUNT , ACTIONS . ADD , account_options1 ) ;
712
+ const json_account = JSON . parse ( res ) . response . reply ;
713
+ console . log ( json_account ) ;
714
+ object_sdk = new NsfsObjectSDK ( '' , config_fs , json_account , "DISABLED" , config_fs . config_root , undefined ) ;
715
+ object_sdk . requesting_account = json_account ;
716
+ await object_sdk . create_bucket ( { name : test_bucket } ) ;
717
+ await object_sdk . set_bucket_versioning ( { name : test_bucket , versioning : "SUSPENDED" } ) ;
718
+ } ) ;
719
+
720
+ afterEach ( async ( ) => {
721
+ await object_sdk . delete_bucket_lifecycle ( { name : test_bucket } ) ;
722
+ await fs_utils . create_fresh_path ( test_bucket_path ) ;
723
+ } ) ;
724
+
725
+ afterAll ( async ( ) => {
726
+ await fs_utils . folder_delete ( test_bucket_path ) ;
727
+ await fs_utils . folder_delete ( root_path ) ;
728
+ await fs_utils . folder_delete ( config_root ) ;
729
+ } , TEST_TIMEOUT ) ;
730
+
731
+ describe ( 'noobaa nc - lifecycle versioning SUSPENDED - noncurrent expiration rule' , ( ) => {
732
+ it . each ( test_cases ) ( 'nc lifecycle - noncurrent expiration rule - expire older versions - $description' , async ( { description, test_key1, test_key2, test_prefix_key } ) => {
733
+ const lifecycle_rule = [ {
734
+ "id" : "keep 2 noncurrent versions" ,
735
+ "status" : "Enabled" ,
736
+ "filter" : {
737
+ "prefix" : "" ,
738
+ } ,
739
+ "noncurrent_version_expiration" : {
740
+ "newer_noncurrent_versions" : 2 ,
741
+ "noncurrent_days" : 1
742
+ }
743
+ } ] ;
744
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
745
+ for ( let i = 0 ; i < 5 ; i ++ ) {
746
+ await create_object ( object_sdk , test_bucket , test_key1_regular , 100 , false ) ;
747
+ }
748
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
749
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
750
+ // in case the versioning is SUSPENDED the number of newer_noncurrent_versions is not relevant and we would have only the latest version (with version_id null)
751
+ expect ( object_list . objects . length ) . toBe ( 1 ) ;
752
+ expect ( object_list . objects [ 0 ] . version_id ) . toBe ( 'null' ) ;
753
+ expect ( object_list . objects [ 0 ] . is_latest ) . toBe ( true ) ;
754
+ } ) ;
755
+
756
+ it ( 'nc lifecycle - noncurrent expiration rule - expire older versions with filter - regular key' , async ( ) => {
757
+ const lifecycle_rule = [ {
758
+ "id" : "keep 1 noncurrent version with filter" ,
759
+ "status" : LIFECYCLE_RULE_STATUS_ENUM . ENABLED ,
760
+ "filter" : {
761
+ "prefix" : prefix ,
762
+ "object_size_greater_than" : 80 ,
763
+ } ,
764
+ "noncurrent_version_expiration" : {
765
+ "newer_noncurrent_versions" : 1 ,
766
+ "noncurrent_days" : 1
767
+ }
768
+ } ] ;
769
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
770
+
771
+ await object_sdk . set_bucket_versioning ( { name : test_bucket , versioning : "ENABLED" } ) ;
772
+ const version_res = [ ] ;
773
+ for ( let i = 0 ; i < 3 ; i ++ ) {
774
+ const res = await create_object ( object_sdk , test_bucket , test_prefix_key_regular , 100 , false ) ; // filter by prefix + size
775
+ version_res . push ( res . version_id ) ;
776
+ }
777
+ await object_sdk . set_bucket_versioning ( { name : test_bucket , versioning : "SUSPENDED" } ) ;
778
+ await create_object ( object_sdk , test_bucket , test_key1_regular , 100 , false ) ; // doesn't match prefix filter
779
+ await create_object ( object_sdk , test_bucket , `${ prefix } ${ test_key2_regular } ` , 60 , false ) ; // doesn't match size filter
780
+ await create_object ( object_sdk , test_bucket , test_prefix_key_regular , 100 , false ) ; // filter by prefix + size
781
+
782
+
783
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
784
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
785
+ expect ( object_list . objects . length ) . toBe ( 4 ) ; // 2 of the mismatched keys (1 version) + 2 versions the filtered key
786
+
787
+ const filtered_versions = object_list . objects . filter ( element => element . key === test_prefix_key_regular ) ;
788
+ expect ( filtered_versions . length ) . toBe ( 2 ) ;
789
+ expect ( [ 'null' , version_res [ 2 ] ] ) . toContain ( filtered_versions [ 0 ] . version_id ) ;
790
+ expect ( [ 'null' , version_res [ 2 ] ] ) . toContain ( filtered_versions [ 1 ] . version_id ) ;
791
+ } ) ;
792
+
793
+ } ) ;
794
+
795
+ describe ( 'noobaa nc - lifecycle versioning SUSPENDED - expiration rule - delete marker' , ( ) => {
796
+ it ( 'nc lifecycle - expiration rule - regular key' , async ( ) => {
797
+ const date = new Date ( ) ;
798
+ date . setDate ( date . getDate ( ) - 1 ) ; // yesterday
799
+ const lifecycle_rule = [ {
800
+ "id" : "expiration after 3 days" ,
801
+ "status" : "Enabled" ,
802
+ "filter" : {
803
+ "prefix" : prefix ,
804
+ } ,
805
+ "expiration" : {
806
+ "date" : date . getTime ( )
807
+ }
808
+ } ] ;
809
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
810
+
811
+ await create_object ( object_sdk , test_bucket , test_prefix_key_regular , 100 , false ) ; // matches prefix filter - will effectively deletes the object
812
+ await create_object ( object_sdk , test_bucket , test_key2_regular , 100 , false ) ;
813
+
814
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
815
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
816
+ expect ( object_list . objects . length ) . toBe ( 2 ) ; // one that didn't match and a delete marker of the one that matched
817
+ const matched_filter_object = object_list . objects . find ( element => element . key === test_prefix_key_regular ) ;
818
+ expect ( matched_filter_object . version_id ) . toBe ( 'null' ) ;
819
+ expect ( matched_filter_object . delete_marker ) . toBe ( true ) ;
820
+ const non_matched_filter_object = object_list . objects . find ( element => element . key === test_key2_regular ) ;
821
+ expect ( non_matched_filter_object . version_id ) . toBe ( 'null' ) ;
822
+ expect ( non_matched_filter_object . delete_marker ) . toBe ( false ) ;
823
+ } ) ;
824
+
825
+ it . each ( test_cases ) ( 'nc lifecycle - expiration rule - expire delete marker - $description' , async ( { description, test_key1, test_key2, test_prefix_key } ) => {
826
+ const lifecycle_rule = [ {
827
+ "id" : "expired_object_delete_marker no filters" ,
828
+ "status" : LIFECYCLE_RULE_STATUS_ENUM . ENABLED ,
829
+ "filter" : {
830
+ "prefix" : '' ,
831
+ } ,
832
+ "expiration" : {
833
+ "expired_object_delete_marker" : true
834
+ }
835
+ } ] ;
836
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
837
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1 } ) ;
838
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key2 } ) ;
839
+
840
+ await create_object ( object_sdk , test_bucket , test_prefix_key , 100 , false ) ;
841
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_prefix_key } ) ; // in SUSPENDED mode there would be only the delete marker of test_prefix_key with version id id of null
842
+
843
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
844
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
845
+ expect ( object_list . objects . length ) . toBe ( 0 ) ; // all the objects doesn't have an older version and we have only delete markers
846
+ } ) ;
847
+
848
+ it ( 'nc lifecycle - expiration rule - expire delete marker with filter - regular key' , async ( ) => {
849
+ const lifecycle_rule = [ {
850
+ "id" : "expired_object_delete_marker with filter by prefix and size" ,
851
+ "status" : LIFECYCLE_RULE_STATUS_ENUM . ENABLED ,
852
+ "filter" : {
853
+ "prefix" : prefix ,
854
+ "object_size_less_than" : 1
855
+ } ,
856
+ "expiration" : {
857
+ "expired_object_delete_marker" : true
858
+ }
859
+ } ] ;
860
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
861
+
862
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
863
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_prefix_key_regular } ) ;
864
+
865
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
866
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
867
+ expect ( object_list . objects . length ) . toBe ( 1 ) ;
868
+ expect ( object_list . objects [ 0 ] . key ) . toBe ( test_key1_regular ) ;
869
+ } ) ;
870
+
871
+ it ( 'nc lifecycle - expiration rule - expire delete marker last item' , async ( ) => {
872
+ const lifecycle_rule = [ {
873
+ "id" : "expiration of delete marker with filter by size and prefix" ,
874
+ "status" : LIFECYCLE_RULE_STATUS_ENUM . ENABLED ,
875
+ "filter" : {
876
+ "prefix" : '' ,
877
+ "object_size_less_than" : 1
878
+ } ,
879
+ "expiration" : {
880
+ "expired_object_delete_marker" : true
881
+ }
882
+ } ] ;
883
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
884
+
885
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
886
+
887
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
888
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
889
+ expect ( object_list . objects . length ) . toBe ( 0 ) ;
890
+ } ) ;
891
+
892
+ it ( 'nc lifecycle - expiration rule - last item in batch is latest delete marker' , async ( ) => {
893
+ const lifecycle_rule = [ {
894
+ "id" : "filter by size and no filter by prefix with expiration of delete marker" ,
895
+ "status" : LIFECYCLE_RULE_STATUS_ENUM . ENABLED ,
896
+ "filter" : {
897
+ "prefix" : '' ,
898
+ "object_size_less_than" : 1
899
+ } ,
900
+ "expiration" : {
901
+ "expired_object_delete_marker" : true
902
+ }
903
+ } ] ;
904
+ await config_fs . create_config_json_file ( JSON . stringify ( {
905
+ NC_LIFECYCLE_LIST_BATCH_SIZE : 3 ,
906
+ NC_LIFECYCLE_BUCKET_BATCH_SIZE : 3 ,
907
+ } ) ) ;
908
+ await object_sdk . set_bucket_lifecycle_configuration_rules ( { name : test_bucket , rules : lifecycle_rule } ) ;
909
+
910
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
911
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key1_regular } ) ;
912
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key2_regular } ) ; // last in batch should not delete
913
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key2_regular } ) ;
914
+ await object_sdk . delete_object ( { bucket : test_bucket , key : test_key3_regular } ) ; // last in batch should delete
915
+ await object_sdk . delete_object ( { bucket : test_bucket , key : 'test_key4' } ) ;
916
+
917
+ await exec_manage_cli ( TYPES . LIFECYCLE , '' , { disable_service_validation : 'true' , disable_runtime_validation : 'true' , config_root } , undefined , undefined ) ;
918
+ const object_list = await object_sdk . list_object_versions ( { bucket : test_bucket } ) ;
919
+ expect ( object_list . objects . length ) . toBe ( 0 ) ;
920
+ } ) ;
921
+ } ) ;
922
+ } ) ;
923
+
692
924
describe ( 'noobaa nc lifecycle - timeout check' , ( ) => {
693
925
const original_lifecycle_timeout = config . NC_LIFECYCLE_TIMEOUT_MS ;
694
926
0 commit comments