You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by dg...@apache.org on 2020/01/14 14:20:02 UTC

[incubator-dlab] branch multiple-cloud updated: [DLAB-1125]: Implement support a multiple cloud functionality

This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch multiple-cloud
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git


The following commit(s) were added to refs/heads/multiple-cloud by this push:
     new 5988619  [DLAB-1125]: Implement support a multiple cloud functionality
5988619 is described below

commit 59886197755de6da37e2780630b3212c58c2d2a0
Author: Dmytro Gnatyshyn <di...@ukr.net>
AuthorDate: Tue Jan 14 16:18:39 2020 +0200

    [DLAB-1125]: Implement support a multiple cloud functionality
---
 .../project-form/project-form.component.html       |  2 +-
 .../project/project-form/project-form.component.ts |  3 +-
 .../services/applicationServiceFacade.service.ts   | 26 ++++++-------
 .../services/dataengineConfiguration.service.ts    |  8 ++--
 .../src/app/core/services/userResource.service.ts  | 10 ++---
 .../webapp/src/app/login/login.component.html      |  8 ++--
 .../webapp/src/app/login/login.component.ts        |  5 ---
 .../reporting-grid/reporting-grid.component.html   | 32 ++++++++--------
 .../src/app/reporting/reporting.component.ts       | 24 ++++++------
 .../cluster-details/cluster-details.component.html | 26 ++++++-------
 .../cluster-details/cluster-details.component.ts   | 10 +++--
 ...utational-resource-create-dialog.component.html | 12 +++---
 ...mputational-resource-create-dialog.component.ts | 19 ++++++----
 .../computational-resource-create.model.ts         |  5 +--
 .../computational-resources-list.component.ts      | 18 +++++----
 .../ami-create-dialog.component.html               | 10 ++---
 .../ami-create-dialog.component.ts                 |  7 ++--
 .../cost-details-dialog.component.html             | 22 +++++------
 .../cost-details-dialog.component.ts               |  2 +
 .../create-environment.component.html              | 10 ++---
 .../create-environment.component.ts                |  2 +-
 .../detail-dialog/detail-dialog.component.html     | 14 +++----
 .../detail-dialog/detail-dialog.component.ts       |  1 +
 .../resources-grid/resources-grid.component.html   |  8 ++--
 .../resources-grid/resources-grid.component.ts     | 15 ++++----
 .../resources-grid/resources-grid.model.ts         | 25 ++++++------
 .../src/app/shared/navbar/navbar.component.ts      |  1 -
 .../webapp/src/dictionary/aws.dictionary.ts        | 41 +-------------------
 .../webapp/src/dictionary/azure.dictionary.ts      | 42 +--------------------
 .../webapp/src/dictionary/gcp.dictionary.ts        | 43 +--------------------
 .../webapp/src/dictionary/global.dictionary.ts     | 44 ++++++++++++++++++++--
 31 files changed, 211 insertions(+), 284 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
index e278dce..8c18309 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
@@ -77,7 +77,7 @@
                   Project name can only contain letters and numbers
                 </span>
                 <span class="error" *ngIf="projectForm?.controls.name.hasError('limit')">
-                  Project name cannot be longer than {{ DICTIONARY.max_project_name_length}} characters
+                  Project name cannot be longer than {{ maxProjectNameLength }} characters
                 </span>
               </div>
             </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
index 5eb522a..d7ba0a1 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
@@ -46,6 +46,7 @@ export class ProjectFormComponent implements OnInit {
   public projectList: Project[] = [];
   public accessKeyValid: boolean;
   public keyLabel: string = '';
+  public maxProjectNameLength: number = 10;
 
   @Input() item: any;
   @Output() update: EventEmitter<{}> = new EventEmitter();
@@ -204,6 +205,6 @@ export class ProjectFormComponent implements OnInit {
   }
 
   private providerMaxLength(control) {
-    return control.value.length <= DICTIONARY.max_project_name_length ? null : { limit: true };
+    return control.value.length <= this.maxProjectNameLength ? null : { limit: true };
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
index e2059f8..6e2aab3 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
@@ -203,33 +203,33 @@ export class ApplicationServiceFacade {
 
   public buildCreateComputationalResources_DataengineServiceRequest(data, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.PUT,
-      '/api/'+ provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_DATAENGINESERVICE),
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_DATAENGINESERVICE),
       data,
       { observe: 'response' });
   }
 
   public buildCreateComputationalResources_DataengineRequest(data, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.PUT,
-      '/api/'+ provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_DATAENGINE),
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_DATAENGINE),
       data,
       { observe: 'response' });
   }
 
-  public buildDeleteComputationalResourcesRequest(data): Observable<any> {
+  public buildDeleteComputationalResourcesRequest(data, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.DELETE,
-      this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES),
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES),
       data);
   }
 
-  public buildStopSparkClusterAction(data): Observable<any> {
+  public buildStopSparkClusterAction(data, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.DELETE,
-      this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES),
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES),
       data);
   }
 
-  public buildStartSparkClusterAction(params): Observable<any> {
+  public buildStartSparkClusterAction(params, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.PUT,
-      this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES) + params,
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES) + params,
       null);
   }
 
@@ -497,15 +497,15 @@ export class ApplicationServiceFacade {
       data);
   }
 
-  public buildGetClusterConfiguration(param): Observable<any> {
+  public buildGetClusterConfiguration(param, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.GET,
-      this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES) + param,
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES) + param,
       null);
   }
 
-  public buildEditClusterConfiguration(param, data): Observable<any> {
+  public buildEditClusterConfiguration(param, data, provider): Observable<any> {
     return this.buildRequest(HTTPMethod.PUT,
-      this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES) + param,
+      '/api/' + provider + this.requestRegistry.Item(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES) + param,
       data);
   }
 
