]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: add system users to rgw user form 56473/head
authorPedro Gonzalez Gomez <pegonzal@redhat.com>
Fri, 22 Mar 2024 14:20:48 +0000 (15:20 +0100)
committerNizamudeen A <nia@redhat.com>
Tue, 26 Mar 2024 09:37:53 +0000 (15:07 +0530)
Fixes: https://tracker.ceph.com/issues/65074
Signed-off-by: Pedro Gonzalez Gomez <pegonzal@redhat.com>
(cherry picked from commit b658bb9c32ad31608921e77603003c004ab0f15b)

src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-details/rgw-user-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-details/rgw-user-details.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.ts
src/pybind/mgr/dashboard/openapi.yaml

index 1b3b9ef866e983abc2817fdd2d51c0082fc1d8ea..ddda3369f47a48b18b29e70318d05bdd228edf84 100644 (file)
@@ -595,7 +595,7 @@ class RgwUser(RgwRESTController):
 
     @allow_empty_body
     def create(self, uid, display_name, email=None, max_buckets=None,
-               suspended=None, generate_key=None, access_key=None,
+               system=None, suspended=None, generate_key=None, access_key=None,
                secret_key=None, daemon_name=None):
         params = {'uid': uid}
         if display_name is not None:
@@ -604,6 +604,8 @@ class RgwUser(RgwRESTController):
             params['email'] = email
         if max_buckets is not None:
             params['max-buckets'] = max_buckets
+        if system is not None:
+            params['system'] = system
         if suspended is not None:
             params['suspended'] = suspended
         if generate_key is not None:
@@ -617,7 +619,7 @@ class RgwUser(RgwRESTController):
 
     @allow_empty_body
     def set(self, uid, display_name=None, email=None, max_buckets=None,
-            suspended=None, daemon_name=None):
+            system=None, suspended=None, daemon_name=None):
         params = {'uid': uid}
         if display_name is not None:
             params['display-name'] = display_name
@@ -625,6 +627,8 @@ class RgwUser(RgwRESTController):
             params['email'] = email
         if max_buckets is not None:
             params['max-buckets'] = max_buckets
+        if system is not None:
+            params['system'] = system
         if suspended is not None:
             params['suspended'] = suspended
         result = self.proxy(daemon_name, 'POST', 'user', params)
index 27162404a62b3d87b025cc846300d03c8e38bfa8..49aff08e387576053ae6538a98a275b052ae638a 100644 (file)
@@ -60,8 +60,8 @@
         </tr>
         <tr>
           <td i18n
-              class="bold">System</td>
-          <td>{{ user.system === 'true' | booleanText }}</td>
+              class="bold">System user</td>
+          <td>{{ user.system | booleanText }}</td>
         </tr>
         <tr>
           <td i18n
index 7b203eb9ccaaa52334b6e4c63ead7580a0a0fa91..27bb6cc46ef02caa9a1fba2b34e02d66f7ca0d98 100644 (file)
@@ -29,7 +29,7 @@ describe('RgwUserDetailsComponent', () => {
   });
 
   it('should show correct "System" info', () => {
-    component.selection = { uid: '', email: '', system: 'true', keys: [], swift_keys: [] };
+    component.selection = { uid: '', email: '', system: true, keys: [], swift_keys: [] };
 
     component.ngOnChanges();
     fixture.detectChanges();
@@ -37,10 +37,10 @@ describe('RgwUserDetailsComponent', () => {
     const detailsTab = fixture.debugElement.nativeElement.querySelectorAll(
       '.table.table-striped.table-bordered tr td'
     );
-    expect(detailsTab[10].textContent).toEqual('System');
+    expect(detailsTab[10].textContent).toEqual('System user');
     expect(detailsTab[11].textContent).toEqual('Yes');
 
-    component.selection.system = 'false';
+    component.selection.system = false;
     component.ngOnChanges();
     fixture.detectChanges();
 
index 9fec45dfe01a8900766b75365d9ee497979b6bb4..69e9b4ca29baf3025aca2096ff8350d424b85131 100644 (file)
           </div>
         </div>
 
+        <!-- System User -->
+        <div class="form-group row">
+          <div class="cd-col-form-offset">
+            <div class="custom-control custom-checkbox">
+              <input class="custom-control-input"
+                     id="system"
+                     type="checkbox"
+                     formControlName="system">
+              <label class="custom-control-label"
+                     for="system"
+                     i18n>System user</label>
+              <cd-helper i18n>System users are distinct from regular users, they are used by the RGW service to perform administrative tasks, manage buckets and objects</cd-helper>
+            </div>
+          </div>
+        </div>
+
         <!-- S3 key -->
         <fieldset *ngIf="!editing">
           <legend i18n>S3 key</legend>
index 15665d53bb95b704b2c62a9eef65e6537a836d3c..64afa205e6926c98e2727cee0256d73ee6683b37 100644 (file)
@@ -187,6 +187,7 @@ describe('RgwUserFormComponent', () => {
         max_buckets: -1,
         secret_key: '',
         suspended: false,
+        system: false,
         uid: null
       });
     });
@@ -200,7 +201,8 @@ describe('RgwUserFormComponent', () => {
         display_name: null,
         email: null,
         max_buckets: -1,
-        suspended: false
+        suspended: false,
+        system: false
       });
     });
 
