You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by yt...@apache.org on 2021/06/18 08:27:03 UTC

[incubator-datalab] 01/01: [DATALAB-2431] added new parameters for Apache Standalone cluster

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

ytykhun pushed a commit to branch DATALAB-2431
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git

commit c402fd428606ddaead510be84e70d781b0d40ff9
Author: Yurii Tykhun <ty...@gmail.com>
AuthorDate: Fri Jun 18 11:26:13 2021 +0300

    [DATALAB-2431] added new parameters for Apache Standalone cluster
---
 .../cluster-details/cluster-details.component.html | 118 +++++----
 ...utational-resource-create-dialog.component.html | 292 +++++++++++----------
 ...mputational-resource-create-dialog.component.ts |   2 -
 .../webapp/src/dictionary/gcp.dictionary.ts        |   3 +-
 4 files changed, 216 insertions(+), 199 deletions(-)

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 d8168b9..e353385 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
@@ -46,10 +46,10 @@
           <div class="col"><span>{{ resource.template_name }}</span></div>
         </div>
         <div class="row-wrap" *ngIf="resource.image === 'docker.datalab-dataengine-service'">
-            <div class="col">
-                <p>Cluster version:</p>
-            </div>
-            <div class="col"><span>{{ resource[DICTIONARY[PROVIDER].cluster_version] }}</span></div>
+          <div class="col">
+              <p>Cluster version:</p>
+          </div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER].cluster_version] }}</span></div>
         </div>
         <div class="row-wrap">
           <div class="col">
@@ -57,15 +57,14 @@
           </div>
           <div class="col" (mouseover)="isEllipsisActive($event)">
             <span>{{resource.computational_name}}</span>
-<!--            <div class="tooltip" [style.visibility]="tooltip ? 'visible': 'hidden'">{{resource.computational_name}}-->
-<!--            </div>-->
+            <!-- <div class="tooltip" [style.visibility]="tooltip ? 'visible': 'hidden'">{{resource.computational_name}}</div> -->
           </div>
         </div>
         <div class="row-wrap">
-            <div class="col"
-                 *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.datalab-dataengine-service'; else inst">
-                <p>Master instance number:</p>
-            </div>
+          <div class="col"
+              *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'; else inst">
+            <p>Master instance number:</p>
+          </div>
           <ng-template #inst>
             <div class="col">
               <p>Total instance number:</p>
@@ -73,29 +72,29 @@
           </ng-template>
           <div class="col">
             <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'aws'">{{ resource.totalInstanceCount > 0 ? resource.totalInstanceCount : resource.dataengine_instance_count}}</span>
-            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.datalab-dataengine' || DICTIONARY[PROVIDER].cloud_provider === 'azure'">{{resource.dataengine_instance_count}}</span>
-            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.datalab-dataengine-service'">1</span>
+            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure'">{{resource.dataengine_instance_count}}</span>
+            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'">1</span>
           </div>
         </div>
         <div class="row-wrap"
-               *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.datalab-dataengine-service'">
-              <div class="col">
-                  <p>Slave instance number:</p>
-              </div>
-              <div class="col"><span>{{ resource.totalInstanceCount - 1}}</span></div>
+          *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'">
+          <div class="col">
+            <p>Slave instance number:</p>
           </div>
+          <div class="col"><span>{{ resource.totalInstanceCount - 1}}</span></div>
+        </div>
         <div class="row-wrap">
           <div class="col">
             <p>Master instance size:</p>
           </div>
           <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].master_node_shape] }}</span></div>
         </div>
-        <div class="row-wrap" *ngIf="resource.image === 'docker.datalab-dataengine-service'">
-              <div class="col">
-                  <p>Slave instance size:</p>
-              </div>
-              <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].slave_node_shape] }}</span></div>
+        <div class="row-wrap">
+          <div class="col">
+            <p>Slave instance size:</p>
           </div>
+          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].slave_node_shape] }}</span></div>
+        </div>
         <ng-template [ngIf]="resource?.enabledGPU">
           <div class="row-wrap">
             <div class="col">
