AMBARI-11745. 'yarn.admin.acl' have default value of 'yarn', and should be updated when 'yarn_user' is changed
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/b2cb5088 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/b2cb5088 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/b2cb5088 Branch: refs/heads/trunk Commit: b2cb508858bca937e55bea7d019cfa4dbc4e3aea Parents: e202aaa Author: Srimanth Gunturi <sgunt...@hortonworks.com> Authored: Fri Jun 5 17:34:13 2015 -0700 Committer: Srimanth Gunturi <sgunt...@hortonworks.com> Committed: Fri Jun 5 19:23:24 2015 -0700 ---------------------------------------------------------------------- .../services/YARN/configuration/yarn-site.xml | 6 + ambari-web/app/assets/test/tests.js | 1 + .../utils/configs/modification_handlers/misc.js | 47 +++++++- .../configs/service_configs_by_category_view.js | 2 +- .../configs/modification_handlers/misc_test.js | 112 +++++++++++++++++++ 5 files changed, 163 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/b2cb5088/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration/yarn-site.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration/yarn-site.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration/yarn-site.xml index 58c817f..f2774fc 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration/yarn-site.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.3/services/YARN/configuration/yarn-site.xml @@ -31,4 +31,10 @@ <value>true</value> </property> + <property> + <name>yarn.admin.acl</name> + <value>yarn</value> + <description> ACL of who can be admin of the YARN cluster. </description> + </property> + </configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/b2cb5088/ambari-web/app/assets/test/tests.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js index 1be092c..7338dbf 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -172,6 +172,7 @@ var files = ['test/init_model_test', 'test/utils/configs/database_test', 'test/utils/configs/config_property_helper_test', 'test/utils/configs/modification_handlers/modification_handler_test', + 'test/utils/configs/modification_handlers/misc_test', 'test/views/common/chart/linear_time_test', 'test/views/common/configs/widgets/combo_config_widget_view_test', 'test/views/common/configs/widgets/config_widget_view_test', http://git-wip-us.apache.org/repos/asf/ambari/blob/b2cb5088/ambari-web/app/utils/configs/modification_handlers/misc.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/configs/modification_handlers/misc.js b/ambari-web/app/utils/configs/modification_handlers/misc.js index 42decb5..2af27ef 100644 --- a/ambari-web/app/utils/configs/modification_handlers/misc.js +++ b/ambari-web/app/utils/configs/modification_handlers/misc.js @@ -53,11 +53,50 @@ module.exports = App.ServiceConfigModificationHandler.create({ filename : 'hdfs-site.xml' }); } + } else if (changedConfig.get("name") == "yarn_user") { + curConfigs = allConfigs.findProperty('serviceName', 'YARN').get('configs'); + var currentUsers, + currentGroups; + var initialUser = changedConfig.get('initialValue'); + var newUser = newValue; + var currentAclValue = curConfigs.findProperty("name", "yarn.admin.acl").get("value"); + var currentAclValueSplits = $.trim(currentAclValue).split(/\s+/).filter(function(i) { return !Em.isEmpty(i); }); + if (currentAclValueSplits.length == 2) { + currentUsers = currentAclValueSplits[0]; + currentGroups = currentAclValueSplits[1]; + } else { + currentUsers = currentAclValueSplits.length > 0 ? currentAclValueSplits.shift() : '' + currentGroups = currentAclValueSplits.join(" "); + } + var currentUserList = currentUsers.split(',').filter(function(i) { return !Em.isEmpty(i); }); + if (!currentUserList.contains(newUser)) { + var currentUserIndex = currentUserList.indexOf(initialUser); + if (currentUserIndex > -1) { + currentUserList.splice(currentUserIndex, 1); + } + if (!currentUserList.contains(newUser)) { + currentUserList.push(newUser); + } + var newAclValue = $.trim(currentUserList.join(',') + ' ' + currentGroups); + if (currentAclValue != newAclValue) { + affectedProperties.push({ + serviceName : "YARN", + sourceServiceName : "MISC", + propertyName : "yarn.admin.acl", + propertyDisplayName : "yarn.admin.acl", + newValue : newAclValue, + curValue : currentAclValue, + changedPropertyName : "yarn_user", + remove : false, + filename : 'yarn-site.xml' + }); + } + } } else if (changedConfig.get("name") == "user_group") { - if (!(selectedServices.indexOf("YARN") >= 0)) { - return; + if (!selectedServices.contains('YARN')) { + return []; } - if (selectedServices.indexOf("MAPREDUCE2") >= 0) { + if (selectedServices.contains("MAPREDUCE2")) { curConfigs = allConfigs.findProperty("serviceName", "MAPREDUCE2").get("configs"); if ($.trim(newValue) != $.trim(curConfigs.findProperty("name", "mapreduce.cluster.administrators").get("value"))) { affectedProperties.push({ @@ -72,7 +111,7 @@ module.exports = App.ServiceConfigModificationHandler.create({ }); } } - if (selectedServices.indexOf("YARN") >= 0) { + if (selectedServices.contains("YARN")) { curConfigs = allConfigs.findProperty("serviceName", "YARN").get("configs"); if (newValue != curConfigs.findProperty("name", "yarn.nodemanager.linux-container-executor.group").get("value")) { affectedProperties.push({ http://git-wip-us.apache.org/repos/asf/ambari/blob/b2cb5088/ambari-web/app/views/common/configs/service_configs_by_category_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/service_configs_by_category_view.js b/ambari-web/app/views/common/configs/service_configs_by_category_view.js index 1d5e730..47722e1 100644 --- a/ambari-web/app/views/common/configs/service_configs_by_category_view.js +++ b/ambari-web/app/views/common/configs/service_configs_by_category_view.js @@ -187,7 +187,7 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri var affected = self.get("newAffectedProperties").objectAt(0), changedProperty = self.get("controller.stepConfigs").findProperty("serviceName", affected.sourceServiceName) .get("configs").findProperty("name", affected.changedPropertyName); - changedProperty.set('value', changedProperty.get('savedValue')); + changedProperty.set('value', changedProperty.get('savedValue') || changedProperty.get('initialValue')); self.get("controller").set("miscModalVisible", false); this.hide(); }, http://git-wip-us.apache.org/repos/asf/ambari/blob/b2cb5088/ambari-web/test/utils/configs/modification_handlers/misc_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/utils/configs/modification_handlers/misc_test.js b/ambari-web/test/utils/configs/modification_handlers/misc_test.js new file mode 100644 index 0000000..d51b2ca --- /dev/null +++ b/ambari-web/test/utils/configs/modification_handlers/misc_test.js @@ -0,0 +1,112 @@ +/** + * 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. + */ + + +require('utils/configs/modification_handlers/modification_handler'); + +var App = require('app'); + +describe('#App.ServiceConfigModificationHandler MISC', function() { + var genStepConfig = function(serviceName, properties) { + return Em.Object.create({ + serviceName: serviceName, + configs: properties + }); + }; + var genProperty = function(propName, value, initialValue, filename) { + return Em.Object.create({ + name: propName, + value: value, + initialValue: initialValue, + filename: filename + }); + }; + var genProperties = function(properties) { + return properties.map(function(item) { + return genProperty.apply(undefined, item); + }); + }; + var handler = require('utils/configs/modification_handlers/misc'); + + describe('#getDependentConfigChanges', function() { + + describe('YARN dependent configs', function() { + var tests = [ + { + miscHandlerParams: { + changedConfig: genProperty('yarn_user', 'new-user', 'initial-user', 'yarn-env.xml'), + selectedServices: ['HDFS', 'YARN', 'MAPREDUCE2', 'ZOOKEEPER'], + allConfigs: [ + genStepConfig('YARN', genProperties([ + ['yarn.admin.acl', 'some-user2 some-group2', '', 'yarn-site.xml'] + ])), + genStepConfig('MISC', genProperties([ + ['user_group', 'some-group', 'initial-group', 'cluster-env.xml'], + ['yarn_user', 'new-user', 'initial-user', 'yarn-env.xml'] + ])) + ] + }, + m: 'yarn_user changed, yarn.admin.acl new user name should be appended to users joined joined comma', + e: { propertyName: 'yarn.admin.acl', curValue: 'some-user2 some-group2', newValue: 'some-user2,new-user some-group2'} + }, + { + miscHandlerParams: { + changedConfig: genProperty('yarn_user', 'new-user', 'initial-user', 'yarn-env.xml'), + selectedServices: ['HDFS', 'YARN', 'MAPREDUCE2', 'ZOOKEEPER'], + allConfigs: [ + genStepConfig('YARN', genProperties([ + ['yarn.admin.acl', 'initial-user some-group2', '', 'yarn-site.xml'] + ])), + genStepConfig('MISC', genProperties([ + ['user_group', 'some-group', 'initial-group', 'cluster-env.xml'], + ['yarn_user', 'some-user', 'initial-user', 'yarn-env.xml'] + ])) + ] + }, + m: 'yarn_user changed, yarn.admin.acl initial user name should be update with new one', + e: { propertyName: 'yarn.admin.acl', curValue: 'initial-user some-group2', newValue: 'new-user some-group2'} + }, + { + miscHandlerParams: { + changedConfig: genProperty('yarn_user', 'new-user', 'initial-user', 'yarn-env.xml'), + selectedServices: ['HDFS', 'YARN', 'MAPREDUCE2', 'ZOOKEEPER'], + allConfigs: [ + genStepConfig('YARN', genProperties([ + ['yarn.admin.acl', '', '', 'yarn-site.xml'] + ])), + genStepConfig('MISC', genProperties([ + ['user_group', 'some-group', 'initial-group', 'cluster-env.xml'], + ['yarn_user', 'new-user', 'initial-user', 'yarn-env.xml'] + ])) + ] + }, + m: 'yarn_user changed, yarn.admin.acl initial value is not in valid format its value should be set with yarn_user and user_group', + e: { propertyName: 'yarn.admin.acl', curValue: '', newValue: 'new-user'} + } + ]; + + tests.forEach(function(test) { + it(test.m, function() { + var handlerParams = test.miscHandlerParams; + var result = handler.getDependentConfigChanges(handlerParams.changedConfig, handlerParams.selectedServices, handlerParams.allConfigs, false).toArray(); + // check the key => value according test.e from result + expect(App.permit(result.findProperty('propertyName', test.e.propertyName), Em.keys(test.e))).to.eql(test.e); + }); + }); + }); + }); +});