瀏覽代碼

AMBARI-9518. Kerberos Wizard: can't navigate to previous step when any stage was failed on Kerberize Cluster step.. (akovalenko)

Aleksandr Kovalenko 10 年之前
父節點
當前提交
a1cceeb9d4

+ 51 - 1
ambari-web/app/controllers/main/admin/kerberos/step6_controller.js

@@ -24,6 +24,12 @@ App.KerberosWizardStep6Controller = App.KerberosProgressPageController.extend({
   commands: [],
   contextForPollingRequest: Em.I18n.t('requestInfo.kerberizeCluster'),
 
+  /**
+   * Define whether show Back button
+   * @type {Boolean}
+   */
+  isBackButtonDisabled: true,
+
   setRequest: function () {
     this.set('request', {
       name: 'KERBERIZE_CLUSTER',
@@ -38,6 +44,17 @@ App.KerberosWizardStep6Controller = App.KerberosProgressPageController.extend({
     });
   },
 
+  /**
+   * Send request to unkerberisze cluster
+   * @returns {$.ajax}
+   */
+  unkerberizeCluster: function () {
+    return App.ajax.send({
+      name: 'admin.unkerberize.cluster',
+      sender: this
+    });
+  },
+
   postKerberosDescriptor: function (kerberosDescriptor) {
     return App.ajax.send({
       name: 'admin.kerberos.cluster.artifact.create',
@@ -51,9 +68,42 @@ App.KerberosWizardStep6Controller = App.KerberosProgressPageController.extend({
     });
   },
 
+  /**
+   * Send request to update kerberos descriptor
+   * @param kerberosDescriptor
+   * @returns {$.ajax|*}
+   */
+  putKerberosDescriptor: function (kerberosDescriptor) {
+    return App.ajax.send({
+      name: 'admin.kerberos.cluster.artifact.update',
+      sender: this,
+      data: {
+        artifactName: 'kerberos_descriptor',
+        data: {
+          artifact_data: kerberosDescriptor
+        }
+      }
+    });
+  },
+
   retry: function () {
     this.set('showRetry', false);
     this.get('tasks').setEach('status', 'PENDING');
     App.router.send('retry');
-  }
+  },
+
+
+  /**
+   * Enable or disable previous steps according to tasks statuses
+   */
+  enableDisablePreviousSteps: function () {
+    var wizardController = App.router.get(this.get('content.controllerName'));
+    if (this.get('tasks').someProperty('status', 'FAILED')) {
+      wizardController.enableStep(4);
+      this.set('isBackButtonDisabled', false);
+    } else {
+      wizardController.setLowerStepsDisable(6);
+      this.set('isBackButtonDisabled', true);
+    }
+  }.observes('tasks.@each.status')
 });

+ 8 - 0
ambari-web/app/controllers/wizard.js

@@ -114,6 +114,14 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
     }
   }.observes('currentStep'),
 
+  /**
+   * Enable step link in left nav menu
+   * @param step - step number
+   */
+  enableStep: function (step) {
+    this.get('isStepDisabled').findProperty('step', step).set('value', false);
+  },
+
   setLowerStepsDisable: function (stepNo) {
     for (var i = 1; i < stepNo; i++) {
       var step = this.get('isStepDisabled').findProperty('step', i);

+ 4 - 4
ambari-web/app/mixins/wizard/wizardProgressPageController.js

@@ -59,9 +59,9 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create({
     if (!self.isSingleRequestPage) {
       this.initStep();
     } else {
-      var runningOperations = App.router.get('backgroundOperationsController.services').filterProperty('isRunning');
-      var currentOperation = runningOperations.findProperty('name', this.contextForPollingRequest);
-      if (!currentOperation) {
+      var requestIds = this.get('content.tasksRequestIds');
+      var currentRequestId = requestIds && requestIds[0][0];
+      if (!currentRequestId) {
         this.submitRequest().done(function (data, result, request) {
           if (data) {
             self.set('currentPageRequestId', data.Requests.id);
@@ -76,7 +76,7 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create({
           }
         });
       } else {
-        self.set('currentPageRequestId',currentOperation.get('id'));
+        self.set('currentPageRequestId', currentRequestId);
         self.doPollingForPageRequest();
       }
     }

+ 21 - 8
ambari-web/app/routes/add_kerberos_routes.js

@@ -226,6 +226,8 @@ module.exports = App.WizardRoute.extend({
       var kerberosWizardController = router.get('kerberosWizardController');
       var kerberosWizardStep4Controller = router.get('kerberosWizardStep4Controller');
       kerberosWizardController.saveServiceConfigProperties(kerberosWizardStep4Controller);
+      kerberosWizardController.setDBProperty('tasksStatuses', null);
+      kerberosWizardController.setDBProperty('tasksRequestIds', null);
       router.transitionTo('step5');
     }
   }),
@@ -250,7 +252,22 @@ module.exports = App.WizardRoute.extend({
     },
     back: Em.Router.transitionTo('step4'),
     next: function (router) {
-      router.transitionTo('step6');
+      var kerberosWizardController = router.get('kerberosWizardController');
+      kerberosWizardController.setDBProperty('tasksStatuses', null);
+      kerberosWizardController.setDBProperty('tasksRequestIds', null);
+      var step6Controller = router.get('kerberosWizardStep6Controller');
+      var kerberosDescriptor = kerberosWizardController.get('kerberosDescriptorConfigs');
+      step6Controller.postKerberosDescriptor(kerberosDescriptor).always(function (data, result, request) {
+        if (result === 'error' && data.status === 409) {
+          step6Controller.putKerberosDescriptor(kerberosDescriptor).always(function (data) {
+            step6Controller.unkerberizeCluster().always(function (data) {
+              router.transitionTo('step6');
+            });
+          });
+        } else {
+          router.transitionTo('step6');
+        }
+      });
     }
   }),
 
@@ -267,16 +284,12 @@ module.exports = App.WizardRoute.extend({
       controller.dataLoading().done(function () {
         controller.setLowerStepsDisable(6);
         controller.loadAllPriorSteps();
-        var kerberosDescriptor = controller.get('kerberosDescriptorConfigs');
-          stepController.postKerberosDescriptor(kerberosDescriptor).always(function (data) {
-          stepController.setRequest();
-          controller.connectOutlet('kerberosWizardStep6', controller.get('content'));
-        });
+        stepController.setRequest();
+        controller.connectOutlet('kerberosWizardStep6', controller.get('content'));
       });
     },
     retry: function () {
       var router = App.get('router');
-      var controller = router.get('kerberosWizardController');
       var stepController = router.get('kerberosWizardStep6Controller');
       stepController.setRequest();
       stepController.loadStep();
@@ -284,7 +297,7 @@ module.exports = App.WizardRoute.extend({
     unroutePath: function () {
       return false;
     },
-    back: Em.Router.transitionTo('step5'),
+    back: Em.Router.transitionTo('step4'),
     next: function (router) {
       router.transitionTo('step7');
     }

+ 13 - 0
ambari-web/app/utils/ajax/ajax.js

@@ -1268,6 +1268,19 @@ var urls = {
       }
     }
   },
+  'admin.unkerberize.cluster': {
+    'type': 'PUT',
+    'real': '/clusters/{clusterName}',
+    'format': function (data) {
+      return {
+        data: JSON.stringify({
+          Clusters: {
+            security_type: "NONE"
+          }
+        })
+      }
+    }
+  },
   'get.cluster.artifact': {
     'real': '/clusters/{clusterName}/artifacts/{artifactName}?fields=artifact_data',
     'mock': '/data/wizard/kerberos/stack_descriptors.json'

+ 1 - 1
ambari-web/app/views/main/admin/kerberos/step6_view.js

@@ -26,6 +26,6 @@ App.KerberosWizardStep6View = App.KerberosProgressPageView.extend({
 
   submitButtonText: Em.I18n.t('common.next') + '&rarr;',
 
-  showBackButton: false
+  showBackButton: true
 
 });

+ 23 - 0
ambari-web/test/controllers/wizard_test.js

@@ -215,4 +215,27 @@ describe('App.WizardController', function () {
     });
 
   });
+
+  describe('#enableStep', function () {
+
+    it('should update appropriate value in isStepDisabled', function () {
+
+      c.set('isStepDisabled', [
+        Em.Object.create({step: 1, value: true}),
+        Em.Object.create({step: 2, value: true}),
+        Em.Object.create({step: 3, value: true}),
+        Em.Object.create({step: 4, value: true}),
+        Em.Object.create({step: 5, value: true}),
+        Em.Object.create({step: 6, value: true}),
+        Em.Object.create({step: 7, value: true})
+      ]);
+
+      c.enableStep(1);
+      expect(c.get('isStepDisabled')[0].get('value')).to.be.false;
+
+      c.enableStep(7);
+      expect(c.get('isStepDisabled')[6].get('value')).to.be.false;
+    });
+
+  });
 });