Explorar o código

AMBARI-9656. Kerberos: Add Service -> Customize Services secure properties duplication and labels issues. (alexantonenko)

Alex Antonenko %!s(int64=10) %!d(string=hai) anos
pai
achega
dea6e433af

+ 7 - 7
ambari-web/app/controllers/global/cluster_controller.js

@@ -60,12 +60,6 @@ App.ClusterController = Em.Controller.extend({
     this.set('clusterDataLoadedPercent', 'width:' + (Math.floor(numLoaded / loadListLength * 100)).toString() + '%');
   },
 
-  doOnClusterLoad: function (item) {
-    if (this.get('isLoaded')) {
-      App.router.get('mainAdminKerberosController').getUpdatedSecurityStatus();
-    }
-  }.observes('isLoaded'),
-
   dataLoadList: Em.Object.create({
     'hosts': false,
     'serviceMetrics': false,
@@ -77,7 +71,8 @@ App.ClusterController = Em.Controller.extend({
     'componentConfigs': false,
     'componentsState': false,
     'rootService': false,
-    'alertDefinitions': false
+    'alertDefinitions': false,
+    'securityStatus': false
   }),
 
   /**
@@ -263,6 +258,7 @@ App.ClusterController = Em.Controller.extend({
      * 11. load root service (Ambari)
      * 12. load alert definitions to model
      * 13. load unhealthy alert instances
+     * 14. load security status
      */
     self.loadStackServiceComponents(function (data) {
       data.items.forEach(function (service) {
@@ -310,6 +306,10 @@ App.ClusterController = Em.Controller.extend({
         App.rootServiceMapper.map(data);
         self.updateLoadStatus('rootService');
       });
+      // load security status
+      App.router.get('mainAdminKerberosController').getSecurityStatus().always(function() {
+        self.updateLoadStatus('securityStatus');
+      });
     });
   },
 

+ 6 - 2
ambari-web/app/controllers/main/admin/kerberos.js

@@ -173,17 +173,21 @@ App.MainAdminKerberosController = App.KerberosWizardStep4Controller.extend({
       this.set('dataIsLoaded', true);
     } else {
       //get Security Status From Server
-      this.getSecurityStatus();
+      return this.getSecurityStatus();
     }
   },
 
+  /**
+   * Load security status from server.
+   * @returns {$.Deferred}
+   */
   getSecurityStatus: function () {
     if (App.get('testMode')) {
       this.set('securityEnabled', !App.get('testEnableSecurity'));
       this.set('dataIsLoaded', true);
     } else {
       //get Security Status From Server
-      App.ajax.send({
+      return App.ajax.send({
         name: 'admin.security_status',
         sender: this,
         success: 'getSecurityStatusSuccessCallback',

+ 28 - 4
ambari-web/app/controllers/main/service/add_controller.js

@@ -18,7 +18,7 @@
 
 
 var App = require('app');
-App.AddServiceController = App.WizardController.extend({
+App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, {
 
   name: 'addServiceController',
   // @TODO: remove after Kerberos Automation supports
@@ -119,10 +119,16 @@ App.AddServiceController = App.WizardController.extend({
     ],
     '4': [
       {
-        type: 'sync',
+        type: 'async',
         callback: function () {
-          this.loadServiceConfigGroups();
-          this.loadServiceConfigProperties();
+          var self = this;
+          var dfd = $.Deferred();
+          this.loadKerberosDescriptorConfigs().done(function() {
+            self.loadServiceConfigGroups();
+            self.loadServiceConfigProperties();
+            dfd.resolve();
+          });
+          return dfd.promise();
         }
       }
     ],
@@ -334,6 +340,24 @@ App.AddServiceController = App.WizardController.extend({
     }
   },
 
+  /**
+   * Load kerberos descriptor configuration
+   * @returns {$.Deferred}
+   */
+  loadKerberosDescriptorConfigs: function() {
+    var self = this,
+        dfd = $.Deferred();
+    if (App.router.get('mainAdminKerberosController.securityEnabled')) {
+      this.getDescriptorConfigs().then(function(properties) {
+        self.set('kerberosDescriptorConfigs', properties);
+        dfd.resolve();
+      });
+    } else {
+      dfd.resolve();
+    }
+    return dfd.promise();
+  },
+
   saveServiceConfigProperties: function (stepController) {
     this._super(stepController);
     if (this.get('currentStep') > 1 && this.get('currentStep') < 6) {

+ 4 - 39
ambari-web/app/controllers/wizard/step7_controller.js

@@ -620,6 +620,10 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, {
     var self = this;
     this.loadServerSideConfigsRecommendations().always(function () {
       self.set('isRecommendedLoaded', true);
+      // format descriptor configs
+      if (self.get('securityEnabled') && self.get('wizardController.name') == 'addServiceController') {
+        App.config.addKerberosDescriptorConfigs(configs, self.get('wizardController.kerberosDescriptorConfigs') || []);
+      }
       self.setStepConfigs(configs, storedConfigs);
       self.checkHostOverrideInstaller();
       self.activateSpecialConfigs();
@@ -708,45 +712,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, {
     this.set('stepConfigs', serviceConfigs);
   },
 
-  /**
-   * Set secure properties for installed services. Mark secure properties and
-   * properties with default empty value as non required to pass validation.
-   *
-   * @param {Em.Object} serviceConfigObj
-   * @param {String} serviceName
-   */
-  setSecureConfigs: function (serviceConfigObj, serviceName) {
-    var configProperties = serviceConfigObj.get('configs');
-    if (!configProperties) return;
-    var secureConfigs = this.get('secureConfigs').filterProperty('serviceName', serviceName);
-    secureConfigs.forEach(function (secureConfig) {
-      var property = configProperties.findProperty('name', secureConfig.name);
-      if (property) {
-        property.set('isRequired', secureConfig.value != "");
-        if (!property.get('isRequired')) property.set('errorMessage', '');
-      }
-    });
-  },
-  /**
-   *
-   * @param selectedService
-   * @param serviceName
-   */
-  addSecureConfigs: function (selectedService, serviceName) {
-    var secureService = this.get('secureServices').findProperty('serviceName', serviceName);
-    if (!secureService) {
-      return;
-    }
-    secureService.configCategories.forEach(function (category) {
-      selectedService.get('configCategories').push(category);
-    });
-    secureService.configs.forEach(function (conf) {
-      conf.isVisible = !conf.displayType.contains('masterHost') && !conf.displayType.contains('slaveHost');
-      var config = App.ServiceConfigProperty.create(conf);
-      selectedService.get('configs').push(config);
-    }, this);
-  },
-
   /**
    * Select first addable service for <code>addServiceWizard</code>
    * Select first service at all in other cases

+ 19 - 0
ambari-web/app/utils/config.js

@@ -744,6 +744,25 @@ App.config = Em.Object.create({
       // Nothing to worry about here, most likely trying indexOf on a non-string
     }
   },
+
+  /**
+   * Mark descriptor properties in configuration object.
+   *
+   * @param {Object[]} configs - config properties to change
+   * @param {App.ServiceConfigProperty[]} descriptor - parsed kerberos descriptor
+   */
+  addKerberosDescriptorConfigs: function(configs, descriptor) {
+    descriptor.forEach(function(item) {
+      var property = configs.findProperty('name', item.get('name'));
+      if (property) {
+        Em.set(property, 'isSecureConfig', true);
+        Em.set(property, 'displayName', Em.get(item, 'name'));
+        Em.set(property, 'isUserProperty', false);
+        Em.set(property, 'isOverridable', false);
+        Em.set(property, 'category', 'Advanced ' + Em.get(item, 'filename'));
+      }
+    });
+  },
   /**
    * create new child configs from overrides, attach them to parent config
    * override - value of config, related to particular host(s)

+ 0 - 34
ambari-web/test/controllers/wizard/step7_test.js

@@ -1282,40 +1282,6 @@ describe('App.InstallerStep7Controller', function () {
 
   });
 
-  describe('#setSecureConfigs', function() {
-    var serviceConfigObj = Em.Object.create({
-      serviceName: 'HDFS',
-      configs: [
-        Em.Object.create({ name: 'hadoop.http.authentication.signature.secret.file' }),
-        Em.Object.create({ name: 'hadoop.security.authentication' })
-      ]
-    });
-    var tests = [
-      { name: 'hadoop.http.authentication.signature.secret.file', e: false },
-      { name: 'hadoop.security.authentication', e: true }
-    ];
-
-    sinon.stub(App, 'get', function(key) {
-      if (['isHadoop22Stack'].contains(key)) return true;
-      else App.get(key);
-    });
-    var controller = App.WizardStep7Controller.create({});
-    controller.get('secureConfigs').pushObjects([
-      {
-        name: 'hadoop.http.authentication.signature.secret.file',
-        serviceName: 'HDFS',
-        value: ''
-      }
-    ]);
-    controller.setSecureConfigs(serviceConfigObj, 'HDFS');
-    App.get.restore();
-    tests.forEach(function(test) {
-      it('{0} is {1}required'.format(test.name, !!test.e ? '' : 'non ' ), function() {
-        expect(serviceConfigObj.get('configs').findProperty('name', test.name).get('isRequired')).to.eql(test.e);
-      });
-    });
-  });
-
   describe('#setInstalledServiceConfigs', function () {
 
     var controller = App.WizardStep7Controller.create({

+ 33 - 0
ambari-web/test/utils/config_test.js

@@ -800,4 +800,37 @@ describe('App.config', function () {
 
   });
 
+  describe('#addKerberosDescriptorConfigs', function() {
+    var configs = [
+      { name: 'prop1', displayName: 'Prop1' },
+      { name: 'prop2', displayName: 'Prop2' },
+      { name: 'prop3', displayName: 'Prop3' },
+    ];
+    var descriptor = [
+      Em.Object.create({ name: 'prop4', filename: 'file-1'}),
+      Em.Object.create({ name: 'prop1', filename: 'file-1'}),
+    ];
+    App.config.addKerberosDescriptorConfigs(configs, descriptor);
+    var propertiesAttrTests = [
+      {
+        attr: 'isUserProperty', val: false,
+        m: 'descriptor properties should not be marked as custom'
+      },
+      {
+        attr: 'category', val: 'Advanced file-1',
+        m: 'descriptor properties should be added to Advanced category'
+      },
+      {
+        attr: 'isOverridable', val: false,
+        m: 'descriptor properties should not be overriden'
+      },
+    ];
+
+    propertiesAttrTests.forEach(function(test) {
+      it(test.m, function() {
+        expect(configs.findProperty('name', 'prop1')[test.attr]).to.be.eql(test.val);
+      });
+    });
+  });
+
 });