This is an automated email from the ASF dual-hosted git repository.
jgolieb pushed a commit to branch branch-feature-AMBARI-14714-configs
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to
refs/heads/branch-feature-AMBARI-14714-configs by this push:
new caea977 [AMBARI-23191] Service config API updates (#1028)
caea977 is described below
commit caea9777815890d409d0c31dc6ee79f6ff0e0de3
Author: Jason Golieb <[email protected]>
AuthorDate: Wed Apr 18 14:44:26 2018 -0400
[AMBARI-23191] Service config API updates (#1028)
* Updates to service config API usage. This does not send "tag", so there
is a known BE issue that must be fixed.
* Unit test fixes.
* Client will generate "tag" value for config versions. This is a temporary
workaround only!
---
ambari-web/app/controllers/wizard.js | 2 +-
.../app/controllers/wizard/step8_controller.js | 102 ++++++++---------
.../app/controllers/wizard/step9_controller.js | 4 +-
.../app/mixins/common/configs/configs_saver.js | 3 +-
ambari-web/app/utils/ajax/ajax.js | 9 +-
ambari-web/test/controllers/wizard/step8_test.js | 35 ++----
.../mixins/common/configs/configs_saver_test.js | 124 +++++++++++----------
7 files changed, 136 insertions(+), 143 deletions(-)
diff --git a/ambari-web/app/controllers/wizard.js
b/ambari-web/app/controllers/wizard.js
index f8f37d4..84ee966 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -529,7 +529,7 @@ App.WizardController =
Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
const serviceGroups = this.get('content.serviceGroups');
const installPromises = serviceGroups.map(sg => {
- data.serviceGroup = sg;
+ data.serviceGroupName = sg;
return App.ajax.send({
name: isRetry ? 'common.host_components.update' :
'common.services.update',
diff --git a/ambari-web/app/controllers/wizard/step8_controller.js
b/ambari-web/app/controllers/wizard/step8_controller.js
index 2ca005e..9a894eb 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -1051,7 +1051,7 @@ App.WizardStep8Controller =
App.WizardStepController.extend(App.AddSecurityConfi
this.addRequestToAjaxQueue({
name: 'wizard.step8.create_selected_services',
data: {
- serviceGroup: service.ServiceInfo.service_group_name,
+ serviceGroupName: service.ServiceInfo.service_group_name,
data: JSON.stringify(service)
}
});
@@ -1131,13 +1131,13 @@ App.WizardStep8Controller =
App.WizardStepController.extend(App.AddSecurityConfi
* @param componentsData
* @param serviceName
*/
- addRequestToCreateComponent: function (componentsData, serviceName,
serviceGroup) {
+ addRequestToCreateComponent: function (componentsData, serviceName,
serviceGroupName) {
this.addRequestToAjaxQueue({
name: 'wizard.step8.create_components',
data: {
data: JSON.stringify(componentsData),
serviceName: serviceName,
- serviceGroup: serviceGroup
+ serviceGroupName: serviceGroupName
}
});
},
@@ -1529,72 +1529,66 @@ App.WizardStep8Controller =
App.WizardStepController.extend(App.AddSecurityConfi
*/
createServiceConfigurations: function () {
this.get('selectedServices').forEach(function (service) {
- Object.keys(service.get('configTypes')).forEach(function (type) {
- if (!this.get('serviceConfigTags').someProperty('type', type)) {
- var configs = this.get('configs').filterProperty('filename',
App.config.getOriginalFileName(type));
- var serviceConfigNote = this.getServiceConfigNote(type,
service.get('displayName'));
-
this.get('serviceConfigTags').pushObject(this.createDesiredConfig(type,
configs, serviceConfigNote));
+ let serviceConfigs = {
+ serviceName: service.get('serviceName'),
+ serviceGroupName: service.get('stackName'), //TODO - mpacks: for now
+ data: {
+ "ServiceConfigVersion": {
+ "service_config_version_note": this.getServiceConfigNote('',
service.get('displayName')),
+ "stack_id":
`${service.get('stackName')}-${service.get('stackVersion')}`
+ },
+ "configurations": []
}
+ };
+
+ Object.keys(service.get('configTypesRendered')).forEach(function
(typeName) {
+ const type = service.get('configTypes')[typeName]; //just ensure that
the type is in both lists; they contain the same data if so
+ if (type) {
+ const configs = this.get('configs').filterProperty('filename',
App.config.getOriginalFileName(typeName));
+
serviceConfigs.data.configurations.push(this.createDesiredConfig(typeName,
configs, null, true));
+ }
}, this);
+
+ if (serviceConfigs.data.configurations.length > 0) {
+
this.get('serviceConfigTags').pushObject(Em.Object.create(serviceConfigs));
+ }
}, this);
+
this.createNotification();
},
/**
+ * Send <code>serviceConfigTags</code> to server
+ * Queued request
+ * One request for each service config data item,
+ * each of which corresponds to a single service instance
+ * @param serviceConfigData
+ * @method applyConfigurationsToCluster
+ */
+ applyConfigurationsToCluster: function (serviceConfigData) {
+ serviceConfigData.forEach(function (serviceConfig) {
+ this.addRequestToAjaxQueue({
+ name: 'common.service.create.configs',
+ data: {
+ serviceName: serviceConfig.get('serviceName'),
+ serviceGroupName: serviceConfig.get('serviceGroupName'),
+ data: serviceConfig.get('data')
+ }
+ });
+ }, this);
+ },
+
+ /**
* Get config version message
*
* @param type
* @param serviceDisplayName
* @returns {*}
- */
+ */
getServiceConfigNote: function(type, serviceDisplayName) {
return this.get('isAddService') && type === 'core-site' ?
Em.I18n.t('dashboard.configHistory.table.notes.addService') :
Em.I18n.t('dashboard.configHistory.table.notes.default').format(serviceDisplayName);
- },
-
- /**
- * Send <code>serviceConfigTags</code> to server
- * Queued request
- * One request for each service config tag
- * @param serviceConfigTags
- * @method applyConfigurationsToCluster
- */
- applyConfigurationsToCluster: function (serviceConfigTags) {
- var allServices =
this.get('installedServices').concat(this.get('selectedServices'));
- var allConfigData = [];
- allServices.forEach(function (service) {
- var serviceConfigData = [];
- Object.keys(service.get('configTypesRendered')).forEach(function (type) {
- var serviceConfigTag = serviceConfigTags.findProperty('type', type);
- if (serviceConfigTag) {
- serviceConfigData.pushObject(serviceConfigTag);
- }
- }, this);
- if (serviceConfigData.length) {
- allConfigData.pushObject(JSON.stringify({
- Clusters: {
- desired_config: serviceConfigData.map(function(item) {
- var props = {};
- Em.keys(item.properties).forEach(function(propName) {
- if (item.properties[propName] !== null) {
- props[propName] = item.properties[propName];
- }
- });
- item.properties = props;
- return item;
- })
- }
- }));
- }
- }, this);
-
- this.addRequestToAjaxQueue({
- name: 'common.across.services.configurations',
- data: {
- data: '[' + allConfigData.toString() + ']'
- }
- });
- },
+ },
/**
* Create and update config groups
diff --git a/ambari-web/app/controllers/wizard/step9_controller.js
b/ambari-web/app/controllers/wizard/step9_controller.js
index b918a75..1785a94 100644
--- a/ambari-web/app/controllers/wizard/step9_controller.js
+++ b/ambari-web/app/controllers/wizard/step9_controller.js
@@ -522,7 +522,7 @@ App.WizardStep9Controller =
App.WizardStepController.extend(App.ReloadPopupMixin
serviceGroups = this.get('content.serviceGroups');
promises = serviceGroups.map(sg => {
- data.serviceGroup = sg;
+ data.serviceGroupName = sg;
return App.ajax.send({
name: 'common.services.update',
@@ -544,7 +544,7 @@ App.WizardStep9Controller =
App.WizardStepController.extend(App.ReloadPopupMixin
serviceGroups = this.get('content.serviceGroups');
promises = serviceGroups.map(sg => {
- data.serviceGroup = sg;
+ data.serviceGroupName = sg;
return App.ajax.send({
name: 'common.services.update',
diff --git a/ambari-web/app/mixins/common/configs/configs_saver.js
b/ambari-web/app/mixins/common/configs/configs_saver.js
index c2245fb..c700c16 100644
--- a/ambari-web/app/mixins/common/configs/configs_saver.js
+++ b/ambari-web/app/mixins/common/configs/configs_saver.js
@@ -458,6 +458,7 @@ App.ConfigsSaverMixin = Em.Mixin.create({
Em.assert('type should be defined', type);
var desired_config = {
"type": type,
+ "tag": "v1", //REMOVE
"properties": {}
};
if (!ignoreVersionNote) {
@@ -487,7 +488,7 @@ App.ConfigsSaverMixin = Em.Mixin.create({
if (Object.keys(attributes.final).length ||
Object.keys(attributes.password).length) {
desired_config.properties_attributes = attributes;
}
- return desired_config;
+ return { "Config": desired_config };
},
/**
diff --git a/ambari-web/app/utils/ajax/ajax.js
b/ambari-web/app/utils/ajax/ajax.js
index 8b1522b..fb54510 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -57,7 +57,7 @@ var urls = {
},
'common.services.update' : {
- 'real':
'/clusters/{clusterName}/servicegroups/{serviceGroup}/services?{urlParams}',
+ 'real':
'/clusters/{clusterName}/servicegroups/{serviceGroupName}/services?{urlParams}',
'mock': '/data/wizard/deploy/poll_1.json',
'format': function (data) {
return {
@@ -247,10 +247,9 @@ var urls = {
'common.service.create.configs': {
'type': 'POST',
-
'real':'/clusters/{clusterName}/servicegroups/{serviceGroup}/services/{serviceName}/configurations',
+ 'real':
'/clusters/{clusterName}/servicegroups/{serviceGroupName}/services/{serviceName}/configurations/service_config_versions',
'format': function(data) {
return {
- apiPrefix: 'api/v2',
data: JSON.stringify(data.data)
}
}
@@ -2096,7 +2095,7 @@ var urls = {
'wizard.step8.create_selected_services': {
'type': 'POST',
- 'real': '/clusters/{cluster}/servicegroups/{serviceGroup}/services',
+ 'real': '/clusters/{cluster}/servicegroups/{serviceGroupName}/services',
'mock': '/data/stacks/HDP-2.1/recommendations.json',
'format': function (data) {
return {
@@ -2107,7 +2106,7 @@ var urls = {
},
'wizard.step8.create_components': {
- 'real':
'/clusters/{cluster}/servicegroups/{serviceGroup}/services/{serviceName}/components',
+ 'real':
'/clusters/{cluster}/servicegroups/{serviceGroupName}/services/{serviceName}/components',
'mock': '',
'format': function (data) {
return {
diff --git a/ambari-web/test/controllers/wizard/step8_test.js
b/ambari-web/test/controllers/wizard/step8_test.js
index 089746c..6d3832d 100644
--- a/ambari-web/test/controllers/wizard/step8_test.js
+++ b/ambari-web/test/controllers/wizard/step8_test.js
@@ -1302,31 +1302,20 @@ describe('App.WizardStep8Controller', function () {
describe('#applyConfigurationsToCluster', function() {
it('should call addRequestToAjaxQueue', function() {
- var serviceConfigTags = [
- {
- type: 'hdfs',
- tag: 'tag1',
- properties: {
- 'prop1': 'value1'
- }
+ var serviceConfig = {
+ serviceName: "service",
+ serviceGroupName: "serviceGroup",
+ data: {
+ properties: {
+ prop1: "val1"
}
- ],
- data = '['+JSON.stringify({
- Clusters: {
- desired_config: [serviceConfigTags[0]]
- }
- })+']';
- installerStep8Controller.reopen({
- installedServices: [
- Em.Object.create({
- isSelected: true,
- isInstalled: false,
- configTypesRendered: {hdfs:'tag1'}
- })
- ], selectedServices: []
- });
+ }
+ }
+
+ var serviceConfigTags = [Em.Object.create(serviceConfig)];
+
installerStep8Controller.applyConfigurationsToCluster(serviceConfigTags);
-
expect(installerStep8Controller.addRequestToAjaxQueue.args[0][0].data.data).to.equal(data);
+
expect(JSON.stringify(installerStep8Controller.addRequestToAjaxQueue.args[0][0].data)).to.deep.equal(JSON.stringify(serviceConfig));
});
});
diff --git a/ambari-web/test/mixins/common/configs/configs_saver_test.js
b/ambari-web/test/mixins/common/configs/configs_saver_test.js
index ff238c1..1d8f9d7 100644
--- a/ambari-web/test/mixins/common/configs/configs_saver_test.js
+++ b/ambari-web/test/mixins/common/configs/configs_saver_test.js
@@ -137,38 +137,46 @@ describe('App.ConfigsSaverMixin', function() {
it('generates config without properties', function() {
expect(mixin.createDesiredConfig('type1')).to.eql({
- "type": 'type1',
- "properties": {},
- "service_config_version_note": ""
+ "Config": {
+ "type": 'type1',
+ "properties": {},
+ "service_config_version_note": ""
+ }
})
});
it('generates config with properties', function() {
expect(mixin.createDesiredConfig('type1', [Em.Object.create({name: 'p1',
value: 'v1', isRequiredByAgent: true}), Em.Object.create({name: 'p2', value:
'v2', isRequiredByAgent: true})], "note")).to.eql({
- "type": 'type1',
- "properties": {
- "p1": 'v1',
- "p2": 'v2'
- },
- "service_config_version_note": 'note'
+ "Config": {
+ "type": 'type1',
+ "properties": {
+ "p1": 'v1',
+ "p2": 'v2'
+ },
+ "service_config_version_note": 'note'
+ }
})
});
it('generates config with properties and skip isRequiredByAgent',
function() {
expect(mixin.createDesiredConfig('type1', [Em.Object.create({name: 'p1',
value: 'v1', isRequiredByAgent: true}), Em.Object.create({name: 'p2', value:
'v2', isRequiredByAgent: false})], "note")).to.eql({
- "type": 'type1',
- "properties": {
- p1: 'v1'
- },
- "service_config_version_note": 'note'
+ "Config": {
+ "type": 'type1',
+ "properties": {
+ p1: 'v1'
+ },
+ "service_config_version_note": 'note'
+ }
})
});
it('generates config with properties and skip
service_config_version_note', function() {
expect(mixin.createDesiredConfig('type1', [Em.Object.create({name: 'p1',
value: 'v1', isRequiredByAgent: true})], "note", true)).to.eql({
- "type": 'type1',
- "properties": {
- p1: 'v1'
+ "Config": {
+ "type": 'type1',
+ "properties": {
+ p1: 'v1'
+ }
}
})
});
@@ -183,47 +191,49 @@ describe('App.ConfigsSaverMixin', function() {
Em.Object.create({name: 'p6', value: 'v6', isRequiredByAgent: true,
propertyType: ["TEXT", "VALUE_FROM_PROPERTY_FILE"]}),
Em.Object.create({name: 'p7', value: 'v7', isRequiredByAgent: true,
propertyType: ["PASSWORD"]})
], "note")).to.eql({
- "type": 'type1',
- "properties": {
- p1: 'v1',
- p2: 'v2',
- p3: 'v3',
- p4: 'v4',
- p5: 'v5',
- p6: 'v6',
- p7: 'v7'
- },
- "properties_attributes": {
- final: {
- 'p1': "true"
- },
- password: {
- "p3": "true",
- "p4": "true",
- "p7": "true"
- },
- user: {
- "p3": "true"
- },
- group: {
- "p3": "true"
- },
- text: {
- "p4": "true",
- "p6": "true"
- },
- additional_user_property: {
- "p4": "true"
- },
- not_managed_hdfs_path: {
- "p5": "true"
- },
- value_from_property_file: {
- "p6": "true"
+ "Config": {
+ "type": 'type1',
+ "properties": {
+ p1: 'v1',
+ p2: 'v2',
+ p3: 'v3',
+ p4: 'v4',
+ p5: 'v5',
+ p6: 'v6',
+ p7: 'v7'
+ },
+ "properties_attributes": {
+ final: {
+ 'p1': "true"
+ },
+ password: {
+ "p3": "true",
+ "p4": "true",
+ "p7": "true"
+ },
+ user: {
+ "p3": "true"
+ },
+ group: {
+ "p3": "true"
+ },
+ text: {
+ "p4": "true",
+ "p6": "true"
+ },
+ additional_user_property: {
+ "p4": "true"
+ },
+ not_managed_hdfs_path: {
+ "p5": "true"
+ },
+ value_from_property_file: {
+ "p6": "true"
+ }
+ },
+ "service_config_version_note": 'note'
}
- },
- "service_config_version_note": 'note'
- })
+ })
})
});
--
To stop receiving notification emails like this one, please contact
[email protected].