]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: remove 'config-opt: read' perm. from system roles.
authorAlfonso Martínez <almartin@redhat.com>
Tue, 3 Mar 2020 11:34:11 +0000 (12:34 +0100)
committerAlfonso Martínez <almartin@redhat.com>
Tue, 3 Mar 2020 11:34:11 +0000 (12:34 +0100)
Fixes: https://tracker.ceph.com/issues/44237
Signed-off-by: Alfonso Martínez <almartin@redhat.com>
qa/tasks/mgr/dashboard/test_pool.py
src/pybind/mgr/dashboard/controllers/pool.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/models/pool-form-info.ts
src/pybind/mgr/dashboard/services/access_control.py

index 6b4f765c8e5274b68c4436e04fa72247d1294a0a..8d403d89a1d51405a3959465f5f9397e9c611b3d 100644 (file)
@@ -406,8 +406,10 @@ class PoolTest(DashboardTestCase):
             'compression_algorithms': JList(six.string_types),
             'compression_modes': JList(six.string_types),
             'is_all_bluestore': bool,
-            "bluestore_compression_algorithm": six.string_types,
+            'bluestore_compression_algorithm': six.string_types,
             'osd_count': int,
             'crush_rules_replicated': JList(JObj({}, allow_unknown=True)),
             'crush_rules_erasure': JList(JObj({}, allow_unknown=True)),
+            'pg_autoscale_default_mode': six.string_types,
+            'pg_autoscale_modes': JList(six.string_types),
         }))
index a7a422caccd6c00a0a87f29b0102d4e41a9b05bc..ac3ab1189b7f9d17be670c444814b437e2574b1d 100644 (file)
@@ -220,20 +220,23 @@ class Pool(RESTController):
             return all(o['osd_objectstore'] == 'bluestore'
                        for o in mgr.get('osd_metadata').values())
 
-        def compression_enum(conf_name):
+        def get_config_option_enum(conf_name):
             return [[v for v in o['enum_values'] if len(v) > 0]
                     for o in mgr.get('config_options')['options']
                     if o['name'] == conf_name][0]
 
+        mgr_config = mgr.get('config')
         result = {
             "pool_names": [p['pool_name'] for p in self._pool_list()],
             "crush_rules_replicated": rules(1),
             "crush_rules_erasure": rules(3),
             "is_all_bluestore": all_bluestore(),
             "osd_count": len(mgr.get('osd_map')['osds']),
-            "bluestore_compression_algorithm": mgr.get('config')['bluestore_compression_algorithm'],
-            "compression_algorithms": compression_enum('bluestore_compression_algorithm'),
-            "compression_modes": compression_enum('bluestore_compression_mode'),
+            "bluestore_compression_algorithm": mgr_config['bluestore_compression_algorithm'],
+            "compression_algorithms": get_config_option_enum('bluestore_compression_algorithm'),
+            "compression_modes": get_config_option_enum('bluestore_compression_mode'),
+            "pg_autoscale_default_mode": mgr_config['osd_pool_default_pg_autoscale_mode'],
+            "pg_autoscale_modes": get_config_option_enum('osd_pool_default_pg_autoscale_mode'),
         }
 
         if pool_name:
index adcc50b51828e5eac41adda6235a7ca5290f63d0..a5164aa84fb44731c292c3735c88070ea84017f4 100644 (file)
@@ -18,7 +18,6 @@ import {
   i18nProviders
 } from '../../../../testing/unit-test-helper';
 import { NotFoundComponent } from '../../../core/not-found/not-found.component';
-import { ConfigurationService } from '../../../shared/api/configuration.service';
 import { ErasureCodeProfileService } from '../../../shared/api/erasure-code-profile.service';
 import { PoolService } from '../../../shared/api/pool.service';
 import { CriticalConfirmationModalComponent } from '../../../shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
