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

ishanbha pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 2c18ebe  [AMBARI-24720] UI: Configure Rolling Restart Advanced Options.
2c18ebe is described below

commit 2c18ebe5b45910cadb76ab4f6eae75d7067f7eda
Author: Ishan Bhatt <[email protected]>
AuthorDate: Mon Oct 1 14:24:02 2018 -0700

    [AMBARI-24720] UI: Configure Rolling Restart Advanced Options.
---
 ambari-web/app/messages.js                         | 15 +++-
 ambari-web/app/styles/application.less             | 44 +++++++++-
 .../app/templates/common/service_restart.hbs       | 96 ++++++++++++++++++----
 .../app/views/common/service_restart_view.js       | 53 +++++++++---
 4 files changed, 178 insertions(+), 30 deletions(-)

diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index bbcece5..67c45f3 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -3284,7 +3284,20 @@ Em.I18n.translations = {
   'service.rolling.restart.choose.info': 'Critical services remain running 
while the upgrade is performed. </br>Minimized disruption, but is a slower 
upgrade.',
   'service.express.restart.choose.info': 'Services are stopped when this 
upgrade is performed. </br>Incurs downtime, but is a faster upgrade.',
   'service.restart.show.advanced.info': 'Show advanced configurations options 
<p style="font-size: 12px; color: #999999; display: inline;">(Restart by 
batches/hosts, interval between restarts, etc.)</p>',
-
+  'service.restart.rolling.title.info': 'RESTART HOSTS BY',
+  'service.restart.rolling.batchesOfHosts': 'Batches of Hosts',
+  'service.restart.rolling.rackByRack': 'Rack by Rack',
+  'service.restart.rolling.advanced.noOfHosts': 'NUMBER OF HOSTS IN A BATCH',
+  'service.restart.rolling.advanced.batchIntervalHosts': 'INTERVAL BETWEEN 
BATCHES (SEC)',
+  'service.restart.rolling.advanced.percentRacks': '% OF RACKS STARTED AT A 
TIME',
+  'service.restart.rolling.advanced.batchIntervalRacks': 'INTERVAL BETWEEN 
RACKS (SEC)',
+  'service.restart.rolling.advanced.automatic.retry': 'Automatically retry on 
failed hosts',
+  'service.restart.rolling.advanced.noOfRetries': 'NUMBER OF RETRIES PER HOST',
+  'service.restart.rolling.advanced.max.failures.tolerated': 'MAXIMUM FAILURES 
TOLERATED<p style="font-size: 11px;">(Restart process is suspended after 
threshold is reached)</p>',
+  'service.restart.rolling.advanced.max.failures.batch': 'MAXIMUM FAILURES 
TOLERATED/BATCH',
+  'service.restart.rolling.advanced.max.failures.rack': 'MAXIMUM FAILURES 
TOLERATED/RACK',
+  'service.restart.rolling.advanced.suppress.alerts': 'Suppress alerts during 
rolling restart',
+  'service.restart.rolling.advanced.pause.after.first': 'Pause after first 
batch',
 
   'rolling.command.context': 'Rolling set {0} to state "{1}" - batch {2} of 
{3}',
   'rolling.nothingToDo.header': 'Nothing to do',
diff --git a/ambari-web/app/styles/application.less 
b/ambari-web/app/styles/application.less
index 56986e5..546aea4 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -3018,6 +3018,11 @@ a.abort-icon:hover {
 }
 
 .service-rolling-restart {
+
+  .radio + .radio, .checkbox + .checkbox {
+    margin-top: 0;
+  }
+
   .restart-header-info {
     margin-bottom: 30px; margin-left: 10px;
   }
@@ -3026,7 +3031,7 @@ a.abort-icon:hover {
     margin-bottom: 15px;
     display: flex;
   }
-  .rolling-block, .express-block {
+  .option-rolling-block, .option-express-block {
     label {
       font-size: 16px;
       left: -20px;
@@ -3037,9 +3042,6 @@ a.abort-icon:hover {
       padding-bottom: 5px;
     }
   }
-  .express-block {
-    margin-top: 0px;
-  }
   .fa-caret-right {
     color: #1491C1;
   }
@@ -3048,5 +3050,39 @@ a.abort-icon:hover {
     float: left;
     clear: both;
     margin-left: 40px;
+    margin-bottom: 10px;
+    a {
+      color: inherit;
+      text-decoration: none;
+      cursor: default;
+    }
+  }
+  .rolling-restart-advanced {
+    display: inline-block;
+    margin-top: 10px;
+    margin-left: 60px;
+    .rolling-restart-by {
+      display: flex;
+      margin-bottom: 20px;
+      input[type="radio"] {
+        padding-left: 15px;
+      }
+      .checkbox.radio {
+        display: inline-block;
+      }
+      .radio.big-radio {
+        padding-right: 20px;
+      }
+    }
+    .input-option {
+      padding-bottom: 10px;
+      margin: 0;
+    }
+    .num-retries {
+      padding-left: 10px;
+    }
+    .separator {
+      width: 40em;
+    }
   }
 }
diff --git a/ambari-web/app/templates/common/service_restart.hbs 
b/ambari-web/app/templates/common/service_restart.hbs
index e183169..226b9df 100644
--- a/ambari-web/app/templates/common/service_restart.hbs
+++ b/ambari-web/app/templates/common/service_restart.hbs
@@ -18,22 +18,90 @@
 
 <div class="service-rolling-restart">
 
-    <h5 class="restart-header-info">{{t service.restart.choose.text}}</h5>
-    <div class="restart-options">
-        <div class="rolling-block col-sm-6 radio big-radio">
-            <i class="fa fa-tachometer"></i>
-            {{view view.rollingRestartCheckBox 
labelIdentifier="use-rolling-restart"}}
-            <p class="faintText">{{t service.rolling.restart.choose.info}}</p>
-        </div>
+  <h5 class="restart-header-info">{{t service.restart.choose.text}}</h5>
+  <div class="restart-options">
+    <div class="option-rolling-block col-sm-6 radio big-radio">
+      <i class="fa fa-tachometer"></i>
+      {{view view.rollingRestartRadioButton 
labelIdentifier="use-rolling-restart"}}
+      <p class="faintText">{{t service.rolling.restart.choose.info}}</p>
+    </div>
 
-        <div class="express-block col-sm-6 radio big-radio">
-            <i class="fa fa-bolt"></i>
-            {{view view.expressRestartCheckBox 
labelIdentifier="use-express-restart"}}
-            <p class="faintText">{{t service.express.restart.choose.info}}</p>
-        </div>
+    <div class="option-express-block col-sm-6 radio big-radio">
+      <i class="fa fa-bolt"></i>
+      {{view view.expressRestartRadioButton 
labelIdentifier="use-express-restart"}}
+      <p class="faintText">{{t service.express.restart.choose.info}}</p>
     </div>
+  </div>
+  {{#if view.useRolling}}
     <div class="restart-advanced-configs">
-        <i class="fa fa-caret-right"></i>
-        <span>{{t service.restart.show.advanced.info}}</span>
+      <a href="#" {{action "toggleAdvancedOptions" target="view"}}><i 
class="fa fa-caret-right"></i>
+        <span>{{t service.restart.show.advanced.info}}</span></a>
     </div>
+    {{#if view.showAdvancedOptions}}
+      <div class="rolling-restart-advanced">
+        {{t service.restart.rolling.title.info}}
+        <div class="rolling-restart-by">
+          <div class="radio big-radio">
+            {{view view.batchesOfHostsRadioButton 
labelIdentifier="use-batches-of-hosts"}}
+            <i class="fa fa-question-circle"></i>
+          </div>
+          <div class="radio big-radio">
+            {{view view.rackByRackRadioButton 
labelIdentifier="use-rack-by-rack"}}
+            <i class="fa fa-question-circle"></i>
+          </div>
+        </div>
+        {{#if view.batchesOfHosts}}
+          <div class="input-option row">
+            <div>{{t service.restart.rolling.advanced.noOfHosts}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.noOfHostsInBatch"}}<br>
+          </div>
+          <div class=" input-option row">
+            <div>{{t 
service.restart.rolling.advanced.batchIntervalHosts}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.batchIntervalHosts"}}
+          </div>
+        {{else}}
+          <div class="input-option row">
+            <div>{{t service.restart.rolling.advanced.percentRacks}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.percentRackStarted"}}<br>
+          </div>
+          <div class="input-option row">
+            <div>{{t 
service.restart.rolling.advanced.batchIntervalRacks}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.batchIntervalRacks"}}
+          </div>
+        {{/if}}
+        <hr class="separator">
+        <div style="margin-top: 20px;">
+          {{view App.CheckboxView checkedBinding="view.isRetryChecked" 
labelTranslate="service.restart.rolling.advanced.automatic.retry"}}
+        </div>
+        {{#if view.isRetryChecked}}
+          <div class="input-option num-retries row">
+            <div>{{t service.restart.rolling.advanced.noOfRetries}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.noOfRetriesPerHost"}}<br>
+          </div>
+        {{/if}}
+        <div class="input-option row">
+          <div>{{t 
service.restart.rolling.advanced.max.failures.tolerated}}</div>
+          {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.maxFailuresTolerated"}}<br>
+        </div>
+        {{#if view.batchesOfHosts}}
+          <div class="input-option row">
+            <div>{{t 
service.restart.rolling.advanced.max.failures.batch}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.maxFailuresBatch"}}
+          </div>
+        {{else}}
+          <div class="input-option row">
+            <div>{{t service.restart.rolling.advanced.max.failures.rack}}</div>
+            {{view Ember.TextField type="number" class="input-sm col-xs-2" 
valueBinding="view.maxFailuresRack"}}
+          </div>
+        {{/if}}
+        <hr class="separator">
+        <div class="mtl">
+          {{view App.CheckboxView checkedBinding="view.suppressAlerts" 
labelTranslate="service.restart.rolling.advanced.suppress.alerts"}}
+        </div>
+        <div class="mtm">
+          {{view App.CheckboxView checkedBinding="view.pauseAfterFirst" 
labelTranslate="service.restart.rolling.advanced.pause.after.first"}}
+        </div>
+      </div>
+    {{/if}}
+  {{/if}}
 </div>
\ No newline at end of file
diff --git a/ambari-web/app/views/common/service_restart_view.js 
b/ambari-web/app/views/common/service_restart_view.js
index 35f9e2f..b6566e8 100644
--- a/ambari-web/app/views/common/service_restart_view.js
+++ b/ambari-web/app/views/common/service_restart_view.js
@@ -21,31 +21,62 @@ App.ServiceRestartView = Em.View.extend({
 
   templateName: require('templates/common/service_restart'),
 
-  useRolling: true,
-
-  useExpress: false,
-
   didInsertElement: function() {
+    this.initDefaultConfigs();
+  },
+
+  initDefaultConfigs: function () {
     this.set('useRolling', true);
-    this.set('useExpress',  false);
+    this.set('showAdvancedOptions', false);
+    this.set('batchesOfHosts', true);
+    this.set('noOfHostsInBatch', 10);
+    this.set('batchIntervalHosts', 120);
+    this.set('percentRackStarted', 100);
+    this.set('batchIntervalRacks', 120);
+    this.set('isRetryChecked', true);
+    this.set('noOfRetriesPerHost', 2);
+    this.set('maxFailuresTolerated', 10);
+    this.set('maxFailuresBatch', 2);
+    this.set('maxFailuresRack', 2);
+    this.set('suppressAlerts', true);
+    this.set('pauseAfterFirst', false);
+
   },
 
-  rollingRestartCheckBox: App.RadioButtonView.extend({
+  rollingRestartRadioButton: App.RadioButtonView.extend({
     labelTranslate: 'common.rolling',
     checked: Em.computed.alias('parentView.useRolling'),
     click: function () {
       this.set('parentView.useRolling', true);
-      this.set('parentView.useExpress', false);
     }
   }),
 
-  expressRestartCheckBox: App.RadioButtonView.extend({
+  expressRestartRadioButton: App.RadioButtonView.extend({
     labelTranslate: 'common.express',
-    checked: Em.computed.alias('parentView.useExpress'),
+    checked: Em.computed.not('parentView.useRolling'),
     click: function () {
       this.set('parentView.useRolling', false);
-      this.set('parentView.useExpress', true);
     }
-  })
+  }),
+
+  batchesOfHostsRadioButton: App.RadioButtonView.extend({
+    labelTranslate: 'service.restart.rolling.batchesOfHosts',
+    checked: Em.computed.alias('parentView.batchesOfHosts'),
+    click: function () {
+      this.set('parentView.batchesOfHosts', true);
+    }
+  }),
+
+  rackByRackRadioButton: App.RadioButtonView.extend({
+    labelTranslate: 'service.restart.rolling.rackByRack',
+    checked: Em.computed.not('parentView.batchesOfHosts'),
+    click: function () {
+      this.set('parentView.batchesOfHosts', false);
+    }
+  }),
+
+  toggleAdvancedOptions: function () {
+    this.toggleProperty('showAdvancedOptions');
+  }
 
 });
\ No newline at end of file

Reply via email to