@@ -16,6 +16,7 @@ const { TMP_PATH, IS_GPFS, is_nc_coretest, set_path_permissions_and_owner, gener
16
16
invalid_nsfs_root_permissions, generate_s3_client, get_coretest_path } = require ( '../system_tests/test_utils' ) ;
17
17
const { get_process_fs_context } = require ( '../../util/native_fs_utils' ) ;
18
18
const _ = require ( 'lodash' ) ;
19
+ const config = require ( '../../../config' ) ;
19
20
20
21
const coretest_path = get_coretest_path ( ) ;
21
22
const coretest = require ( coretest_path ) ;
@@ -452,6 +453,7 @@ mocha.describe('bucketspace namespace_fs - versioning', function() {
452
453
await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : head_object_key , Body : body1 } ) ;
453
454
await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : get_object_key , Body : body1 } ) ;
454
455
await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : delete_latest_object_key , Body : body1 } ) ;
456
+ await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : delete_latest_object_key_suspended , Body : body1 } ) ;
455
457
456
458
await s3_uid6 . putBucketVersioning ( { Bucket : content_dir_bucket_name , VersioningConfiguration : { MFADelete : 'Disabled' , Status : 'Enabled' } } ) ;
457
459
} ) ;
@@ -640,7 +642,135 @@ mocha.describe('bucketspace namespace_fs - versioning', function() {
640
642
641
643
const get_res = await s3_uid6 . getObject ( { Bucket : content_dir_bucket_name , Key : key } ) ;
642
644
assert . equal ( get_res . VersionId , res2 . VersionId ) ;
645
+ } ) ;
646
+
647
+ mocha . it ( 'content directory - object tagging - versioning enabled' , async function ( ) {
648
+ const dir_tagging_key = 'dir_tagging/' ;
649
+ const tag_set1 = { TagSet : [ { Key : "key1" , Value : "Value1" } ] } ;
650
+ const tag_set2 = { TagSet : [ { Key : "key2" , Value : "Value2" } ] } ;
651
+
652
+ await s3_uid6 . putBucketVersioning ( { Bucket : content_dir_bucket_name , VersioningConfiguration : { MFADelete : 'Disabled' , Status : 'Enabled' } } ) ;
653
+ const res_put = await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , Body : body1 } ) ;
654
+ await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , Body : body1 } ) ;
655
+ const version_id = res_put . VersionId ;
656
+
657
+ await s3_uid6 . putObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , Tagging : tag_set1 } ) ;
658
+ let res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
659
+ assert . deepEqual ( res . TagSet , tag_set1 . TagSet ) ;
660
+
661
+ await s3_uid6 . putObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key ,
662
+ Tagging : tag_set2 , VersionId : version_id } ) ;
663
+ res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
664
+ assert . notDeepEqual ( res . TagSet , tag_set2 ) ;
665
+
666
+ const version_res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name ,
667
+ Key : dir_tagging_key , VersionId : version_id } ) ;
668
+ assert . deepEqual ( version_res . TagSet , tag_set2 . TagSet ) ;
669
+
670
+ await s3_uid6 . deleteObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
671
+ res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
672
+ assert . equal ( res . TagSet . length , 0 ) ;
673
+
674
+ await s3_uid6 . deleteObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , VersionId : version_id } ) ;
675
+ res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , VersionId : version_id } ) ;
676
+ assert . equal ( res . TagSet . length , 0 ) ;
677
+ } ) ;
678
+
679
+ mocha . it ( 'content directory - object tagging - versioning suspended' , async function ( ) {
680
+ const dir_tagging_key = 'dir_tagging/' ;
681
+ const tag_set1 = { TagSet : [ { Key : "key1" , Value : "Value1" } ] } ;
682
+ const tag_set2 = { TagSet : [ { Key : "key2" , Value : "Value2" } ] } ;
683
+
684
+ await s3_uid6 . putBucketVersioning ( { Bucket : content_dir_bucket_name , VersioningConfiguration : { MFADelete : 'Disabled' , Status : 'Suspended' } } ) ;
685
+ const res_put = await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , Body : body1 } ) ;
686
+ await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , Body : body1 } ) ;
687
+ const version_id = res_put . VersionId ;
688
+
689
+ await s3_uid6 . putObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , Tagging : tag_set1 } ) ;
690
+ let res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
691
+ assert . deepEqual ( res . TagSet , tag_set1 . TagSet ) ;
692
+
693
+ await s3_uid6 . putObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key ,
694
+ Tagging : tag_set2 , VersionId : version_id } ) ;
695
+ res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
696
+ assert . notDeepEqual ( res . TagSet , tag_set2 ) ;
643
697
698
+ const version_res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name ,
699
+ Key : dir_tagging_key , VersionId : version_id } ) ;
700
+ assert . deepEqual ( version_res . TagSet , tag_set2 . TagSet ) ;
701
+
702
+ await s3_uid6 . deleteObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
703
+ res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key } ) ;
704
+ assert . equal ( res . TagSet . length , 0 ) ;
705
+
706
+ await s3_uid6 . deleteObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , VersionId : version_id } ) ;
707
+ res = await s3_uid6 . getObjectTagging ( { Bucket : content_dir_bucket_name , Key : dir_tagging_key , VersionId : version_id } ) ;
708
+ assert . equal ( res . TagSet . length , 0 ) ;
709
+ } ) ;
710
+
711
+ mocha . it ( 'content directory - list object' , async function ( ) {
712
+ const res = await s3_uid6 . listObjects ( { Bucket : content_dir_bucket_name } ) ;
713
+ assert . equal ( res . Contents . length , 10 ) ;
714
+ } ) ;
715
+
716
+ mocha . it ( 'content directory - list object versions - enabled mode' , async function ( ) {
717
+ await s3_uid6 . putBucketVersioning ( { Bucket : content_dir_bucket_name , VersioningConfiguration : { MFADelete : 'Disabled' , Status : 'Enabled' } } ) ;
718
+ const key = "list_key/" ;
719
+ const version_ids = new Set ( ) ;
720
+ let push_res = await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : key , Body : body1 } ) ;
721
+ version_ids . add ( push_res . VersionId ) ;
722
+ push_res = await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : key , Body : body1 } ) ;
723
+ version_ids . add ( push_res . VersionId ) ;
724
+ push_res = await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : key , Body : body1 } ) ;
725
+ version_ids . add ( push_res . VersionId ) ;
726
+ const list_res = await s3_uid6 . listObjectVersions ( { Bucket : content_dir_bucket_name } ) ;
727
+ const key_list_versions = list_res . Versions . filter ( v => v . Key === key ) ;
728
+ assert . equal ( key_list_versions . length , version_ids . size ) ;
729
+ key_list_versions . forEach ( v => {
730
+ assert ( version_ids . has ( v . VersionId ) ) ;
731
+ if ( v . VersionId === push_res . VersionId ) {
732
+ assert . equal ( v . IsLatest , true ) ;
733
+ assert ( ! v . Key . includes ( config . NSFS_FOLDER_OBJECT_NAME ) ) ;
734
+ assert ( ! v . VersionId . includes ( config . NSFS_FOLDER_OBJECT_NAME ) ) ;
735
+ }
736
+ } ) ;
737
+ } ) ;
738
+
739
+ mocha . it ( 'content directory - list object versions - delete marker' , async function ( ) {
740
+ const key = "list_key/" ;
741
+ const delete_res = await s3_uid6 . deleteObject ( { Bucket : content_dir_bucket_name , Key : key } ) ;
742
+ const list_res = await s3_uid6 . listObjectVersions ( { Bucket : content_dir_bucket_name } ) ;
743
+ const key_list_versions = list_res . Versions . filter ( v => v . Key === key ) ;
744
+ assert . equal ( key_list_versions . length , 3 ) ;
745
+ assert . equal ( list_res . DeleteMarkers . length , 3 ) ; // 2 previous delete markers + 1 new delete marker
746
+ let is_delete_marker_present = false ;
747
+ for ( const delete_marker of list_res . DeleteMarkers ) {
748
+ if ( delete_marker . versionId === delete_res . created_version_id ) {
749
+ is_delete_marker_present = true ;
750
+ assert . equal ( delete_marker . versionId , delete_res . created_version_id ) ;
751
+ assert . equal ( delete_marker . IsLatest , true ) ;
752
+ assert ( ! delete_marker . Key . includes ( config . NSFS_FOLDER_OBJECT_NAME ) ) ;
753
+ assert ( ! delete_marker . VersionId . includes ( config . NSFS_FOLDER_OBJECT_NAME ) ) ;
754
+ }
755
+ }
756
+ assert ( is_delete_marker_present ) ;
757
+ } ) ;
758
+
759
+ mocha . it ( 'content directory - list object versions - suspended mode' , async function ( ) {
760
+ const key = "list_key/" ;
761
+ await s3_uid6 . putBucketVersioning ( { Bucket : content_dir_bucket_name , VersioningConfiguration : { MFADelete : 'Disabled' , Status : 'Suspended' } } ) ;
762
+ const push_res = await s3_uid6 . putObject ( { Bucket : content_dir_bucket_name , Key : key , Body : body1 } ) ;
763
+ const list_res = await s3_uid6 . listObjectVersions ( { Bucket : content_dir_bucket_name } ) ;
764
+ const key_list_versions = list_res . Versions . filter ( v => v . Key === key ) ;
765
+ assert . equal ( key_list_versions . length , 4 ) ; //3 from before + 1 new key
766
+ key_list_versions . forEach ( v => {
767
+ if ( v . VersionId === push_res . VersionId ) {
768
+ assert . equal ( v . VersionId , 'null' ) ;
769
+ assert . equal ( v . IsLatest , true ) ;
770
+ assert ( ! v . key . includes ( config . NSFS_FOLDER_OBJECT_NAME ) ) ;
771
+ assert ( ! v . VersionId . includes ( config . NSFS_FOLDER_OBJECT_NAME ) ) ;
772
+ }
773
+ } ) ;
644
774
} ) ;
645
775
} ) ;
646
776
@@ -3419,10 +3549,10 @@ function _extract_version_info_from_xattr(version_id_str) {
3419
3549
3420
3550
/**
3421
3551
* version_file_exists returns path of version in .versions
3422
- * @param {String } full_path
3423
- * @param {String } key
3424
- * @param {String } dir
3425
- * @param {String } version_id
3552
+ * @param {String } full_path
3553
+ * @param {String } key
3554
+ * @param {String } dir
3555
+ * @param {String } version_id
3426
3556
* @returns {Promise<Boolean> }
3427
3557
*/
3428
3558
async function version_file_exists ( full_path , key , dir , version_id ) {
0 commit comments