@@ -631,7 +631,7 @@ export class ApplicationServiceFacade {
 
     // Computational Resources
     this.requestRegistry.Add(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES,
-      '/api/infrastructure_provision/computational_resources');
+      '/infrastructure_provision/computational_resources');
     this.requestRegistry.Add(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_DATAENGINESERVICE,
       '/infrastructure_provision/computational_resources/dataengine-service'); // emr(aws)
     this.requestRegistry.Add(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_DATAENGINE,
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/dataengineConfiguration.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/dataengineConfiguration.service.ts
index 5dcef3e..fe61c75 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/dataengineConfiguration.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/dataengineConfiguration.service.ts
@@ -28,19 +28,19 @@ import { ErrorUtils } from '../util';
 export class DataengineConfigurationService {
   constructor(private applicationServiceFacade: ApplicationServiceFacade) {}
 
-  public getClusterConfiguration(exploratory, cluster): Observable<{}> {
+  public getClusterConfiguration(exploratory, cluster, provider): Observable<{}> {
     const url = `/${exploratory}/${cluster}/config`;
     return this.applicationServiceFacade
-      .buildGetClusterConfiguration(url)
+      .buildGetClusterConfiguration(url, provider)
       .pipe(
         map(response => response),
         catchError(ErrorUtils.handleServiceError));
   }
 
-  public editClusterConfiguration(data, exploratory, cluster): Observable<{}> {
+  public editClusterConfiguration(data, exploratory, cluster, provider): Observable<{}> {
     const url = `/dataengine/${exploratory}/${cluster}/config`;
     return this.applicationServiceFacade
-      .buildEditClusterConfiguration(url, data)
+      .buildEditClusterConfiguration(url, data, provider)
       .pipe(
         map(response => response),
         catchError(ErrorUtils.handleServiceError));
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/userResource.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/userResource.service.ts
index e540729..04acbb8 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/userResource.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/userResource.service.ts
@@ -100,26 +100,26 @@ export class UserResourceService {
         catchError(ErrorUtils.handleServiceError));
   }
 
-  public suspendComputationalResource(notebookName: string, computationalResourceName: string): Observable<{}> {
+  public suspendComputationalResource(notebookName: string, computationalResourceName: string, provider: string): Observable<{}> {
     const body = JSON.stringify('/' + notebookName + '/' + computationalResourceName + '/terminate');
     return this.applicationServiceFacade
-      .buildDeleteComputationalResourcesRequest(body)
+      .buildDeleteComputationalResourcesRequest(body, provider)
       .pipe(
         map(response => response),
         catchError(ErrorUtils.handleServiceError));
   }
 
-  public toggleStopStartAction(project: string, notebook: string, resource: string, action): Observable<{}> {
+  public toggleStopStartAction(project: string, notebook: string, resource: string, action, provider: string): Observable<{}> {
     const url = `/${project}/${notebook}/${resource}/${action}`;
     if (action === 'stop') {
       return this.applicationServiceFacade
-        .buildStopSparkClusterAction(JSON.stringify(url))
+        .buildStopSparkClusterAction(JSON.stringify(url), provider)
         .pipe(
           map(response => response),
           catchError(ErrorUtils.handleServiceError));
     } else if (action === 'start') {
       return this.applicationServiceFacade
-        .buildStartSparkClusterAction(url)
+        .buildStartSparkClusterAction(url, provider)
         .pipe(
           map(response => response),
           catchError(ErrorUtils.handleServiceError));
diff --git a/services/self-service/src/main/resources/webapp/src/app/login/login.component.html b/services/self-service/src/main/resources/webapp/src/app/login/login.component.html
index 2266df3..d87e1d1 100644
--- a/services/self-service/src/main/resources/webapp/src/app/login/login.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/login/login.component.html
@@ -23,7 +23,7 @@
       <img src="assets/img/logo.png" alt="">
     </a>
     <form name="form" class="form-wrap" #f="ngForm" novalidate>
-      <!-- 
+      <!--
       <div class="input-icon-group">
         <span class="input-icon"><span class="login-icon icon-username"></span></span>
         <input type="text" class="input-with-icon" name="username" [(ngModel)]="model.username" [pattern]="userPattern" #username="ngModel" placeholder="Username" required />
@@ -34,8 +34,8 @@
         <input type="password" class="input-with-icon" placeholder="Password" name="password" [(ngModel)]="model.password" #password="ngModel" required />
       </div>
 
-      
-      <div class="form-group" [ngClass]="{'flex': DICTIONARY.cloud_provider === 'azure'}">
+
+      <div class="form-group" [ngClass]="{'flex': DICTIONARY['aws'].cloud_provider === 'azure'}">
         <button mat-raised-button [disabled]="loading || !username.valid || !password.valid"
                 (click)="login_btnClick();"
                 class="butt butt-login"
@@ -50,7 +50,7 @@
               </span>
             </span>
         </button>
-        <button *ngIf="DICTIONARY.cloud_provider === 'azure' && !DICTIONARY.use_ldap"
+        <button *ngIf="DICTIONARY['aws'].cloud_provider === 'azure' && !DICTIONARY['aws'].use_ldap"
                 class="butt butt-azure"
                 mat-raised-button (click)="loginWithAzure_btnClick();">
           Login with Azure
diff --git a/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts b/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts
index 64314c6..bc50072 100644
--- a/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts
@@ -22,7 +22,6 @@ import { Subscription } from 'rxjs';
 
 import { LoginModel } from './login.model';
 import { AppRoutingService, HealthStatusService, ApplicationSecurityService } from '../core/services';
-import { HTTP_STATUS_CODES } from '../core/util';
 import { DICTIONARY } from '../../dictionary/global.dictionary';
 
 @Component({
@@ -69,12 +68,8 @@ export class LoginComponent implements OnInit, OnDestroy {
 
         return false;
       }, error => {
-        if (DICTIONARY.cloud_provider === 'azure' && error && error.status === HTTP_STATUS_CODES.FORBIDDEN) {
-          window.location.href = error.headers.get('Location');
-        } else {
           this.error = error.message;
           this.loading = false;
-        }
       });
 
     return false;
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html
index f9bf7cf..e9b7e0d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html
@@ -30,7 +30,7 @@
           </i>
         </button>
       </th>
-      <td mat-cell *matCellDef="let element"> {{element[DICTIONARY.billing.dlabId]}} </td>
+      <td mat-cell *matCellDef="let element"> {{element[DICTIONARY['aws'].billing.dlabId]}} </td>
       <td mat-footer-cell *matFooterCellDef> Total </td>
     </ng-container>
 
@@ -72,7 +72,7 @@
           </i>
         </button>
       </th>
-      <td mat-cell *matCellDef="let element"> {{element[DICTIONARY.billing.resourceType]}} </td>
+      <td mat-cell *matCellDef="let element"> {{element[DICTIONARY['aws'].billing.resourceType]}} </td>
       <td mat-footer-cell *matFooterCellDef></td>
     </ng-container>
 
@@ -96,34 +96,34 @@
 
     <ng-container matColumnDef="shape">
       <th mat-header-cell *matHeaderCellDef class="th_shape">
-        <span class="label"> {{ DICTIONARY.instance_size}} </span>
+        <span class="label"> {{ DICTIONARY['aws'].instance_size}} </span>
         <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
           <i class="material-icons">
             <span
-              *ngIf="filteredReportData[DICTIONARY.billing.instance_size].length > 0; else shape_filtered">filter_list</span>
+              *ngIf="filteredReportData[DICTIONARY['aws'].billing.instance_size].length > 0; else shape_filtered">filter_list</span>
             <ng-template #shape_filtered>more_vert</ng-template>
           </i>
         </button>
       </th>
       <td mat-cell *matCellDef="let element">
-        <span [outerHTML]="element[DICTIONARY.billing.instance_size] | lineBreak"></span>
+        <span [outerHTML]="element[DICTIONARY['aws'].billing.instance_size] | lineBreak"></span>
       </td>
       <td mat-footer-cell *matFooterCellDef></td>
     </ng-container>
 
     <ng-container matColumnDef="service">
       <th mat-header-cell *matHeaderCellDef class="service">
-        <span class="label"> {{ DICTIONARY.service}} </span>
+        <span class="label"> {{ DICTIONARY['aws'].service}} </span>
         <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
           <i class="material-icons">
             <span
-              *ngIf="filteredReportData[DICTIONARY.billing.instance_size].length > 0; else service_filtered">filter_list</span>
+              *ngIf="filteredReportData[DICTIONARY['aws'].billing.instance_size].length > 0; else service_filtered">filter_list</span>
             <ng-template #service_filtered>more_vert</ng-template>
           </i>
         </button>
       </th>
       <td mat-cell *matCellDef="let element">
-        {{ element[DICTIONARY.billing.service] }}
+        {{ element[DICTIONARY['aws'].billing.service] }}
         <span *ngIf="element.resource_type">({{ element.resource_type }})</span>
       </td>
       <td mat-footer-cell *matFooterCellDef></td>
@@ -135,11 +135,11 @@
       </th>
 
       <td mat-cell *matCellDef="let element">
-        {{ element[DICTIONARY.billing.cost] }} {{ element[DICTIONARY.billing.currencyCode] }}
+        {{ element[DICTIONARY['aws'].billing.cost] }} {{ element[DICTIONARY['aws'].billing.currencyCode] }}
       </td>
       <td mat-footer-cell *matFooterCellDef>
-        <span *ngIf="reportData?.length">{{ fullReport[DICTIONARY.billing.costTotal] }}
-          {{ fullReport[DICTIONARY.billing.currencyCode] }}</span>
+        <span *ngIf="reportData?.length">{{ fullReport[DICTIONARY['aws'].billing.costTotal] }}
+          {{ fullReport[DICTIONARY['aws'].billing.currencyCode] }}</span>
       </td>
     </ng-container>
 
@@ -178,16 +178,16 @@
     <ng-container matColumnDef="shape-filter">
       <th mat-header-cell *matHeaderCellDef>
         <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)"
-          [type]="[DICTIONARY.billing.instance_size]" [items]="filterConfiguration[DICTIONARY.billing.instance_size]"
-          [model]="filteredReportData[DICTIONARY.billing.instance_size]"></multi-select-dropdown>
+          [type]="[DICTIONARY['aws'].billing.instance_size]" [items]="filterConfiguration[DICTIONARY['aws'].billing.instance_size]"
+          [model]="filteredReportData[DICTIONARY['aws'].billing.instance_size]"></multi-select-dropdown>
       </th>
     </ng-container>
     <ng-container matColumnDef="service-filter">
       <th mat-header-cell *matHeaderCellDef>
         <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)"
-          [type]="[DICTIONARY.billing.service_filter_key]"
-          [items]="filterConfiguration[DICTIONARY.billing.service_filter_key]"
-          [model]="filteredReportData[DICTIONARY.billing.service_filter_key]"></multi-select-dropdown>
+          [type]="[DICTIONARY['aws'].billing.service_filter_key]"
+          [items]="filterConfiguration[DICTIONARY['aws'].billing.service_filter_key]"
+          [model]="filteredReportData[DICTIONARY['aws'].billing.service_filter_key]"></multi-select-dropdown>
       </th>
     </ng-container>
     <ng-container matColumnDef="actions" stickyEnd>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
index 01126b9..7801c8f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
@@ -95,8 +95,8 @@ export class ReportingComponent implements OnInit, OnDestroy {
         this.reportingToolbar.reportData = this.data;
         if (!localStorage.getItem('report_period')) {
           localStorage.setItem('report_period', JSON.stringify({
-            start_date: this.data[DICTIONARY.billing.dateFrom],
-            end_date: this.data[DICTIONARY.billing.dateTo]
+            start_date: this.data[DICTIONARY['aws'].billing.dateFrom],
+            end_date: this.data[DICTIONARY['aws'].billing.dateTo]
           }));
           this.reportingToolbar.setDateRange();
         }
@@ -140,30 +140,30 @@ export class ReportingComponent implements OnInit, OnDestroy {
       if (item.project && projects.indexOf(item.project) === -1)
         projects.push(item.project);
 
-      if (item[DICTIONARY.billing.resourceType] && types.indexOf(item[DICTIONARY.billing.resourceType]) === -1)
-        types.push(item[DICTIONARY.billing.resourceType]);
+      if (item[DICTIONARY['aws'].billing.resourceType] && types.indexOf(item[DICTIONARY['aws'].billing.resourceType]) === -1)
+        types.push(item[DICTIONARY['aws'].billing.resourceType]);
 
-      if (item[DICTIONARY.billing.instance_size]) {
-        if (item[DICTIONARY.billing.instance_size].indexOf('Master') > -1) {
-          for (let shape of item[DICTIONARY.billing.instance_size].split('\n')) {
+      if (item[DICTIONARY['aws'].billing.instance_size]) {
+        if (item[DICTIONARY['aws'].billing.instance_size].indexOf('Master') > -1) {
+          for (let shape of item[DICTIONARY['aws'].billing.instance_size].split('\n')) {
             shape = shape.replace('Master: ', '');
             shape = shape.replace(/Slave:\s+\d+ x /, '');
             shape = shape.replace(/\s+/g, '');
 
             shapes.indexOf(shape) === -1 && shapes.push(shape);
           }
-        } else if (item[DICTIONARY.billing.instance_size].match(/\d x \S+/)) {
-          const parsedShape = item[DICTIONARY.billing.instance_size].match(/\d x \S+/)[0].split(' x ')[1];
+        } else if (item[DICTIONARY['aws'].billing.instance_size].match(/\d x \S+/)) {
+          const parsedShape = item[DICTIONARY['aws'].billing.instance_size].match(/\d x \S+/)[0].split(' x ')[1];
           if (shapes.indexOf(parsedShape) === -1) {
             shapes.push(parsedShape);
           }
         } else {
-          shapes.indexOf(item[DICTIONARY.billing.instance_size]) === -1 && shapes.push(item[DICTIONARY.billing.instance_size]);
+          shapes.indexOf(item[DICTIONARY['aws'].billing.instance_size]) === -1 && shapes.push(item[DICTIONARY['aws'].billing.instance_size]);
         }
       }
 
-      if (item[DICTIONARY.billing.service] && services.indexOf(item[DICTIONARY.billing.service]) === -1)
-        services.push(item[DICTIONARY.billing.service]);
+      if (item[DICTIONARY['aws'].billing.service] && services.indexOf(item[DICTIONARY['aws'].billing.service]) === -1)
+        services.push(item[DICTIONARY['aws'].billing.service]);
     });
 
     if (!this.reportingGrid.filterConfiguration || !localStorage.getItem('report_config')) {
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html
index 41c145e..04ea086 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html
@@ -35,7 +35,7 @@
               {{resource.status}}
             </span>
           </td>
-          <td>{{ resource[DICTIONARY[resource.image].master_node_shape] }}</td>
+          <td>{{ resource[DICTIONARY[PROVIDER][resource.image].master_node_shape] }}</td>
         </tr>
       </table>
       <div class="detail-info content-box" *ngIf="!resource.error_message">
@@ -49,7 +49,7 @@
           <div class="col">
             <p>Cluster version:</p>
           </div>
-          <div class="col"><span>{{ resource[DICTIONARY.cluster_version] }}</span></div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER].cluster_version] }}</span></div>
         </div>
         <div class="row-wrap">
           <div class="col">
@@ -63,34 +63,34 @@
         </div>
         <div class="row-wrap">
           <div class="col"
-            *ngIf="DICTIONARY.cloud_provider === 'gcp' && resource.image === 'docker.dlab-dataengine-service'; else inst">
-            <p>{{ DICTIONARY[resource.image].master_instance_number }}:</p>
+            *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.dlab-dataengine-service'; else inst">
+            <p>Master instance number:</p>
           </div>
           <ng-template #inst>
             <div class="col">
-              <p>{{ DICTIONARY[resource.image].instance_number }}:</p>
+              <p>Total instance number:</p>
             </div>
           </ng-template>
-          <div class="col"><span>{{ resource[DICTIONARY[resource.image].total_instance_number] }}</span></div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].total_instance_number] }}</span></div>
         </div>
         <div class="row-wrap"
-          *ngIf="DICTIONARY.cloud_provider === 'gcp' && resource.image === 'docker.dlab-dataengine-service'">
+          *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.dlab-dataengine-service'">
           <div class="col">
-            <p>{{ DICTIONARY[resource.image].slave_instance_number }}:</p>
+            <p>Slave instance number:</p>
           </div>
-          <div class="col"><span>{{ resource[DICTIONARY[resource.image].total_slave_instance_number] }}</span></div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].total_slave_instance_number] }}</span></div>
         </div>
         <div class="row-wrap">
           <div class="col">