@@ -152,42 +151,53 @@
             </p>
           </div>
         </div>
-          <div class="checkbox-group" *ngIf="resource.image === 'docker.datalab-dataengine'
-          && resource.status === 'running'
-          && environment.image !== 'docker.datalab-zeppelin'
-          && environment.image !== 'docker.datalab-superset'
-          && environment.image !== 'docker.datalab-jupyterlab'">
-              <label>
-                  <input #configurationNode type="checkbox" (change)="selectConfiguration()"/> Cluster configurations
-              </label>
-              <div class="checkbox-group">
-                  <form [formGroup]="configurationForm" novalidate>
-                      <div class="config-details"
-                           [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
-                <textarea formControlName="configuration_parameters" placeholder="Cluster configuration template, JSON"
-                          data-gramm_editor="false"></textarea>
-                          <span class="danger_color"
-                                *ngIf="!configurationForm.controls.configuration_parameters.valid && configurationForm.controls['configuration_parameters'].dirty">Configuration
-                  parameters is not in a valid format</span>
-                      </div>
-                  </form>
-              </div>
+          <div class="checkbox-group" 
+            *ngIf="resource.image === 'docker.datalab-dataengine'
+                && resource.status === 'running'
+                && environment.image !== 'docker.datalab-zeppelin'
+                && environment.image !== 'docker.datalab-superset'
+                && environment.image !== 'docker.datalab-jupyterlab'"
+          >
+            <label>
+              <input #configurationNode type="checkbox" (change)="selectConfiguration()"/> Cluster configurations
+            </label>
+            <div class="checkbox-group">
+              <form [formGroup]="configurationForm" novalidate>
+                <div class="config-details"
+                    [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
+                  <textarea 
+                    formControlName="configuration_parameters" 
+                    placeholder="Cluster configuration template, JSON"
+                    data-gramm_editor="false">
+                  </textarea>
+                  <span class="danger_color"
+                    *ngIf="!configurationForm.controls.configuration_parameters.valid 
+                        && configurationForm.controls['configuration_parameters'].dirty">
+                        Configuration parameters is not in a valid format
+                  </span>
+                </div>
+              </form>
+            </div>
           </div>
           <div *ngIf="environment.image === 'docker.datalab-zeppelin' && resource.status === 'running'">
-              <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. Currently it
-                  can be
-                  done directly through Apache Zeppelin interpreter menu.
-                  For more details please refer for Apache Zeppelin <a
-                          href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
-                      documentation</a>.
-              </small>
+            <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. 
+              Currently it can be done directly through Apache Zeppelin interpreter menu.
+                For more details please refer for Apache Zeppelin 
+                <a href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
+                    documentation</a>.
+            </small>
           </div>
           <div class="text-center m-top-30" *ngIf="configuration?.nativeElement['checked'] || false">
-              <button mat-raised-button type="button" (click)="dialogRef.close()" class="butt action">Cancel</button>
-              <button mat-raised-button type="submit" [disabled]="!configurationForm.valid"
-                      class="butt butt-success action"
-                      [ngClass]="{'not-allowed': !configurationForm.valid}"
-            (click)="editClusterConfiguration(configurationForm.value)">Update</button>
+            <button mat-raised-button type="button" 
+                    (click)="dialogRef.close()" 
+                    class="butt action">Cancel
+            </button>
+            <button mat-raised-button type="submit" 
+                    [disabled]="!configurationForm.valid"
+                    class="butt butt-success action"
+                    [ngClass]="{'not-allowed': !configurationForm.valid}"
+                    (click)="editClusterConfiguration(configurationForm.value)">Update
+            </button>
         </div>
       </div>
 
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 510a336..aa8d00b 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
@@ -26,73 +26,71 @@
     <div class="content-box mat-reset">
       <form [formGroup]="resourceForm" *ngIf="clusterTypes.length && resourceForm; else placeholder">
 
-        <div class="form-wrapper" [ngClass]="{ }">
-            <div class="col">
-                <div class="control-group" *ngIf="PROVIDER !== 'azure'" [hidden]="clusterTypes.length === 1">
-                    <label class="label">Select cluster type</label>
-                    <div class="control selector-wrapper">
-                        <mat-form-field>
-                            <!--                  <mat-label>Select cluster type</mat-label>-->
-                            <mat-select formControlName="template_name" 
-                                        disableOptionCentering
-                                        panelClass="scrolling"
-                                        placeholder="Select cluster type">
-                                <mat-option *ngFor="let type of clusterTypes" [value]="type.template_name"
-                                            (click)="selectImage(type)">{{ type.template_name }}
-                                </mat-option>
-                    <mat-option *ngIf="!clusterTypes.length" class="multiple-select ml-10" disabled>Clusters types list
-                      is empty</mat-option>
-                  </mat-select>
-                  <button class="caret">
-                    <i class="material-icons">keyboard_arrow_down</i>
-                  </button>
-                </mat-form-field>
+        <div class="form-wrapper">
+          <div class="col">
+              <div class="control-group" *ngIf="PROVIDER !== 'azure'" [hidden]="clusterTypes.length === 1">
+                  <label class="label">Select cluster type</label>
+                  <div class="control selector-wrapper">
+                    <mat-form-field>
+                      <mat-select formControlName="template_name" 
+                                  disableOptionCentering
+                                  panelClass="scrolling"
+                                  placeholder="Select cluster type">
+                        <mat-option *ngFor="let type of clusterTypes" [value]="type.template_name"
+                                    (click)="selectImage(type)">{{ type.template_name }}
+                        </mat-option>
+                        <mat-option *ngIf="!clusterTypes.length" class="multiple-select ml-10" disabled>Clusters types list
+                          is empty</mat-option>
+                      </mat-select>
+                      <button class="caret">
+                        <i class="material-icons">keyboard_arrow_down</i>
+                      </button>
+                    </mat-form-field>
+                  </div>
               </div>
-            </div>
 
-            
-
-            <div class="control-group alias-name" *ngIf="selectedImage?.image">
-              <label class="label">Cluster alias</label>
-              <div class="control">
-                <input
-                  [class.danger_field]="!resourceForm?.controls['cluster_alias_name'].valid
-                        && resourceForm?.controls['cluster_alias_name'].dirty && resourceForm?.controls['cluster_alias_name'].hasError('duplication')"
-                  type="text" class="form-control" placeholder="Enter cluster alias"
-                  formControlName="cluster_alias_name" />
-                <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('user-duplication')">You have cluster with this name in current project.</span>
-                <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('other-user-duplication')">Other user has cluster with this name in current project.</span>
-                <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('maxlength') &&
-                !resourceForm?.controls['cluster_alias_name'].hasError('pattern')"
-                >
-                  Cluster name cannot be longer than {{maxClusterNameLength}} characters.
-                </span>
-                <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('pattern')">
-                  Cluster name can only contain letters, numbers, hyphens and '_' but can not end with special
-                  characters.
-                </span>
+              <div class="control-group alias-name" *ngIf="selectedImage?.image">
+                <label class="label">Cluster alias</label>
+                <div class="control">
+                  <input
+                    [class.danger_field]="!resourceForm?.controls['cluster_alias_name'].valid
+                          && resourceForm?.controls['cluster_alias_name'].dirty 
+                          && resourceForm?.controls['cluster_alias_name'].hasError('duplication')"
+                    type="text" class="form-control" placeholder="Enter cluster alias"
+                    formControlName="cluster_alias_name" />
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('user-duplication')">You have cluster with this name in current project.</span>
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('other-user-duplication')">Other user has cluster with this name in current project.</span>
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('maxlength') &&
+                  !resourceForm?.controls['cluster_alias_name'].hasError('pattern')"
+                  >
+                    Cluster name cannot be longer than {{maxClusterNameLength}} characters.
+                  </span>
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('pattern')">
+                    Cluster name can only contain letters, numbers, hyphens and '_' but can not end with special
+                    characters.
+                  </span>
+                </div>
               </div>
-            </div>
 
-            <div class="control-group" *ngIf="selectedImage?.image">
-              <label class="label">Master instance size</label>
-              <div class="control selector-wrapper">
-                <mat-form-field>
-                  <mat-label>Select instance size</mat-label>
-                  <mat-select panelClass="scrolling" formControlName="shape_master" disableOptionCentering>
-                    <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
-                      [label]="item.key | underscoreless">
-                      <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="clearGpuType('master')">
-                        <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{ list_item.Type }}
-                      </mat-option>
-                    </mat-optgroup>
-                  </mat-select>
-                  <button class="caret">
-                    <i class="material-icons">keyboard_arrow_down</i>
-                  </button>
-                </mat-form-field>
+              <div class="control-group" *ngIf="selectedImage?.image">
+                <label class="label">Master instance size</label>
+                <div class="control selector-wrapper">
+                  <mat-form-field>
+                    <mat-label>Select instance size</mat-label>
+                    <mat-select panelClass="scrolling" formControlName="shape_master" disableOptionCentering>
+                      <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
+                        [label]="item.key | underscoreless">
+                        <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="clearGpuType('master')">
+                          <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{ list_item.Type }}
+                        </mat-option>
+                      </mat-optgroup>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                </div>
               </div>
