Browse Source

AMBARI-3125 NameNode HA wizard: Create Rollback popup (mockup). (atkach)

atkach 11 years ago
parent
commit
38bcb75a6a

+ 1 - 0
ambari-web/app/controllers.js

@@ -29,6 +29,7 @@ require('controllers/main/admin');
 require('controllers/main/admin/highAvailability_controller');
 require('controllers/main/admin/highAvailability/wizard_controller');
 require('controllers/main/admin/highAvailability/progress_controller');
+require('controllers/main/admin/highAvailability/rollback_controller');
 require('controllers/main/admin/highAvailability/step1_controller');
 require('controllers/main/admin/highAvailability/step2_controller');
 require('controllers/main/admin/highAvailability/step3_controller');

+ 1 - 1
ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js

@@ -111,7 +111,7 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
       header: Em.I18n.t('admin.highAvailability.confirmRollbackHeader'),
       primary: Em.I18n.t('common.confirm'),
       onPrimary: function () {
-        //App.router.send();
+        App.router.transitionTo('root.main.admin.adminHighAvailability.rollback');
         this.hide();
       },
       secondary : Em.I18n.t('common.cancel'),

+ 120 - 3
ambari-web/app/controllers/main/admin/highAvailability/rollback_controller.js

@@ -17,9 +17,9 @@
  */
 
 var App = require('app');
-require('controllers/highAvailability/progress_controller');
+require('controllers/main/admin/highAvailability/progress_controller');
 