-            <p>{{ DICTIONARY[resource.image].data_engine_master_instance_size }}:</p>
+            <p>Master instance size:</p>
           </div>
-          <div class="col"><span>{{ resource[DICTIONARY[resource.image].master_node_shape] }}</span></div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].master_node_shape] }}</span></div>
         </div>
         <div class="row-wrap" *ngIf="resource.image === 'docker.dlab-dataengine-service'">
           <div class="col">
-            <p>{{ DICTIONARY[resource.image].data_engine_slave_instance_size }}:</p>
+            <p>Slave instance size:</p>
           </div>
-          <div class="col"><span>{{ resource[DICTIONARY[resource.image].slave_node_shape] }}</span></div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].slave_node_shape] }}</span></div>
         </div>
 
         <div *ngIf="resource.status === 'running'">
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
index cc0211b..75ea01e 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
@@ -35,6 +35,7 @@ import { CLUSTER_CONFIGURATION } from '../computational-resource-create-dialog/c
 
 export class DetailComputationalResourcesComponent implements OnInit {
   readonly DICTIONARY = DICTIONARY;
+  readonly PROVIDER = this.data.environment.cloud_provider;
 
   resource: any;
   environment: any;
@@ -55,7 +56,9 @@ export class DetailComputationalResourcesComponent implements OnInit {
   ) { }
 
   ngOnInit() {
-    this.open(this.data.environment, this.data.resource)
+    this.open(this.data.environment, this.data.resource);
+
+    console.log(this.PROVIDER);
   }
 
   public open(environment, resource): void {
@@ -63,6 +66,7 @@ export class DetailComputationalResourcesComponent implements OnInit {
     this.resource = resource;
     this.environment = environment;
 
+
     this.upTimeInHours = (this.resource.up_time) ? DateUtils.diffBetweenDatesInHours(this.resource.up_time) : 0;
     this.upTimeSince = (this.resource.up_time) ? new Date(this.resource.up_time).toString() : '';
     this.initFormModel();
@@ -87,14 +91,14 @@ export class DetailComputationalResourcesComponent implements OnInit {
 
   public getClusterConfiguration(): void {
     this.dataengineConfigurationService
-      .getClusterConfiguration(this.environment.name, this.resource.computational_name)
+      .getClusterConfiguration(this.environment.name, this.resource.computational_name, this.PROVIDER)
       .subscribe((result: any) => this.config = result,
         error => this.toastr.error(error.message || 'Configuration loading failed!', 'Oops!'));
   }
 
   public editClusterConfiguration(data): void {
     this.dataengineConfigurationService
-      .editClusterConfiguration(data.configuration_parameters, this.environment.name, this.resource.computational_name)
+      .editClusterConfiguration(data.configuration_parameters, this.environment.name, this.resource.computational_name, this.PROVIDER)
       .subscribe(result => {
         this.dialogRef.close();
       },
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html
index b7a7b03..8daf498 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html
@@ -78,7 +78,7 @@
                 <span class="error" *ngIf="!resourceForm?.controls.cluster_alias_name.valid
                                             && resourceForm?.controls['cluster_alias_name'].dirty
                                             && !resourceForm?.controls['cluster_alias_name'].hasError('duplication')">
-                  Cluster name cannot be longer than {{DICTIONARY.max_cluster_name_length}} characters
+                  Cluster name cannot be longer than {{DICTIONARY[PROVIDER].max_cluster_name_length}} characters
                   and can only contain letters, numbers, hyphens and '_' but can not end with special
                   characters
                 </span>
@@ -88,7 +88,7 @@
 
           <div class="col">
             <div class="control-group" *ngIf="selectedImage?.image">
-              <label class="label">{{ DICTIONARY[selectedImage.image].instance_number }}</label>
+              <label class="label">Total instance number</label>
               <div class="control">
                 <input type="number" class="form-control" min="{{minInstanceNumber}}" max="{{maxInstanceNumber}}"
                   formControlName="instance_number" (keypress)="CheckUtils.isNumberKey($event)" />
@@ -100,10 +100,10 @@
             </div>
 
             <div class="control-group" *ngIf="selectedImage?.image">
-              <label class="label">{{ DICTIONARY[selectedImage.image].data_engine_master_instance_size }}</label>
+              <label class="label">Master instance size</label>
               <div class="control selector-wrapper">
                 <mat-form-field>
-                  <mat-label>Select {{ DICTIONARY.notebook_instance_size }}</mat-label>
+                  <mat-label>Select instance size</mat-label>
                   <mat-select formControlName="shape_master" disableOptionCentering>
                     <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
                       [label]="item.key | underscoreless">
@@ -121,10 +121,10 @@
 
             <div class="control-group" *ngIf="selectedImage?.image"
               [hidden]="selectedImage?.image === 'docker.dlab-dataengine'">
-              <label class="label">{{ DICTIONARY[selectedImage.image].data_engine_slave_instance_size }}</label>
+              <label class="label">Slave instance size</label>
               <div class="control selector-wrapper">
                 <mat-form-field>
-                  <mat-label>Select {{ DICTIONARY.notebook_instance_size }}</mat-label>
+                  <mat-label>Select instance size</mat-label>
                   <mat-select formControlName="shape_slave" disableOptionCentering>
                     <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
                       [label]="item.key | underscoreless">
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
index c289c5d..4d20b50 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
@@ -122,7 +122,7 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
   }
 
   public isAvailableSpots(): boolean {
-    if (DICTIONARY.cloud_provider === 'aws' && this.selectedImage.image === 'docker.dlab-dataengine-service')
+    if (this.PROVIDER === 'aws' && this.selectedImage.image === 'docker.dlab-dataengine-service')
       return !!Object.keys(this.filterAvailableSpots()).length;
 
     return false;
@@ -141,10 +141,13 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
       version: [''],
       shape_master: ['', Validators.required],
       shape_slave: [''],
-      cluster_alias_name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern), Validators.maxLength(DICTIONARY.max_cluster_name_length),
+      cluster_alias_name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern),
+        Validators.maxLength(DICTIONARY[this.PROVIDER].max_cluster_name_length),
       this.checkDuplication.bind(this)]],
       instance_number: ['', [Validators.required, Validators.pattern(PATTERNS.nodeCountPattern), this.validInstanceNumberRange.bind(this)]],
-      preemptible_instance_number: [0, Validators.compose([Validators.pattern(PATTERNS.integerRegex), this.validPreemptibleRange.bind(this)])],
+      preemptible_instance_number: [0,
+        Validators.compose([Validators.pattern(PATTERNS.integerRegex),
+        this.validPreemptibleRange.bind(this)])],
       instance_price: [0, [this.validInstanceSpotRange.bind(this)]],
       configuration_parameters: ['', [this.validConfiguration.bind(this)]],
       custom_tag: [this.notebook_instance.tags.custom_tag]
@@ -157,17 +160,17 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
 
   private getComputationalResourceLimits(): void {
     if (this.selectedImage && this.selectedImage.image) {
-      const activeImage = DICTIONARY[this.selectedImage.image];
+      const activeImage = DICTIONARY[this.PROVIDER][this.selectedImage.image];
 
       this.minInstanceNumber = this.selectedImage.limits[activeImage.total_instance_number_min];
       this.maxInstanceNumber = this.selectedImage.limits[activeImage.total_instance_number_max];
 
-      if (DICTIONARY.cloud_provider === 'gcp' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      if (this.PROVIDER === 'gcp' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
         this.maxInstanceNumber = this.selectedImage.limits[activeImage.total_instance_number_max] - 1;
         this.minPreemptibleInstanceNumber = this.selectedImage.limits.min_dataproc_preemptible_instance_count;
       }
 
-      if (DICTIONARY.cloud_provider === 'aws' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      if (this.PROVIDER === 'aws' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
         this.minSpotPrice = this.selectedImage.limits.min_emr_spot_instance_bid_pct;
         this.maxSpotPrice = this.selectedImage.limits.max_emr_spot_instance_bid_pct;
 
@@ -183,7 +186,7 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
   //  Validation
   private validInstanceNumberRange(control) {
     if (control && control.value)
-      if (DICTIONARY.cloud_provider === 'gcp' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      if (this.PROVIDER === 'gcp' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
         this.validPreemptibleNumberRange();
         return control.value >= this.minInstanceNumber && control.value <= this.maxInstanceNumber ? null : { valid: false };
       } else {
@@ -262,7 +265,7 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
           return obj;
         }, {});
 
-      if (DICTIONARY.cloud_provider !== 'azure') {
+      if (this.PROVIDER !== 'azure') {
         const images = this.clusterTypes.filter(image => image.image === 'docker.dlab-dataengine');
         this.clusterTypes = images;
         this.selectedImage = this.clusterTypes[0];
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts
index b38fcdf..a64857d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts
@@ -22,7 +22,6 @@ import { Injectable } from '@angular/core';
 import { Observable } from 'rxjs';
 
 import { UserResourceService } from '../../../core/services';
-import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 
 @Injectable()
 export class ComputationalResourceModel {
@@ -32,7 +31,7 @@ export class ComputationalResourceModel {
   public createComputationalResource(parameters, image, env, spot, provider): Observable<{}> {
     const config = parameters.configuration_parameters ? JSON.parse(parameters.configuration_parameters) : null;
 
-    if (DICTIONARY.cloud_provider === 'aws' && image.image === 'docker.dlab-dataengine-service') {
+    if (provider === 'aws' && image.image === 'docker.dlab-dataengine-service') {
       return this.userResourceService.createComputationalResource_DataengineService({
         name: parameters.cluster_alias_name,
         emr_instance_count: parameters.instance_number,
@@ -48,7 +47,7 @@ export class ComputationalResourceModel {
         project: env.project,
         custom_tag: parameters.custom_tag
       }, provider);
-    } else if (DICTIONARY.cloud_provider === 'gcp' && image.image === 'docker.dlab-dataengine-service') {
+    } else if (provider=== 'gcp' && image.image === 'docker.dlab-dataengine-service') {
       return this.userResourceService.createComputationalResource_DataengineService({
         template_name: image.template_name,
         image: image.image,
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.ts
index bd175a6..f7bfa1d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.ts
@@ -54,13 +54,13 @@ export class ComputationalResourcesListComponent {
       dialogRef.afterClosed().subscribe(result => {
         if (result && action === 'stop') {
           this.userResourceService
-            .toggleStopStartAction(this.environment.project, this.environment.name, resource.computational_name, action)
+            .toggleStopStartAction(this.environment.project, this.environment.name, resource.computational_name, action, this.environment.cloud_provider)
             .subscribe(() => {
               this.rebuildGrid();
             });
         } else if (result && action === 'terminate') {
           this.userResourceService
-            .suspendComputationalResource(this.environment.name, resource.computational_name)
+            .suspendComputationalResource(this.environment.name, resource.computational_name, this.environment.cloud_provider)
             .subscribe(() => {
               this.rebuildGrid();
             });
@@ -68,7 +68,7 @@ export class ComputationalResourcesListComponent {
       });
     } else if (action === 'start') {
       this.userResourceService
-        .toggleStopStartAction(this.environment.project, this.environment.name, resource.computational_name, 'start')
+        .toggleStopStartAction(this.environment.project, this.environment.name, resource.computational_name, 'start', this.environment.cloud_provider)
         .subscribe(
           () => this.rebuildGrid(),
           error => this.toastr.error(error.message || 'Computational resource starting failed!', 'Oops!'));
@@ -76,12 +76,14 @@ export class ComputationalResourcesListComponent {
   }
 
   public detailComputationalResources(environment, resource): void {
-    this.dialog.open(DetailComputationalResourcesComponent, { data: { environment, resource }, panelClass: 'modal-sm' })
+    this.dialog.open(DetailComputationalResourcesComponent, { data:
+        { environment, resource }, panelClass: 'modal-sm' })
       .afterClosed().subscribe(() => this.rebuildGrid());
-  };
+  }
 
   public openScheduleDialog(resource) {
-    this.dialog.open(SchedulerComponent, { data: { notebook: this.environment, type: 'СOMPUTATIONAL', resource }, panelClass: 'modal-xl-s' })
+    this.dialog.open(SchedulerComponent, { data:
+        { notebook: this.environment, type: 'СOMPUTATIONAL', resource }, panelClass: 'modal-xl-s' })
       .afterClosed().subscribe(() => this.rebuildGrid());
   }
 }
@@ -100,9 +102,9 @@ export class ComputationalResourcesListComponent {
           <span class="strong" matTooltip="{{ data.resource.computational_name }}"
                   [matTooltipShowDelay]="2000"
                   matTooltipPosition="left"
-          > 
+          >
                 {{ data.resource.computational_name }}
-            </span> will be 
+            </span> will be
       <span *ngIf="data.action === 'terminate'"> decommissioned.</span>
       <span *ngIf="data.action === 'stop'">stopped.</span>
     </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html
index b3510c4..1e7c25c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html
@@ -19,7 +19,7 @@
 
 <div class="ami-dialog" id="dialog-box">
   <header class="dialog-header">
-    <h4 class="modal-title">Create {{ DICTIONARY.image }}</h4>
+    <h4 class="modal-title">Create image</h4>
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </header>
   <div class="dialog-content">
@@ -28,13 +28,13 @@
         <div class="control-group">
           <label class="label">Name</label>
           <div class="control">
-            <input type="text" formControlName="name" placeholder="Enter {{ DICTIONARY.image }} name">
+            <input type="text" formControlName="name" placeholder="Enter image name">
             <span class="error" *ngIf="createAMIForm.controls['name'].hasError('duplication')">This
-              {{ DICTIONARY.image }} name already exists in project.</span>
+              image name already exists in project.</span>
             <span class="error"
               *ngIf="!createAMIForm.valid && createAMIForm.controls['name'].dirty && !createAMIForm.controls['name'].hasError('duplication')">
-              {{ DICTIONARY.image }} name
-              <span *ngIf="DICTIONARY.cloud_provider === 'azure'"> cannot be longer than 10 characters and</span>
+              image name
+              <span *ngIf="provider === 'azure'"> cannot be longer than 10 characters and</span>
               can only contain letters, numbers, hyphens and '_'</span>
           </div>
         </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts
index 430f6cb..ff17382 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts
@@ -35,7 +35,7 @@ export class AmiCreateDialogComponent implements OnInit {
   readonly DICTIONARY = DICTIONARY;
   public notebook: any;
   public createAMIForm: FormGroup;
-
+  public provider: string;
   namePattern = '[-_a-zA-Z0-9]+';
   delimitersRegex = /[-_]?/g;
   imagesList: any;
@@ -50,6 +50,7 @@ export class AmiCreateDialogComponent implements OnInit {
 
   ngOnInit() {
     this.notebook = this.data;
+    this.provider = this.data.cloud_provider;
 
     this.initFormModel();
     this._userResource.getImagesList(this.data.project).subscribe(res => this.imagesList = res);
@@ -58,7 +59,7 @@ export class AmiCreateDialogComponent implements OnInit {
   public assignChanges(data) {
     this._userResource.createAMI(data).subscribe(
       response => response.status === HTTP_STATUS_CODES.ACCEPTED && this.dialogRef.close(),
-      error => this.toastr.error(error.message || `${DICTIONARY.image.toLocaleUpperCase()} creation failed!`, 'Oops!'));
+      error => this.toastr.error(error.message || `Image creation failed!`, 'Oops!'));
   }
 
   private initFormModel(): void {
@@ -70,7 +71,7 @@ export class AmiCreateDialogComponent implements OnInit {
   }
 
   private providerMaxLength(control) {
-    if (DICTIONARY.cloud_provider !== 'aws')
+    if (control && control.value)
       return control.value.length <= 10 ? null : { valid: false };
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
index 700cc54..95ae591 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
@@ -34,25 +34,25 @@
       <div class="billing-detail content-box">
         <mat-list>
             <mat-list-item class="list-header">
-              <div class="resource-name ellipsis" [ngClass]="{ 'wide-name-field' : DICTIONARY.cloud_provider === 'azure' }">Name</div>
-              <div class="service">{{ DICTIONARY.service }}</div>
-              <div class="resource-type" *ngIf="DICTIONARY.cloud_provider === 'aws'">{{ DICTIONARY.type }}</div>
+              <div class="resource-name ellipsis" [ngClass]="{ 'wide-name-field' : provider === 'azure' }">Name</div>
+              <div class="service">{{ DICTIONARY[provider].service }}</div>
+              <div class="resource-type" *ngIf="provider === 'aws'">Type</div>
               <div class="cost-currency">Cost</div>
               <div class="usage-date-start">Start</div>
               <div class="usage-date-end">End</div>
             </mat-list-item>
             <div class="scrolling-content" id="scrolling">
               <mat-list-item *ngFor="let item of notebook.billing">
-                <div class="resource-name" [ngClass]="{ 'wide-name-field' : DICTIONARY.cloud_provider === 'azure' }"
-                     matTooltip="{{ item[DICTIONARY.billing.resourceName] }}"
+                <div class="resource-name" [ngClass]="{ 'wide-name-field' : provider === 'azure' }"
+                     matTooltip="{{ item[DICTIONARY[provider].billing.resourceName] }}"
                      matTooltipPosition="above">
-                     {{ item[DICTIONARY.billing.resourceName] }}
+                     {{ item[DICTIONARY[provider].billing.resourceName] }}
                 </div>
-                <div class="service">{{ item[DICTIONARY.billing.service] }}</div>
-                <div class="resource-type" *ngIf="DICTIONARY.cloud_provider === 'aws'">{{ item[DICTIONARY.billing.type] }}</div>
-                <div class="cost-currency">{{ item[DICTIONARY.billing.cost] }} {{ item[DICTIONARY.billing.currencyCode] }}</div>
-                <div class="usage-date-start">{{ item[DICTIONARY.billing.dateFrom] | date }}</div>
-                <div class="usage-date-end">{{ item[DICTIONARY.billing.dateTo] | date }}</div>
+                <div class="service">{{ item[DICTIONARY[provider].billing.service] }}</div>
+                <div class="resource-type" *ngIf="provider === 'aws'">{{ item[DICTIONARY[provider].billing.type] }}</div>
+                <div class="cost-currency">{{ item[DICTIONARY[provider].billing.cost] }} {{ item[DICTIONARY[provider].billing.currencyCode] }}</div>
+                <div class="usage-date-start">{{ item[DICTIONARY[provider].billing.dateFrom] | date }}</div>
+                <div class="usage-date-end">{{ item[DICTIONARY[provider].billing.dateTo] | date }}</div>
               </mat-list-item>
             </div>
         </mat-list>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.ts
index 3243b77..e115cad 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.ts
@@ -29,6 +29,7 @@ import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 export class CostDetailsDialogComponent implements OnInit {
   readonly DICTIONARY = DICTIONARY;
   public notebook: any;
+  public provider: string;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
@@ -37,5 +38,6 @@ export class CostDetailsDialogComponent implements OnInit {
 
   ngOnInit() {
     this.notebook = this.data;
+    this.provider = this.notebook.cloud_provider;
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html
index 0606e54..d532a10 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html
@@ -85,10 +85,10 @@
         </div>
 
         <div class="control-group" *ngIf="images && images.length > 0">
-          <label class="label">Select {{ DICTIONARY.image }}</label>
+          <label class="label">Select image</label>
           <div class="control selector-wrapper">
             <mat-form-field>
-              <mat-label>Select {{ DICTIONARY.image }}</mat-label>
+              <mat-label>Select image</mat-label>
               <mat-select formControlName="notebook_image_name" disableOptionCentering>
                 <mat-option [value]="null">None</mat-option>
                 <mat-option *ngFor="let image of images" [value]="image.name">{{ image.name }}</mat-option>
@@ -114,17 +114,17 @@
             <span class="error" *ngIf="!createExploratoryForm?.controls.name.valid
                                         && createExploratoryForm?.controls['name'].dirty
                                         && !createExploratoryForm?.controls['name'].hasError('duplication')">Name
-              <span *ngIf="DICTIONARY.cloud_provider !== 'aws'">cannot be longer than 10 characters and</span> can only
+             cannot be longer than 10 characters and can only
               contain letters, numbers, hyphens and '_' but can not end with special characters
             </span>
           </div>
         </div>
 
         <div class="control-group">
-          <label class="label">{{ DICTIONARY.notebook_instance_size }}</label>
+          <label class="label">Instance size</label>
           <div class="control selector-wrapper" [ngClass]="{ 'not-active': !currentTemplate }">
             <mat-form-field>
-              <mat-label>Select {{ DICTIONARY.notebook_instance_size }}</mat-label>
+              <mat-label>Select instance size</mat-label>
               <mat-select formControlName="shape" disableOptionCentering [disabled]="!currentTemplate"
                 panelClass="create-resources-shapes">
                 <mat-optgroup *ngFor="let item of (shapes | keys)" [label]="item.key | underscoreless">
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts
index 5b907f4..eb32cec 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts
@@ -152,7 +152,7 @@ export class ExploratoryEnvironmentCreateComponent implements OnInit {
   }
 
   private providerMaxLength(control) {
-    if (DICTIONARY.cloud_provider !== 'aws')
+    if (control && control.value)
       return control.value.length <= 10 ? null : { valid: false };
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
index 22802ae..4977b22 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
@@ -59,23 +59,23 @@
             <p class="flex" *ngIf="notebook.password">Password: &nbsp;<span
                 class="strong">{{ notebook.password }}</span></p>
 
-            <p class="m-top-30">{{ DICTIONARY.personal_storage }}: &nbsp;</p>
+            <p class="m-top-30">{{ DICTIONARY[PROVIDER].personal_storage }}: &nbsp;</p>
             <div class="links_block">
-              <p *ngIf="DICTIONARY.cloud_provider === 'azure' && notebook.account_name">{{ DICTIONARY.account }}
+              <p *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.account_name">{{ DICTIONARY[PROVIDER].account }}
                 <span class="bucket-info">{{ notebook.account_name}}</span></p>
-              <p *ngIf="notebook.bucket_name">{{ DICTIONARY.container }} <span
+              <p *ngIf="notebook.bucket_name">{{ DICTIONARY[PROVIDER].container }} <span
                   class="bucket-info">{{ notebook.bucket_name }}</span></p>
             </div>
-            <p>{{ DICTIONARY.collaboration_storage }}: &nbsp;</p>
+            <p>Shared endpoint bucket: &nbsp;</p>
             <div class="links_block">
-              <p *ngIf="DICTIONARY.cloud_provider === 'azure' && notebook.shared_account_name">{{ DICTIONARY.account }}
+              <p *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.shared_account_name">{{ DICTIONARY[PROVIDER].account }}
                 <span class="bucket-info">{{ notebook.shared_account_name}}</span></p>
-              <p *ngIf="notebook.shared_bucket_name">{{ DICTIONARY.container }}
+              <p *ngIf="notebook.shared_bucket_name">{{ DICTIONARY[PROVIDER].container }}
                 <span class="bucket-info">{{ notebook.shared_bucket_name }}</span></p>
             </div>
             <br />
 
-            <div *ngIf="DICTIONARY.cloud_provider === 'azure' && notebook.datalake_name">
+            <div *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.datalake_name">
               <p>Data Lake Store: &nbsp;</p>
               <div class="links_block">
                 <p>Data Lake Store Account: &nbsp;<span class="bucket-info">{{ notebook.datalake_name }}</span></p>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
index fa05b52..1fa43ca 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
@@ -35,6 +35,7 @@ import { CLUSTER_CONFIGURATION } from '../../computational/computational-resourc
 
 export class DetailDialogComponent implements OnInit {
   readonly DICTIONARY = DICTIONARY;
+  readonly PROVIDER = this.data.cloud_provider;
   notebook: any;
   upTimeInHours: number;
   upTimeSince: string = '';
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html
index d71b66f..1a13600 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html
@@ -62,7 +62,7 @@
     </ng-container>
     <ng-container matColumnDef="shapes">
       <th mat-header-cell *matHeaderCellDef class="shape-col">
-        <span class="label"> {{ DICTIONARY.instance_size }} </span>
+        <span class="label"> Size </span>
         <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
           <i class="material-icons">
             <span *ngIf="filtering && filterForm.shapes.length > 0 && !collapseFilterRow">filter_list</span>
@@ -78,7 +78,7 @@
     </ng-container>
     <ng-container matColumnDef="resources">
       <th mat-header-cell *matHeaderCellDef class="resources-col">
-        <span class="label"> {{ DICTIONARY.computational_resource }} </span>
+        <span class="label"> Computational resources </span>
         <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
           <i class="material-icons">
             <span *ngIf="filtering && filterForm.resources.length > 0 && !collapseFilterRow">filter_list</span>
@@ -197,7 +197,7 @@
                 <li (click)="exploratoryAction(element, 'ami')"
                   *ngIf="element.status === 'running' && element.cloud_provider !== 'gcp' && element.image !== 'docker.dlab-superset' && element.image !== 'docker.dlab-jupyterlab'">
                   <i class="material-icons">view_module</i>
-                  <span>Create {{ DICTIONARY.image }}</span>
+                  <span>Create {{ DICTIONARY[element.cloud_provider].image }}</span>
                 </li>
                 <li (click)="exploratoryAction(element, 'install')"
                   *ngIf="element.image !== 'docker.dlab-superset' && element.image !== 'docker.dlab-jupyterlab'">
@@ -234,7 +234,7 @@
     <ng-container matColumnDef="shape-filter">
       <th mat-header-cell *matHeaderCellDef class="shape-col">
         <multi-select-dropdown (selectionChange)="onUpdate($event)"
-          [type]="DICTIONARY.cloud_provider === 'aws' ? 'shapes': 'sizes'" [items]="filterConfiguration.shapes"
+          [type]="'sizes'" [items]="filterConfiguration.shapes"
           [model]="filterForm.shapes"></multi-select-dropdown>
       </th>
     </ng-container>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
index 8c49782..78bb38a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
@@ -39,7 +39,7 @@ import { ConfirmationDialogComponent } from '../../shared/modal-dialog/confirmat
 import { SchedulerComponent } from '../scheduler';
 
 import { DICTIONARY } from '../../../dictionary/global.dictionary';
-import {ProgressBarService} from "../../core/services/progress-bar.service";
+import {ProgressBarService} from '../../core/services/progress-bar.service';
 
 @Component({
   selector: 'resources-grid',
@@ -72,9 +72,9 @@ export class ResourcesGridComponent implements OnInit {
   public filteringColumns: Array<any> = [
     { title: 'Environment name', name: 'name', class: 'name-col', filter_class: 'name-filter', filtering: true },
     { title: 'Status', name: 'statuses', class: 'status-col', filter_class: 'status-filter', filtering: true },
-    { title: DICTIONARY.instance_size, name: 'shapes', class: 'shape-col', filter_class: 'shape-filter', filtering: true },
+    { title: 'Instance size', name: 'shapes', class: 'shape-col', filter_class: 'shape-filter', filtering: true },
     { title: 'Tags', name: 'tag', class: 'tag-col', filter_class: 'tag-filter', filtering: false },
-    { title: DICTIONARY.computational_resource, name: 'resources', class: 'resources-col', filter_class: 'resource-filter', filtering: true },
+    { title: 'Computational resource', name: 'resources', class: 'resources-col', filter_class: 'resource-filter', filtering: true },
     { title: 'Cost', name: 'cost', class: 'cost-col', filter_class: 'cost-filter', filtering: false },
     { title: '', name: 'actions', class: 'actions-col', filter_class: 'action-filter', filtering: false }
   ];
@@ -91,12 +91,11 @@ export class ResourcesGridComponent implements OnInit {
   ) { }
 
   ngOnInit(): void {
-
     this.buildGrid();
   }
 
   public buildGrid(): void {
-    setTimeout(() => {this.progressBarService.startProgressBar()} , 0);
+    setTimeout(() => {this.progressBarService.startProgressBar(); } , 0);
     this.userResourceService.getUserProvisionedResources()
       .subscribe((result: any) => {
         this.environments = ExploratoryModel.loadEnvironments(result);
@@ -127,14 +126,15 @@ export class ResourcesGridComponent implements OnInit {
   }
 
   public containsNotebook(notebook_name: string): boolean {
-    if (notebook_name)
+    if (notebook_name && this.environments && this.environments.length ) {
       return this.environments
         .filter(project => project.exploratory
           .some(item => CheckUtils.delimitersFiltering(notebook_name) === CheckUtils.delimitersFiltering(item.name))).length > 0;
+    }
   }
 
   public isResourcesInProgress(notebook) {
-    let env = this.getResourceByName(notebook.name);
+    const env = this.getResourceByName(notebook.name);
 
     if (env && env.resources.length) {
       return env.resources.filter(item => (item.status !== 'failed' && item.status !== 'terminated'
@@ -194,6 +194,7 @@ export class ResourcesGridComponent implements OnInit {
         .afterClosed().subscribe(() => this.buildGrid());
     } else if (action === 'ami') {
       this.dialog.open(AmiCreateDialogComponent, { data: data, panelClass: 'modal-sm' })
+
         .afterClosed().subscribe(() => this.buildGrid());
     }
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
index 5540271..063c7fc 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
@@ -55,6 +55,7 @@ export class ExploratoryModel {
   public static loadEnvironments(data: Array<any>) {
     if (data) {
       return data.map((value) => {
+        const provider = value.endpoints[0].cloudProvider.toLowerCase();
         return {
           project: value.project,
           exploratory: value.exploratory.map(el => new ExploratoryModel(el.exploratory_name,
@@ -69,24 +70,24 @@ export class ExploratoryModel {
             el.private_ip,
             el.exploratory_user,
             el.exploratory_pass,
-            value.shared[el.endpoint][DICTIONARY.bucket_name],
-            value.shared[el.endpoint][DICTIONARY.shared_bucket_name],
+            value.shared[el.endpoint][DICTIONARY[provider].bucket_name],
+            value.shared[el.endpoint][DICTIONARY[provider].shared_bucket_name],
             el.error_message,
-            el[DICTIONARY.billing.cost],
-            el[DICTIONARY.billing.currencyCode],
+            el[DICTIONARY[provider].billing.cost],
+            el[DICTIONARY[provider].billing.currencyCode],
             el.billing,
             el.libs,
-            value.shared[el.endpoint][DICTIONARY.user_storage_account_name],
-            value.shared[el.endpoint][DICTIONARY.shared_storage_account_name],
-            value.shared[el.endpoint][DICTIONARY.datalake_name],
-            value.shared[el.endpoint][DICTIONARY.datalake_user_directory_name],
-            value.shared[el.endpoint][DICTIONARY.datalake_shared_directory_name],
+            value.shared[el.endpoint][DICTIONARY[provider].user_storage_account_name],
+            value.shared[el.endpoint][DICTIONARY[provider].shared_storage_account_name],
+            value.shared[el.endpoint][DICTIONARY[provider].datalake_name],
+            value.shared[el.endpoint][DICTIONARY[provider].datalake_user_directory_name],
+            value.shared[el.endpoint][DICTIONARY[provider].datalake_shared_directory_name],
             el.project,
             el.endpoint,
             el.tags,
-            value.endpoints[0].cloudProvider.toLowerCase()
+            provider,
           ))
-        }
+        };
       });
     }
   }
@@ -94,5 +95,5 @@ export class ExploratoryModel {
 
 export interface Exploratory {
   project: string;
-  exploratory: ExploratoryModel[]
+  exploratory: ExploratoryModel[];
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts
index 37ae148..78ddd3c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts
@@ -75,7 +75,6 @@ import {ProgressBarService} from "../../core/services/progress-bar.service";
   encapsulation: ViewEncapsulation.None
 })
 export class NavbarComponent implements OnInit, OnDestroy {
-  readonly PROVIDER = DICTIONARY.cloud_provider;
 
   private readonly CHECK_ACTIVE_SCHEDULE_TIMEOUT: number = 55000;
   private readonly CHECK_ACTIVE_SCHEDULE_PERIOD: number = 15;
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts
index a37445f..f989415 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts
@@ -17,15 +17,11 @@
  * under the License.
  */
 
-export const NAMING_CONVENTION = {
+export const NAMING_CONVENTION_AWS = {
     'cloud_provider': 'aws',
-    'use_ldap': true,
-    'notebook_instance_size': 'Instance shape',
     'personal_storage': 'Project bucket',
-    'collaboration_storage': 'Shared endpoint bucket',
     'account': '',
     'container': '',
-    'data_engine': 'Deploy Spark Server / Deploy EMR',
     'image': 'AMI',
     'data_engine_master_instance_size': 'Master instance shape',
     'data_engine_slave_instance_size': 'Slave instance shape',
@@ -52,7 +48,6 @@ export const NAMING_CONVENTION = {
     'service': 'Service',
     'type': 'Type',
     'instance_size': 'Shape',
-    'computational_resource': 'Computational resources',
     'user_storage_account_name': '',
     'shared_storage_account_name': '',
     'bucket_name': 'user_own_bicket_name',
@@ -65,9 +60,6 @@ export const NAMING_CONVENTION = {
         'total_instance_number_max': 'max_emr_instance_count',
         'min_emr_spot_instance_bid_pct': 'min_emr_spot_instance_bid_pct',
         'max_emr_spot_instance_bid_pct': 'max_emr_spot_instance_bid_pct',
-        'data_engine_master_instance_size': 'Master instance shape',
-        'data_engine_slave_instance_size': 'Slave instance shape',
-        'instance_number': 'Total instance number',
         'master_node_shape': 'master_node_shape',
         'slave_node_shape': 'slave_node_shape',
         'total_instance_number': 'total_instance_number',
@@ -76,40 +68,9 @@ export const NAMING_CONVENTION = {
         'total_instance_number_min': 'min_spark_instance_count',
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Node shape',
-        'instance_number': 'Total node number',
         'master_node_shape': 'dataengine_instance_shape',
         'total_instance_number': 'dataengine_instance_count',
     },
-    'max_project_name_length': 40
 };
 
-export class ReportingConfigModel {
 
-    static getDefault(): ReportingConfigModel {
-        return new ReportingConfigModel([], [], [], [], [], '', '', '', []);
-    }
-
-    constructor(
-        public user: Array<string>,
-        public product: Array<string>,
-        public resource_type: Array<string>,
-        public status: Array<string>,
-        public shape: Array<string>,
-        public date_start: string,
-        public date_end: string,
-        public dlab_id: string,
-        public project?: Array<string>
-    ) { }
-
-    defaultConfigurations(): void {
-        this.user = [];
-        this.product = [];
-        this.resource_type = [];
-        this.status = [];
-        this.shape = [];
-        this.date_start = '';
-        this.date_end = '';
-        this.dlab_id = '';
-        this.project = [];
-    }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts
index 819c181..67ac627 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts
@@ -17,22 +17,18 @@
  * under the License.
  */
 
-export const NAMING_CONVENTION = {
+export const NAMING_CONVENTION_AZURE = {
     'cloud_provider': 'azure',
-    'use_ldap': true,
-    'notebook_instance_size': 'Virtual machine size',
     'personal_storage': 'Project bucket',
     'collaboration_storage': 'Shared endpoint bucket',
     'account': 'Account:',
     'container': 'Container:',
-    'data_engine': 'Deploy Spark Server / Deploy HDInsight',
     'image': 'image',
     'data_engine_master_instance_size': 'Head node size',
     'data_engine_slave_instance_size': 'Worker node size',
     'master_node_shape': 'azure_dataengine_master_size',
     'slave_node_shape': 'azure_dataengine_slave_size',
     'total_instance_number': 'dataengine_instance_count',
-
     'spot_instance': 'Low-priority virtual machines',
     'cluster_version': '',
     'max_cluster_name_length': 10,
@@ -53,7 +49,6 @@ export const NAMING_CONVENTION = {
     'service': 'Category',
     'type': '',
     'instance_size': 'Size',
-    'computational_resource': 'Computational resources',
     'user_storage_account_name': 'user_storage_account_name',
     'shared_storage_account_name': 'shared_storage_account_name',
     'bucket_name': 'user_container_name',
@@ -66,9 +61,6 @@ export const NAMING_CONVENTION = {
         'total_instance_number_max': 'max_emr_instance_count',
         'min_emr_spot_instance_bid_pct': 'min_emr_spot_instance_bid_pct',
         'max_emr_spot_instance_bid_pct': 'max_emr_spot_instance_bid_pct',
-        'data_engine_master_instance_size': 'Master instance shape',
-        'data_engine_slave_instance_size': 'Slave instance shape',
-        'instance_number': 'Total instance number',
         'master_node_shape': 'master_node_shape',
         'slave_node_shape': 'slave_node_shape',
         'total_instance_number': 'total_instance_number',
@@ -77,40 +69,8 @@ export const NAMING_CONVENTION = {
         'total_instance_number_min': 'min_spark_instance_count',
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Node size',
-        'instance_number': 'Total node number',
         'master_node_shape': 'dataengine_instance_shape',
         'total_instance_number': 'dataengine_instance_count'
     },
-    'max_project_name_length': 30
 };
 
-export class ReportingConfigModel {
-
-    static getDefault(): ReportingConfigModel {
-        return new ReportingConfigModel([], [], [], [], [], '', '', '', []);
-    }
-
-    constructor(
-        public user: Array<string>,
-        public category: Array<string>,
-        public resource_type: Array<string>,
-        public status: Array<string>,
-        public size: Array<string>,
-        public date_start: string,
-        public date_end: string,
-        public dlab_id: string,
-        public project?: Array<string>
-    ) { }
-
-    defaultConfigurations(): void {
-        this.user = [];
-        this.category = [];
-        this.resource_type = [];
-        this.status = [];
-        this.size = [];
-        this.date_start = '';
-        this.date_end = '';
-        this.dlab_id = '';
-        this.project = [];
-    }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts
index 10d7cf2..0d02f63 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts
@@ -17,23 +17,17 @@
  * under the License.
  */
 
-export const NAMING_CONVENTION = {
+export const NAMING_CONVENTION_GCP = {
     'cloud_provider': 'gcp',
-    'use_ldap': true,
-    'notebook_instance_size': 'Instance type',
     'personal_storage': 'Project bucket',
-    'collaboration_storage': 'Shared endpoint bucket',
     'account': '',
     'container': '',
-    'data_engine': 'Deploy Spark Server / Deploy Dataproc',
     'image': 'Not available',
     'data_engine_master_instance_size': 'Master machine type',
     'data_engine_slave_instance_size': 'Slave machine type',
-
     'master_node_shape': 'master_node_shape',
     'slave_node_shape': 'slave_node_shape',
     'total_instance_number': 'total_instance_number',
-
     'spot_instance': 'Preemptible worker nodes',
     'cluster_version': 'dataproc_version',
     'max_cluster_name_length': 7,
@@ -54,7 +48,6 @@ export const NAMING_CONVENTION = {
     'service': 'Product',
     'type': 'Resource',
     'instance_size': 'Type',
-    'computational_resource': 'Computational resources',
     'user_storage_account_name': '',
     'shared_storage_account_name': '',
     'bucket_name': 'user_own_bucket_name',
@@ -67,9 +60,6 @@ export const NAMING_CONVENTION = {
         'total_instance_number_max': 'max_instance_count',
         'min_emr_spot_instance_bid_pct': 'min_emr_spot_instance_bid_pct',
         'max_emr_spot_instance_bid_pct': 'max_emr_spot_instance_bid_pct',
-        'data_engine_master_instance_size': 'Master machine type',
-        'data_engine_slave_instance_size': 'Slave machine type',
-        'instance_number': 'Total machine count',
         'master_instance_number': 'Master node count',
         'slave_instance_number': 'Worker node count',
         'master_node_shape': 'master_node_shape',
@@ -81,41 +71,10 @@ export const NAMING_CONVENTION = {
         'total_instance_number_min': 'min_spark_instance_count',
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Machine type',
-        'instance_number': 'Total machine number',
         'master_instance_number': 'Master machine number',
         'master_node_shape': 'dataengine_instance_shape',
         'total_instance_number': 'dataengine_instance_count',
     },
-    'max_project_name_length': 10
 };
 
-export class ReportingConfigModel {
-
-    static getDefault(): ReportingConfigModel {
-        return new ReportingConfigModel([], [], [], [], [], '', '', '', []);
-    }
-
-    constructor(
-        public user: Array<string>,
-        public product: Array<string>,
-        public resource_type: Array<string>,
-        public status: Array<string>,
-        public shape: Array<string>,
-        public date_start: string,
-        public date_end: string,
-        public dlab_id: string,
-        public project?: Array<string>
-    ) { }
 
-    defaultConfigurations(): void {
-        this.user = [];
-        this.product = [];
-        this.resource_type = [];
-        this.status = [];
-        this.shape = [];
-        this.date_start = '';
-        this.date_end = '';
-        this.dlab_id = '';
-        this.project = [];
-    }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
index 6d0d8ea..a4a7005 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
@@ -19,8 +19,46 @@
 
 // from './{{ aws | gcp | azure }}.dictionary';
 
-import { NAMING_CONVENTION } from './CLOUD_PROVIDER.dictionary';
+import { NAMING_CONVENTION_AWS } from './aws.dictionary';
+import { NAMING_CONVENTION_GCP } from './gcp.dictionary';
+import { NAMING_CONVENTION_AZURE } from './azure.dictionary';
+
+export const DICTIONARY = Object.freeze({
+  aws: NAMING_CONVENTION_AWS,
+  gcp: NAMING_CONVENTION_GCP,
+  azure: NAMING_CONVENTION_AZURE
+});
+
+export class ReportingConfigModel {
+
+  static getDefault(): ReportingConfigModel {
+    return new ReportingConfigModel([], [], [], [], [], '', '', '', []);
+  }
+
+  constructor(
+    public user: Array<string>,
+    public product: Array<string>,
+    public resource_type: Array<string>,
+    public status: Array<string>,
+    public shape: Array<string>,
+    public date_start: string,
+    public date_end: string,
+    public dlab_id: string,
+    public project?: Array<string>
+  ) { }
+
+  defaultConfigurations(): void {
+    this.user = [];
+    this.product = [];
+    this.resource_type = [];
+    this.status = [];
+    this.shape = [];
+    this.date_start = '';
+    this.date_end = '';
+    this.dlab_id = '';
+    this.project = [];
+  }
+}
+
 
-export * from './CLOUD_PROVIDER.dictionary';
 
-export const DICTIONARY = Object.freeze(NAMING_CONVENTION);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org