-            </div>
           </div>
 
           <div class="col">
@@ -126,27 +124,26 @@
               </div>
             </div>
 
-              <div class="control-group" *ngIf="selectedImage?.image"
-                   >
-                  <label class="label">Slave instance size</label>
-                  <div class="control selector-wrapper">
-                      <mat-form-field>
-                          <mat-label>Select instance size</mat-label>
-                          <mat-select panelClass="scrolling" formControlName="shape_slave" disableOptionCentering>
-                              <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
-                                            [label]="item.key | underscoreless">
-                                  <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="clearGpuType('slave')">
-                                      <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{
-                                      list_item.Type }}
-                                  </mat-option>
-                    </mat-optgroup>
-                  </mat-select>
-                  <button class="caret">
-                    <i class="material-icons">keyboard_arrow_down</i>
-                  </button>
-                </mat-form-field>
+              <div class="control-group" *ngIf="selectedImage?.image">
+                <label class="label">Slave instance size</label>
+                <div class="control selector-wrapper">
+                  <mat-form-field>
+                    <mat-label>Select instance size</mat-label>
+                      <mat-select panelClass="scrolling" formControlName="shape_slave" disableOptionCentering>
+                        <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
+                                        [label]="item.key | underscoreless">
+                          <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="clearGpuType('slave')">
+                              <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{
+                              list_item.Type }}
+                          </mat-option>
+                        </mat-optgroup>
+                      </mat-select>
+                      <button class="caret">
+                        <i class="material-icons">keyboard_arrow_down</i>
+                      </button>
+                  </mat-form-field>
+                </div>
               </div>
