From: Volker Theile Date: Thu, 29 Aug 2019 11:14:33 +0000 (+0200) Subject: mgr/dashboard: A block-manager can not access the pool page X-Git-Tag: v15.1.0~1720^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=75e9d9a0f01a4f47240233288863b6d654538dab;p=ceph-ci.git mgr/dashboard: A block-manager can not access the pool page Fixes: https://tracker.ceph.com/issues/41573 Signed-off-by: Volker Theile --- diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts index 9097d9dae93..50983ab85d5 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts @@ -17,6 +17,7 @@ import { ConfigurationService } from '../../../shared/api/configuration.service' import { PoolService } from '../../../shared/api/pool.service'; import { CriticalConfirmationModalComponent } from '../../../shared/components/critical-confirmation-modal/critical-confirmation-modal.component'; import { ExecutingTask } from '../../../shared/models/executing-task'; +import { AuthStorageService } from '../../../shared/services/auth-storage.service'; import { SummaryService } from '../../../shared/services/summary.service'; import { TaskWrapperService } from '../../../shared/services/task-wrapper.service'; import { SharedModule } from '../../../shared/shared.module'; @@ -81,9 +82,14 @@ describe('PoolListComponent', () => { }); describe('monAllowPoolDelete', () => { + let configOptRead: boolean; let configurationService: ConfigurationService; beforeEach(() => { + configOptRead = true; + spyOn(TestBed.get(AuthStorageService), 'getPermissions').and.callFake(() => ({ + configOpt: { read: configOptRead } + })); configurationService = TestBed.get(ConfigurationService); }); @@ -128,6 +134,13 @@ describe('PoolListComponent', () => { component = fixture.componentInstance; expect(component.monAllowPoolDelete).toBe(false); }); + + it('should set value correctly w/o config-opt read privileges', () => { + configOptRead = false; + fixture = TestBed.createComponent(PoolListComponent); + component = fixture.componentInstance; + expect(component.monAllowPoolDelete).toBe(false); + }); }); describe('pool deletion', () => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts index a54679ba750..c73109e8ea5 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts @@ -96,14 +96,18 @@ export class PoolListComponent implements OnInit { } ]; - this.configurationService.get('mon_allow_pool_delete').subscribe((data: any) => { - if (_.has(data, 'value')) { - const monSection = _.find(data.value, (v) => { - return v.section === 'mon'; - }) || { value: false }; - this.monAllowPoolDelete = monSection.value === 'true' ? true : false; - } - }); + // Note, we need read permissions to get the 'mon_allow_pool_delete' + // configuration option. + if (this.permissions.configOpt.read) { + this.configurationService.get('mon_allow_pool_delete').subscribe((data: any) => { + if (_.has(data, 'value')) { + const monSection = _.find(data.value, (v) => { + return v.section === 'mon'; + }) || { value: false }; + this.monAllowPoolDelete = monSection.value === 'true' ? true : false; + } + }); + } } ngOnInit() {