You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by al...@apache.org on 2015/05/12 22:49:22 UTC
[5/7] ambari git commit: AMBARI-11075. Apply a property value in
hdfs-site when ranger-hdfs-plugin is enabled (alexantonenko)
AMBARI-11075. Apply a property value in hdfs-site when ranger-hdfs-plugin is enabled (alexantonenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/81a3eebd
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/81a3eebd
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/81a3eebd
Branch: refs/heads/trunk
Commit: 81a3eebdd47c4c0179d3af2f5c45baf69a474db7
Parents: 17f4eca
Author: Alex Antonenko <hi...@gmail.com>
Authored: Tue May 12 20:30:29 2015 +0300
Committer: Alex Antonenko <hi...@gmail.com>
Committed: Tue May 12 23:48:37 2015 +0300
----------------------------------------------------------------------
.../utils/configs/modification_handlers/hdfs.js | 18 +++
.../configs/service_configs_by_category_view.js | 89 ++++++-----
.../service_configs_by_category_view_test.js | 151 +++++++++++++++++++
ambari-web/test/views/main/host_test.js | 2 +-
4 files changed, 223 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/81a3eebd/ambari-web/app/utils/configs/modification_handlers/hdfs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/configs/modification_handlers/hdfs.js b/ambari-web/app/utils/configs/modification_handlers/hdfs.js
index 128b62b..bff1ddd 100644
--- a/ambari-web/app/utils/configs/modification_handlers/hdfs.js
+++ b/ambari-web/app/utils/configs/modification_handlers/hdfs.js
@@ -34,9 +34,12 @@ module.exports = App.ServiceConfigModificationHandler.create({
var affectedPropertyName = changedConfig.get("name");
if (affectedPropertyName == rangerPluginEnabledName) {
var configDfsPermissionsEnabled = this.getConfig(allConfigs, 'dfs.permissions.enabled', 'hdfs-site.xml', 'HDFS');
+ var configAttributesProviderClass = this.getConfig(allConfigs, 'dfs.namenode.inode.attributes.provider.class', 'hdfs-site.xml', 'HDFS');
+ var isAttributesProviderClassSet = typeof configAttributesProviderClass !== 'undefined';
var rangerPluginEnabled = newValue == "Yes";
var newDfsPermissionsEnabled = rangerPluginEnabled ? "true" : "true";
+ var newAttributesProviderClass = 'org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer';
// Add Hive-Ranger configs
if (configDfsPermissionsEnabled != null && newDfsPermissionsEnabled !== configDfsPermissionsEnabled.get('value')) {
@@ -52,6 +55,21 @@ module.exports = App.ServiceConfigModificationHandler.create({
filename : 'hdfs-site.xml'
});
}
+ if (rangerPluginEnabled && (!isAttributesProviderClassSet || newAttributesProviderClass != configAttributesProviderClass.get('value'))) {
+ affectedProperties.push({
+ serviceName : "HDFS",
+ sourceServiceName : "HDFS",
+ propertyName : 'dfs.namenode.inode.attributes.provider.class',
+ propertyDisplayName : 'dfs.namenode.inode.attributes.provider.class',
+ newValue : newAttributesProviderClass,
+ curValue : isAttributesProviderClassSet ? configAttributesProviderClass.get('value') : '',
+ changedPropertyName : rangerPluginEnabledName,
+ removed : false,
+ isNewProperty : !isAttributesProviderClassSet,
+ filename : 'hdfs-site.xml',
+ categoryName: 'Custom hdfs-site'
+ });
+ }
}
return affectedProperties;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/81a3eebd/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 85402f0..ab2a498 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
@@ -162,9 +162,20 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri
header: "Warning: you must also change these Service properties",
onApply: function () {
self.get("newAffectedProperties").forEach(function(item) {
- self.get("controller.stepConfigs").findProperty("serviceName", item.serviceName).get("configs").find(function(config) {
- return item.propertyName == config.get('name') && (item.filename == null || item.filename == config.get('filename'));
- }).set("value", item.newValue);
+ if (item.isNewProperty) {
+ self.createProperty({
+ name: item.propertyName,
+ displayName: item.propertyDisplayName,
+ value: item.newValue,
+ categoryName: item.categoryName,
+ serviceName: item.serviceName,
+ filename: item.filename
+ });
+ } else {
+ self.get("controller.stepConfigs").findProperty("serviceName", item.serviceName).get("configs").find(function(config) {
+ return item.propertyName == config.get('name') && (item.filename == null || item.filename == config.get('filename'));
+ }).set("value", item.newValue);
+ }
});
self.get("controller").set("miscModalVisible", false);
this.hide();
@@ -354,6 +365,34 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri
return 'admin-bulk-add-properties-' + App.router.get('loginName');
},
+ isSecureConfig: function (configName, filename) {
+ var secureConfigs = this.get('controller.secureConfigs').filterProperty('filename', filename);
+ return !!secureConfigs.findProperty('name', configName);
+ },
+
+ createProperty: function (propertyObj) {
+ var selectedConfigGroup = this.get('controller.selectedConfigGroup'),
+ isSecureConfig = this.isSecureConfig(propertyObj.name, propertyObj.filename);
+ this.get('serviceConfigs').pushObject(App.ServiceConfigProperty.create({
+ name: propertyObj.name,
+ displayName: propertyObj.displayName || propertyObj.name,
+ value: propertyObj.value,
+ displayType: stringUtils.isSingleLine(propertyObj.value) ? 'advanced' : 'multiLine',
+ isSecureConfig: isSecureConfig,
+ category: propertyObj.categoryName,
+ id: 'site property',
+ serviceName: propertyObj.serviceName,
+ defaultValue: null,
+ supportsFinal: App.config.shouldSupportFinal(propertyObj.serviceName, propertyObj.filename),
+ filename: propertyObj.filename || '',
+ isUserProperty: true,
+ isNotSaved: true,
+ isRequired: false,
+ group: selectedConfigGroup.get('isDefault') ? null : selectedConfigGroup,
+ isOverridable: selectedConfigGroup.get('isDefault')
+ }));
+ },
+
/**
* Show popup for adding new config-properties
* @method showAddPropertyWindow
@@ -375,44 +414,13 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri
var service = this.get('service');
var serviceName = service.get('serviceName');
- var secureConfigs = this.get('controller.secureConfigs').filterProperty('filename', siteFileName);
-
- function isSecureConfig(configName) {
- return !!secureConfigs.findProperty('name', configName);
- }
-
var configsOfFile = service.get('configs').filterProperty('filename', siteFileName);
var siteFileProperties = App.config.get('configMapping').all().filterProperty('filename', siteFileName);
- var supportsFinal = App.config.shouldSupportFinal(serviceName, siteFileName);
-
function isDuplicatedConfigKey(name) {
return siteFileProperties.findProperty('name', name) || configsOfFile.findProperty('name', name);
}
- var serviceConfigs = this.get('serviceConfigs');
-
- function createProperty(propertyName, propertyValue) {
- serviceConfigs.pushObject(App.ServiceConfigProperty.create({
- name: propertyName,
- displayName: propertyName,
- value: propertyValue,
- displayType: stringUtils.isSingleLine(propertyValue) ? 'advanced' : 'multiLine',
- isSecureConfig: isSecureConfig(propertyName),
- category: category.get('name'),
- id: 'site property',
- serviceName: serviceName,
- defaultValue: null,
- supportsFinal: supportsFinal,
- filename: siteFileName || '',
- isUserProperty: true,
- isNotSaved: true,
- isRequired: false,
- group: selectedConfigGroup.get('isDefault') ? null : selectedConfigGroup,
- isOverridable: selectedConfigGroup.get('isDefault')
- }));
- }
-
var serviceConfigObj = Ember.Object.create({
isBulkMode: isBulkMode,
bulkConfigValue: '',
@@ -501,6 +509,11 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri
primary: 'Add',
secondary: 'Cancel',
onPrimary: function () {
+ var propertyObj = {
+ filename: siteFileName,
+ serviceName: serviceName,
+ categoryName: category.get('name')
+ };
if (serviceConfigObj.isBulkMode) {
var popup = this;
processConfig(serviceConfigObj.bulkConfigValue, function (error, parsedConfig) {
@@ -510,7 +523,9 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri
} else {
for (var key in parsedConfig) {
if (parsedConfig.hasOwnProperty(key)) {
- createProperty(key, parsedConfig[key]);
+ propertyObj.name = key;
+ propertyObj.value = parsedConfig[key];
+ persistController.createProperty(propertyObj);
}
}
popup.hide();
@@ -523,7 +538,9 @@ App.ServiceConfigsByCategoryView = Em.View.extend(App.UserPref, App.ConfigOverri
* For the first entrance use this if (serviceConfigObj.name.trim() != '')
*/
if (!serviceConfigObj.isKeyError) {
- createProperty(serviceConfigObj.get('name'), serviceConfigObj.get('value'));
+ propertyObj.name = serviceConfigObj.get('name');
+ propertyObj.value = serviceConfigObj.get('value');
+ persistController.createProperty(propertyObj);
this.hide();
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/81a3eebd/ambari-web/test/views/common/configs/service_configs_by_category_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/service_configs_by_category_view_test.js b/ambari-web/test/views/common/configs/service_configs_by_category_view_test.js
index 6505cf0..aeae18b 100644
--- a/ambari-web/test/views/common/configs/service_configs_by_category_view_test.js
+++ b/ambari-web/test/views/common/configs/service_configs_by_category_view_test.js
@@ -370,4 +370,155 @@ describe('App.ServiceConfigsByCategoryView', function () {
});
});
+ describe('#isSecureConfig', function () {
+
+ var cases = [
+ {
+ name: 'n0',
+ filename: 'f0',
+ isSecureConfig: true,
+ title: 'secure config'
+ },
+ {
+ name: 'n1',
+ filename: 'f1',
+ isSecureConfig: false,
+ title: 'secure config with the same name is present in another filename'
+ },
+ {
+ name: 'n2',
+ filename: 'f2',
+ isSecureConfig: false,
+ title: 'no configs of the specified filename are secure'
+ }
+ ];
+
+ before(function () {
+ view.reopen({
+ controller: {
+ secureConfigs: [
+ {
+ name: 'n0',
+ filename: 'f0'
+ },
+ {
+ name: 'n1',
+ filename: 'f0'
+ },
+ {
+ name: 'n2',
+ filename: 'f1'
+ }
+ ]
+ }
+ })
+ });
+
+ cases.forEach(function (item) {
+ it(item.title, function () {
+ expect(view.isSecureConfig(item.name, item.filename)).to.equal(item.isSecureConfig);
+ });
+ });
+
+ });
+
+ describe('#createProperty', function () {
+
+ var cases = [
+ {
+ propertyObj: {
+ name: 'n0',
+ displayName: 'd0',
+ value: 'v0',
+ filename: 'f0',
+ categoryName: 'c0',
+ serviceName: 's0'
+ },
+ isDefaultConfigGroup: true,
+ result: {
+ name: 'n0',
+ displayName: 'd0',
+ value: 'v0',
+ displayType: 'advanced',
+ isSecureConfig: true,
+ category: 'c0',
+ id: 'site property',
+ serviceName: 's0',
+ defaultValue: null,
+ supportsFinal: true,
+ filename: 'f0',
+ isUserProperty: true,
+ isNotSaved: true,
+ isRequired: false,
+ group: null,
+ isOverridable: true
+ },
+ title: 'single line value, secure config, final attribute supported, default config group'
+ },
+ {
+ propertyObj: {
+ name: 'n1',
+ value: 'v\n1',
+ filename: '',
+ categoryName: 'c1',
+ serviceName: 's1'
+ },
+ isDefaultConfigGroup: false,
+ result: {
+ name: 'n1',
+ displayName: 'n1',
+ value: 'v\n1',
+ displayType: 'multiLine',
+ isSecureConfig: false,
+ category: 'c1',
+ id: 'site property',
+ serviceName: 's1',
+ defaultValue: null,
+ supportsFinal: false,
+ filename: '',
+ isUserProperty: true,
+ isNotSaved: true,
+ isRequired: false,
+ group: Em.Object.create({
+ isDefault: false
+ }),
+ isOverridable: false
+ },
+ title: 'multiline value, non-secure config, no display name and filename, final attribute not supported, custom config group'
+ }
+ ];
+
+ before(function () {
+ view.get('serviceConfigs').clear();
+ sinon.stub(view, 'isSecureConfig').withArgs('n0', 'f0').returns(true).withArgs('n1', '').returns(false);
+ sinon.stub(App.config, 'shouldSupportFinal').withArgs('s0', 'f0').returns(true).withArgs('s1', '').returns(false);
+ });
+
+ after(function () {
+ view.get('serviceConfigs').clear();
+ view.isSecureConfig.restore();
+ App.config.shouldSupportFinal.restore();
+ });
+
+ cases.forEach(function (item) {
+ it(item.title, function () {
+ view.reopen({
+ filteredCategoryConfigs: [],
+ controller: {
+ selectedConfigGroup: Em.Object.create({
+ isDefault: item.isDefaultConfigGroup
+ })
+ }
+ });
+ view.createProperty(item.propertyObj);
+ expect(view.get('serviceConfigs').filterProperty('name', item.propertyObj.name)).to.have.length(1);
+ expect(view.get('serviceConfigs').findProperty('name', item.propertyObj.name).getProperties([
+ 'name', 'displayName', 'value', 'displayType', 'isSecureConfig', 'category', 'id', 'serviceName', 'defaultValue',
+ 'supportsFinal', 'filename', 'isUserProperty', 'isNotSaved', 'isRequired', 'group', 'isOverridable'
+ ])).to.eql(item.result);
+ });
+ });
+
+ });
+
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/81a3eebd/ambari-web/test/views/main/host_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/host_test.js b/ambari-web/test/views/main/host_test.js
index 28871b7..8a0624b 100644
--- a/ambari-web/test/views/main/host_test.js
+++ b/ambari-web/test/views/main/host_test.js
@@ -98,7 +98,7 @@ describe('App.MainHostView', function () {
view.updatePagination.restore();
});
- it('should execute and updatePagination', function () {
+ it('should execute updatePagination', function () {
view.updateHostsPagination();
expect(view.updatePagination.calledOnce).to.be.true;
});