-            </div>
 
           </div>
         </div>
@@ -266,24 +263,23 @@
                   </mat-form-field>
                 </div>
               </div>
-
             </div>
           </div>
         </div>
-          <div class="preemptible checkbox-group control-group"
-               *ngIf="PROVIDER === 'gcp' && selectedImage?.image === 'docker.datalab-dataengine-service'">
-            <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('preemptible')">
-              <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.preemptible}" (click)="selectPreemptibleNodes(isSelected.preemptible)">
-                <span class="checked-checkbox" *ngIf="isSelected.preemptible"></span>
-              </div>
-              <span class="pl-5">Preemptible node</span>
+        <div class="preemptible checkbox-group control-group"
+              *ngIf="PROVIDER === 'gcp' && selectedImage?.image === 'docker.datalab-dataengine-service'">
+          <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('preemptible')">
+            <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.preemptible}" (click)="selectPreemptibleNodes(isSelected.preemptible)">
+              <span class="checked-checkbox" *ngIf="isSelected.preemptible"></span>
             </div>
-              <div *ngIf="isSelected.preemptible" class="preemptible-details control"
-                   [ngClass]="{ show: isSelected.preemptible}">
-                  <input type="text" class="form-control" formControlName="preemptible_instance_number"
-                         (keypress)="CheckUtils.isNumberKey($event)"
-                         (keydown.arrowup)="preemptibleCounter($event, 'increment')"
-                         (keydown.arrowdown)="preemptibleCounter($event, 'decrement')"/>
+            <span class="pl-5">Preemptible node</span>
+          </div>
+          <div *ngIf="isSelected.preemptible" class="preemptible-details control"
+                [ngClass]="{ show: isSelected.preemptible}">
+            <input type="text" class="form-control" formControlName="preemptible_instance_number"
+                    (keypress)="CheckUtils.isNumberKey($event)"
+                    (keydown.arrowup)="preemptibleCounter($event, 'increment')"
+                    (keydown.arrowdown)="preemptibleCounter($event, 'decrement')"/>
             <span class="error error-bottom" *ngIf="!resourceForm?.controls.preemptible_instance_number.valid">
               <span *ngIf="minPreemptibleInstanceNumber !== maxPreemptibleInstanceNumber; else equal">
                 Only integer values greater than or equal to {{ minPreemptibleInstanceNumber }} and less than