@@ -216,6 +218,7 @@ describe('RgwUserFormComponent', () => {
         max_buckets: 0,
         secret_key: '',
         suspended: false,
+        system: false,
         uid: null
       });
     });
@@ -229,7 +232,8 @@ describe('RgwUserFormComponent', () => {
         display_name: null,
         email: null,
         max_buckets: 0,
-        suspended: false
+        suspended: false,
+        system: false
       });
     });
 
@@ -246,6 +250,7 @@ describe('RgwUserFormComponent', () => {
         max_buckets: 100,
         secret_key: '',
         suspended: false,
+        system: false,
         uid: null
       });
     });
@@ -260,7 +265,8 @@ describe('RgwUserFormComponent', () => {
         display_name: null,
         email: null,
         max_buckets: 100,
-        suspended: false
+        suspended: false,
+        system: false
       });
     });
   });
@@ -283,7 +289,8 @@ describe('RgwUserFormComponent', () => {
         display_name: null,
         email: '',
         max_buckets: 1000,
-        suspended: false
+        suspended: false,
+        system: false
       });
     });
 
index 9d4e1ce601b7fb83399a423c9dbbe333fcc53de7..b2cb7d6518d93be5d30ac4b1083e521df7c15731 100644 (file)
@@ -109,6 +109,7 @@ export class RgwUserFormComponent extends CdForm implements OnInit {
         1000,
         [CdValidators.requiredIf({ max_buckets_mode: '1' }), CdValidators.number(false)]
       ],
+      system: [false],
       suspended: [false],
       // S3 key
       generate_key: [true],
@@ -577,7 +578,7 @@ export class RgwUserFormComponent extends CdForm implements OnInit {
    * @return {Boolean} Returns TRUE if the general user settings have been modified.
    */
   private _isGeneralDirty(): boolean {
-    return ['display_name', 'email', 'max_buckets_mode', 'max_buckets', 'suspended'].some(
+    return ['display_name', 'email', 'max_buckets_mode', 'max_buckets', 'system', 'suspended'].some(
       (path) => {
         return this.userForm.get(path).dirty;
       }
@@ -624,6 +625,7 @@ export class RgwUserFormComponent extends CdForm implements OnInit {
     const result = {
       uid: this.getUID(),
       display_name: this.userForm.getValue('display_name'),
+      system: this.userForm.getValue('system'),
       suspended: this.userForm.getValue('suspended'),
       email: '',
       max_buckets: this.userForm.getValue('max_buckets'),
@@ -658,7 +660,7 @@ export class RgwUserFormComponent extends CdForm implements OnInit {
    */
   private _getUpdateArgs() {
     const result: Record<string, any> = {};
-    const keys = ['display_name', 'email', 'max_buckets', 'suspended'];
+    const keys = ['display_name', 'email', 'max_buckets', 'system', 'suspended'];
     for (const key of keys) {
       result[key] = this.userForm.getValue(key);
     }
index 711e8c8e9557f99bf22b781e0818d67d22b758f4..606b6c13a8ede077de3f57c72d615471d3f0b1f2 100644 (file)
@@ -10980,6 +10980,8 @@ paths:
                   type: string
                 suspended:
                   type: string
+                system:
+                  type: string
                 uid:
                   type: string
               required:
@@ -11132,6 +11134,8 @@ paths:
                   type: string
                 suspended:
                   type: string
+                system:
+                  type: string
               type: object
       responses:
         '200':