From ad8dbefff848411f459d563b329c6c6af8a0dd82 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alfonso=20Mart=C3=ADnez?= Date: Tue, 3 Mar 2020 12:34:11 +0100 Subject: [PATCH] mgr/dashboard: remove 'config-opt: read' perm. from system roles. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fixes: https://tracker.ceph.com/issues/44237 Signed-off-by: Alfonso Martínez --- qa/tasks/mgr/dashboard/test_pool.py | 4 ++- src/pybind/mgr/dashboard/controllers/pool.py | 11 +++--- .../pool-form/pool-form.component.spec.ts | 10 ++---- .../pool/pool-form/pool-form.component.ts | 34 ++++++++----------- .../src/app/shared/models/pool-form-info.ts | 2 ++ .../mgr/dashboard/services/access_control.py | 6 +--- 6 files changed, 30 insertions(+), 37 deletions(-) diff --git a/qa/tasks/mgr/dashboard/test_pool.py b/qa/tasks/mgr/dashboard/test_pool.py index 6b4f765c8e527..8d403d89a1d51 100644 --- a/qa/tasks/mgr/dashboard/test_pool.py +++ b/qa/tasks/mgr/dashboard/test_pool.py @@ -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), })) diff --git a/src/pybind/mgr/dashboard/controllers/pool.py b/src/pybind/mgr/dashboard/controllers/pool.py index a7a422caccd6c..ac3ab1189b7f9 100644 --- a/src/pybind/mgr/dashboard/controllers/pool.py +++ b/src/pybind/mgr/dashboard/controllers/pool.py @@ -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: diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts index adcc50b51828e..a5164aa84fb44 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts @@ -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; 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); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts index 34500296125e8..4ba4a61de54d7 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts @@ -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) { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/models/pool-form-info.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/models/pool-form-info.ts index 7741087b9c321..4f5b653df38d2 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/models/pool-form-info.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/models/pool-form-info.ts @@ -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[]; } diff --git a/src/pybind/mgr/dashboard/services/access_control.py b/src/pybind/mgr/dashboard/services/access_control.py index 96aea131ded78..f5a559751e60e 100644 --- a/src/pybind/mgr/dashboard/services/access_control.py +++ b/src/pybind/mgr/dashboard/services/access_control.py @@ -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], }) -- 2.39.5