Skip to content

Commit 19696f6

Browse files
committed
NC | lifecycle | Add Tests in POSIX Integration Tests - Part 3
Signed-off-by: shirady <[email protected]>
1 parent 826738a commit 19696f6

File tree

1 file changed

+241
-9
lines changed

1 file changed

+241
-9
lines changed

src/test/unit_tests/jest_tests/test_nc_lifecycle_posix_integration.test.js

Lines changed: 241 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ describe('noobaa nc - lifecycle versioning DISABLED', () => {
420420
}
421421
});
422422

423-
describe('noobaa nc - lifecycle versioning ENABLE', () => {
423+
describe('noobaa nc - lifecycle versioning ENABLED', () => {
424424
const test_bucket_path = `${root_path}/${test_bucket}`;
425425
const test_key1_regular = 'test_key1';
426426
const test_key2_regular = 'test_key2';
@@ -461,7 +461,7 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
461461
await fs_utils.folder_delete(config_root);
462462
}, TEST_TIMEOUT);
463463

464-
describe('noobaa nc - lifecycle versioning ENABLE - noncurrent expiration rule', () => {
464+
describe('noobaa nc - lifecycle versioning ENABLED - noncurrent expiration rule', () => {
465465
it.each(test_cases)('nc lifecycle - noncurrent expiration rule - expire older versions - $description', async ({ description, test_key1, test_key2, test_key3, test_prefix_key }) => {
466466
const lifecycle_rule = [{
467467
"id": "keep 2 noncurrent versions",
@@ -550,7 +550,10 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
550550
});
551551
});
552552

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 () => {
554557
const date = new Date();
555558
date.setDate(date.getDate() - 1); // yesterday
556559
const lifecycle_rule = [{
@@ -578,9 +581,7 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
578581
});
579582
expect(has_delete_marker).toBe(true);
580583
});
581-
});
582584

583-
describe('noobaa nc - lifecycle versioning ENABLE - expiration rule - delete marker', () => {
584585
it.each(test_cases)('nc lifecycle - expiration rule - expire delete marker - $description', async ({ description, test_key1, test_key2, test_key3, test_prefix_key }) => {
585586
const lifecycle_rule = [{
586587
"id": "expired_object_delete_marker no filters",
@@ -601,7 +602,7 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
601602

602603
await exec_manage_cli(TYPES.LIFECYCLE, '', { disable_service_validation: 'true', disable_runtime_validation: 'true', config_root }, undefined, undefined);
603604
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
605606
object_list.objects.forEach(element => {
606607
expect(element.key).toBe(test_prefix_key);
607608
});
@@ -619,7 +620,6 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
619620
"expired_object_delete_marker": true
620621
}
621622
}];
622-
await object_sdk.set_bucket_versioning({ name: test_bucket, versioning: "ENABLED" });
623623
await object_sdk.set_bucket_lifecycle_configuration_rules({ name: test_bucket, rules: lifecycle_rule });
624624

625625
await object_sdk.delete_object({ bucket: test_bucket, key: test_key1_regular });
@@ -643,7 +643,6 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
643643
"expired_object_delete_marker": true
644644
}
645645
}];
646-
await object_sdk.set_bucket_versioning({ name: test_bucket, versioning: "ENABLED" });
647646
await object_sdk.set_bucket_lifecycle_configuration_rules({ name: test_bucket, rules: lifecycle_rule });
648647

649648
await object_sdk.delete_object({ bucket: test_bucket, key: test_key1_regular });
@@ -669,7 +668,6 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
669668
NC_LIFECYCLE_LIST_BATCH_SIZE: 3,
670669
NC_LIFECYCLE_BUCKET_BATCH_SIZE: 3,
671670
}));
672-
await object_sdk.set_bucket_versioning({ name: test_bucket, versioning: "ENABLED" });
673671
await object_sdk.set_bucket_lifecycle_configuration_rules({ name: test_bucket, rules: lifecycle_rule });
674672

675673
await object_sdk.delete_object({ bucket: test_bucket, key: test_key1_regular });
@@ -689,6 +687,240 @@ describe('noobaa nc - lifecycle versioning ENABLE', () => {
689687
});
690688
});
691689

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+
692924
describe('noobaa nc lifecycle - timeout check', () => {
693925
const original_lifecycle_timeout = config.NC_LIFECYCLE_TIMEOUT_MS;
694926

0 commit comments

Comments
 (0)