From 05e84e7fe5bd03f335a8c21610947415d8d13944 Mon Sep 17 00:00:00 2001 From: williamlardier Date: Tue, 7 May 2024 14:57:21 +0200 Subject: [PATCH] testing real restores --- tests/ctst/features/azureArchive.feature | 351 ------------------ tests/ctst/features/dmf.feature | 75 ---- .../iam-policies/backbeatServiceUser.feature | 76 ---- tests/ctst/features/quotas/Quotas.feature | 62 ++-- 4 files changed, 31 insertions(+), 533 deletions(-) delete mode 100644 tests/ctst/features/azureArchive.feature delete mode 100644 tests/ctst/features/dmf.feature delete mode 100644 tests/ctst/features/iam-policies/backbeatServiceUser.feature diff --git a/tests/ctst/features/azureArchive.feature b/tests/ctst/features/azureArchive.feature deleted file mode 100644 index 9839c5fbfd..0000000000 --- a/tests/ctst/features/azureArchive.feature +++ /dev/null @@ -1,351 +0,0 @@ -Feature: Azure Archive - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Archive objects when timeout is reached - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - And manifest containing object "obj-1" should "contain" object "obj-2" - And manifest access tier should be valid for object "obj-1" - And tar access tier should be valid for object "obj-1" - - Examples: - | versioningConfiguration | objectCount | objectSize | - | Non versioned | 2 | 100 | - | Versioned | 2 | 100 | - | Suspended | 2 | 100 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Archive 0 byte objects - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-3" should be "transitioned" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | - | Non versioned | 3 | 0 | - | Versioned | 3 | 0 | - | Suspended | 3 | 0 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Create, read, update and delete azure archive location - Given an azure archive location "" - And a "" bucket - And a transition workflow to "" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioning" and have the storage class "" - And object "obj-2" should be "transitioning" and have the storage class "" - And object "obj-3" should be "transitioning" and have the storage class "" - When i change azure archive location "" container target - Given objects "obj2" of size bytes - Then object "obj2-1" should be "transitioning" and have the storage class "" - And object "obj2-2" should be "transitioning" and have the storage class "" - And object "obj2-3" should be "transitioning" and have the storage class "" - - Examples: - | versioningConfiguration | objectCount | objectSize | locationName | - | Non versioned | 3 | 0 | e2e-azure-archive-2-non-versioned | - | Versioned | 3 | 0 | e2e-azure-archive-2-versioned | - | Suspended | 3 | 0 | e2e-azure-archive-2-suspended | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Respect maximum number of objects per archived Tar - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-3" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-4" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-5" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-6" should be "transitioned" and have the storage class "e2e-azure-archive" - And manifest and tar containing object "obj-1" should exist - And manifest containing object "" should contain objects - And manifest and tar containing object "obj-2" should exist - And manifest containing object "" should contain objects - And manifest and tar containing object "obj-3" should exist - And manifest containing object "" should contain objects - And manifest and tar containing object "obj-4" should exist - And manifest containing object "" should contain objects - And manifest and tar containing object "obj-5" should exist - And manifest containing object "" should contain objects - And manifest and tar containing object "obj-6" should exist - And manifest containing object "" should contain objects - - Examples: - | versioningConfiguration | objectCount | objectSize | packObjectCount | - | Non versioned | 6 | 1 | 3 | - | Versioned | 6 | 1 | 3 | - | Suspended | 6 | 1 | 3 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Respect maximum size of an archived Tar - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - And manifest and tar containing object "obj-1" should exist - And manifest containing object "" should contain objects - And manifest and tar containing object "obj-2" should exist - And manifest containing object "" should contain objects - - Examples: - | versioningConfiguration | objectCount | objectSize | packObjectCount | - | Non versioned | 2 | 30000 | 1 | - | Versioned | 2 | 30000 | 1 | - | Suspended | 2 | 30000 | 1 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Restore an already restored object - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - When i restore object "obj-1" for days - And i restore object "obj-2" for days - Then blob for object "obj-1" must be rehydrated - And blob for object "obj-2" must be rehydrated - Then object "obj-1" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-1" should expire in days - And object "obj-2" should expire in days - When i restore object "obj-1" for 30 days - And i restore object "obj-2" for 5 days - Then object "obj-1" should expire in 30 days - And object "obj-2" should expire in 5 days - When i wait for 5 days - Then object "obj-1" should expire in 25 days - And object "obj-2" should be "cold" and have the storage class "e2e-azure-archive" - When i wait for 25 days - Then object "obj-1" should be "cold" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | restoreDays | - | Non versioned | 2 | 100 | 15 | - | Versioned | 2 | 100 | 15 | - | Suspended | 2 | 100 | 15 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Restore an object that has already been restored and expired - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - When i restore object "obj-1" for days - Then blob for object "obj-1" must be rehydrated - Then object "obj-1" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-1" should expire in days - When i wait for days - Then object "obj-1" should be "cold" and have the storage class "e2e-azure-archive" - Then i restore object "obj-1" for days - Then object "obj-1" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-1" should expire in days - When i wait for days - Then object "obj-1" should be "cold" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | restoreDays | - | Non versioned | 2 | 100 | 15 | - | Versioned | 2 | 100 | 15 | - | Suspended | 2 | 100 | 15 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Restore objects from tar - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes with user metadata "x-amz-meta-123=456" - And object "obj-2" should have the user metadata with key "x-amz-meta-123" and value "456" - And a tag on object "obj-1" with key "tag1" and value "value1" - And a tag on object "obj-2" with key "tag2" and value "value2" - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - And manifest containing object "obj-1" should "contain" object "obj-2" - When i restore object "obj-1" for days - Then blob for object "obj-1" must be rehydrated - And blob for object "obj-2" must be rehydrated - Then object "obj-1" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-1" should expire in days - And object "obj-1" should have the same data - And object "obj-1" should have the tag "tag1" with value "value1" - And object "obj-1" should have the user metadata with key "x-amz-meta-123" and value "456" - When i restore object "obj-2" for days - Then object "obj-2" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-2" should expire in days - And object "obj-2" should have the same data - And object "obj-2" should have the tag "tag2" with value "value2" - And object "obj-2" should have the user metadata with key "x-amz-meta-123" and value "456" - - When i wait for days - Then object "obj-1" should be "cold" and have the storage class "e2e-azure-archive" - Then object "obj-2" should be "cold" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | restoreDays | - | Non versioned | 2 | 100 | 15 | - | Versioned | 2 | 100 | 15 | - | Suspended | 2 | 100 | 15 | - - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Failed restore objects from tar must be retried and restored - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioning" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioning" and have the storage class "e2e-azure-archive" - And manifest containing object "obj-1" should "contain" object "obj-2" - When i restore object "obj-1" for days - Then blob for object "obj-1" fails to rehydrate - And blob for object "obj-2" fails to rehydrate - Then object "obj-1" should be "transitioning" and have the storage class "e2e-azure-archive" - When i run sorbetctl to retry failed restore for "e2e-azure-archive" location - Then object "obj-1" should be "restored" and have the storage class "e2e-azure-archive" - And object "obj-1" should expire in days - And object "obj-1" should have the same data - - Examples: - | versioningConfiguration | objectCount | objectSize | restoreDays | - | Non versioned | 2 | 100 | 5 | - | Versioned | 2 | 100 | 2 | - | Suspended | 2 | 100 | 2 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - Scenario Outline: Pause and resume archiving to azure (PutObject after pause) - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And that lifecycle is "paused" for the "e2e-azure-archive" location - And objects "obj" of size bytes - Then the storage class of object "obj-1" must stay "" for seconds - And the storage class of object "obj-2" must stay "" for seconds - Given that lifecycle is "resumed" for the "e2e-azure-archive" location - Then object "obj-1" should be "transitioning" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioning" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | timeout | - | Non versioned | 2 | 30000 | 10 | - | Versioned | 2 | 30000 | 10 | - | Suspended | 2 | 30000 | 10 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - Scenario Outline: Pause and resume archiving to azure (PutObject before pause) - Given a "" bucket - And objects "obj" of size bytes - And a transition workflow to "e2e-azure-archive" location - And that lifecycle is "paused" for the "e2e-azure-archive" location - Then the storage class of object "obj-1" must stay "" for seconds - And the storage class of object "obj-2" must stay "" for seconds - Given that lifecycle is "resumed" for the "e2e-azure-archive" location - Then object "obj-1" should be "transitioning" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioning" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | timeout | - | Non versioned | 2 | 30000 | 10 | - | Versioned | 2 | 30000 | 10 | - | Suspended | 2 | 30000 | 10 | - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Restore notifications are triggered - Given a "" bucket - And one notification destination - And i subscribe to "s3:ObjectRestore:*" notifications for destination 0 - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - And object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - When i restore object "obj-2" for days - Then i should "receive" a notification for "s3:ObjectRestore:Post" event in destination 0 - And blob for object "obj-2" must be rehydrated - Then object "obj-2" should be "restored" and have the storage class "e2e-azure-archive" - Then i should "receive" a notification for "s3:ObjectRestore:Completed" event in destination 0 - When i wait for days - Then i should "receive" a notification for "s3:ObjectRestore:Delete" event in destination 0 - - Examples: - | versioningConfiguration | objectCount | objectSize | restoreDays | - | Non versioned | 2 | 100 | 15 | - | Versioned | 2 | 100 | 15 | - | Suspended | 2 | 100 | 15 | - - - @2.7.0 - @PreMerge - @Flaky - @AzureArchive - @ColdStorage - Scenario Outline: Cannot add object MD to a transitioned object - Given a "" bucket - And a transition workflow to "e2e-azure-archive" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - Then i "should not" be able to add user metadata to object "obj-1" - When i restore object "obj-1" for 10 days - When i restore object "obj-2" for 10 days - Then blob for object "obj-1" must be rehydrated - Then blob for object "obj-2" must be rehydrated - Then object "obj-1" should be "restored" and have the storage class "e2e-azure-archive" - Then object "obj-2" should be "restored" and have the storage class "e2e-azure-archive" - Then i "should" be able to add user metadata to object "obj-1" - Then i "should" be able to add user metadata to object "obj-2" - Then object "obj-1" should be "transitioned" and have the storage class "e2e-azure-archive" - Then object "obj-2" should be "transitioned" and have the storage class "e2e-azure-archive" - - Examples: - | versioningConfiguration | objectCount | objectSize | packObjectCount | - | Non versioned | 2 | 30000 | 1 | - | Versioned | 2 | 30000 | 1 | - | Suspended | 2 | 30000 | 1 | diff --git a/tests/ctst/features/dmf.feature b/tests/ctst/features/dmf.feature deleted file mode 100644 index 1e811b0583..0000000000 --- a/tests/ctst/features/dmf.feature +++ /dev/null @@ -1,75 +0,0 @@ -Feature: DMF - - @2.7.0 - @PreMerge - @Dmf - @ColdStorage - Scenario Outline: Deletion of an archived object - Given a "" bucket - And a transition workflow to "e2e-cold" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-cold" - And object "obj-2" should be "transitioned" and have the storage class "e2e-cold" - And dmf volume should contain objects - When i delete object "obj-1" - And i delete object "obj-2" - Then dmf volume should contain 0 objects - - Examples: - | versioningConfiguration | objectCount | objectSize | - | Non versioned | 2 | 100 | - | Versioned | 2 | 100 | - | Suspended | 2 | 100 | - - @2.7.0 - @PreMerge - @Dmf - @ColdStorage - @Flaky - Scenario Outline: Retry DMF job/command upon failure - Given a "" bucket - And a flaky backend that will require retries for "" - And a transition workflow to "e2e-cold" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-cold" - And object "obj-2" should be "transitioned" and have the storage class "e2e-cold" - When i restore object "obj-1" for 5 days - Then object "obj-1" should be "restored" and have the storage class "e2e-cold" - When i delete object "obj-1" - And i delete object "obj-2" - Then dmf volume should contain 0 objects - - Examples: - | versioningConfiguration | objectCount | objectSize | retryNumber | operation | - | Non versioned | 2 | 100 | 1 | archive | - | Versioned | 2 | 100 | 1 | archive | - | Suspended | 2 | 100 | 1 | archive | - | Non versioned | 2 | 100 | 1 | restore | - | Versioned | 2 | 100 | 1 | restore | - | Suspended | 2 | 100 | 1 | restore | - | Non versioned | 2 | 100 | 1 | command | - | Versioned | 2 | 100 | 1 | command | - | Suspended | 2 | 100 | 1 | command | - - @2.7.0 - @PreMerge - @Dmf - @ColdStorage - Scenario Outline: Deletion of a restored object - Given a "" bucket - And a transition workflow to "e2e-cold" location - And objects "obj" of size bytes - Then object "obj-1" should be "transitioned" and have the storage class "e2e-cold" - And object "obj-2" should be "transitioned" and have the storage class "e2e-cold" - And dmf volume should contain objects - When i restore object "obj-1" for days - Then object "obj-1" should be "restored" and have the storage class "e2e-cold" - When i delete object "obj-1" - And i delete object "obj-2" - Then dmf volume should contain 0 objects - - Examples: - | versioningConfiguration | objectCount | objectSize | restoreDays | - | Non versioned | 2 | 100 | 1 | - | Versioned | 2 | 100 | 1 | - | Suspended | 2 | 100 | 1 | diff --git a/tests/ctst/features/iam-policies/backbeatServiceUser.feature b/tests/ctst/features/iam-policies/backbeatServiceUser.feature deleted file mode 100644 index b8aca51e33..0000000000 --- a/tests/ctst/features/iam-policies/backbeatServiceUser.feature +++ /dev/null @@ -1,76 +0,0 @@ -Feature: IAM Policies for Backbeat Service Users - As a backbeat service user, - I want to have specific permissions to perform S3 actions for data replication and expiration - So that I can effectively manage data within the system. - - - @2.6.0 - @PreMerge - @IamPoliciesBackbeatServiceUser - Scenario Outline: Backbeat Service Users are authorized to perform the actions and get success response - Given an existing bucket "" "" versioning, "without" ObjectLock "" retention mode - And an object "" that "" - And a service user "" assuming the role "" of a user account - When the user tries to perform "" on the bucket - Then the user should be able to perform successfully the "" action - - Examples: - | action | withVersioning | objectExists | serviceUserName | roleName | - | GetBucketVersioning | with | does not exist | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | ListObjects | with | exists | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | ListMultipartUploads | with | exists | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | GetObjectTagging | without | exists | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | GetObjectTagging | with | exists | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | GetObject | without | exists | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | GetObject | with | exists | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | - | GetObject | without | exists | backbeat-lifecycle-op-1 | backbeat-lifecycle-op-1 | - | GetObject | with | exists | backbeat-lifecycle-op-1 | backbeat-lifecycle-op-1 | - | DeleteObject | without | exists | backbeat-lifecycle-op-1 | backbeat-lifecycle-op-1 | - | DeleteObject | with | exists | backbeat-lifecycle-op-1 | backbeat-lifecycle-op-1 | - | AbortMultipartUpload | with | exists | backbeat-lifecycle-op-1 | backbeat-lifecycle-op-1 | - | GetObject | without | exists | sorbet-fwd-2 | cold-storage-archive-role-2 | - | GetObject | with | exists | sorbet-fwd-2 | cold-storage-archive-role-2 | - | GetObject | without | exists | sorbet-fwd-2 | cold-storage-restore-role-2 | - | GetObject | with | exists | sorbet-fwd-2 | cold-storage-restore-role-2 | - - @2.6.0 - @PreMerge - @IamPoliciesBackbeatServiceUser - Scenario Outline: Backbeat Service Users are authorized to perform the actions and get expected error response - Given an existing bucket "" "" versioning, "without" ObjectLock "" retention mode - And an object "" that "" - And a service user "" assuming the role "" of a user account - When the user tries to perform "" on the bucket - Then the user should receive "" error - - Examples: - | action | withVersioning | objectExists | serviceUserName | roleName | expectedError | - | GetBucketLifecycleConfiguration | with | does not exist | backbeat-lifecycle-bp-1 | backbeat-lifecycle-bp-1 | NoSuchLifecycleConfiguration | - | PutObjectVersion | with | exists | sorbet-fwd-2 | cold-storage-restore-role-2 | InvalidObjectState | - - @2.6.0 - @PreMerge - @Flaky - @IamPoliciesBackbeatServiceUser - Scenario Outline: Backbeat Service Users are authorized to perform the actions - Given a service user "" assuming the role "" of an internal service account - When the user tries to perform vault auth "" - Then the user should be able to perform successfully the "" action - - Examples: - | action | serviceUserName | roleName | - | GetAccountInfo | backbeat-qp-1 | backbeat-qp-1 | - | GetAccountInfo | backbeat-lifecycle-conductor-1 | backbeat-lifecycle-conductor-1 | - - @2.6.0 - @PreMerge - @Flaky - @IamPoliciesBackbeatServiceUser - Scenario Outline: Backbeat Service Users are not authorized to perform the actions - Given a service user "" assuming the role "" of a user account - When the user tries to perform vault auth "" - Then the user should not be able to perform the "" action - - Examples: - | action | serviceUserName | roleName | - | GetAccountInfo | backbeat-lifecycle-conductor-1 | backbeat-lifecycle-conductor-1 | diff --git a/tests/ctst/features/quotas/Quotas.feature b/tests/ctst/features/quotas/Quotas.feature index b653bfac51..8bfd48e751 100644 --- a/tests/ctst/features/quotas/Quotas.feature +++ b/tests/ctst/features/quotas/Quotas.feature @@ -84,35 +84,35 @@ Feature: Quota Management for APIs | 100 | 99 | 0 | IAM_USER | | 100 | 0 | 99 | IAM_USER | | 100 | 99 | 99 | IAM_USER | -# @2.6.0 -# @PreMerge -# @Quotas -# @Restore -# @Dmf -# @ColdStorage -# Scenario Outline: Object restoration implements strict quotas -# Given an action "" -# And a transition workflow to "e2e-cold" location -# And an upload size of B -# Then object "" should be "transitioned" and have the storage class "e2e-cold" -# Given a "STORAGE_MANAGER" type -# And a bucket quota set to B -# And an account quota set to B -# And a "" type -# And an environment setup for the API -# And an "existing" IAM Policy that "applies" with "ALLOW" effect for the current API -# When i restore object "" for5 days -# Then the API should "" with "" + @2.6.0 + @PreMerge + @Quotas + @Restore + @Dmf + @ColdStorage + Scenario Outline: Object restoration implements strict quotas + Given an action "" + And a transition workflow to "e2e-cold" location + And an upload size of B + Then object "" should be "transitioned" and have the storage class "e2e-cold" + Given a "STORAGE_MANAGER" type + And a bucket quota set to B + And an account quota set to B + And a "" type + And an environment setup for the API + And an "existing" IAM Policy that "applies" with "ALLOW" effect for the current API + When i restore object "" for5 days + Then the API should "" with "" -# Examples: -# | action | uploadSize | bucketQuota | accountQuota | userType | result | expectedError | retryNumber | -# | RestoreObject | 100 | 0 | 0 | ACCOUNT | succeed | | 3 | -# | RestoreObject | 100 | 99 | 0 | ACCOUNT | fail | QuotaExceeded | 3 | -# | RestoreObject | 100 | 0 | 99 | ACCOUNT | fail | QuotaExceeded | 3 | -# | RestoreObject | 100 | 99 | 99 | ACCOUNT | fail | QuotaExceeded | 3 | -# | RestoreObject | 100 | 101 | 101 | ACCOUNT | succeed | | 3 | -# | RestoreObject | 100 | 0 | 0 | IAM_USER | succeed | | 3 | -# | RestoreObject | 100 | 99 | 0 | IAM_USER | fail | QuotaExceeded | 3 | -# | RestoreObject | 100 | 0 | 99 | IAM_USER | fail | QuotaExceeded | 3 | -# | RestoreObject | 100 | 99 | 99 | IAM_USER | fail | QuotaExceeded | 3 | -# | RestoreObject | 100 | 101 | 101 | IAM_USER | succeed | | 3 | + Examples: + | action | uploadSize | bucketQuota | accountQuota | userType | result | expectedError | retryNumber | + | RestoreObject | 100 | 0 | 0 | ACCOUNT | succeed | | 3 | + | RestoreObject | 100 | 99 | 0 | ACCOUNT | fail | QuotaExceeded | 3 | + | RestoreObject | 100 | 0 | 99 | ACCOUNT | fail | QuotaExceeded | 3 | + | RestoreObject | 100 | 99 | 99 | ACCOUNT | fail | QuotaExceeded | 3 | + | RestoreObject | 100 | 101 | 101 | ACCOUNT | succeed | | 3 | + | RestoreObject | 100 | 0 | 0 | IAM_USER | succeed | | 3 | + | RestoreObject | 100 | 99 | 0 | IAM_USER | fail | QuotaExceeded | 3 | + | RestoreObject | 100 | 0 | 99 | IAM_USER | fail | QuotaExceeded | 3 | + | RestoreObject | 100 | 99 | 99 | IAM_USER | fail | QuotaExceeded | 3 | + | RestoreObject | 100 | 101 | 101 | IAM_USER | succeed | | 3 |