self.assertEqual(data['bucket'], 'teuth-test-bucket')
self.assertEqual(data['owner'], 'admin')
self.assertEqual(data['placement_rule'], 'default-placement')
- self.assertEqual(data['versioning'], 'Suspended')
+ self.assertEqual(data['versioning'], 'Off')
# Update bucket: change owner, enable versioning.
self._put(
# Get the bucket.
data = _verify_tenant_bucket('teuth-test-bucket', 'testx', 'teuth-test-user')
self.assertEqual(data['placement_rule'], 'default-placement')
- self.assertEqual(data['versioning'], 'Suspended')
+ self.assertEqual(data['versioning'], 'Off')
# Update bucket: different user with different tenant, enable versioning.
self._put(
export enum RgwBucketVersioning {
ENABLED = 'Enabled',
- SUSPENDED = 'Suspended'
+ SUSPENDED = 'Suspended',
+ OFF = 'Off'
}
placementTargets: object[] = [];
isVersioningAlreadyEnabled = false;
isMfaDeleteAlreadyEnabled = false;
+ initialVersioningStatus: string | null = null;
icons = Icons;
kmsConfigured = false;
s3Configured = false;
if (data['getBid']) {
const bidResp = data['getBid'];
+ if (this.editing) {
+ this.initialVersioningStatus = bidResp['versioning'] ?? null;
+ }
// Get the default values (incl. the values from disabled fields).
const defaults = _.clone(this.bucketForm.getRawValue());
mfaTokenPinControl.updateValueAndValidity();
}
- getVersioningStatus() {
- return this.isVersioningEnabled ? RgwBucketVersioning.ENABLED : RgwBucketVersioning.SUSPENDED;
+ getVersioningStatus(): string {
+ if (this.isVersioningEnabled) {
+ return RgwBucketVersioning.ENABLED;
+ }
+ if (this.editing && this.initialVersioningStatus === RgwBucketVersioning.OFF) {
+ return '';
+ }
+ return RgwBucketVersioning.SUSPENDED;
}
getMfaDeleteStatus() {
)
.subscribe();
const req = httpTesting.expectOne(
- `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&versioning_state=Enabled&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10&tags=null&bucket_policy=null&canned_acl=private&replication=true&lifecycle=null`
+ `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10&tags=null&bucket_policy=null&canned_acl=private&replication=true&lifecycle=null&versioning_state=Enabled`
+ );
+ expect(req.request.method).toBe('PUT');
+ });
+
+ it('should call update without versioning_state when empty', () => {
+ service
+ .update(
+ 'foo',
+ 'bar',
+ 'baz',
+ '',
+ true,
+ 'aws:kms',
+ 'qwerty1',
+ 'Enabled',
+ '1',
+ '223344',
+ 'GOVERNANCE',
+ '10',
+ null,
+ null,
+ 'private',
+ 'true',
+ null
+ )
+ .subscribe();
+ const req = httpTesting.expectOne(
+ `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10&tags=null&bucket_policy=null&canned_acl=private&replication=true&lifecycle=null`
);
expect(req.request.method).toBe('PUT');
});
lifecycle: string
) {
return this.rgwDaemonService.request((params: HttpParams) => {
- params = params.appendAll({
+ const paramsObject: Record<string, string> = {
bucket_id: bucketId,
uid: uid,
- versioning_state: versioningState,
encryption_state: String(encryptionState),
encryption_type: encryptionType,
key_id: keyId,
canned_acl: cannedAcl,
replication: replication,
lifecycle: lifecycle
- });
+ };
+ if (versioningState) {
+ paramsObject['versioning_state'] = versioningState;
+ }
+ params = params.appendAll(paramsObject);
return this.http.put(`${this.url}/${bucket}`, null, { params: params });
});
}
"""
# pylint: disable=unused-argument
result = request()
- if 'Status' not in result:
- result['Status'] = 'Suspended'
+ if not isinstance(result, dict):
+ result = {}
+ # RGW omits Status when versioning has never been configured (CLI/radosgw-admin
+ # reports "off"). That must not be shown as "Suspended", which means versioning was enabled
+ if not result.get('Status'):
+ result['Status'] = 'Off'
if 'MfaDelete' not in result:
result['MfaDelete'] = 'Disabled'
return result