-App.HighAvailabilityRollbackController = App.HighAvailabilityProgressPageController({
+App.HighAvailabilityRollbackController = App.HighAvailabilityProgressPageController.extend({
 
   name: "highAvailabilityRollbackController",
 
@@ -35,11 +35,128 @@ App.HighAvailabilityRollbackController = App.HighAvailabilityProgressPageControl
     'stopJournalNodes',
     'deleteJournalNodes',
     'deleteAdditionalNameNode',
-    'startAllServices',
+    'startAllServices'
   ],
 
   getStartingPoint: function() {
 
+  },
+
+  clearStep: function () {
+    this.set('isSubmitDisabled', true);
+    this.set('tasks', []);
+    this.set('logs', []);
+    this.set('currentRequestIds', []);
+    var commands = this.get('commands');
+    for (var i = 0; i < commands.length; i++) {
+      this.get('tasks').pushObject(Ember.Object.create({
+        title: Em.I18n.t('admin.highAvailability.rollback.task' + i + '.title'),
+        status: 'PENDING',
+        id: i,
+        command: commands[i],
+        showRetry: false,
+        name: Em.I18n.t('admin.highAvailability.rollback.task' + i + '.title'),
+        displayName: Em.I18n.t('admin.highAvailability.rollback.task' + i + '.title'),
+        progress: 0,
+        isRunning: false,
+        hosts: []
+      }));
+    }
+  },
+
+  onTaskStatusChange: function () {
+    if (!this.get('tasks').someProperty('status', 'IN_PROGRESS') && !this.get('tasks').someProperty('status', 'QUEUED') && !this.get('tasks').someProperty('status', 'FAILED')) {
+      var nextTask = this.get('tasks').findProperty('status', 'PENDING');
+      if (nextTask) {
+        this.set('status', 'IN_PROGRESS');
+        this.setTaskStatus(nextTask.get('id'), 'QUEUED');
+        this.set('currentTaskId', nextTask.get('id'));
+        this.runTask(nextTask.get('id'));
+      } else {
+        this.set('status', 'COMPLETED');
+        this.set('isSubmitDisabled', false);
+      }
+    } else if (this.get('tasks').someProperty('status', 'FAILED') || this.get('tasks').someProperty('status', 'TIMEDOUT') || this.get('tasks').someProperty('status', 'ABORTED')) {
+      this.set('status', 'FAILED');
+      this.get('tasks').findProperty('status', 'FAILED').set('showRetry', true);
+    }
+
+    var statuses = this.get('tasks').mapProperty('status');
+    var requestIds = this.get('currentRequestIds');
+    this.saveTasksStatuses(statuses);
+    this.saveRequestIds(requestIds);
+    App.clusterStatus.setClusterStatus({
+      clusterName: this.get('content.cluster.name'),
+      clusterState: 'HIGH_AVAILABILITY_ROLLBACK',
+      wizardControllerName: this.get('content.controllerName'),
+      localdb: App.db.data
+    });
+  },
+
+  saveTasksStatuses: function(statuses){
+    App.db.setHighAvailabilityWizardTasksStatuses(statuses);
+    //this.set('content.tasksStatuses', statuses);
+  },
+
+  loadTasksStatuses: function(){
+    var statuses = App.db.getHighAvailabilityWizardTasksStatuses();
+    //this.set('content.tasksStatuses', statuses);
+  },
+
+  saveRequestIds: function(requestIds){
+    App.db.setHighAvailabilityWizardRequestIds(requestIds);
+    //this.set('content.requestIds', requestIds);
+  },
+
+  loadRequestIds: function(){
+    var requestIds = App.db.getHighAvailabilityWizardRequestIds();
+    //this.set('content.requestIds', requestIds);
+  },
+
+  done: function () {
+    if (!this.get('isSubmitDisabled')) {
+      this.removeObserver('tasks.@each.status', this, 'onTaskStatusChange');
+      this.get('popup').hide();
+      App.router.transitionTo('main.admin.adminHighAvailability');
+    }
+  },
+
+  stopAllServices: function(){
+
+  },
+  restoreHBaseConfigs: function(){
+
+  },
+
+  stopFailoverControllers: function(){
+
+  },
+  deleteFailoverControllers: function(){
+
+  },
+  stopStandbyNameNode: function(){
+
+  },
+  stopNamenode: function(){
+
+  },
+  restoreHDFSConfigs: function(){
+
+  },
+  enableSecondaryNameNode: function(){
+
+  },
+  stopJournalNodes: function(){
+
+  },
+  deleteJournalNodes: function(){
+
+  },
+  deleteAdditionalNameNode: function(){
+
+  },
+  startAllServices: function(){
+
   }
 
 });

+ 14 - 0
ambari-web/app/messages.js

@@ -699,6 +699,20 @@ Em.I18n.translations = {
   'admin.highAvailability.wizard.step6.jsNoInit':'JournalNodes not initialized yet',
   'admin.highAvailability.wizard.step8.metaNoInit':'Metadata not initialized yet',
 
+  'admin.highAvailability.rollback.header':'Disable NameNode HA Wizard',
+  'admin.highAvailability.rollback.task0.title':'Stop all services',
+  'admin.highAvailability.rollback.task1.title':'Restore HBASE configurations',
+  'admin.highAvailability.rollback.task2.title':'Stop Failover controllers',
+  'admin.highAvailability.rollback.task3.title':'Delete Failover controllers',
+  'admin.highAvailability.rollback.task4.title':'Stop stand by NameNode',
+  'admin.highAvailability.rollback.task5.title':'Stop NameNode',
+  'admin.highAvailability.rollback.task6.title':'Restore HDFS configurations',
+  'admin.highAvailability.rollback.task7.title':'Enable Secondary NameNode',
+  'admin.highAvailability.rollback.task8.title':'Stop JournalNodes',
+  'admin.highAvailability.rollback.task9.title':'Delete JournalNodes',
+  'admin.highAvailability.rollback.task10.title':'Delete additional NameNode',
+  'admin.highAvailability.rollback.task11.title':'Start all services',
+  'admin.highAvailability.rollback.notice.inProgress': 'Please wait while NameNode HA is being disabled.',
 
   'admin.highAvailability.wizard.step8.body':
     '<ol>' +

+ 55 - 1
ambari-web/app/routes/main.js

@@ -652,7 +652,61 @@ module.exports = Em.Route.extend({
       connectOutlets: function (router) {
         router.set('mainAdminController.category', "highAvailability");
         router.get('mainAdminController').connectOutlet('mainAdminHighAvailability');
-      }
+      },
+
+      rollback: Ember.Route.extend({
+        route: '/rollback',
+        enter: function (router) {
+          //after refresh check if the wizard is open then restore it
+          Ember.run.next(function () {
+            App.router.get('updateController').set('isWorking', false);
+
+
+            var highAvailabilityWizardController = router.get('highAvailabilityWizardController');
+            highAvailabilityWizardController.finish();
+            highAvailabilityWizardController.get('popup').hide();
+
+            var popup = App.ModalPopup.show({
+              classNames: ['full-width-modal'],
+              header: Em.I18n.t('admin.highAvailability.rollback.header'),
+              bodyClass: App.HighAvailabilityRollbackView.extend({
+                controllerBinding: 'App.router.highAvailabilityRollbackController'
+              }),
+              primary: Em.I18n.t('form.cancel'),
+              secondary: null,
+              showFooter: false,
+
+              onClose: function () {
+                var self = this;
+                var controller = router.get('highAvailabilityRollbackController');
+//                if (!controller.get('isSubmitDisabled')) {
+                  self.proceedOnClose();
+//                }
+              },
+              proceedOnClose: function () {
+                App.router.get('updateController').set('isWorking', true);
+                /*App.clusterStatus.setClusterStatus({
+                  clusterName: router.get('content.cluster.name'),
+                  clusterState: 'HIGH_AVAILABILITY_DISABLED',
+                  wizardControllerName: router.get('highAvailabilityRollbackController.name'),
+                  localdb: App.db.data
+                });*/
+                this.hide();
+                router.transitionTo('main.admin.adminHighAvailability');
+              },
+              didInsertElement: function () {
+                this.fitHeight();
+              }
+            });
+            router.set('highAvailabilityRollbackController.popup', popup);
+          });
+
+        },
+
+        unroutePath: function () {
+          return false;
+        }
+      })
     }),
 
     enableHighAvailability: require('routes/high_availability_routes'),

+ 21 - 0
ambari-web/app/templates/main/admin/highAvailability/rollback.hbs

@@ -0,0 +1,21 @@
+{{!
+* 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.
+}}
+<div class="wizard">
+  {{template "templates/main/admin/highAvailability/progress"}}
+</div>
+

+ 1 - 0
ambari-web/app/views.js

@@ -56,6 +56,7 @@ require('views/main/admin');
 require('views/main/admin/highAvailability_view');
 require('views/main/admin/highAvailability/wizard_view');
 require('views/main/admin/highAvailability/progress_view');
+require('views/main/admin/highAvailability/rollback_view');
 require('views/main/admin/highAvailability/step1_view');
 require('views/main/admin/highAvailability/step2_view');
 require('views/main/admin/highAvailability/step3_view');

+ 29 - 0
ambari-web/app/views/main/admin/highAvailability/rollback_view.js

@@ -0,0 +1,29 @@
+/**
+ * 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.
+ */
+
+
+var App = require('app');
+
+App.HighAvailabilityRollbackView = App.HighAvailabilityProgressPageView.extend({
+  templateName: require('templates/main/admin/highAvailability/rollback'),
+
+  notice: Em.I18n.t('admin.highAvailability.rollback.notice.inProgress'),
+  submitButtonText: Em.I18n.t('common.done')
+
+
+});