]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Change the provider of services to root 28312/head
authorTiago Melo <tmelo@suse.com>
Wed, 22 May 2019 08:58:36 +0000 (08:58 +0000)
committerTiago Melo <tmelo@suse.com>
Thu, 30 May 2019 12:06:45 +0000 (12:06 +0000)
It looks like that even if we provide a service only in 1 module, there are
still situations where angular will create multiple instances of that service.

By setting root as its providers, this no longer happens.

Fixes: http://tracker.ceph.com/issues/39996
Signed-off-by: Tiago Melo <tmelo@suse.com>
(cherry picked from commit cc81bbc83b8276855d3f8b4d57d17e4b2f348508)

24 files changed:
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-form/rbd-snapshot-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool.module.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/components/usage-bar/usage-bar.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/forms/cd-form-builder.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/api-interceptor.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/auth-guard.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/auth-storage.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/feature-toggles-guard.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/feature-toggles.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/formatter.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/module-status-guard.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/prometheus-alert-formatter.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/prometheus-alert.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/prometheus-notification.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/rbd-configuration.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/refresh-interval.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/services.module.ts [deleted file]
src/pybind/mgr/dashboard/frontend/src/app/shared/services/summary.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/shared.module.ts

index 9dea478ef8a7018221885693374ce588a98284b4..fe292c50a766528b5786aa52dd5ca1ba2cf7729b 100644 (file)
@@ -10,7 +10,6 @@ import { configureTestBed, i18nProviders } from '../../../../testing/unit-test-h
 import { ApiModule } from '../../../shared/api/api.module';
 import { ComponentsModule } from '../../../shared/components/components.module';
 import { AuthStorageService } from '../../../shared/services/auth-storage.service';
