From e60fbca5224fdc9e2903e1b322258b3e99c7fbab Mon Sep 17 00:00:00 2001 From: Afreen Date: Fri, 1 Mar 2024 12:56:25 +0530 Subject: [PATCH] mgr/dashboard: Locking improvements in bucket create form Fixes https://tracker.ceph.com/issues/64658 - Addition of help texts - Addition of info/warnings related to modes and versioning - change of Locking section layout - renaming locking to 'Object Locking' - changes default retention period to 10 - edit bucket only shows lock when its enabled Signed-off-by: Afreen (cherry picked from commit 014d4468fce5aadfbc63bd9651c0c66db0bf7f49) Conflicts: src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts --- .../rgw-bucket-form.component.html | 87 +++++++++++++------ .../rgw-bucket-form.component.spec.ts | 12 ++- .../rgw-bucket-form.component.ts | 2 +- .../shared/components/components.module.ts | 7 +- .../help-text/help-text.component.html | 3 + .../help-text/help-text.component.scss | 3 + .../help-text/help-text.component.spec.ts | 22 +++++ .../help-text/help-text.component.ts | 8 ++ 8 files changed, 115 insertions(+), 29 deletions(-) create mode 100644 src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.html create mode 100644 src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.scss create mode 100644 src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.spec.ts create mode 100644 src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.ts diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html index fd085a74d2d09..41b7f11629779 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html @@ -213,30 +213,34 @@ - -
+ +
Locking - - + i18n> + Object Locking + + Store objects using a write-once-read-many (WORM) model to help you prevent objects from being deleted or overwritten for a fixed amount of time or indefinitely. + Object Locking works only in versioned buckets. + + +
-
-
- - - - Enables locking for the objects in the bucket. Locking can only be enabled while creating a bucket. - -
+ +
+ + + Enables locking for the objects in the bucket. Locking can only be enabled while creating a bucket. +
- - +
-
+ min="1"> + + The number of days that you want to specify for the default retention period that will be applied to new objects placed in this bucket. + The entered value must be a positive integer. @@ -277,6 +296,24 @@ i18n>Retention Days must be a positive integer.
+ +
+
+
+ + Bucket Versioning can't be disabled when Object Locking is enabled. + + + Enabling Object Locking will allow the configuration of GOVERNANCE or COMPLIANCE modes, which will help ensure that an object version cannot be overwritten or deleted for the specified period. + +
+
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.spec.ts index 704d7918465df..44318eda88e16 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.spec.ts @@ -272,10 +272,20 @@ describe('RgwBucketFormComponent', () => { expect(control.disabled).toBeTruthy(); }); - it('should have the "lockDays" error', () => { + it('should not have the "lockDays" error for 10 days', () => { formHelper.setValue('lock_enabled', true); const control = component.bucketForm.get('lock_retention_period_days'); control.updateValueAndValidity(); + expect(control.value).toBe(10); + expect(control.invalid).toBeFalsy(); + formHelper.expectValid(control); + }); + + it('should have the "lockDays" error for 0 days', () => { + formHelper.setValue('lock_enabled', true); + formHelper.setValue('lock_retention_period_days', 0); + const control = component.bucketForm.get('lock_retention_period_days'); + control.updateValueAndValidity(); expect(control.value).toBe(0); expect(control.invalid).toBeTruthy(); formHelper.expectError(control, 'lockDays'); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts index a50545714d11f..e92cf952c655b 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts @@ -151,7 +151,7 @@ export class RgwBucketFormComponent extends CdForm implements OnInit, AfterViewC ] ], lock_mode: ['COMPLIANCE'], - lock_retention_period_days: [0, [CdValidators.number(false), lockDaysValidator]], + lock_retention_period_days: [10, [CdValidators.number(false), lockDaysValidator]], bucket_policy: ['{}', CdValidators.json()], grantee: [Grantee.Owner, [Validators.required]], aclPermission: [[aclPermission.FullControl], [Validators.required]] diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts index 5b533f1cddb30..d5180f5db9dac 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts @@ -53,6 +53,7 @@ import { CardComponent } from './card/card.component'; import { CardRowComponent } from './card-row/card-row.component'; import { CodeBlockComponent } from './code-block/code-block.component'; import { VerticalNavigationComponent } from './vertical-navigation/vertical-navigation.component'; +import { HelpTextComponent } from './help-text/help-text.component'; @NgModule({ imports: [ @@ -109,7 +110,8 @@ import { VerticalNavigationComponent } from './vertical-navigation/vertical-navi CardComponent, CardRowComponent, CodeBlockComponent, - VerticalNavigationComponent + VerticalNavigationComponent, + HelpTextComponent ], providers: [], exports: [ @@ -143,7 +145,8 @@ import { VerticalNavigationComponent } from './vertical-navigation/vertical-navi CardComponent, CardRowComponent, CodeBlockComponent, - VerticalNavigationComponent + VerticalNavigationComponent, + HelpTextComponent ] }) export class ComponentsModule {} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.html b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.html new file mode 100644 index 0000000000000..e8d0d6e3d19ae --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.scss b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.scss new file mode 100644 index 0000000000000..f7be01cd929b3 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.scss @@ -0,0 +1,3 @@ +::ng-deep legend .text-muted { + font-size: small; +} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.spec.ts new file mode 100644 index 0000000000000..10a86418f8dc9 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HelpTextComponent } from './help-text.component'; + +describe('HelpTextComponent', () => { + let component: HelpTextComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [HelpTextComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(HelpTextComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.ts new file mode 100644 index 0000000000000..60fed74aa5560 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/help-text/help-text.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'cd-help-text', + templateUrl: './help-text.component.html', + styleUrls: ['./help-text.component.scss'] +}) +export class HelpTextComponent {} -- 2.39.5