You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by xi...@apache.org on 2013/10/31 18:38:05 UTC

git commit: AMBARI-3632. Need ability to remove hbase master.(xiwang)

Updated Branches:
  refs/heads/trunk 020138345 -> a1394c581


AMBARI-3632. Need ability to remove hbase master.(xiwang)


Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/a1394c58
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/a1394c58
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/a1394c58

Branch: refs/heads/trunk
Commit: a1394c581ec7fedc7f862536b0099a69274cab66
Parents: 0201383
Author: Xi Wang <xi...@apache.org>
Authored: Thu Oct 31 10:36:47 2013 -0700
Committer: Xi Wang <xi...@apache.org>
Committed: Thu Oct 31 10:36:47 2013 -0700

----------------------------------------------------------------------
 ambari-web/app/controllers/main/host/details.js | 54 +++++++++++++++++++-
 ambari-web/app/messages.js                      |  4 +-
 ambari-web/app/styles/application.less          | 10 ++++
 .../main/host/details/deleteComponentPopup.hbs  | 25 +++++++++
 ambari-web/app/templates/main/host/summary.hbs  | 17 ++++--
 ambari-web/app/views/main/host/summary.js       | 13 ++++-
 6 files changed, 114 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/a1394c58/ambari-web/app/controllers/main/host/details.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/host/details.js b/ambari-web/app/controllers/main/host/details.js
