Repository: ambari Updated Branches: refs/heads/trunk 549783cde -> f9696fe8b
AMBARI-20535. Add Service wizard: "Configure Services" and "Configure identities" pages should be coincided (akovalenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f9696fe8 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f9696fe8 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f9696fe8 Branch: refs/heads/trunk Commit: f9696fe8baedd9b9f318e0bcf0181dd050cf1c0a Parents: 549783c Author: Aleksandr Kovalenko <[email protected]> Authored: Thu Mar 23 17:19:40 2017 +0200 Committer: Aleksandr Kovalenko <[email protected]> Committed: Thu Mar 23 18:38:32 2017 +0200 ---------------------------------------------------------------------- .../app/controllers/main/admin/kerberos.js | 1 + .../main/admin/kerberos/step4_controller.js | 126 +----- .../main/admin/kerberos/wizard_controller.js | 14 - .../controllers/main/service/add_controller.js | 37 +- ambari-web/app/controllers/wizard.js | 9 + .../app/controllers/wizard/step7_controller.js | 135 ++++-- .../app/controllers/wizard/step8_controller.js | 2 +- .../app/mixins/wizard/addSecurityConfigs.js | 444 ++++++++++++++++++- ambari-web/app/routes/add_kerberos_routes.js | 2 +- ambari-web/app/routes/add_service_routes.js | 99 ++--- ambari-web/app/templates/main/service/add.hbs | 7 +- ambari-web/app/utils/ajax/ajax.js | 4 + .../admin/kerberos/step4_controller_test.js | 166 ------- .../main/service/add_controller_test.js | 54 --- .../test/controllers/wizard/step7_test.js | 32 +- .../test/controllers/wizard/step8_test.js | 7 +- 16 files changed, 603 insertions(+), 536 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/admin/kerberos.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/admin/kerberos.js b/ambari-web/app/controllers/main/admin/kerberos.js index 762f4d0..564fb35 100644 --- a/ambari-web/app/controllers/main/admin/kerberos.js +++ b/ambari-web/app/controllers/main/admin/kerberos.js @@ -360,6 +360,7 @@ App.MainAdminKerberosController = App.KerberosWizardStep4Controller.extend({ setStepConfigs: function (properties) { this.get('stepConfigs').clear(); this._super(properties); + this.set('selectedService', this.get('stepConfigs')[0]); this.get('stepConfigs').forEach(function (serviceConfig) { serviceConfig.set('initConfigsLength', serviceConfig.get('configs.length')); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js b/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js index f23814c..275045e 100644 --- a/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js +++ b/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js @@ -17,12 +17,10 @@ */ var App = require('app'); -var blueprintUtils = require('utils/blueprint'); require('controllers/wizard/step7_controller'); App.KerberosWizardStep4Controller = App.WizardStep7Controller.extend(App.AddSecurityConfigs, App.ToggleIsRequiredMixin, App.KDCCredentialsControllerMixin, { name: 'kerberosWizardStep4Controller', - isWithinAddService: Em.computed.equal('wizardController.name', 'addServiceController'), // stores configurations loaded by ConfigurationsController.getConfigsByTags servicesConfigurations: null, @@ -36,10 +34,6 @@ App.KerberosWizardStep4Controller = App.WizardStep7Controller.extend(App.AddSecu loadStep: function() { var self, stored; - if (this.get('wizardController.skipConfigureIdentitiesStep')) { - App.router.send('next'); - return; - } self = this; this.clearStep(); stored = this.get('wizardController').loadCachedStepConfigValues(this) || []; @@ -72,25 +66,12 @@ App.KerberosWizardStep4Controller = App.WizardStep7Controller.extend(App.AddSecu * @returns {$.Deferred} */ getDescriptor: function() { - var self = this; var dfd = $.Deferred(); var successCallback = function(data) { dfd.resolve(data); }; - var checkDescriptor = function() { - if (self.get('isWithinAddService')) { - return App.ajax.send({ - sender: self, - name: 'admin.kerberize.cluster_descriptor_artifact' - }); - } - return $.Deferred().resolve().promise(); - }; - checkDescriptor().always(function(data, status) { - self.storeClusterDescriptorStatus(status === 'success'); - self.loadClusterDescriptorConfigs(self.get('isWithinAddService') ? self.get('selectedServiceNames') : false).then(successCallback); - }); + this.loadClusterDescriptorConfigs(false).then(successCallback); return dfd.promise(); }, @@ -486,26 +467,6 @@ App.KerberosWizardStep4Controller = App.WizardStep7Controller.extend(App.AddSecu }, /** - * Returns payload for recommendations request. - * Takes services' configurations and merge them with kerberos descriptor properties. - * - * @param {object[]} configurations services' configurations fetched from API - * @param {App.ServiceConfigProperty[]} kerberosDescriptor descriptor configs - * @returns {object} payload for recommendations request - */ - getBlueprintPayloadObject: function(configurations, kerberosDescriptor) { - var recommendations = blueprintUtils.generateHostGroups(App.get('allHostNames')); - var mergedConfigurations = this.mergeDescriptorToConfigurations(configurations, this.createServicesStackDescriptorConfigs(kerberosDescriptor)); - recommendations.blueprint.configurations = mergedConfigurations.reduce(function(p, c) { - p[c.type] = {}; - p[c.type].properties = c.properties; - return p; - }, {}); - - return recommendations; - }, - - /** * @override */ _saveRecommendedValues: function(data) { @@ -551,89 +512,6 @@ App.KerberosWizardStep4Controller = App.WizardStep7Controller.extend(App.AddSecu */ getServicesConfigObject: function() { return this.get('stepConfigs').findProperty('name', 'ADVANCED'); - }, - - /** - * Returns map with appropriate action and properties to process with. - * Key is an action e.g. `add`, `update`, `delete` and value is an object `fileName` -> `propertyName`: `propertyValue`. - * - * @param {object} recommendedConfigurations - * @param {object[]} servicesConfigurations services' configurations fetched from API - * @param {App.ServiceConfigProperty[]} allConfigs all current configurations stored in controller, basically kerberos descriptor - * @returns {object} - */ - groupRecommendationProperties: function(recommendedConfigurations, servicesConfigurations, allConfigs) { - var resultMap = { - update: {}, - add: {}, - delete: {} - }; - - /** - * Adds property to associated group `add`,`delete`,`update`. - * - * @param {object} propertyMap <code>resultMap</code> object - * @param {string} name property name - * @param {string} propertyValue property value - * @param {string} fileName property file name - * @return {object} <code>resultMap</code> - * @param {string} group, `add`,`delete`,`update` - */ - var addProperty = function(propertyMap, name, propertyValue, fileName, group) { - var ret = $.extend(true, {}, propertyMap); - if (ret.hasOwnProperty(group)) { - if (!ret[group].hasOwnProperty(fileName)) { - ret[group][fileName] = {}; - } - ret[group][fileName][name] = propertyValue; - } - return ret; - }; - - return Em.keys(recommendedConfigurations || {}).reduce(function(acc, fileName) { - var propertyMap = acc; - var recommendedProperties = Em.getWithDefault(recommendedConfigurations, fileName + '.properties', {}); - var recommendedAttributes = Em.getWithDefault(recommendedConfigurations, fileName + '.property_attributes', {}); - // check for properties that should be delted - Em.keys(recommendedAttributes).forEach(function(propertyName) { - var attribute = recommendedAttributes[propertyName]; - // delete properties which are present in kerberos descriptor - if (attribute.hasOwnProperty('delete') && allConfigs.filterProperty('filename', fileName).someProperty('name', propertyName)) { - propertyMap = addProperty(propertyMap, propertyName, '', fileName, 'delete'); - } - }); - - return Em.keys(recommendedProperties).reduce(function(a, propertyName) { - var propertyValue = recommendedProperties[propertyName]; - // check if property exist in saved configurations on server - var isExist = Em.getWithDefault(servicesConfigurations.findProperty('type', fileName) || {}, 'properties', {}).hasOwnProperty(propertyName); - if (!isExist) { - return addProperty(a, propertyName, propertyValue, fileName, 'add'); - } - // when property exist check that it present in current step configs (kerberos descriptor) - // and add it as property to `update` - if (allConfigs.filterProperty('filename', fileName).someProperty('name', propertyName)) { - return addProperty(a, propertyName, propertyValue, fileName, 'update'); - } - return a; - }, propertyMap); - }, resultMap); - }, - - /** - * - * @method getServiceByFilename - * @param {string}fileName - * @returns {string} - */ - getServiceByFilename: function(fileName) { - // core-site properties goes to HDFS - if (fileName === 'core-site' && App.Service.find().someProperty('serviceName', 'HDFS')) { - return 'HDFS'; - } - var associatedService = App.StackService.find().filter(function(service) { - return Em.keys(service.get('configTypes')).contains(fileName); - })[0]; - return associatedService ? associatedService.get('serviceName') : ''; } + }); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js index 2f07e1f..93ffcaa 100644 --- a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js +++ b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js @@ -154,11 +154,6 @@ App.KerberosWizardController = App.WizardController.extend(App.InstallComponent, this.set('content.kerberosOption', stepController.get('selectedItem')); }, - loadKerberosDescriptorConfigs: function () { - var kerberosDescriptorConfigs = this.getDBProperty('kerberosDescriptorConfigs'); - this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs); - }, - /** * Override the visibility of a list of form items with a new value * @@ -183,15 +178,6 @@ App.KerberosWizardController = App.WizardController.extend(App.InstallComponent, this.set('content.kerberosOption', this.getDBProperty('kerberosOption')); }, - /** - * @method saveKerberosDescriptorConfigs - * @param {App.ServiceConfigProperty[]} kerberosDescriptorConfigs - */ - saveKerberosDescriptorConfigs: function (kerberosDescriptorConfigs) { - this.setDBProperty('kerberosDescriptorConfigs', kerberosDescriptorConfigs); - this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs); - }, - createKerberosResources: function (callback) { var self = this; this.createKerberosService().done(function () { http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/service/add_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/add_controller.js b/ambari-web/app/controllers/main/service/add_controller.js index 0989f76..dc8f76c 100644 --- a/ambari-web/app/controllers/main/service/add_controller.js +++ b/ambari-web/app/controllers/main/service/add_controller.js @@ -22,7 +22,7 @@ App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, { name: 'addServiceController', - totalSteps: 8, + totalSteps: 7, /** * @type {string} @@ -122,6 +122,7 @@ App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, { callback: function () { var self = this; var dfd = $.Deferred(); + this.load('cluster'); this.loadKerberosDescriptorConfigs().done(function() { self.loadServiceConfigGroups(); self.loadConfigThemes().then(function() { @@ -134,18 +135,6 @@ App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, { return dfd.promise(); } } - ], - '5': [ - { - type: 'sync', - callback: function () { - this.checkSecurityStatus(); - this.load('cluster'); - this.set('content.additionalClients', []); - this.set('installClientQueueLength', 0); - this.set('installClietsQueue', App.ajaxQueue.create({abortOnError: false})); - } - } ] }, @@ -323,12 +312,17 @@ App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, { */ loadKerberosDescriptorConfigs: function() { var self = this, - dfd = $.Deferred(); + dfd = $.Deferred(), + mergedDescriptorConfigs; if (App.get('isKerberosEnabled')) { - this.loadClusterDescriptorConfigs().then(function(properties) { - self.set('kerberosDescriptorConfigs', self.createServicesStackDescriptorConfigs(properties)); - }).always(function(){ - dfd.resolve(); + this.loadClusterDescriptorStackConfigs().then(function (stackProperties) { + self.loadClusterDescriptorConfigs().then(function(properties) { + self.set('kerberosDescriptorData', properties); + mergedDescriptorConfigs = self.mergeDescriptorStackWithConfigs(stackProperties, properties); + self.set('kerberosDescriptorConfigs', mergedDescriptorConfigs); + }).always(function(){ + dfd.resolve(); + }); }); } else { dfd.resolve(); @@ -568,13 +562,6 @@ App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, { } }, - checkSecurityStatus: function() { - if (!App.get('isKerberosEnabled')) { - this.set('skipConfigureIdentitiesStep', true); - this.get('isStepDisabled').findProperty('step', 5).set('value', true); - } - }, - loadServiceConfigGroups: function () { this._super(); this.set('areInstalledConfigGroupsLoaded', !Em.isNone(this.getDBProperty('serviceConfigGroups'))); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/wizard.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js index 7af9ab0..d9d05bc 100644 --- a/ambari-web/app/controllers/wizard.js +++ b/ambari-web/app/controllers/wizard.js @@ -1487,6 +1487,15 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM return App.get('router.configurationController').loadFromServer([{'siteName': 'hadoop-env'}]); }, + loadKerberosDescriptorConfigs: function () { + var kerberosDescriptorConfigs = this.getDBProperty('kerberosDescriptorConfigs'); + this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs); + }, + + saveKerberosDescriptorConfigs: function (kerberosDescriptorConfigs) { + this.setDBProperty('kerberosDescriptorConfigs', kerberosDescriptorConfigs); + this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs); + }, /** * reset stored wizard data and reload App * @param {App.WizardController} controller - wizard controller http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/wizard/step7_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard/step7_controller.js b/ambari-web/app/controllers/wizard/step7_controller.js index 0207e6b..dd3bfcb 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -42,7 +42,7 @@ var App = require('app'); * @property {?object[]} slaveComponentHosts */ -App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.EnhancedConfigsMixin, App.ToggleIsRequiredMixin, App.GroupsMappingMixin, { +App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.EnhancedConfigsMixin, App.ToggleIsRequiredMixin, App.GroupsMappingMixin, App.AddSecurityConfigs, App.KDCCredentialsControllerMixin, { name: 'wizardStep7Controller', @@ -429,7 +429,9 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E */ _updateIsEditableFlagForConfig: function (serviceConfigProperty, defaultGroupSelected) { if (App.isAuthorized('AMBARI.ADD_DELETE_CLUSTERS')) { - if (App.get('isKerberosEnabled') && serviceConfigProperty.get('isConfigIdentity')) { + if (App.get('isKerberosEnabled') && + serviceConfigProperty.get('isConfigIdentity') && + !App.StackService.find().filterProperty('isSelected').mapProperty('serviceName').contains(Em.get(serviceConfigProperty, 'serviceName'))) { serviceConfigProperty.set('isEditable', false); } else if (defaultGroupSelected && !Em.get(serviceConfigProperty, 'group')) { if (serviceConfigProperty.get('serviceName') === 'MISC') { @@ -488,7 +490,7 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E self.applyServicesConfigs(configs); }); } else { - this.applyServicesConfigs(configs); + this.applyServicesConfigs(configs, true); } }, @@ -515,13 +517,14 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E return configs }, - applyServicesConfigs: function (configs) { + applyServicesConfigs: function (configs, isRestoring) { + var self = this; console.time('applyServicesConfigs execution time: '); if (!this.get('installedServiceNames').contains('HAWQ') && this.get('allSelectedServiceNames').contains('HAWQ')) { this.updateHawqConfigs(configs); } if (App.get('isKerberosEnabled') && this.get('wizardController.name') === 'addServiceController') { - this.addKerberosDescriptorConfigs(configs, this.get('wizardController.kerberosDescriptorConfigs') || []); + this.addKerberosDescriptorConfigs(configs, this.get('wizardController.kerberosDescriptorConfigs') || [], isRestoring); } var stepConfigs = this.createStepConfigs(); var serviceConfigs = this.renderConfigs(stepConfigs, configs); @@ -536,7 +539,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E this.checkHostOverrideInstaller(); this.selectProperService(); var isInstallerWizard = (this.get("content.controllerName") === 'installerController'); - var self = this; var rangerService = App.StackService.find().findProperty('serviceName', 'RANGER'); var isRangerServiceAbsent = rangerService && !rangerService.get('isInstalled') && !rangerService.get('isSelected'); if (isRangerServiceAbsent) { @@ -638,21 +640,33 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E * @param {App.ServiceConfigProperty[]} descriptor - parsed kerberos descriptor * @method addKerberosDescriptorConfigs */ - addKerberosDescriptorConfigs: function (configs, descriptor) { + addKerberosDescriptorConfigs: function (configs, descriptor, isRestoring) { + var servicesToBeInstalled = this.get('content.services').filterProperty('isSelected').mapProperty('serviceName'); descriptor.forEach(function (item) { - var property = configs.findProperty('name', item.get('name')); + var service = item.get('serviceName'); + if (!servicesToBeInstalled.contains(service)) return false; + var name = item.get('name'); + var filename = Em.get(item, 'filename'); + var property = configs.filterProperty('serviceName', service).findProperty('name', name); + var propertyObj = { + isSecureConfig: true, + value: Em.get(isRestoring && property ? property : item, 'value'), + defaultValue: Em.get(item, 'value'), + displayName: name, + isOverridable: false, + isConfigIdentity: Em.get(item, 'isConfigIdentity'), + isUserProperty: !!Em.get(item, 'isUserProperty'), + category: (Em.get(item, 'isUserProperty') ? 'Custom ' : 'Advanced ') + filename + }; if (property) { - Em.setProperties(property, { - isSecureConfig: true, - displayName: Em.get(item, 'name'), - isUserProperty: false, - isOverridable: false, - isConfigIdentity: Em.get(item, 'isConfigIdentity'), + Em.setProperties(property, $.extend(propertyObj, { + savedValue: Em.get(item, 'value'), description: Em.get(item, 'isConfigIdentity') - ? App.config.kerberosIdentitiesDescription(Em.get(property, 'description')) - : Em.get(property, 'description'), - category: 'Advanced ' + Em.get(item, 'filename') - }); + ? App.config.kerberosIdentitiesDescription(Em.get(property, 'description')) + : Em.get(property, 'description') + })); + } else { + configs.push(App.ServiceConfigProperty.create(App.config.getDefaultConfig(name, filename, propertyObj))); } }); }, @@ -974,8 +988,8 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E * @return {$.ajax|null} * @method getConfigTags */ - getConfigTags: function () { - this.set('isAppliedConfigLoaded', false); + getConfigTags: function (resetFlag) { + if (resetFlag) this.set('isAppliedConfigLoaded', false); return App.ajax.send({ name: 'config.tags', sender: this, @@ -983,6 +997,27 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E }); }, + getServicesConfigurations: function() { + var dfd = $.Deferred(); + var configs, servicesConfigurations; + configs = this.get('wizardController').getConfigsAndFilenames(this, true).serviceConfigProperties; + servicesConfigurations = configs.reduce(function(configTags, property) { + var fileName = App.config.getConfigTagFromFileName(property.filename), + configType; + if (!configTags.someProperty('type', fileName)) { + configTags.push({ + type: fileName, + properties: {} + }); + } + configType = configTags.findProperty('type', fileName); + configType.properties[property.name] = property.value; + return configTags; + }, []); + dfd.resolve(servicesConfigurations); + return dfd.promise(); + }, + /** * Success callback for config tags request * Updates <code>serviceConfigTags</code> with tags received from server @@ -1211,7 +1246,9 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E _setEditableValue: function (config) { var selectedGroup = this.get('selectedConfigGroup'); if (!selectedGroup) return config; - if (App.get('isKerberosEnabled') && config.get('isConfigIdentity')) { + if (App.get('isKerberosEnabled') && + config.get('isConfigIdentity') && + !App.StackService.find().filterProperty('isSelected').mapProperty('serviceName').contains(Em.get(config, 'serviceName'))) { config.set('isEditable', false); } else { var isEditable = config.get('isEditable'), @@ -1511,7 +1548,8 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E }, onSecondary: function () { this._super(); - self.setButtonClickFinish(); + self.set('submitButtonClicked', false); + App.set('router.nextBtnClickInProgress', false); deferred.reject(); } }); @@ -1534,7 +1572,8 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E } }, onSecondary: function() { - self.setButtonClickFinish(); + App.set('router.nextBtnClickInProgress', false); + self.set('submitButtonClicked', false); this.hide(); }, onClose: function() { @@ -1568,14 +1607,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E return false; } App.set('router.nextBtnClickInProgress', true); - if (this.get('wizardController.name') === 'addServiceController' && this.get('hasChangedDependencies')) { - return this.showChangedDependentConfigs({}, this.proceedWithChecks.bind(this), this.setButtonClickFinish.bind(this)); - } else { - return this.proceedWithChecks(); - } - }, - - proceedWithChecks: function () { if (this.get('supportsPreInstallChecks')) { var preInstallChecksController = App.router.get('preInstallChecksController'); if (preInstallChecksController.get('preInstallChecksWhereRun')) { @@ -1586,11 +1617,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E return this.postSubmit(); }, - setButtonClickFinish: function () { - this.set('submitButtonClicked', false); - App.set('router.nextBtnClickInProgress', false); - }, - postSubmit: function () { var self = this; this.set('submitButtonClicked', true); @@ -1599,7 +1625,8 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E }) .fail(function (value) { if ("invalid_configs" === value) { - self.setButtonClickFinish(); + self.set('submitButtonClicked', false); + App.set('router.nextBtnClickInProgress', false); } else { // Failed due to validation mechanism failure. // Should proceed with other checks @@ -1650,5 +1677,37 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E hasStepConfigIssues: function() { return !this.get('stepConfigs').filterProperty('showConfig', true).everyProperty('hasConfigIssues', false); - }.property('[email protected]') + }.property('[email protected]'), + + checkDescriptor: function() { + if (App.get('isKerberosEnabled')) { + return App.ajax.send({ + sender: self, + name: 'admin.kerberize.cluster_descriptor_artifact' + }); + } + return $.Deferred().resolve().promise(); + }, + + /** + * Store status of kerberos descriptor located in cluster artifacts. + * This status needed for Add Service Wizard to select appropriate method to create + * or update descriptor. + * + * @param {Boolean} isExists <code>true</code> if cluster descriptor present + */ + storeClusterDescriptorStatus: function(isExists) { + this.get('wizardController').setDBProperty('isClusterDescriptorExists', isExists); + }, + + /** + * Get all configs, that should be stored in kerberos_descriptor + * @returns {Array} + */ + getDescriptorConfigs: function () { + return this.get('stepConfigs').reduce(function (allConfigs, service) { + return allConfigs.concat(service.get('configs').filterProperty('isSecureConfig')); + }, []); + } + }); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/wizard/step8_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard/step8_controller.js b/ambari-web/app/controllers/wizard/step8_controller.js index efd8834..4678d03 100644 --- a/ambari-web/app/controllers/wizard/step8_controller.js +++ b/ambari-web/app/controllers/wizard/step8_controller.js @@ -877,7 +877,7 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, App.wiz * @method updateKerberosDescriptor */ updateKerberosDescriptor: function(instant) { - var kerberosDescriptor = App.db.get('KerberosWizard', 'kerberosDescriptorConfigs'); + var kerberosDescriptor = this.get('wizardController').getDBProperty('kerberosDescriptorConfigs'); var descriptorExists = this.get('wizardController').getDBProperty('isClusterDescriptorExists') === true; var ajaxOpts = { http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/mixins/wizard/addSecurityConfigs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/wizard/addSecurityConfigs.js b/ambari-web/app/mixins/wizard/addSecurityConfigs.js index b5f3e6a..2e6d3bc 100644 --- a/ambari-web/app/mixins/wizard/addSecurityConfigs.js +++ b/ambari-web/app/mixins/wizard/addSecurityConfigs.js @@ -17,6 +17,7 @@ */ var App = require('app'); +var blueprintUtils = require('utils/blueprint'); /** * Mixin for loading and setting secure configs @@ -52,19 +53,6 @@ App.AddSecurityConfigs = Em.Mixin.create({ ], /** - * Store status of kerberos descriptor located in cluster artifacts. - * This status needed for Add Service Wizard to select appropriate method to create - * or update descriptor. - * - * @param {Boolean} isExists <code>true</code> if cluster descriptor present - */ - storeClusterDescriptorStatus: function(isExists) { - if (this.get('isWithinAddService')) { - this.get('wizardController').setDBProperty('isClusterDescriptorExists', isExists); - } - }, - - /** * * @param {object[]} items - stack descriptor json response * @returns {App.ServiceConfigProperty[]} @@ -321,8 +309,8 @@ App.AddSecurityConfigs = Em.Mixin.create({ updateKerberosDescriptor: function (kerberosDescriptor, configs) { configs.forEach(function (_config) { var isConfigUpdated; - var isStackResouce = true; - isConfigUpdated = this.updateResourceIdentityConfigs(kerberosDescriptor, _config, isStackResouce); + var isStackResource = true; + isConfigUpdated = this.updateResourceIdentityConfigs(kerberosDescriptor, _config, isStackResource); if (!isConfigUpdated) { kerberosDescriptor.services.forEach(function (_service) { isConfigUpdated = this.updateResourceIdentityConfigs(_service, _config); @@ -372,13 +360,13 @@ App.AddSecurityConfigs = Em.Mixin.create({ if (Array.isArray(configurations)) { configurations.forEach(function (_configuration) { for (var key in _configuration) { - if (Object.keys(_configuration[key]).contains(config.name) && config.filename === key) { + if (Object.keys(_configuration[key]).contains(config.name) && App.config.getConfigTagFromFileName(config.filename) === key) { _configuration[key][config.name] = config.value; isConfigUpdated = true } } }, this); - } else if (Object.keys(configurations).contains(config.name) && config.filename === 'stackConfigs') { + } else if (Object.keys(configurations).contains(config.name) && App.config.getConfigTagFromFileName(config.filename) === 'stackConfigs') { configurations[config.name] = config.value; isConfigUpdated = true; } @@ -434,5 +422,427 @@ App.AddSecurityConfigs = Em.Mixin.create({ queryParams: '?' + queryParams } }); + }, + + loadClusterDescriptorStackConfigs: function () { + return App.ajax.send({ + sender: this, + name: 'admin.kerberize.cluster_descriptor.stack' + }); + }, + + mergeDescriptorStackWithConfigs: function (descriptorStack, descriptorConfigs) { + var result = []; + var stackConfigs = this.createServicesStackDescriptorConfigs(descriptorStack); + var currentConfigs = this.createServicesStackDescriptorConfigs(descriptorConfigs); + + stackConfigs.forEach(function (stackConfig) { + var currentConfig = currentConfigs.filterProperty('name', stackConfig.get('name')).findProperty('filename', stackConfig.get('filename')); + if (currentConfig) { + currentConfigs = currentConfigs.without(currentConfig); + result.push(currentConfig); + } else { + result.push(stackConfig); + } + }); + + // add all properties from descriptor/COMPOSITE, that are absent in descriptor/STACK as custom properties + currentConfigs.setEach('isUserProperty', true); + result = result.concat(currentConfigs); + + return result; + }, + + /** + * Prepare step configs using stack descriptor properties. + * + * @param {App.ServiceConfigProperty[]} configs + * @param {App.ServiceConfigProperty[]} stackConfigs converted kerberos descriptor + */ + setStepConfigs: function(configs, stackConfigs, showAdminProperties) { + var configProperties = this.prepareConfigProperties(configs, showAdminProperties), + stackConfigProperties = stackConfigs ? this.prepareConfigProperties(stackConfigs, showAdminProperties) : [], + alterProperties = ['value','initialValue', 'defaultValue']; + if (this.get('wizardController.name') === 'addServiceController') { + // config properties for installed services should be disabled on Add Service Wizard + configProperties.forEach(function(item) { + if (this.get('installedServiceNames').contains(item.get('serviceName')) || item.get('serviceName') == 'Cluster') { + item.set('isEditable', false); + } else if (stackConfigs) { + var stackConfigProperty = stackConfigProperties.filterProperty('filename', item.get('filename')).findProperty('name', item.get('name')); + if (stackConfigProperty) { + alterProperties.forEach(function (alterProperty) { + item.set(alterProperty, stackConfigProperty.get(alterProperty)); + }); + } + } + }, this); + // Concat properties that are present in the stack's kerberos descriptor but not in the cluster kerberos descriptor + stackConfigProperties.forEach(function(_stackConfigProperty){ + var isPropertyInClusterDescriptor = configProperties.filterProperty('filename', _stackConfigProperty.get('filename')).someProperty('name', _stackConfigProperty.get('name')); + if (!isPropertyInClusterDescriptor) { + if (this.get('installedServiceNames').contains(_stackConfigProperty.get('serviceName')) || _stackConfigProperty.get('serviceName') === 'Cluster') { + _stackConfigProperty.set('isEditable', false); + } + configProperties.pushObject(_stackConfigProperty); + } + }, this); + } + configProperties = App.config.sortConfigs(configProperties); + var stepConfigs = this.createServiceConfig(configProperties); + this.get('stepConfigs').pushObjects(stepConfigs); + return stepConfigs; + }, + + /** + * Filter configs by installed services for Kerberos Wizard or by installed + selected services + * for Add Service Wizard. + * Set property value observer. + * Set realm property with value from previous configuration step. + * Set appropriate category for all configs. + * Hide KDC related credentials properties if kerberos was manually enabled. + * + * @param {App.ServiceConfigProperty[]} configs + * @returns {App.ServiceConfigProperty[]} + */ + prepareConfigProperties: function(configs, showAdminProperties) { + var self = this; + // stored configs from previous steps (Configure Kerberos or Customize Services for ASW) + var storedServiceConfigs = this.get('wizardController.content.serviceConfigProperties'); + var installedServiceNames = ['Cluster', 'AMBARI'].concat(App.Service.find().mapProperty('serviceName')); + var configProperties = configs.slice(0); + var siteProperties = App.configsCollection.getAll(); + var realmValue; + // override stored values + App.config.mergeStoredValue(configProperties, this.get('wizardController').loadCachedStepConfigValues(this)); + + // show admin properties in add service wizard + if (showAdminProperties) { + installedServiceNames = installedServiceNames.concat(this.get('selectedServiceNames')); + } + configProperties = configProperties.filter(function(item) { + return installedServiceNames.contains(item.get('serviceName')); + }); + if (this.get('wizardController.name') !== 'addServiceController') { + realmValue = storedServiceConfigs.findProperty('name', 'realm').value; + configProperties.findProperty('name', 'realm').set('value', realmValue); + configProperties.findProperty('name', 'realm').set('savedValue', realmValue); + configProperties.findProperty('name', 'realm').set('recommendedValue', realmValue); + } + + configProperties.setEach('isSecureConfig', false); + configProperties.forEach(function(property, item, allConfigs) { + if (['spnego_keytab', 'spnego_principal'].contains(property.get('name'))) { + property.addObserver('value', self, 'spnegoPropertiesObserver'); + } + if (property.get('observesValueFrom') && allConfigs.someProperty('name', property.get('observesValueFrom'))) { + var observedValue = Em.get(allConfigs.findProperty('name', property.get('observesValueFrom')), 'value'); + property.set('value', observedValue); + property.set('recommendedValue', observedValue); + property.set('isVisible', true); + } + if (property.get('serviceName') === 'Cluster') { + property.set('category', 'Global'); + } + else { + property.set('category', property.get('serviceName')); + } + // All user identity except storm should be grouped under "Ambari Principals" category + if (property.get('identityType') == 'user') property.set('category', 'Ambari Principals'); + var siteProperty = siteProperties.findProperty('name', property.get('name')); + if (siteProperty) { + if (siteProperty.category === property.get('category')) { + property.set('displayName',siteProperty.displayName); + if (siteProperty.index) { + property.set('index', siteProperty.index); + } + } + if (siteProperty.displayType) { + property.set('displayType', siteProperty.displayType); + } + } + this.tweakConfigProperty(property); + },this); + + return configProperties; + }, + + /** + * Function to override kerberos descriptor's property values + */ + tweakConfigProperty: function(config) { + var defaultHiveMsPort = "9083", + hiveMSHosts, + port, + hiveMSHostNames, + configValue; + if (config.name === 'templeton.hive.properties') { + hiveMSHosts = App.HostComponent.find().filterProperty('componentName', 'HIVE_METASTORE'); + if (hiveMSHosts.length > 1) { + hiveMSHostNames = hiveMSHosts.mapProperty('hostName'); + port = config.value.match(/:[0-9]{2,4}/); + port = port ? port[0].slice(1) : defaultHiveMsPort; + for (var i = 0; i < hiveMSHostNames.length; i++) { + hiveMSHostNames[i] = "thrift://" + hiveMSHostNames[i] + ":" + port; + } + configValue = config.value.replace(/thrift.+[0-9]{2,},/i, hiveMSHostNames.join('\\,') + ","); + config.set('value', configValue); + config.set('recommendedValue', configValue); + } + } + }, + + /** + * Sync up values between inherited property and its reference. + * + * @param {App.ServiceConfigProperty} configProperty + */ + spnegoPropertiesObserver: function(configProperty) { + var stepConfig = this.get('stepConfigs').findProperty('name', 'KERBEROS') || this.get('stepConfigs').findProperty('name', 'ADVANCED'); + + stepConfig.get('configs').forEach(function(config) { + if (config.get('observesValueFrom') === configProperty.get('name')) { + Em.run.once(this, function() { + config.set('value', configProperty.get('value')); + config.set('recommendedValue', configProperty.get('value')); + }); + } + }, this); + }, + /** + * Prepare all necessary data for recommendations payload. + * + * #mutates initialConfigValues + * @returns {$.Deferred.promise()} + */ + bootstrapRecommendationPayload: function(kerberosDescriptor) { + var dfd = $.Deferred(); + var self = this; + + this.getServicesConfigurations().then(function(configurations) { + var recommendations = self.getBlueprintPayloadObject(configurations, kerberosDescriptor); + self.set('servicesConfigurations', configurations); + self.set('initialConfigValues', recommendations.blueprint.configurations); + dfd.resolve(recommendations); + }); + return dfd.promise(); + }, + + getServicesConfigurations: function() { + var dfd = $.Deferred(); + var self = this; + this.getConfigTags().then(function() { + App.router.get('configurationController').getConfigsByTags(self.get('serviceConfigTags')).done(function (configurations) { + dfd.resolve(configurations); + }); + }); + + return dfd.promise(); + }, + + /** + * Returns payload for recommendations request. + * Takes services' configurations and merge them with kerberos descriptor properties. + * + * @param {object[]} configurations services' configurations fetched from API + * @param {App.ServiceConfigProperty[]} kerberosDescriptor descriptor configs + * @returns {object} payload for recommendations request + */ + getBlueprintPayloadObject: function(configurations, kerberosDescriptor) { + var recommendations = blueprintUtils.generateHostGroups(App.get('allHostNames')); + var mergedConfigurations = this.mergeDescriptorToConfigurations(configurations, this.createServicesStackDescriptorConfigs(kerberosDescriptor)); + recommendations.blueprint.configurations = mergedConfigurations.reduce(function(p, c) { + p[c.type] = {}; + p[c.type].properties = c.properties; + return p; + }, {}); + + return recommendations; + }, + + /** + * Returns map with appropriate action and properties to process with. + * Key is an action e.g. `add`, `update`, `delete` and value is an object `fileName` -> `propertyName`: `propertyValue`. + * + * @param {object} recommendedConfigurations + * @param {object[]} servicesConfigurations services' configurations fetched from API + * @param {App.ServiceConfigProperty[]} allConfigs all current configurations stored in controller, basically kerberos descriptor + * @returns {object} + */ + groupRecommendationProperties: function(recommendedConfigurations, servicesConfigurations, allConfigs) { + var resultMap = { + update: {}, + add: {}, + delete: {} + }; + + /** + * Adds property to associated group `add`,`delete`,`update`. + * + * @param {object} propertyMap <code>resultMap</code> object + * @param {string} name property name + * @param {string} propertyValue property value + * @param {string} fileName property file name + * @return {object} <code>resultMap</code> + * @param {string} group, `add`,`delete`,`update` + */ + var addProperty = function(propertyMap, name, propertyValue, fileName, group) { + var ret = $.extend(true, {}, propertyMap); + if (ret.hasOwnProperty(group)) { + if (!ret[group].hasOwnProperty(fileName)) { + ret[group][fileName] = {}; + } + ret[group][fileName][name] = propertyValue; + } + return ret; + }; + + return Em.keys(recommendedConfigurations || {}).reduce(function(acc, fileName) { + var propertyMap = acc; + var recommendedProperties = Em.getWithDefault(recommendedConfigurations, fileName + '.properties', {}); + var recommendedAttributes = Em.getWithDefault(recommendedConfigurations, fileName + '.property_attributes', {}); + // check for properties that should be delted + Em.keys(recommendedAttributes).forEach(function(propertyName) { + var attribute = recommendedAttributes[propertyName]; + // delete properties which are present in kerberos descriptor + if (attribute.hasOwnProperty('delete') && allConfigs.filterProperty('filename', fileName).someProperty('name', propertyName)) { + propertyMap = addProperty(propertyMap, propertyName, '', fileName, 'delete'); + } + }); + + return Em.keys(recommendedProperties).reduce(function(a, propertyName) { + var propertyValue = recommendedProperties[propertyName]; + // check if property exist in saved configurations on server + var isExist = Em.getWithDefault(servicesConfigurations.findProperty('type', fileName) || {}, 'properties', {}).hasOwnProperty(propertyName); + if (!isExist) { + return addProperty(a, propertyName, propertyValue, fileName, 'add'); + } + // when property exist check that it present in current step configs (kerberos descriptor) + // and add it as property to `update` + if (allConfigs.filterProperty('filename', fileName).someProperty('name', propertyName)) { + return addProperty(a, propertyName, propertyValue, fileName, 'update'); + } + return a; + }, propertyMap); + }, resultMap); + }, + + /** + * + * @method getServiceByFilename + * @param {string}fileName + * @returns {string} + */ + getServiceByFilename: function(fileName) { + // core-site properties goes to HDFS + if (fileName === 'core-site' && App.Service.find().someProperty('serviceName', 'HDFS')) { + return 'HDFS'; + } + var associatedService = App.StackService.find().filter(function(service) { + return Em.keys(service.get('configTypes')).contains(fileName); + })[0]; + return associatedService ? associatedService.get('serviceName') : ''; + }, + + loadServerSideConfigsRecommendations: function(recommendations) { + return App.ajax.send({ + 'name': 'config.recommendations', + 'sender': this, + 'data': { + stackVersionUrl: App.get('stackVersionURL'), + dataToSend: { + recommend: 'configurations', + hosts: App.get('allHostNames'), + services: this.get('serviceNames'), + recommendations: recommendations + } + }, + 'success': 'loadRecommendationsSuccess', + 'error': 'loadRecommendationsError' + }); + }, + + loadRecommendationsError: function(req, ajaxOpts, error, opt) { + var resp; + try { + resp = $.parseJSON(req.responseText); + } catch (e) { } + return App.ModalPopup.show({ + header: Em.I18n.t('common.error'), + secondary: false, + bodyClass: App.AjaxDefaultErrorPopupBodyView.extend({ + type: opt.type || 'GET', + url: opt.url, + status: req.status, + message: resp && resp.message || req.responseText + }) + }); + }, + + /** + * Callback executed when all configs specified by tags are loaded. + * Here we handle configurations for instlled services and Kerberos. + * Gather needed info for recommendation request such as configurations object. + * + * @override + */ + getConfigTagsSuccess: function(data) { + // here we get all installed services including KERBEROS + var serviceNames = App.Service.find().mapProperty('serviceName').concat(['KERBEROS']).uniq(); + // collect all config types for selected services + var installedServiceSites = Array.prototype.concat.apply([], App.config.get('preDefinedServiceConfigs').filter(function(serviceConfig) { + return serviceNames.contains(Em.get(serviceConfig, 'serviceName')); + }).map(function (service) { + // when service have no configs return <code>null</code> instead return config types + if (!service.get('configTypes')) return null; + return Object.keys(service.get('configTypes')); + }, this).compact()).uniq(); // cleanup <code>null</code> + + // take all configs for selected services by config types recieved from API response + var serviceConfigTags = Em.keys(data.Clusters.desired_configs).reduce(function(tags, site) { + if (data.Clusters.desired_configs.hasOwnProperty(site)) { + // push cluster-env.xml also since it not associated with any service but need to further processing + if (installedServiceSites.contains(site) || site === 'cluster-env') { + tags.push({ + siteName: site, + tagName: data.Clusters.desired_configs[site].tag, + newTagName: null + }); + } + } + return tags; + }, []); + // store configurations + this.set('serviceConfigTags', serviceConfigTags); + this.set('isAppliedConfigLoaded', true); + }, + + /** + * Add/update property in `properties` object for each config type with + * associated kerberos descriptor config value. + * + * @private + * @param {object[]} configurations + * @param {App.ServiceConfigProperty[]} kerberosDescriptor + * @returns {object[]} + */ + mergeDescriptorToConfigurations: function(configurations, kerberosDescriptor) { + return configurations.map(function(configType) { + var properties = $.extend({}, configType.properties); + var filteredDescriptor = kerberosDescriptor.filterProperty('filename', configType.type); + if (filteredDescriptor.length) { + filteredDescriptor.forEach(function(descriptorConfig) { + var configName = Em.get(descriptorConfig, 'name'); + properties[configName] = Em.get(descriptorConfig, 'value'); + }); + } + return { + type: configType.type, + version: configType.version, + tag: configType.tag, + properties: properties + }; + }); } + }); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/routes/add_kerberos_routes.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/add_kerberos_routes.js b/ambari-web/app/routes/add_kerberos_routes.js index f556acb..3dbf050 100644 --- a/ambari-web/app/routes/add_kerberos_routes.js +++ b/ambari-web/app/routes/add_kerberos_routes.js @@ -174,7 +174,7 @@ module.exports = App.WizardRoute.extend({ kerberosWizardStep2Controller.get('stepConfigs')[0].get('configs').findProperty('name', 'manage_krb5_conf').set('value', 'false'); } - kerberosWizardController.saveServiceConfigProperties(kerberosWizardStep2Controller).always(function() { + kerberosWizardController.saveServiceConfigProperties(kerberosWizardStep2Controller, true).always(function() { kerberosWizardController.clearTasksData(); if (kerberosWizardController.get('skipClientInstall')) { kerberosWizardController.setDBProperty('kerberosDescriptorConfigs', null); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/routes/add_service_routes.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/add_service_routes.js b/ambari-web/app/routes/add_service_routes.js index 9ff0b10..773042b 100644 --- a/ambari-web/app/routes/add_service_routes.js +++ b/ambari-web/app/routes/add_service_routes.js @@ -232,6 +232,9 @@ module.exports = App.WizardRoute.extend({ addServiceController.setDBProperty('serviceConfigGroups', undefined); App.ServiceConfigGroup.find().clear(); addServiceController.clearServiceConfigProperties().always(function() { + if (App.get('isKerberosEnabled')) { + addServiceController.setDBProperty('kerberosDescriptorConfigs', null); + } router.transitionTo('step4'); }); }); @@ -248,7 +251,7 @@ module.exports = App.WizardRoute.extend({ controller.dataLoading().done(function () { var wizardStep7Controller = router.get('wizardStep7Controller'); controller.loadAllPriorSteps().done(function () { - wizardStep7Controller.getConfigTags(); + wizardStep7Controller.getConfigTags(true); wizardStep7Controller.set('wizardController', controller); controller.usersLoading().done(function () { router.get('mainController').isLoading.call(router.get('clusterController'), 'isClusterNameLoaded').done(function () { @@ -275,69 +278,36 @@ module.exports = App.WizardRoute.extend({ next: function (router) { var addServiceController = router.get('addServiceController'); var wizardStep7Controller = router.get('wizardStep7Controller'); - addServiceController.saveServiceConfigGroups(wizardStep7Controller, true); - addServiceController.saveServiceConfigProperties(wizardStep7Controller).always(function() { + var kerberosDescriptor = addServiceController.get('kerberosDescriptor'); + wizardStep7Controller.checkDescriptor().always(function (data, status) { + wizardStep7Controller.storeClusterDescriptorStatus(status === 'success'); if (App.get('isKerberosEnabled')) { - addServiceController.clearCachedStepConfigValues(router.get('kerberosWizardStep4Controller')); - router.transitionTo('step5'); - return; + wizardStep7Controller.updateKerberosDescriptor(kerberosDescriptor, wizardStep7Controller.getDescriptorConfigs()); + addServiceController.saveKerberosDescriptorConfigs(kerberosDescriptor); + if (router.get('mainAdminKerberosController.isManualKerberos')) { + router.get('wizardStep8Controller').set('wizardController', router.get('addServiceController')); + router.get('wizardStep8Controller').updateKerberosDescriptor(true); + } } - router.transitionTo('step6'); + addServiceController.saveServiceConfigGroups(wizardStep7Controller, true); + addServiceController.saveServiceConfigProperties(wizardStep7Controller).always(function() { + router.transitionTo('step5'); + }); }); } }), - step5: Em.Route.extend({ + step5: App.StepRoute.extend({ route: '/step5', connectOutlets: function (router) { App.logger.setTimer(consoleMsg.format(5)); var controller = router.get('addServiceController'); controller.setCurrentStep('5'); controller.dataLoading().done(function () { - var kerberosStep4Controller = router.get('kerberosWizardStep4Controller'); - controller.loadAllPriorSteps().done(function () { - kerberosStep4Controller.set('wizardController', controller); - App.logger.logTimerIfMoreThan(consoleMsg.format(5)); - controller.connectOutlet('kerberosWizardStep4', controller.get('content')); - }); - }); - }, - back: function (router) { - var controller = router.get('addServiceController'); - if (!controller.get('content.skipConfigStep')) { - return router.transitionTo('step4'); - } - if (!controller.get('content.skipSlavesStep')) { - return router.transitionTo('step3'); - } - if (!controller.get('content.skipMasterStep')) { - return router.transitionTo('step2'); - } - return router.transitionTo('step1'); - }, - next: function (router) { - if (App.Cluster.find().objectAt(0).get('isKerberosEnabled')) { - if (router.get('mainAdminKerberosController.isManualKerberos')) { - router.get('wizardStep8Controller').set('wizardController', router.get('addServiceController')); - router.get('wizardStep8Controller').updateKerberosDescriptor(true); - } - router.get('addServiceController').cacheStepConfigValues(router.get('kerberosWizardStep4Controller')); - } - router.transitionTo('step6'); - } - }), - - step6: App.StepRoute.extend({ - route: '/step6', - connectOutlets: function (router, context) { - App.logger.setTimer(consoleMsg.format(6)); - var controller = router.get('addServiceController'); - controller.setCurrentStep('6'); - controller.dataLoading().done(function () { controller.loadAllPriorSteps().done(function () { var wizardStep8Controller = router.get('wizardStep8Controller'); wizardStep8Controller.set('wizardController', controller); - App.logger.logTimerIfMoreThan(consoleMsg.format(6)); + App.logger.logTimerIfMoreThan(consoleMsg.format(5)); controller.connectOutlet('wizardStep8', controller.get('content')); }); }); @@ -347,9 +317,6 @@ module.exports = App.WizardRoute.extend({ }, backTransition: function (router) { var controller = router.get('addServiceController'); - if (App.get('isKerberosEnabled')) { - return router.transitionTo('step5'); - } if (!controller.get('content.skipConfigStep')) { return router.transitionTo('step4'); } @@ -367,30 +334,30 @@ module.exports = App.WizardRoute.extend({ router.get('wizardStep8Controller').set('servicesInstalled', true); addServiceController.setInfoForStep9(); addServiceController.saveClusterState('ADD_SERVICES_INSTALLING_3'); - App.router.transitionTo('step7'); + App.router.transitionTo('step6'); }); } }), - step7: Em.Route.extend({ - route: '/step7', + step6: Em.Route.extend({ + route: '/step6', connectOutlets: function (router, context) { - App.logger.setTimer(consoleMsg.format(7)); + App.logger.setTimer(consoleMsg.format(6)); var controller = router.get('addServiceController'); - controller.setCurrentStep('7'); + controller.setCurrentStep('6'); if (!App.get('testMode')) { //if test mode is ON don't disable prior steps link. - controller.setLowerStepsDisable(7); + controller.setLowerStepsDisable(6); } controller.dataLoading().done(function () { controller.loadAllPriorSteps().done(function () { var wizardStep9Controller = router.get('wizardStep9Controller'); wizardStep9Controller.set('wizardController', controller); - App.logger.setTimer(consoleMsg.format(7)); + App.logger.setTimer(consoleMsg.format(6)); controller.connectOutlet('wizardStep9', controller.get('content')); }); }); }, - back: Em.Router.transitionTo('step6'), + back: Em.Router.transitionTo('step5'), retry: function (router, context) { var addServiceController = router.get('addServiceController'); var wizardStep9Controller = router.get('wizardStep9Controller'); @@ -418,23 +385,23 @@ module.exports = App.WizardRoute.extend({ // We need to do recovery based on whether we are in Add Host or Installer wizard addServiceController.saveClusterState('ADD_SERVICES_INSTALLED_4'); - router.transitionTo('step8'); + router.transitionTo('step7'); } }), - step8: Em.Route.extend({ - route: '/step8', + step7: Em.Route.extend({ + route: '/step7', connectOutlets: function (router, context) { var controller = router.get('addServiceController'); - controller.setCurrentStep('8'); - controller.setLowerStepsDisable(8); + controller.setCurrentStep('7'); + controller.setLowerStepsDisable(7); controller.dataLoading().done(function () { controller.loadAllPriorSteps().done(function () { controller.connectOutlet('wizardStep10', controller.get('content')); }); }); }, - back: Em.Router.transitionTo('step7'), + back: Em.Router.transitionTo('step6'), complete: function (router, context) { var addServiceController = router.get('addServiceController'); addServiceController.get('popup').onClose(); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/templates/main/service/add.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/add.hbs b/ambari-web/app/templates/main/service/add.hbs index 2873a87..28dc83a 100644 --- a/ambari-web/app/templates/main/service/add.hbs +++ b/ambari-web/app/templates/main/service/add.hbs @@ -24,10 +24,9 @@ <li {{bindAttr class="isStep2:active view.isStep2Disabled:disabled view.isStep2Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep2 target="controller"}}><i class="step-marker"><span class="step-index">2</span></i><p class="step-name">{{t installer.step5.header}}</p></a></li> <li {{bindAttr class="isStep3:active view.isStep3Disabled:disabled view.isStep3Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep3 target="controller"}}><i class="step-marker"><span class="step-index">3</span></i><p class="step-name">{{t installer.step6.header}}</p></a></li> <li {{bindAttr class="isStep4:active view.isStep4Disabled:disabled view.isStep4Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep4 target="controller"}}><i class="step-marker"><span class="step-index">4</span></i><p class="step-name">{{t installer.step7.header}}</p></a></li> - <li {{bindAttr class="isStep5:active view.isStep5Disabled:disabled view.isStep5Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep5 target="controller"}}><i class="step-marker"><span class="step-index">5</span></i><p class="step-name">{{t admin.kerberos.wizard.step4.header}}</p></a></li> - <li {{bindAttr class="isStep6:active view.isStep6Disabled:disabled view.isStep6Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep5 target="controller"}}><i class="step-marker"><span class="step-index">6</span></i><p class="step-name">{{t installer.step8.header}}</p></a></li> - <li {{bindAttr class="isStep7:active view.isStep7Disabled:disabled view.isStep7Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep6 target="controller"}}><i class="step-marker"><span class="step-index">7</span></i><p class="step-name">{{t installer.step9.header}}</p></a></li> - <li {{bindAttr class="isStep8:active view.isStep8Disabled:disabled view.isStep8Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep7 target="controller"}}><i class="step-marker"><span class="step-index">8</span></i><p class="step-name">{{t installer.step10.header}}</p></a></li> + <li {{bindAttr class="isStep6:active view.isStep5Disabled:disabled view.isStep5Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep5 target="controller"}}><i class="step-marker"><span class="step-index">5</span></i><p class="step-name">{{t installer.step8.header}}</p></a></li> + <li {{bindAttr class="isStep7:active view.isStep6Disabled:disabled view.isStep6Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep6 target="controller"}}><i class="step-marker"><span class="step-index">6</span></i><p class="step-name">{{t installer.step9.header}}</p></a></li> + <li {{bindAttr class="isStep8:active view.isStep7Disabled:disabled view.isStep7Completed:completed"}}><a href="javascript:void(null);" {{action gotoStep7 target="controller"}}><i class="step-marker"><span class="step-index">7</span></i><p class="step-name">{{t installer.step10.header}}</p></a></li> </ul> </div> {{outlet}} http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/utils/ajax/ajax.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js index b63027e..614eb79 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -1592,6 +1592,10 @@ var urls = { 'real': '/clusters/{clusterName}/kerberos_descriptors/COMPOSITE{queryParams}', 'mock': '/data/wizard/kerberos/stack_descriptors.json' }, + 'admin.kerberize.cluster_descriptor.stack': { + 'real': '/clusters/{clusterName}/kerberos_descriptors/STACK', + 'mock': '/data/wizard/kerberos/stack_descriptors.json' + }, 'admin.kerberos.cluster.artifact.create': { 'type': 'POST', 'real': '/clusters/{clusterName}/artifacts/{artifactName}', http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js b/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js index 422ac26..894d167 100644 --- a/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js +++ b/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js @@ -34,8 +34,6 @@ describe('App.KerberosWizardStep4Controller', function() { c = getController(); }); - App.TestAliases.testAsComputedEqual(getController(), 'isWithinAddService', 'wizardController.name', 'addServiceController'); - describe("#clearStep()", function () { beforeEach(function() { @@ -213,85 +211,6 @@ describe('App.KerberosWizardStep4Controller', function() { }); }); - describe('#setStepConfigs', function() { - describe('Add Service Wizard', function() { - - var properties = Em.A([ - Em.Object.create({ name: 'realm', value: '', serviceName: 'Cluster' }), - Em.Object.create({ name: 'spnego_keytab', value: 'spnego_keytab_value', serviceName: 'Cluster', isEditable: true }), - Em.Object.create({ name: 'hdfs_keytab', value: '', serviceName: 'HDFS', observesValueFrom: 'spnego_keytab', isEditable: true }), - Em.Object.create({ name: 'falcon_keytab', value: 'falcon_keytab_value', serviceName: 'FALCON', isEditable: true }), - Em.Object.create({ name: 'mapreduce_keytab', value: 'mapreduce_keytab_value', serviceName: 'MAPREDUCE2', isEditable: true }) - ]); - - var res; - var controller; - before(function() { - sinon.stub(App.StackService, 'find').returns([ - Em.Object.create({ - serviceName: 'KERBEROS', - configCategories: [], - configTypeList: [] - }), - Em.Object.create({ - serviceName: 'HDFS', - configCategories: [], - configTypeList: [] - }), - Em.Object.create({ - serviceName: 'MAPREDUCE2', - configTypeList: [] - }) - ]); - sinon.stub(App.Service, 'find').returns([ - Em.Object.create({ - serviceName: 'HDFS' - }), - Em.Object.create({ - serviceName: 'KERBEROS' - }) - ]); - controller = App.KerberosWizardStep4Controller.create({ - selectedServiceNames: ['FALCON', 'MAPREDUCE2'], - installedServiceNames: ['HDFS', 'KERBEROS'], - wizardController: Em.Object.create({ - name: 'addServiceController', - getDBProperty: function() { - return Em.A([ - Em.Object.create({ name: 'realm', value: 'realm_value' }) - ]); - }, - loadCachedStepConfigValues : function() { - return null; - } - }) - }); - sinon.stub(App.router, 'get').withArgs('mainAdminKerberosController.isManualKerberos').returns(false); - var stepConfigs = controller.setStepConfigs(properties); - res = stepConfigs[0].get('configs').concat(stepConfigs[1].get('configs')); - }); - - Em.A([ - { name: 'spnego_keytab', e: false }, - { name: 'falcon_keytab', e: true }, - { name: 'hdfs_keytab', e: false }, - { name: 'mapreduce_keytab', e: true } - ]).forEach(function(test) { - it('Add Service: property `{0}` should be {1} editable'.format(test.name, !!test.e ? '' : 'not '), function() { - expect(res.findProperty('name', test.name).get('isEditable')).to.eql(test.e); - }); - }); - - after(function() { - controller.destroy(); - controller = null; - App.StackService.find.restore(); - App.Service.find.restore(); - App.router.get.restore(); - }); - }); - }); - describe("#createCategoryForServices()", function() { var controller = App.KerberosWizardStep4Controller.create({ wizardController: { @@ -336,66 +255,6 @@ describe('App.KerberosWizardStep4Controller', function() { }); }); - describe('#loadStep', function() { - var controller; - describe('skip "Configure Identities" step. ', function() { - beforeEach(function() { - controller = App.KerberosWizardStep4Controller.create({}); - this.wizardController = App.AddServiceController.create({}); - controller.set('wizardController', this.wizardController); - sinon.stub(controller, 'clearStep').returns(true); - sinon.stub(controller, 'getDescriptor').returns({ then: function() { return { always: function() {}}}}); - sinon.stub(controller, 'setStepConfigs').returns(true); - sinon.stub(App.router, 'send').withArgs('next'); - }); - - afterEach(function() { - controller.clearStep.restore(); - - controller.setStepConfigs.restore(); - App.router.send.restore(); - }); - - var tests = [ - { - securityEnabled: true, - stepSkipped: false - }, - { - securityEnabled: false, - stepSkipped: true - } - ]; - - tests.forEach(function(test) { - var message = 'Security {0} configure identities step should be {1}'.format(!!test.securityEnabled ? 'enabled' : 'disabled', !!test.stepSkipped ? 'skipped' : 'not skipped'); - describe(message, function() { - - beforeEach(function () { - sinon.stub(App, 'get').withArgs('isKerberosEnabled').returns(test.securityEnabled); - this.wizardController.checkSecurityStatus(); - controller.loadStep(); - }); - - afterEach(function () { - App.get.restore(); - }); - - it('`send` is ' + (test.stepSkipped ? '' : 'not') + ' called with `next`', function () { - expect(App.router.send.calledWith('next')).to.be.eql(test.stepSkipped); - }); - - }); - }, this); - - it('step should not be disabled for Add Kerberos wizard', function() { - controller.set('wizardController', App.KerberosWizardController.create({})); - controller.loadStep(); - expect(App.router.send.calledWith('next')).to.be.false; - }); - }); - }); - describe('#mergeDescriptorToConfigurations', function() { var genAppConfigProperty = function(name, fileName, value) { return App.ServiceConfigProperty.create({ @@ -598,35 +457,15 @@ describe('App.KerberosWizardStep4Controller', function() { }; beforeEach(function() { - c.reopen({ - isWithinAddService: true, - selectedServiceNames: [] - }); - sinon.stub(c, 'storeClusterDescriptorStatus'); sinon.stub(c, 'loadClusterDescriptorConfigs').returns(mock); sinon.stub(mock, 'then'); }); afterEach(function() { c.loadClusterDescriptorConfigs.restore(); - c.storeClusterDescriptorStatus.restore(); mock.then.restore(); }); - it("App.ajax.send should be called", function() { - c.getDescriptor(); - var args = testHelpers.findAjaxRequest('name', 'admin.kerberize.cluster_descriptor_artifact'); - expect(args[0]).to.be.eql({ - sender: c, - name: 'admin.kerberize.cluster_descriptor_artifact' - }); - }); - - it("storeClusterDescriptorStatus should be called", function() { - c.getDescriptor(); - expect(c.storeClusterDescriptorStatus.calledOnce).to.be.true; - }); - it("loadClusterDescriptorConfigs should be called", function() { c.getDescriptor(); expect(c.loadClusterDescriptorConfigs.calledOnce).to.be.true; @@ -637,11 +476,6 @@ describe('App.KerberosWizardStep4Controller', function() { expect(mock.then.calledOnce).to.be.true; }); - it("then should be called, isWithinAddService is false", function() { - c.set('isWithinAddService', false); - c.getDescriptor(); - expect(mock.then.calledOnce).to.be.true; - }); }); describe("#tweakConfigProperty()", function () { http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/main/service/add_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/service/add_controller_test.js b/ambari-web/test/controllers/main/service/add_controller_test.js index ffde1f7..a52c38f 100644 --- a/ambari-web/test/controllers/main/service/add_controller_test.js +++ b/ambari-web/test/controllers/main/service/add_controller_test.js @@ -415,60 +415,6 @@ describe('App.AddServiceController', function() { }, this); }); - describe('#checkSecurityStatus', function () { - - var cases = [ - { - securityEnabled: true, - skipConfigureIdentitiesStep: false, - isStep5Disabled: false, - title: 'security enabled' - }, - { - securityEnabled: false, - skipConfigureIdentitiesStep: true, - isStep5Disabled: true, - title: 'security disabled' - } - ]; - - beforeEach(function () { - addServiceController.setProperties({ - skipConfigureIdentitiesStep: false, - isStepDisabled: [ - Em.Object.create({ - step: 5, - value: false - }) - ] - }); - }); - - afterEach(function () { - App.get.restore(); - }); - - cases.forEach(function (item) { - describe(item.title, function () { - - beforeEach(function () { - sinon.stub(App, 'get').withArgs('isKerberosEnabled').returns(item.securityEnabled); - addServiceController.checkSecurityStatus(); - }); - - it('skipConfigureIdentitiesStep is ' + item.skipConfigureIdentitiesStep, function () { - expect(addServiceController.get('skipConfigureIdentitiesStep')).to.equal(item.skipConfigureIdentitiesStep); - }); - - it('step 5 is ' + (item.isStep5Disabled ? 'disabved' : 'enabled'), function () { - expect(addServiceController.get('isStepDisabled').findProperty('step', 5).get('value')).to.equal(item.isStep5Disabled); - }); - - }); - }); - - }); - describe('#loadServiceConfigGroups', function () { var dbMock, http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/wizard/step7_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js index d5d157d..919e735 100644 --- a/ambari-web/test/controllers/wizard/step7_test.js +++ b/ambari-web/test/controllers/wizard/step7_test.js @@ -1448,6 +1448,9 @@ describe('App.InstallerStep7Controller', function () { beforeEach(function() { sinon.stub(App.config, 'kerberosIdentitiesDescription'); + installerStep7Controller.set('content.services', [ + {isSelected: true, serviceName: 's1'} + ]); }); afterEach(function() { @@ -1455,13 +1458,14 @@ describe('App.InstallerStep7Controller', function () { }); var configs = [ - { name: 'prop1', displayName: 'Prop1', description: 'd1' }, - { name: 'prop2', displayName: 'Prop2', description: 'd1' }, - { name: 'prop3', displayName: 'Prop3', description: 'd1' } + { name: 'prop1', displayName: 'Prop1', description: 'd1', serviceName: 's1' }, + { name: 'prop2', displayName: 'Prop2', description: 'd1', serviceName: 's2' }, + { name: 'prop3', displayName: 'Prop3', description: 'd1', serviceName: 's2' }, + { name: 'prop4', displayName: 'Prop4', description: 'd1', serviceName: 's3' } ]; var descriptor = [ - Em.Object.create({ name: 'prop4', filename: 'file-1'}), - Em.Object.create({ name: 'prop1', filename: 'file-1'}) + Em.Object.create({ name: 'prop4', filename: 'file-1', serviceName: 's2'}), + Em.Object.create({ name: 'prop1', filename: 'file-1', serviceName: 's1'}) ]; var propertiesAttrTests = [ { @@ -2059,22 +2063,4 @@ describe('App.InstallerStep7Controller', function () { }); - describe('#setButtonClickFinish', function () { - - beforeEach(function () { - installerStep7Controller.set('submitButtonClicked', true); - App.set('router.nextBtnClickInProgress', true); - installerStep7Controller.setButtonClickFinish(); - }); - - it('submitButtonClicked should be false', function () { - expect(installerStep7Controller.get('submitButtonClicked')).to.be.false; - }); - - it('nextBtnClickInProgress should be false', function () { - expect(App.get('router.nextBtnClickInProgress')).to.be.false; - }); - - }); - }); http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/wizard/step8_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/wizard/step8_test.js b/ambari-web/test/controllers/wizard/step8_test.js index bdc4f4c..15b9245 100644 --- a/ambari-web/test/controllers/wizard/step8_test.js +++ b/ambari-web/test/controllers/wizard/step8_test.js @@ -2291,15 +2291,16 @@ describe('App.WizardStep8Controller', function () { }; beforeEach(function () { - sinon.stub(App.db, 'get').withArgs('KerberosWizard', 'kerberosDescriptorConfigs').returns(1234); sinon.stub(installerStep8Controller, 'addRequestToAjaxQueue', Em.K); sinon.stub(installerStep8Controller, 'get').withArgs('wizardController').returns(Em.Object.create({ - getDBProperty: function() { return true; } + getDBProperty: function(key) { + if (key === 'kerberosDescriptorConfigs') return 1234; + if (key === 'isClusterDescriptorExists') return true; + } })); }); afterEach(function () { - App.db.get.restore(); installerStep8Controller.addRequestToAjaxQueue.restore(); installerStep8Controller.get.restore(); });
