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)
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,
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', () => {
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);
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();
}
@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();