index db69fb8..81b95fa 100644
--- a/ambari-web/app/controllers/main/host/details.js
+++ b/ambari-web/app/controllers/main/host/details.js
@@ -156,11 +156,61 @@ App.MainHostDetailsController = Em.Controller.extend({
       } else {
         App.router.get('clusterController').loadUpdatedStatusDelayed(500);
       }
-      App.router.get('backgroundOperationsController').showPopup();
+      if (App.router.get('mainAdminUserSettingsController').loadShowBgChecked()) {
+        App.router.get('backgroundOperationsController').showPopup();
+      }
     });
   },
 
   /**
+   * send command to server to delete selected host component
+   *
+   */
+  deleteComponent: function (event) {
+    var self = this;
+    var component = event.context;
+    var componentName = component.get('componentName').toUpperCase().toString();
+    var displayName = component.get('displayName');
+    var numberOfComponents = 0;
+    var isLastComponent = false;
+    var allComponents = component.get('service.hostComponents');
+    allComponents.forEach(function(component) {
+      if (component.get('componentName') == componentName) numberOfComponents++;
+      if (numberOfComponents > 1) return;
+    });
+    if (numberOfComponents == 1) {
+      isLastComponent = true;
+    }
+    App.ModalPopup.show({
+      header: Em.I18n.t('popup.confirmation.commonHeader'),
+      bodyClass: Ember.View.extend({
+        templateName: require('templates/main/host/details/deleteComponentPopup')
+      }),
+      enablePrimary: false,
+      lastComponent: function() {
+        if (isLastComponent) {
+          this.set('enablePrimary',false);
+          return true;
+        } else {
+          this.set('enablePrimary',true);
+          return false;
+        }
+      }.property(),
+      lastComponentError:  Em.View.extend({
+        template: Ember.Handlebars.compile(Em.I18n.t('hosts.host.deleteComponent.popup.warning').format(displayName))
+      }),
+      deleteComponentMsg: function() {
+        return Em.I18n.t('hosts.host.deleteComponent.popup.msg').format(displayName);
+      }.property(),
+      onPrimary: function () {
+        if (!this.get('enablePrimary')) return;
+        self._doDeleteHostComponent(component);
+        this.hide();
+      },
+    });
+
+  },
+  /**
    * Deletes the given host component, or all host components.
    * 
    * @param component  When <code>null</code> all host components are deleted.
@@ -352,7 +402,7 @@ App.MainHostDetailsController = Em.Controller.extend({
         onPrimary: function () {
           this.hide();
           if (component.get('componentName') === 'CLIENTS') {
-            // Clients component has many sub-components which 
+            // Clients component has many sub-components which
             // need to be installed.
             var scs = component.get('subComponentNames');
             scs.forEach(function (sc) {

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/a1394c58/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index cabc24e..eb0e755 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1275,7 +1275,7 @@ Em.I18n.translations = {
   'hosts.host.summary.hostname':'Hostname',
   'hosts.host.summary.agentHeartbeat':'Agent <br/> Heartbeat',
   'hosts.host.summary.hostMetrics':'Host Metrics',
-  'hosts.host.summary.action':'Action...',
+  'hosts.host.summary.action':'Actions...',
   'hosts.host.summary.addComponent':'Add Component...',
 
   'hosts.host.details.hostActions':'Host Actions...',
@@ -1288,6 +1288,8 @@ Em.I18n.translations = {
   'host.host.componentFilter.master':'Master Components',
   'host.host.componentFilter.slave':'Slave Components',
   'host.host.componentFilter.client':'Client Components',
+  'hosts.host.deleteComponent.popup.msg':'Are you sure you want to delete {0}?',
+  'hosts.host.deleteComponent.popup.warning':'<b>WARNING!</b> Delete the last <i>{0}</i> component in the cluster?</br>Deleting the last component in the cluster could result in permanent loss of service data.',
   'hosts.host.installComponent.msg':'Are you sure you want to install {0}?',
   'hosts.host.addComponent.msg':'Are you sure you want to add {0}?',
   'hosts.host.addComponent.note':'Note: After this component is installed, go to Services -> Nagios to restart the Nagios service.  This is required for the alerts and notifications to work properly.',

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/a1394c58/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 84345ef..49c985e 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -3026,6 +3026,16 @@ table.graphs {
       font-style: italic;
     }
   }
+
+  .host-components {
+    .dropdown-menu {
+      .disabled {
+        pointer-events: none;
+        color: #808080;
+        cursor: default;
+      }
+    }
+  }
 }
 
 .background-operations {

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/a1394c58/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs b/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs
new file mode 100644
index 0000000..b50ec51
--- /dev/null
+++ b/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs
@@ -0,0 +1,25 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{deleteComponentMsg}}<br /><br />
+{{#if lastComponent}}
+    <div class="alert-error row-fluid">
+        <div class='tinyspan tinyoffset'>{{view Ember.Checkbox checkedBinding="enablePrimary"}}</div>
+        <div class='span10'>{{view lastComponentError}}</div>
+    </div>
+{{/if}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/a1394c58/ambari-web/app/templates/main/host/summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/host/summary.hbs b/ambari-web/app/templates/main/host/summary.hbs
index 8da39de..688f22c 100644
--- a/ambari-web/app/templates/main/host/summary.hbs
+++ b/ambari-web/app/templates/main/host/summary.hbs
@@ -69,11 +69,11 @@
                   <span class="caret pull-right"></span>
                 </a>
                 <ul class="dropdown-menu">
-                   <li>
-                      <div class="component-text-status">
-                       {{view.componentTextStatus}}
-                      </div>
-                    </li>
+                  <li>
+                    <div class="component-text-status">
+                      {{view.componentTextStatus}}
+                    </div>
+                  </li>
                   {{#if view.isDataNode}}
                     {{#if view.isDataNodeDecommissionAvailable}}
                       <li {{bindAttr class="view.noActionAvailable"}}>
@@ -90,6 +90,13 @@
                       </li>
                     {{/if}}
                   {{/if}}
+                  {{#if view.isHBaseMaster}}
+                    <li {{bindAttr class="view.isDeleteHBaseMasterDisabled:disabled"}}>
+                      <a href="javascript:void(null)" data-toggle="modal" {{action "deleteComponent" view.content target="controller"}}>
+                        {{t common.delete}}
+                      </a>
+                    </li>
+                  {{/if}}
                   {{#unless view.isInstalling}}
                     {{#if view.isStart}}
                       <li {{bindAttr class=" view.isDecommissioning:hidden view.noActionAvailable"}}>

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/a1394c58/ambari-web/app/views/main/host/summary.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/host/summary.js b/ambari-web/app/views/main/host/summary.js
index b19e41a..51ef1a0 100644
--- a/ambari-web/app/views/main/host/summary.js
+++ b/ambari-web/app/views/main/host/summary.js
@@ -425,7 +425,18 @@ App.MainHostSummaryView = Em.View.extend({
       var decommissionHostNames = this.get('decommissionDataNodeHostNames');
       var hostName = App.router.get('mainHostDetailsController.content.hostName');
       return decommissionHostNames != null && decommissionHostNames.contains(hostName);
-    }.property('App.router.mainHostDetailsController.content', 'decommissionDataNodeHostNames')
+    }.property('App.router.mainHostDetailsController.content', 'decommissionDataNodeHostNames'),
+
+    /**
+     * Shows whether we need to show Delete button
+     */
+    isHBaseMaster: function () {
+      return this.get('content.componentName') === 'HBASE_MASTER';
+    }.property('content'),
+    isDeleteHBaseMasterDisabled: function () {
+      return !(this.get('workStatus') == App.HostComponentStatus.stopped || this.get('workStatus') == App.HostComponentStatus.unknown ||
+        this.get('workStatus') == App.HostComponentStatus.install_failed || this.get('workStatus') == App.HostComponentStatus.upgrade_failed);
+    }.property('workStatus'),
 
   }),
   timeSinceHeartBeat: function () {