]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: feature-toggles: minor fixes
authorErnesto Puerta <epuertat@redhat.com>
Wed, 6 Feb 2019 11:55:35 +0000 (12:55 +0100)
committerErnesto Puerta <epuertat@redhat.com>
Mon, 11 Feb 2019 11:07:55 +0000 (12:07 +0100)
Fixes: http://tracker.ceph.com/issues/37530
Signed-off-by: Ernesto Puerta <epuertat@redhat.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health/health.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health/health.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health/health.component.ts
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.ts
src/pybind/mgr/dashboard/frontend/src/locale/messages.xlf
src/pybind/mgr/dashboard/plugins/feature_toggles.py

index e9df42074acfc1fa238250d91b94d0c5310d71c6..358c712785b1f41815fbfd872186393ad2fa7b58 100644 (file)
@@ -1,5 +1,4 @@
-<ng-container *ngIf="enabled_feature$ | async as enabled_feature">
-<div *ngIf="healthData"
+<div *ngIf="healthData && enabledFeature$ | async as enabledFeature"
      class="container-fluid">
   <cd-info-group groupTitle="Status"
                  i18n-groupTitle
                   link="/rgw/daemon"
                   class="col-sm-6 col-md-4 col-lg-3"
                   contentClass="content-medium content-highlight"
-                  *ngIf="enabled_feature.rgw && healthData.rgw != null">
+                  *ngIf="enabledFeature.rgw && healthData.rgw != null">
       {{ healthData.rgw }} total
     </cd-info-card>
     <cd-info-card cardTitle="Metadata Servers"
                   i18n-cardTitle
                   class="col-sm-6 col-md-4 col-lg-3"
-                  *ngIf="(enabled_feature.cephfs && healthData.fs_map | mdsSummary) as transformedResult"
+                  *ngIf="(enabledFeature.cephfs && healthData.fs_map | mdsSummary) as transformedResult"
                   [contentClass]="(transformedResult.length > 1 ? 'text-area-size-2' : '') + ' content-highlight'">
       <span *ngFor="let result of transformedResult"
             [ngClass]="result.class">
                   link="/block/iscsi"
                   class="col-sm-6 col-md-4 col-lg-3"
                   contentClass="content-medium content-highlight"
-                  *ngIf="enabled_feature.iscsi && healthData.iscsi_daemons != null">
+                  *ngIf="enabledFeature.iscsi && healthData.iscsi_daemons != null">
       {{ healthData.iscsi_daemons }} total
     </cd-info-card>
   </cd-info-group>
     </ng-container>
   </ng-template>
 </div>
-</ng-container>
index 8bb61cf2cd879ab64998079bd9b5c630c3e6c54f..cc5a3b61dbecca5e03b320a49355aba278a05871 100644 (file)
@@ -46,17 +46,7 @@ describe('HealthComponent', () => {
       return new Permissions({ log: ['read'] });
     }
   };