@@ -292,8 +288,7 @@
               <ng-template #equal>Please manage total machines count.</ng-template>
             </span>
           </div>
-          </div>
-
+        </div>
 
         <div class="checkbox-group control-group m-top-15" *ngIf="PROVIDER === 'aws'" [hidden]="!selectedImage.templates.length">
           <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('spotInstances')">
@@ -314,55 +309,68 @@
             rises above your bid price, the Spot instance is reclaimed by AWS so that it can be given to another
             customer. Make sure to backup your data on periodic basis.</span>
         </div>
-          <div class="checkbox-group control-group"
-               [hidden]="PROVIDER === 'gcp' && selectedImage?.image === 'docker.datalab-dataengine-service'"
-               *ngIf="notebook_instance?.image !== 'docker.datalab-zeppelin'">
-              <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('configuration')">
-                <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.configuration}">
-                  <span class="checked-checkbox" *ngIf="isSelected.configuration"></span>
-                </div>
-                <span class="pl-5">Cluster configurations</span>
-              </div>
-              <div class="config-link" *ngIf="(isSelected.configuration)
-            && selectedImage?.image === 'docker.datalab-dataengine-service'
-            && PROVIDER === 'aws'">
-                  To view example JSON of configurations refer for <a
-                      href="https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html"
-                      target="_blank">AWS
-                  official documentation</a>
-              </div>
+        <div class="checkbox-group control-group"
+              [hidden]="PROVIDER === 'gcp' && selectedImage?.image === 'docker.datalab-dataengine-service'"
+              *ngIf="notebook_instance?.image !== 'docker.datalab-zeppelin'">
+          <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('configuration')">
+            <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.configuration}">
+              <span class="checked-checkbox" *ngIf="isSelected.configuration"></span>
+            </div>
+            <span class="pl-5">Cluster configurations</span>
           </div>
-          <div class="checkbox-group ml-10">
-              <div class="config-details" [ngClass]="{ show: isSelected.configuration }">
-            <textarea formControlName="configuration_parameters" placeholder="Cluster configuration template, JSON"
-                      data-gramm_editor="false"></textarea>
-                  <span class="error"
-                        *ngIf="!resourceForm?.controls.configuration_parameters.valid && resourceForm?.controls['configuration_parameters'].dirty">Configuration
-              parameters is not in a valid format.</span>
-              </div>
+          <div class="config-link" 
+              *ngIf="(isSelected.configuration) 
+                && selectedImage?.image === 'docker.datalab-dataengine-service'
+                && PROVIDER === 'aws'"
+          >
+            To view example JSON of configurations refer for <a
+                href="https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html"
+                target="_blank">AWS
+            official documentation</a>
           </div>
