]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: fix bucket versioning when locking is enabled 41050/head
authorAvan Thakkar <athakkar@redhat.com>
Tue, 27 Apr 2021 19:21:28 +0000 (00:51 +0530)
committerAvan Thakkar <athakkar@redhat.com>
Wed, 5 May 2021 11:54:41 +0000 (17:24 +0530)
Fixes: https://tracker.ceph.com/issues/50545
Signed-off-by: Avan Thakkar <athakkar@redhat.com>
qa/tasks/mgr/dashboard/test_rgw.py
src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.e2e-spec.ts
src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.po.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts

index 5029c12d3225963ae564b51b07ce8e6d723d64ff..f545c748329062b0b88ae3b68a68116aa31a4b06 100644 (file)
@@ -433,6 +433,16 @@ class RgwBucketTest(RgwTestCase):
         self.assertEqual(data['lock_retention_period_days'], 15)
         self.assertEqual(data['lock_retention_period_years'], 0)
         self.assertStatus(200)
+
+        # Update: Disabling bucket versioning should fail if object locking enabled
+        self._put('/api/rgw/bucket/teuth-test-bucket',
+                  params={
+                      'bucket_id': data['id'],
+                      'uid': 'teuth-test-user',
+                      'versioning_state': 'Suspended'
+                  })
+        self.assertStatus(409)
+
         # Delete
         self._delete('/api/rgw/bucket/teuth-test-bucket')
         self.assertStatus(204)
index ba0490a6283dc8601b988649a4b46a5e12dae3a4..bd395f47315ae1b1f7083d14e2843b5a5a44109a 100644 (file)
@@ -300,12 +300,16 @@ class RgwBucket(RgwRESTController):
         uid_tenant = uid[:uid.find('$')] if uid.find('$') >= 0 else None
         bucket_name = RgwBucket.get_s3_bucket_name(bucket, uid_tenant)
 
+        locking = self._get_locking(uid, daemon_name, bucket_name)
         if versioning_state:
+            if versioning_state == 'Suspended' and locking['lock_enabled']:
+                raise DashboardException(msg='Bucket versioning cannot be disabled/suspended '
+                                             'on buckets with object lock enabled ',
+                                             http_status_code=409, component='rgw')
             self._set_versioning(uid, daemon_name, bucket_name, versioning_state,
                                  mfa_delete, mfa_token_serial, mfa_token_pin)
 
         # Update locking if it is enabled.
-        locking = self._get_locking(uid, daemon_name, bucket_name)
         if locking['lock_enabled']:
             self._set_locking(uid, daemon_name, bucket_name, lock_mode,
                               lock_retention_period_days,
index 737c112682153fc65018a0c1fe382cf1e44cbc55..75ff8c7c277b1f32299f0c6c20633ebda05c3820 100644 (file)
@@ -35,6 +35,24 @@ describe('RGW buckets page', () => {
     it('should delete bucket', () => {
       buckets.delete(bucket_name);
     });
+
+    it('should create bucket with object locking enabled', () => {
+      buckets.navigateTo('create');
+      buckets.create(
+        bucket_name,
+        '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
+        'default-placement',
+        true
+      );
+      buckets.getFirstTableCell(bucket_name).should('exist');
+    });
+
+    it('should not allow to edit versioning if object locking is enabled', () => {
+      buckets.edit(bucket_name, 'dev', true);
+      buckets.getDataTables().should('contain.text', 'dev');
+
+      buckets.delete(bucket_name);
+    });
   });
 
   describe('Invalid Input in Create and Edit tests', () => {
index 7d0b46c256e721cd222e8127442f7664d330a3c3..6183ae25790cccd5fdbc0fe4a154e6eb3cd5b232 100644 (file)
@@ -19,8 +19,12 @@ export class BucketsPageHelper extends PageHelper {
     return this.selectOption('placement-target', placementTarget);
   }
 
+  private selectLockMode(lockMode: string) {
+    return this.selectOption('lock_mode', lockMode);
+  }
+
   @PageHelper.restrictTo(pages.create.url)
-  create(name: string, owner: string, placementTarget: string) {
+  create(name: string, owner: string, placementTarget: string, isLocking = false) {
     // Enter in bucket name
     cy.get('#bid').type(name);
 
@@ -32,6 +36,15 @@ export class BucketsPageHelper extends PageHelper {
     this.selectPlacementTarget(placementTarget);
     cy.get('#placement-target').should('have.class', 'ng-valid');
 
+    if (isLocking) {
+      cy.get('#lock_enabled').click({ force: true });
+      // Select lock mode:
+      this.selectLockMode('Compliance');
+      cy.get('#lock_mode').should('have.class', 'ng-valid');
+      cy.get('#lock_retention_period_days').type('3');
+      cy.get('#lock_retention_period_years').type('0');
+    }
+
     // Click the create button and wait for bucket to be made
     cy.contains('button', 'Create Bucket').click();
 
@@ -39,12 +52,32 @@ export class BucketsPageHelper extends PageHelper {
   }
 
   @PageHelper.restrictTo(pages.index.url)
-  edit(name: string, new_owner: string) {
+  edit(name: string, new_owner: string, isLocking = false) {
     this.navigateEdit(name);
 
     cy.get('input[name=placement-target]').should('have.value', 'default-placement');
     this.selectOwner(new_owner);
 
+    // If object locking is enabled versioning shouldn't be visible
+    if (isLocking) {
+      cy.get('input[id=versioning]').should('be.disabled');
+      cy.contains('button', 'Edit Bucket').click();
+
+      // wait to be back on buckets page with table visible and click
+      this.getExpandCollapseElement(name).click();
+
+      // check its details table for edited owner field
+      cy.get('.table.table-striped.table-bordered')
+        .first()
+        .should('contains.text', new_owner)
+        .as('bucketDataTable');
+
+      // Check versioning enabled:
+      cy.get('@bucketDataTable').find('tr').its(2).find('td').last().should('have.text', new_owner);
+      cy.get('@bucketDataTable').find('tr').its(11).find('td').last().as('versioningValueCell');
+
+      return cy.get('@versioningValueCell').should('have.text', this.versioningStateEnabled);
+    }
     // Enable versioning
     cy.get('input[id=versioning]').should('not.be.checked');
     cy.get('label[for=versioning]').click();
index 8bf17755d67a35c469caa8a8122c1dcf94e91e44..1c51d701d12d70058356b66abcf4cd6f6f1c6bb0 100644 (file)
@@ -147,6 +147,9 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
             this.isVersioningAlreadyEnabled = this.isVersioningEnabled;
             this.isMfaDeleteAlreadyEnabled = this.isMfaDeleteEnabled;
             this.setMfaDeleteValidators();
+            if (value['lock_enabled']) {
+              this.bucketForm.controls['versioning'].disable();
+            }
           }
         }