-import { ServicesModule } from '../../../shared/services/services.module';
 import { RbdSnapshotFormComponent } from './rbd-snapshot-form.component';
 
 describe('RbdSnapshotFormComponent', () => {
@@ -22,7 +21,6 @@ describe('RbdSnapshotFormComponent', () => {
       ReactiveFormsModule,
       ComponentsModule,
       HttpClientTestingModule,
-      ServicesModule,
       ApiModule,
       ToastModule.forRoot(),
       RouterTestingModule
index 522c60f8737242ecb5acc298688816fccbf52231..233b79cf26a60776629d574aa16e4484c9137de5 100644 (file)
@@ -23,7 +23,6 @@ import { Permissions } from '../../../shared/models/permissions';
 import { PipesModule } from '../../../shared/pipes/pipes.module';
 import { AuthStorageService } from '../../../shared/services/auth-storage.service';
 import { NotificationService } from '../../../shared/services/notification.service';
-import { ServicesModule } from '../../../shared/services/services.module';
 import { SummaryService } from '../../../shared/services/summary.service';
 import { TaskListService } from '../../../shared/services/task-list.service';
 import { RbdSnapshotListComponent } from './rbd-snapshot-list.component';
@@ -49,7 +48,6 @@ describe('RbdSnapshotListComponent', () => {
       DataTableModule,
       ComponentsModule,
       ToastModule.forRoot(),
-      ServicesModule,
       ApiModule,
       HttpClientTestingModule,
       RouterTestingModule,
index 66be4de9d5822b3d6ac6403982ab10b4e2c2b145..0d3f6c56e9ff6e5cdd749444ba74db6384532a8b 100644 (file)
@@ -9,7 +9,6 @@ import { TabsModule } from 'ngx-bootstrap/tabs';
 import { TooltipModule } from 'ngx-bootstrap/tooltip';
 
 import { ActionLabels, URLVerbs } from '../../shared/constants/app.constants';
-import { ServicesModule } from '../../shared/services/services.module';
 import { SharedModule } from '../../shared/shared.module';
 import { BlockModule } from '../block/block.module';
 import { CephSharedModule } from '../shared/ceph-shared.module';
@@ -28,7 +27,6 @@ import { PoolListComponent } from './pool-list/pool-list.component';
     RouterModule,
     ReactiveFormsModule,
     BsDropdownModule,
-    ServicesModule,
     TooltipModule.forRoot(),
     BlockModule
   ],
index 5d8ba0a4c045d7ddd22144873c5ec5a68eeba400..334e601f471c75f7f483e8b15980ec6f318ac446 100644 (file)
@@ -4,7 +4,6 @@ import { TooltipModule } from 'ngx-bootstrap/tooltip';
 
 import { configureTestBed } from '../../../../testing/unit-test-helper';
 import { PipesModule } from '../../pipes/pipes.module';
-import { ServicesModule } from '../../services/services.module';
 import { UsageBarComponent } from './usage-bar.component';
 
 describe('UsageBarComponent', () => {
@@ -12,7 +11,7 @@ describe('UsageBarComponent', () => {
   let fixture: ComponentFixture<UsageBarComponent>;
 
   configureTestBed({
-    imports: [PipesModule, ServicesModule, TooltipModule.forRoot()],
+    imports: [PipesModule, TooltipModule.forRoot()],
     declarations: [UsageBarComponent]
   });
 
index e2710d0d4ac486f928a31e7d30ed27dc0847a240..307407a2fc58398358f36f418ef9831865d3d1a9 100644 (file)
@@ -1,14 +1,13 @@
 import { Injectable } from '@angular/core';
 import { FormBuilder } from '@angular/forms';
 
-import { ServicesModule } from '../services/services.module';
 import { CdFormGroup } from './cd-form-group';
 
 /**
  * CdFormBuilder extends FormBuilder to create an CdFormGroup based form.
  */
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class CdFormBuilder extends FormBuilder {
   group(
index 1e10ddd494f6310d4843ed2b9d2f59e870ee2ac5..374f863717dac60790722334ccae46663456c8cc 100644 (file)
@@ -17,10 +17,9 @@ import { CdNotificationConfig } from '../models/cd-notification';
 import { FinishedTask } from '../models/finished-task';
 import { AuthStorageService } from './auth-storage.service';
 import { NotificationService } from './notification.service';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class ApiInterceptorService implements HttpInterceptor {
   constructor(
index 2b4f635f63d6da4cb90bb7954a80688cf12707e2..7e11d9a2d033804488e687e5504b884ede4bfb0d 100644 (file)
@@ -2,10 +2,9 @@ import { Injectable } from '@angular/core';
 import { CanActivate, CanActivateChild, Router } from '@angular/router';
 
 import { AuthStorageService } from './auth-storage.service';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class AuthGuardService implements CanActivate, CanActivateChild {
   constructor(private router: Router, private authStorageService: AuthStorageService) {}
index b0053d0e3991824c9b316910b4e1226fdfd39c78..cab5bc813ca36109eef46f20452da89b8e3d6603 100644 (file)
@@ -1,10 +1,9 @@
 import { Injectable } from '@angular/core';
 
 import { Permissions } from '../models/permissions';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class AuthStorageService {
   constructor() {}
index 07ee7d5c4fbaebe16320b444f2ecc830f6d69661..3cad644d91cefcc05708ebdaf88c8f9d6cc74f6f 100644 (file)
@@ -4,10 +4,9 @@ import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router } from '@
 import { map } from 'rxjs/operators';
 
 import { FeatureTogglesMap, FeatureTogglesService } from './feature-toggles.service';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class FeatureTogglesGuardService implements CanActivate, CanActivateChild {
   constructor(private router: Router, private featureToggles: FeatureTogglesService) {}
index d78abe90668bd30edb78465597ed732a901b9803..9104e0b420137114a10f931c7de1aebd27845920 100644 (file)
@@ -4,13 +4,11 @@ import { Injectable } from '@angular/core';
 import { Observable, timer } from 'rxjs';
 import { flatMap, shareReplay } from 'rxjs/operators';
 
-import { ServicesModule } from './services.module';
-
 export type FeatureTogglesMap = Map<string, boolean>;
 export type FeatureTogglesMap$ = Observable<FeatureTogglesMap>;
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class FeatureTogglesService {
   readonly API_URL: string = 'api/feature_toggles';
index 51ac884150d04cd0850b77ff6d46784037e7a0f2..6c9ce12b20962cf88662d60d623b1fc5930557b4 100644 (file)
@@ -2,10 +2,8 @@ import { Injectable } from '@angular/core';
 
 import * as _ from 'lodash';
 
-import { ServicesModule } from './services.module';
-
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class FormatterService {
   constructor() {}
index 98c4b490a7039a42d3c66f6b0f0d0e005a1b3e87..50bcc947d69d732545105a848344683dbf4dc407 100644 (file)
@@ -5,8 +5,6 @@ import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router } from '@
 import { of as observableOf } from 'rxjs';
 import { catchError, map } from 'rxjs/operators';
 
-import { ServicesModule } from './services.module';
-
 /**
  * This service checks if a route can be activated by executing a
  * REST API call to '/api/<apiPath>/status'. If the returned response
@@ -33,7 +31,7 @@ import { ServicesModule } from './services.module';
  * ...
  */
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class ModuleStatusGuardService implements CanActivate, CanActivateChild {
   // TODO: Hotfix - remove WHITELIST'ing when a generic ErrorComponent is implemented
index 14bd6b51e1b14c5f2526d3f71274235704772a26..e8ec58faa63b5fc3f5bc8b488f2d676aba920898 100644 (file)
@@ -8,11 +8,10 @@ import { NotificationType } from '../enum/notification-type.enum';
 import { CdNotification, CdNotificationConfig } from '../models/cd-notification';
 import { FinishedTask } from '../models/finished-task';
 import { CdDatePipe } from '../pipes/cd-date.pipe';
-import { ServicesModule } from './services.module';
 import { TaskMessageService } from './task-message.service';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class NotificationService {
   private hideToasties = false;
index 8fdc5ddb68fceacb37e7e153218d7083142aa262..f172ed70e4b3c543d114bb3035482e13e870ec02 100644 (file)
@@ -10,10 +10,9 @@ import {
   PrometheusNotificationAlert
 } from '../models/prometheus-alerts';
 import { NotificationService } from './notification.service';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class PrometheusAlertFormatter {
   constructor(private notificationService: NotificationService) {}
index 9a6d26c88e230ba57c1f83052cad2c88aad9a55d..c7bdb9b1cbe9b9f4431eae09025cfc38384a8a7f 100644 (file)
@@ -5,10 +5,9 @@ import * as _ from 'lodash';
 import { PrometheusService } from '../api/prometheus.service';
 import { PrometheusAlert, PrometheusCustomAlert } from '../models/prometheus-alerts';
 import { PrometheusAlertFormatter } from './prometheus-alert-formatter';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class PrometheusAlertService {
   private canAlertsBeNotified = false;
index b7fc85fbd6f96b75633160b052e4fb581443190a..5b4f795bb5f5f80ba22c116905bb8df68be14403 100644 (file)
@@ -6,10 +6,9 @@ import { PrometheusService } from '../api/prometheus.service';
 import { CdNotificationConfig } from '../models/cd-notification';
 import { PrometheusNotification } from '../models/prometheus-alerts';
 import { PrometheusAlertFormatter } from './prometheus-alert-formatter';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class PrometheusNotificationService {
   private notifications: PrometheusNotification[];
index cf56d64d87beaa655ef318735658eb84e65a7911..10a0ac7060ec1621e95c4fca16619c28d57fb101 100644 (file)
@@ -7,7 +7,6 @@ import {
   RbdConfigurationSection,
   RbdConfigurationType
 } from '../models/configuration';
-import { ServicesModule } from './services.module';
 
 /**
  * Define here which options should be made available under which section heading.
@@ -15,7 +14,7 @@ import { ServicesModule } from './services.module';
  * this information.
  */
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class RbdConfigurationService {
   readonly sections: RbdConfigurationSection[];
index 4cc846acdb9b43df25b1a7a3b054cd18d4e5b3d2..0627d78ecf028315fa9a205296d340d43736f96a 100644 (file)
@@ -2,9 +2,8 @@ import { Injectable, OnDestroy } from '@angular/core';
 
 import { BehaviorSubject, interval, Subscription } from 'rxjs';
 
-import { ServicesModule } from './services.module';
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class RefreshIntervalService implements OnDestroy {
   private intervalTime: number;
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/services.module.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/services.module.ts
deleted file mode 100644 (file)
index 0278df0..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-
-@NgModule({
-  imports: [CommonModule]
-})
-export class ServicesModule {}
index 0f81659c7c7b4bee3d07039f18c72937eb991014..8124ecc8db42adf1f035ae24ead301dc671860d4 100644 (file)
@@ -6,10 +6,9 @@ import * as _ from 'lodash';
 import { BehaviorSubject, Subscription } from 'rxjs';
 
 import { ExecutingTask } from '../models/executing-task';
-import { ServicesModule } from './services.module';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class SummaryService {
   // Observable sources
index 5bbe9810221245b10fa1c2d1dcab96a44c333733..20ecd9d9891d6c98b631cb45ffa770bfa91c213c 100644 (file)
@@ -5,7 +5,6 @@ import * as _ from 'lodash';
 import { ExecutingTask } from '../models/executing-task';
 import { FinishedTask } from '../models/finished-task';
 import { Task } from '../models/task';
-import { ServicesModule } from './services.module';
 import { SummaryService } from './summary.service';
 
 class TaskSubscription {
@@ -21,7 +20,7 @@ class TaskSubscription {
 }
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class TaskManagerService {
   subscriptions: Array<TaskSubscription> = [];
index f457423fcd8b8140888937627cad3d5ff9be9fc0..d5244f672ee4f046bdde577db2cd107acdfe3501 100644 (file)
@@ -5,7 +5,6 @@ import { I18n } from '@ngx-translate/i18n-polyfill';
 import { Components } from '../enum/components.enum';
 import { FinishedTask } from '../models/finished-task';
 import { Task } from '../models/task';
-import { ServicesModule } from './services.module';
 
 export class TaskMessageOperation {
   running: string;
@@ -55,7 +54,7 @@ class TaskMessage {
 }
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class TaskMessageService {
   constructor(private i18n: I18n) {}
index c77938420ffb2d58ba919eb7d044794627128906..66668ec6838d208500de35cf19183dc070611c0f 100644 (file)
@@ -6,13 +6,12 @@ import { NotificationType } from '../enum/notification-type.enum';
 import { ExecutingTask } from '../models/executing-task';
 import { FinishedTask } from '../models/finished-task';
 import { NotificationService } from './notification.service';
-import { ServicesModule } from './services.module';
 import { SummaryService } from './summary.service';
 import { TaskManagerService } from './task-manager.service';
 import { TaskMessageService } from './task-message.service';
 
 @Injectable({
-  providedIn: ServicesModule
+  providedIn: 'root'
 })
 export class TaskWrapperService {
   constructor(
index a8ced08310221bf0b41c8a223a5a1b8ed52acfef..ae3a1c08358adcfe8c7016e2f67359493f361861 100644 (file)
@@ -9,27 +9,18 @@ import { PipesModule } from './pipes/pipes.module';
 import { AuthGuardService } from './services/auth-guard.service';
 import { AuthStorageService } from './services/auth-storage.service';
 import { FormatterService } from './services/formatter.service';
-import { ServicesModule } from './services/services.module';
 
 @NgModule({
   imports: [
     CommonModule,
     PipesModule,
     ComponentsModule,
-    ServicesModule,
     DataTableModule,
     ApiModule,
     DirectivesModule
   ],
   declarations: [],
-  exports: [
-    ComponentsModule,
-    PipesModule,
-    ServicesModule,
-    DataTableModule,
-    ApiModule,
-    DirectivesModule
-  ],
+  exports: [ComponentsModule, PipesModule, DataTableModule, ApiModule, DirectivesModule],
   providers: [AuthStorageService, AuthGuardService, FormatterService]
 })
 export class SharedModule {}