@@ -40,7 +39,6 @@ describe('PoolFormComponent', () => {
   let component: PoolFormComponent;
   let fixture: ComponentFixture<PoolFormComponent>;
   let poolService: PoolService;
-  let configurationService: ConfigurationService;
   let form: CdFormGroup;
   let router: Router;
   let ecpService: ErasureCodeProfileService;
@@ -133,7 +131,9 @@ describe('PoolFormComponent', () => {
       compression_algorithms: ['snappy'],
       compression_modes: ['none', 'passive'],
       crush_rules_replicated: [],
-      crush_rules_erasure: []
+      crush_rules_erasure: [],
+      pg_autoscale_default_mode: 'off',
+      pg_autoscale_modes: ['off', 'warn', 'on']
     };
     const ecp1 = new ErasureCodeProfile();
     ecp1.name = 'ecp1';
@@ -164,10 +164,6 @@ describe('PoolFormComponent', () => {
 
   beforeEach(() => {
     setUpPoolComponent();
-    configurationService = TestBed.get(ConfigurationService);
-    spyOn(configurationService, 'get').and.callFake(() => [
-      { default: 'off', enum_values: ['on', 'warn', 'off'], value: [] }
-    ]);
     poolService = TestBed.get(PoolService);
     spyOn(poolService, 'getInfo').and.callFake(() => [component.info]);
     ecpService = TestBed.get(ErasureCodeProfileService);
index 34500296125e89a5c12e88bd10bad29a7822d5a3..4ba4a61de54d7ff15cad9967a449e3e7ad038b69 100644 (file)
@@ -7,7 +7,6 @@ import * as _ from 'lodash';
 import { BsModalService } from 'ngx-bootstrap/modal';
 import { forkJoin, Subscription } from 'rxjs';
 
-import { ConfigurationService } from '../../../shared/api/configuration.service';
 import { ErasureCodeProfileService } from '../../../shared/api/erasure-code-profile.service';
 import { PoolService } from '../../../shared/api/pool.service';
 import { CriticalConfirmationModalComponent } from '../../../shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
@@ -77,7 +76,6 @@ export class PoolFormComponent implements OnInit {
     private router: Router,
     private modalService: BsModalService,
     private poolService: PoolService,
-    private configurationService: ConfigurationService,
     private authStorageService: AuthStorageService,
     private formatter: FormatterService,
     private bsModalService: BsModalService,
@@ -165,25 +163,21 @@ export class PoolFormComponent implements OnInit {
   }
 
   ngOnInit() {
-    forkJoin(
-      this.configurationService.get('osd_pool_default_pg_autoscale_mode'),
-      this.poolService.getInfo(),
-      this.ecpService.list()
-    ).subscribe((data: [any, PoolFormInfo, ErasureCodeProfile[]]) => {
-      const pgAutoscaleConfig = data[0];
-      this.pgAutoscaleModes = pgAutoscaleConfig.enum_values;
-      const defaultPgAutoscaleMode = this.configurationService.getValue(pgAutoscaleConfig, 'mon');
-      this.form.silentSet('pgAutoscaleMode', defaultPgAutoscaleMode);
-      this.initInfo(data[1]);
-      this.initEcp(data[2]);
-      if (this.editing) {
-        this.initEditMode();
-      } else {
-        this.setAvailableApps();
+    forkJoin(this.poolService.getInfo(), this.ecpService.list()).subscribe(
+      (data: [PoolFormInfo, ErasureCodeProfile[]]) => {
+        this.pgAutoscaleModes = data[0].pg_autoscale_modes;
+        this.form.silentSet('pgAutoscaleMode', data[0].pg_autoscale_default_mode);
+        this.initInfo(data[0]);
+        this.initEcp(data[1]);
+        if (this.editing) {
+          this.initEditMode();
+        } else {
+          this.setAvailableApps();
+        }
+        this.listenToChanges();
+        this.setComplexValidators();
       }
-      this.listenToChanges();
-      this.setComplexValidators();
-    });
+    );
   }
 
   private initInfo(info: PoolFormInfo) {
index 7741087b9c3210b5f37ff92af9ecce349cbbd41d..4f5b653df38d27b5b63580786da56debd3f47fee 100644 (file)
@@ -9,4 +9,6 @@ export class PoolFormInfo {
   compression_modes: string[];
   crush_rules_replicated: CrushRule[];
   crush_rules_erasure: CrushRule[];
+  pg_autoscale_default_mode: string;
+  pg_autoscale_modes: string[];
 }
index 96aea131ded789adbd35fbb3506e275f07c256df..f5a559751e60e7b7316840e93c4c332454d1bcf0 100644 (file)
@@ -237,7 +237,6 @@ BLOCK_MGR_ROLE = Role('block-manager', 'Block Manager', {
 # RadosGW manager role provides all permissions for block related scopes
 RGW_MGR_ROLE = Role('rgw-manager', 'RGW Manager', {
     Scope.RGW: [_P.READ, _P.CREATE, _P.UPDATE, _P.DELETE],
-    Scope.CONFIG_OPT: [_P.READ],
     Scope.GRAFANA: [_P.READ],
 })
 
@@ -258,14 +257,12 @@ CLUSTER_MGR_ROLE = Role('cluster-manager', 'Cluster Manager', {
 # Pool manager role provides all permissions for pool related scopes
 POOL_MGR_ROLE = Role('pool-manager', 'Pool Manager', {
     Scope.POOL: [_P.READ, _P.CREATE, _P.UPDATE, _P.DELETE],
-    Scope.CONFIG_OPT: [_P.READ],
     Scope.GRAFANA: [_P.READ],
 })
 
-# Pool manager role provides all permissions for CephFS related scopes
+# CephFS manager role provides all permissions for CephFS related scopes
 CEPHFS_MGR_ROLE = Role('cephfs-manager', 'CephFS Manager', {
     Scope.CEPHFS: [_P.READ, _P.CREATE, _P.UPDATE, _P.DELETE],
-    Scope.CONFIG_OPT: [_P.READ],
     Scope.GRAFANA: [_P.READ],
 })
 
@@ -273,7 +270,6 @@ GANESHA_MGR_ROLE = Role('ganesha-manager', 'NFS Ganesha Manager', {
     Scope.NFS_GANESHA: [_P.READ, _P.CREATE, _P.UPDATE, _P.DELETE],
     Scope.CEPHFS: [_P.READ, _P.CREATE, _P.UPDATE, _P.DELETE],
     Scope.RGW: [_P.READ, _P.CREATE, _P.UPDATE, _P.DELETE],
-    Scope.CONFIG_OPT: [_P.READ],
     Scope.GRAFANA: [_P.READ],
 })