-          <div *ngIf="notebook_instance?.image === 'docker.datalab-zeppelin'" class="ml-10">
-              <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. Currently it
-                  can be
-                  done directly through Apache Zeppelin interpreter menu.
-                  For more details please refer for Apache Zeppelin <a
-                          href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
-                      documentation</a>.
-              </small>
+        </div>
+        <div class="checkbox-group ml-10">
+          <div class="config-details" [ngClass]="{ show: isSelected.configuration }">
+            <textarea formControlName="configuration_parameters" 
+                      placeholder="Cluster configuration template, JSON"
+                      data-gramm_editor="false">
+            </textarea>
+            <span class="error"
+                  *ngIf="!resourceForm?.controls.configuration_parameters.valid 
+                  && resourceForm?.controls['configuration_parameters'].dirty">
+                  Configuration parameters is not in a valid format.
+            </span>
           </div>
-          <div class="text-center m-top-30">
-              <button mat-raised-button type="button" (click)="dialogRef.close()" class="butt action">Cancel</button>
-              <button mat-raised-button type="button" [disabled]="!resourceForm?.valid ||
-              (!resourceForm.value.shape_slave) ||
-              (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.version)"
-                      (click)="createComputationalResource(resourceForm.value)" class="butt butt-success action"
-                      [ngClass]="{'not-allowed': !resourceForm?.valid ||
-              (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.shape_slave) ||
-              (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.version) }">Create
-              </button>
+        </div>
+        <div *ngIf="notebook_instance?.image === 'docker.datalab-zeppelin'" class="ml-10">
+          <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. Currently it
+              can be
+              done directly through Apache Zeppelin interpreter menu.
+              For more details please refer for Apache Zeppelin <a
+                      href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
+                  documentation</a>.
+          </small>
+        </div>
+        <div class="text-center m-top-30">
+          <button mat-raised-button 
+                  type="button" 
+                  (click)="dialogRef.close()" 
+                  class="butt action">Cancel
+          </button>
+          <button mat-raised-button 
+                  type="button" 
+                  [disabled]="!resourceForm?.valid 
+                    || (!resourceForm.value.shape_slave) 
+                    || (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.version)"
+                  (click)="createComputationalResource(resourceForm.value)" 
+                  class="butt butt-success action"
+                  [ngClass]="{'not-allowed': !resourceForm?.valid 
+                    || (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.shape_slave) 
+                    || (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.version) }">
+                  Create
+          </button>
         </div>
       </form>
-
     </div>
     <ng-template #placeholder>
       <div *ngIf="!loading && !clusterTypes?.length" class="info message">
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 70b24e2..76852a9 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
@@ -88,7 +88,6 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
 
   public selectImage($event) {
     this.selectedImage = $event;
-    this.selectedImage.computationGPU = ['tesla1', 'tesla2', 'tesla3'];
     this.filterShapes();
     this.getComputationalResourceLimits();
 
@@ -267,7 +266,6 @@ export class ComputationalResourceCreateDialogComponent implements OnInit {
         this.clusterTypes.forEach((cluster, index) => this.clusterTypes[index].computation_resources_shapes =
           SortUtils.shapesSort(cluster.computation_resources_shapes));
         this.selectedImage = this.clusterTypes[0];
-        this.selectedImage.computationGPU = ['tesla1', 'tesla2', 'tesla3'];
         if (this.selectedImage) {
           this._ref.detectChanges();
           this.filterShapes();
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 179fc45..9cf117b 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
@@ -72,7 +72,8 @@ export const NAMING_CONVENTION_GCP = {
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Machine type',
         'master_instance_number': 'Master machine number',
-        'master_node_shape': 'dataengine_instance_shape',
+        'master_node_shape': 'master_node_shape',
+        'slave_node_shape': 'slave_node_shape',
         'total_instance_number': 'dataengine_instance_count',
     },
 };

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