blob: 960a0bf3128b6b63e1eee1acf68120d6fa86bc33 [file] [log] [blame]
/**
* 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.
*/
var App = require('app');
var objectUtils = require('utils/object_utils');
App.ConfigsComparator = Em.Mixin.create({
isCompareMode: false,
compareServiceVersion: null,
selectedVersion: null,
isVersionDefault: Em.K,
/**
* load version configs for comparison
* @param allConfigs
* @return {object}
* @public
* @method loadCompareVersionConfigs
*/
loadCompareVersionConfigs: function (allConfigs) {
var dfd = $.Deferred();
var self = this;
var compareServiceVersions = [];
if (this.get('compareServiceVersion')) {
if (!this.isVersionDefault(this.get('compareServiceVersion').get('version'))) {
compareServiceVersions = [this.get('compareServiceVersion').get('version'), this.get('selectedVersion')];
} else {
compareServiceVersions = [this.get('compareServiceVersion').get('version')];
}
this.getCompareVersionConfigs(compareServiceVersions).done(function (json) {
allConfigs.setEach('isEditable', false);
self.initCompareConfig(allConfigs, json);
self.setProperties({
compareServiceVersion: null,
isCompareMode: true
});
dfd.resolve(true);
}).fail(function () {
self.set('compareServiceVersion', null);
dfd.resolve(true);
});
} else {
self.set('isCompareMode', false);
allConfigs.setEach('isComparison', false);
dfd.resolve(false);
}
return dfd.promise();
},
/**
* attach analogical config to each property for comparison
* @param allConfigs
* @param json
* @private
* @method initCompareConfig
*/
initCompareConfig: function(allConfigs, json) {
var serviceVersionMap = {};
var configNamesMap = allConfigs.toWickMapByProperty('name');
var serviceName = this.get('content.serviceName');
var compareVersionNumber = this.get('compareServiceVersion').get('version');
//indicate whether compared versions are from non-default group
var compareNonDefaultVersions = (json.items.length > 1);
serviceVersionMap[compareVersionNumber] = {};
if (compareNonDefaultVersions) {
serviceVersionMap[this.get('selectedVersion')] = {};
}
json.items.forEach(function (item) {
item.configurations.forEach(function (configuration) {
if (serviceName == 'YARN' && configuration.type == 'capacity-scheduler') {
var configsToSkip = App.config.getPropertiesFromTheme('YARN');
// put all properties in a single textarea for capacity-scheduler
var value = '';
for (var prop in configuration.properties) {
if (configsToSkip.contains(App.config.configId(prop, configuration.type))) {
serviceVersionMap[item.service_config_version][prop + '-' + configuration.type] = {
name: prop,
value: configuration.properties[prop],
type: configuration.type,
tag: configuration.tag,
version: configuration.version,
service_config_version: item.service_config_version
};
} else {
value += prop + '=' + configuration.properties[prop] + '\n';
}
}
serviceVersionMap[item.service_config_version][configuration.type + '-' + configuration.type] = {
name: configuration.type,
value: value,
type: configuration.type,
tag: configuration.tag,
version: configuration.version,
service_config_version: item.service_config_version
};
} else {
for (var prop in configuration.properties) {
serviceVersionMap[item.service_config_version][prop + '-' + configuration.type] = {
name: prop,
value: configuration.properties[prop],
type: configuration.type,
tag: configuration.tag,
version: configuration.version,
service_config_version: item.service_config_version
};
if (Em.isNone(configNamesMap[prop])) {
allConfigs.push(this.getMockConfig(prop, serviceName, App.config.getOriginalFileName(configuration.type)));
}
}
}
if (configuration.properties_attributes && configuration.properties_attributes.final) {
for (var final in configuration.properties_attributes.final) {
var config = serviceVersionMap[item.service_config_version][final + '-' + configuration.type];
if (config) {
config.isFinal = (configuration.properties_attributes.final[final] === 'true');
}
}
}
}, this);
}, this);
if (compareNonDefaultVersions) {
allConfigs.forEach(function (serviceConfig) {
if (Em.get(serviceConfig, 'isRequiredByAgent') !== false) {
this.setCompareConfigs(serviceConfig, serviceVersionMap, compareVersionNumber, this.get('selectedVersion'));
}
}, this);
} else {
allConfigs.forEach(function (serviceConfig) {
if (Em.get(serviceConfig, 'isRequiredByAgent') !== false) {
var serviceCfgVersionMap = serviceVersionMap[this.get('compareServiceVersion').get('version')];
var compareConfig = serviceCfgVersionMap[serviceConfig.name + '-' + App.config.getConfigTagFromFileName(serviceConfig.filename)];
this.setCompareDefaultGroupConfig(serviceConfig, compareConfig);
}
}, this);
}
},
/**
* set compare properties to service config of non-default group
* @param serviceConfig
* @param serviceVersionMap
* @param compareVersion
* @param selectedVersion
* @private
* @method setCompareConfigs
*/
setCompareConfigs: function (serviceConfig, serviceVersionMap, compareVersion, selectedVersion) {
var compareConfig = serviceVersionMap[compareVersion][Em.get(serviceConfig, 'name') + '-' + App.config.getConfigTagFromFileName(Em.get(serviceConfig, 'filename'))];
var selectedConfig = serviceVersionMap[selectedVersion][Em.get(serviceConfig, 'name') + '-' + App.config.getConfigTagFromFileName(Em.get(serviceConfig, 'filename'))];
Em.set(serviceConfig, 'compareConfigs', []);
Em.set(serviceConfig, 'isComparison', true);
if (!Em.get(serviceConfig, 'isCustomGroupConfig')) {
Em.set(serviceConfig, 'hasCompareDiffs', false);
}
if (compareConfig && selectedConfig) {
Em.get(serviceConfig, 'compareConfigs').push(this.getComparisonConfig(serviceConfig, compareConfig));
Em.get(serviceConfig, 'compareConfigs').push(this.getComparisonConfig(serviceConfig, selectedConfig));
Em.set(serviceConfig, 'hasCompareDiffs', this.hasCompareDiffs(Em.get(serviceConfig,'compareConfigs')[0], Em.get(serviceConfig,'compareConfigs')[1]));
} else if (compareConfig && !selectedConfig) {
Em.get(serviceConfig, 'compareConfigs').push(this.getComparisonConfig(serviceConfig, compareConfig));
Em.get(serviceConfig, 'compareConfigs').push(this.getMockComparisonConfig(selectedConfig, selectedVersion));
Em.set(serviceConfig, 'hasCompareDiffs', true);
} else if (!compareConfig && selectedConfig) {
Em.get(serviceConfig, 'compareConfigs').push(this.getMockComparisonConfig(selectedConfig, compareVersion));
Em.get(serviceConfig, 'compareConfigs').push(this.getComparisonConfig(serviceConfig, selectedConfig));
Em.set(serviceConfig, 'hasCompareDiffs', true);
}
},
/**
* init attributes and wrap mock compare config into App.ServiceConfigProperty
* @param serviceConfig
* @param compareServiceVersion
* @return {object}
* @private
* @method getMockComparisonConfig
*/
getMockComparisonConfig: function (serviceConfig, compareServiceVersion) {
var compareObject = $.extend(true, {isComparison: false}, serviceConfig);
Em.set(compareObject, 'isEditable', false);
Em.set(compareObject, 'serviceVersion', App.ServiceConfigVersion.find(this.get('content.serviceName') + "_" + compareServiceVersion));
Em.set(compareObject, 'isMock', true);
Em.set(compareObject, 'displayType', 'label');
compareObject = App.ServiceConfigProperty.create(compareObject);
compareObject.set('value', Em.I18n.t('common.property.undefined'));
return compareObject;
},
/**
* init attributes and wrap compare config into App.ServiceConfigProperty
* @param serviceConfig
* @param compareConfig
* @return {object}
* @private
* @method getComparisonConfig
*/
getComparisonConfig: function (serviceConfig, compareConfig) {
var compareObject = $.extend(true, {isComparison: false, isOriginalSCP: false}, serviceConfig);
Em.set(compareObject, 'isEditable', false);
if (compareConfig) {
if (Em.get(serviceConfig, 'isMock')) {
Em.set(compareObject, 'displayType', 'string');
Em.set(compareObject, 'isMock', false);
}
Em.set(compareObject, 'serviceVersion', App.ServiceConfigVersion.find(this.get('content.serviceName') + "_" + compareConfig.service_config_version));
compareObject = App.ServiceConfigProperty.create(compareObject);
compareObject.setProperties({
isFinal: !!compareConfig.isFinal,
value: App.config.formatPropertyValue(serviceConfig, compareConfig.value),
compareConfigs: null,
isOriginalSCP: false
});
}
return compareObject;
},
/**
* set compare properties to service config of default group
* @param serviceConfig
* @param compareConfig
* @private
* @method setCompareDefaultGroupConfig
*/
setCompareDefaultGroupConfig: function (serviceConfig, compareConfig) {
var compareObject = {};
var isEmptyProp = App.isEmptyObject(serviceConfig);
Em.set(serviceConfig, 'compareConfigs', []);
Em.set(serviceConfig, 'isComparison', true);
//if config isn't reconfigurable then it can't have changed value to compare
if (compareConfig) {
compareObject = this.getComparisonConfig(serviceConfig, compareConfig);
Em.set(serviceConfig, 'hasCompareDiffs', Em.get(serviceConfig, 'isMock') || this.hasCompareDiffs(serviceConfig, compareObject));
Em.get(serviceConfig, 'compareConfigs').push(compareObject);
// user custom property or property that was added during upgrade
} else {
if (Em.get(serviceConfig, 'value') !== 'Undefined') {
var addToComparison = !Em.get(serviceConfig, 'isCustomGroupConfig') && (Em.get(serviceConfig, 'isUserProperty') || !isEmptyProp && !compareConfig && Em.get(serviceConfig, 'isRequiredByAgent') !== false);
if (addToComparison) {
Em.get(serviceConfig, 'compareConfigs').push(this.getMockComparisonConfig(serviceConfig, this.get('compareServiceVersion.version')));
Em.set(serviceConfig, 'hasCompareDiffs', true);
}
}
}
return serviceConfig;
},
/**
* check value and final attribute of original and compare config for differences
* if config is password, it won't be shown in the comparison
*
* @param originalConfig
* @param compareConfig
* @return {Boolean}
* @private
* @method hasCompareDiffs
*/
hasCompareDiffs: function (originalConfig, compareConfig) {
var displayType = Em.get(originalConfig, 'displayType');
var notShownTypes = ['password'];
if (notShownTypes.contains(displayType)) {
return false;
}
var originalValue = App.config.trimProperty({ value: Em.get(originalConfig, 'value'), displayType: 'string' });
var compareValue = App.config.trimProperty({ value: Em.get(compareConfig, 'value'), displayType: 'string' });
if (originalValue.toArray) {
originalValue = originalValue.toArray();
}
if (compareValue.toArray) {
compareValue = compareValue.toArray();
}
if (originalValue instanceof Array) {
originalValue.sort();
}
if (compareValue instanceof Array) {
compareValue.sort();
}
return (!objectUtils.deepEqual(originalValue, compareValue)) || (!!Em.get(originalConfig, 'isFinal') !== !!Em.get(compareConfig, 'isFinal'));
},
/**
* generate mock config object
* @param name
* @param serviceName
* @param filename
* @return {Object}
* @private
* @method getMockConfig
*/
getMockConfig: function (name, serviceName, filename) {
var undefinedConfig = App.configsCollection.getConfigByName(name, filename) || {
description: name,
displayName: name,
isOverridable: false,
isReconfigurable: false,
isRequired: false,
isRequiredByAgent: true,
isSecureConfig: false,
isUserProperty: true,
isVisible: true,
isOriginalSCP: false,
name: name,
filename: filename,
serviceName: serviceName,
category: App.config.getDefaultCategory(false, filename),
value: Em.I18n.t('common.property.undefined'),
isMock: true,
displayType: 'label'
};
return App.ServiceConfigProperty.create(undefinedConfig);
},
/**
* get configs of chosen version from server to compare
* @param compareServiceVersions
* @return {$.ajax}
* @private
* @method getCompareVersionConfigs
*/
getCompareVersionConfigs: function (compareServiceVersions) {
this.set('versionLoaded', false);
return App.ajax.send({
name: 'service.serviceConfigVersions.get.multiple',
sender: this,
data: {
serviceName: this.get('content.serviceName'),
serviceConfigVersions: compareServiceVersions
}
});
}
});