-  const fakeFeatureTogglesService = {
-    get: () => {
-      return of({
-        rbd: true,
-        mirroring: true,
-        iscsi: true,
-        cephfs: true,
-        rgw: true
-      });
-    }
-  };
+  let fakeFeatureTogglesService;
 
   configureTestBed({
     imports: [SharedModule, HttpClientTestingModule, PopoverModule.forRoot()],
@@ -72,12 +62,20 @@ describe('HealthComponent', () => {
     providers: [
       i18nProviders,
       { provide: AuthStorageService, useValue: fakeAuthStorageService },
-      { provide: FeatureTogglesService, useValue: fakeFeatureTogglesService },
       PgCategoryService
     ]
   });
 
   beforeEach(() => {
+    fakeFeatureTogglesService = spyOn(TestBed.get(FeatureTogglesService), 'get').and.returnValue(
+      of({
+        rbd: true,
+        mirroring: true,
+        iscsi: true,
+        cephfs: true,
+        rgw: true
+      })
+    );
     fixture = TestBed.createComponent(HealthComponent);
     component = fixture.componentInstance;
     getHealthSpy = spyOn(TestBed.get(HealthService), 'getMinimalHealth');
@@ -98,6 +96,32 @@ describe('HealthComponent', () => {
     expect(infoCards.length).toBe(18);
   });
 
+  describe('features disabled', () => {
+    beforeEach(() => {
+      fakeFeatureTogglesService.and.returnValue(
+        of({
+          rbd: false,
+          mirroring: false,
+          iscsi: false,
+          cephfs: false,
+          rgw: false
+        })
+      );
+      fixture = TestBed.createComponent(HealthComponent);
+      component = fixture.componentInstance;
+    });
+
+    it('should not render cards related to disabled features', () => {
+      fixture.detectChanges();
+
+      const infoGroups = fixture.debugElement.nativeElement.querySelectorAll('cd-info-group');
+      expect(infoGroups.length).toBe(3);
+
+      const infoCards = fixture.debugElement.nativeElement.querySelectorAll('cd-info-card');
+      expect(infoCards.length).toBe(15);
+    });
+  });
+
   it('should render all except "Status" group and cards', () => {
     const payload = _.cloneDeep(healthPayload);
     payload.health.status = '';
index 713a05ea6c9f8ca3e7cce89ae6e39ab52c9c557e..ae75eca6482667eb022f7a6da06f70795fb85956 100644 (file)
@@ -22,7 +22,7 @@ export class HealthComponent implements OnInit, OnDestroy {
   healthData: any;
   interval: number;
   permissions: Permissions;
-  enabled_feature$: FeatureTogglesMap$;
+  enabledFeature$: FeatureTogglesMap$;
 
   constructor(
     private healthService: HealthService,
@@ -32,7 +32,7 @@ export class HealthComponent implements OnInit, OnDestroy {
     private featureToggles: FeatureTogglesService
   ) {
     this.permissions = this.authStorageService.getPermissions();
-    this.enabled_feature$ = this.featureToggles.get();
+    this.enabledFeature$ = this.featureToggles.get();
   }
 
   ngOnInit() {
index 307966699c621dd3784155b399296da9a4746ae5..a77c7d370356001dd40ba94be81e55437cb4aa78 100644 (file)
@@ -1,4 +1,3 @@
-<ng-container *ngIf="enabled_feature$ | async as enabled_feature">
 <nav class="navbar navbar-default navbar-main">
   <!-- Brand and toggle get grouped for better mobile display -->
 
@@ -21,7 +20,8 @@
   </div>
 
   <!-- Collect the nav links, forms, and other content for toggling -->
-  <div class="collapse navbar-collapse"
+  <div *ngIf="enabledFeature$ | async as enabledFeature"
+       class="collapse navbar-collapse"
        id="bs-example-navbar-collapse-1"
        [collapse]="isCollapsed">
     <ul class="nav navbar-nav navbar-primary">
           routerLinkActive="active"
           class="dropdown tc_menuitem tc_menuitem_block"
           *ngIf="
-          (enabled_feature.rbd || enabled_feature.mirroring || enabled_feature.iscsi) &&
+          (enabledFeature.rbd || enabledFeature.mirroring || enabledFeature.iscsi) &&
           (permissions.rbdImage.read || permissions.rbdMirroring.read || permissions.iscsi.read)">
         <a dropdownToggle
            class="dropdown-toggle"
 
         <ul class="dropdown-menu">
           <li routerLinkActive="active"
-              *ngIf="enabled_feature.rbd && permissions.rbdImage.read">
+              *ngIf="enabledFeature.rbd && permissions.rbdImage.read">
             <a i18n
                class="dropdown-item"
                routerLink="/block/rbd">Images</a>
 
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_block_mirroring"
-              *ngIf="enabled_feature.mirroring && permissions.rbdMirroring.read">
+              *ngIf="enabledFeature.mirroring && permissions.rbdMirroring.read">
             <a class="dropdown-item"
                routerLink="/block/mirroring">
               <ng-container i18n>Mirroring</ng-container>
           </li>
 
           <li routerLinkActive="active"
-              *ngIf="enabled_feature.iscsi && permissions.iscsi.read">
+              *ngIf="enabledFeature.iscsi && permissions.iscsi.read">
             <a i18n
                class="dropdown-item"
                routerLink="/block/iscsi">iSCSI</a>
       <!-- Filesystem -->
       <li routerLinkActive="active"
           class="tc_menuitem tc_menuitem_cephs"
-          *ngIf="enabled_feature.cephfs && permissions.cephfs.read">
+          *ngIf="enabledFeature.cephfs && permissions.cephfs.read">
         <a i18n
            routerLink="/cephfs">Filesystems</a>
       </li>
       <li dropdown
           routerLinkActive="active"
           class="dropdown tc_menuitem tc_menuitem_rgw"
-          *ngIf="enabled_feature.rgw && permissions.rgw.read">
+          *ngIf="enabledFeature.rgw && permissions.rgw.read">
         <a dropdownToggle
            class="dropdown-toggle"
            data-toggle="dropdown">
   </div>
   <!-- /.navbar-collapse -->
 </nav>
-</ng-container>
index 018df3f14bdd04f81bd81334135c8eefbcaa57f6..5f8d1f5a7e96a8c20645b500f41ee9de10afed74 100644 (file)
@@ -20,7 +20,7 @@ export class NavigationComponent implements OnInit {
 
   isCollapsed = true;
   prometheusConfigured = false;
-  enabled_feature$: FeatureTogglesMap$;
+  enabledFeature$: FeatureTogglesMap$;
 
   constructor(
     private authStorageService: AuthStorageService,
@@ -29,7 +29,7 @@ export class NavigationComponent implements OnInit {
     private featureToggles: FeatureTogglesService
   ) {
     this.permissions = this.authStorageService.getPermissions();
-    this.enabled_feature$ = this.featureToggles.get();
+    this.enabledFeature$ = this.featureToggles.get();
   }
 
   ngOnInit() {
index 6ddc58e45d3c558a9d7e23d58a2ebd91ded5518f..c39f954b7fe1a45ac29192524d4a011690836747 100644 (file)
@@ -6,7 +6,7 @@
         <source>Toggle navigation</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/core/navigation/navigation/navigation.component.html</context>
-          <context context-type="linenumber">16</context>
+          <context context-type="linenumber">15</context>
         </context-group>
       </trans-unit><trans-unit id="f65253954b66e929a8b4d5ecaf61f9129f8cec64" datatype="html">
         <source>Dashboard</source>
@@ -28,7 +28,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">82</context>
+          <context context-type="linenumber">81</context>
         </context-group>
       </trans-unit><trans-unit id="624f596cc3320f5e0a0d7c7346c364e5af9bdd8c" datatype="html">
         <source>Monitors</source>
@@ -38,7 +38,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">49</context>
+          <context context-type="linenumber">48</context>
         </context-group>
       </trans-unit><trans-unit id="1a9183778f2c6473d7ccb080f651caa01faaf70c" datatype="html">
         <source>OSDs</source>
@@ -48,7 +48,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">58</context>
+          <context context-type="linenumber">57</context>
         </context-group>
       </trans-unit><trans-unit id="4a41f824a35ba01d5bd7be61aa06b3e8145209d0" datatype="html">
         <source>Configuration</source>
@@ -86,7 +86,7 @@
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">191</context>
+          <context context-type="linenumber">190</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/cephfs/cephfs-detail/cephfs-detail.component.html</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">4</context>
+          <context context-type="linenumber">3</context>
         </context-group>
       </trans-unit><trans-unit id="57ec6032f5618d4a9f16eb950ad23d2ce7c24b54" datatype="html">
         <source>Cluster ID</source>
         <source>Cluster Status</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">16</context>
+          <context context-type="linenumber">15</context>
         </context-group>
       </trans-unit><trans-unit id="1d4bc612bbf19aa9553853266b9e92c9d75f4464" datatype="html">
         <source>Manager Daemons</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">70</context>
+          <context context-type="linenumber">69</context>
         </context-group>
       </trans-unit><trans-unit id="946ac5dea9921dc09d7b0a63b89535371f283b19" datatype="html">
         <source>Object Gateways</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">91</context>
+          <context context-type="linenumber">90</context>
         </context-group>
       </trans-unit><trans-unit id="ff03fa5bcf37c4da46ad736c1f7d03f959e8ba9a" datatype="html">
         <source>Metadata Servers</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">99</context>
+          <context context-type="linenumber">98</context>
         </context-group>
       </trans-unit><trans-unit id="d817609ba4993eba859409ab71e566168f4d5f5a" datatype="html">
         <source>iSCSI Gateways</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">110</context>
+          <context context-type="linenumber">109</context>
         </context-group>
       </trans-unit><trans-unit id="42c13e50391250ea9379bdf55d5d6c0228c0c8bc" datatype="html">
         <source>Client IOPS</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">126</context>
+          <context context-type="linenumber">125</context>
         </context-group>
       </trans-unit><trans-unit id="52213660b2454d139ada3079a42ec6caf3c3c01e" datatype="html">
         <source>Client Throughput</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">135</context>
+          <context context-type="linenumber">134</context>
         </context-group>
       </trans-unit><trans-unit id="32efd1c3f70e3c5244239de97a2cc95d98534a14" datatype="html">
         <source>Client Read/Write</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">144</context>
+          <context context-type="linenumber">143</context>
         </context-group>
       </trans-unit><trans-unit id="5277e7546d03a767761199b70deb8c77a921b390" datatype="html">
         <source>Client Recovery</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">162</context>
+          <context context-type="linenumber">161</context>
         </context-group>
       </trans-unit><trans-unit id="6d9a9f55046891733ef71170e7652063765eb542" datatype="html">
         <source>Scrub</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">171</context>
+          <context context-type="linenumber">170</context>
         </context-group>
       </trans-unit><trans-unit id="3cc9c2ae277393b3946b38c088dabff671b1ee1b" datatype="html">
         <source>Performance</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">120</context>
+          <context context-type="linenumber">119</context>
         </context-group>
       </trans-unit><trans-unit id="88f383269db2d32cccee9e936fe549dccb9fdbf4" datatype="html">
         <source>Raw Capacity</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">201</context>
+          <context context-type="linenumber">200</context>
         </context-group>
       </trans-unit><trans-unit id="afdb601c16162f2c798b16a2920955f1cc6a20aa" datatype="html">
         <source>Objects</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">214</context>
+          <context context-type="linenumber">213</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/rbd-details/rbd-details.component.html</context>
         <source>PGs per OSD</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">223</context>
+          <context context-type="linenumber">222</context>
         </context-group>
       </trans-unit><trans-unit id="498a109c6e9e94f1966de01aa0326f7f0ac6fb52" datatype="html">
         <source>PG Status</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">232</context>
+          <context context-type="linenumber">231</context>
         </context-group>
       </trans-unit><trans-unit id="ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa" datatype="html">
         <source>Capacity</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">182</context>
+          <context context-type="linenumber">181</context>
         </context-group>
       </trans-unit><trans-unit id="44ecac93d67c6a671198091c2270354f80322327" datatype="html">
         <source><x id="START_ITALIC_TEXT" ctype="x-i" equiv-text="&lt;i&gt;"/><x id="CLOSE_ITALIC_TEXT" ctype="x-i" equiv-text="&lt;/i&gt;"/> See <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Logs<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more details.</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/dashboard/health/health.component.html</context>
-          <context context-type="linenumber">266</context>
+          <context context-type="linenumber">265</context>
         </context-group>
       </trans-unit><trans-unit id="f0b5d789d42c0e69348e5fe0037fcbf5b5fbbdcc" datatype="html">
         <source>Move an image to trash</source>
index 22e1336ec3e37d4ddb25191e37a3a5aa59a38a93..7edbfa8f6adafb7f8e0b5d36072b7ae1c00faf12 100644 (file)
@@ -54,7 +54,6 @@ class FeatureToggles(I.CanMgr, I.CanLog, I.Setupable, I.HasOptions,
 
     @PM.add_hook
     def setup(self):
-        url_prefix = self.mgr.get_module_option('url_prefix')
         self.Controller2Feature = {
             controller: feature
             for feature, controllers in Feature2Controller.items()
@@ -104,7 +103,7 @@ class FeatureToggles(I.CanMgr, I.CanLog, I.Setupable, I.HasOptions,
     def _get_feature_from_request(self, request):
         try:
             return self.Controller2Feature[
-                cherrypy.request.handler.callable.__self__]
+                request.handler.callable.__self__]
         except (AttributeError, KeyError):
             return None
 
@@ -128,9 +127,7 @@ class FeatureToggles(I.CanMgr, I.CanLog, I.Setupable, I.HasOptions,
 
     @PM.add_hook
     def get_controllers(self):
-        from ..controllers import ApiController,\
-            RESTController, Endpoint, ReadPermission
-        from ..security import Scope
+        from ..controllers import ApiController, RESTController
 
         @ApiController('/feature_toggles')
         class FeatureTogglesEndpoint(RESTController):