Updated Branches:
  refs/heads/trunk 2b21ff7ed -> 5eeb4241d

AMBARI-4199 Add Service Wizard: Installed services configs have only default 
config group. (Denys Buzhor via atkach)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/5eeb4241
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/5eeb4241
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/5eeb4241

Branch: refs/heads/trunk
Commit: 5eeb4241d2ab269669aa5f6b8f4d054545d46428
Parents: 2b21ff7
Author: atkach <[email protected]>
Authored: Tue Dec 31 14:30:53 2013 +0200
Committer: atkach <[email protected]>
Committed: Tue Dec 31 14:30:53 2013 +0200

----------------------------------------------------------------------
 .../controllers/main/service/info/configs.js    |   2 +-
 ambari-web/app/controllers/wizard.js            |   6 +
 .../app/controllers/wizard/step7_controller.js  | 222 +++++++++++++++++++
 .../app/controllers/wizard/step8_controller.js  |  24 +-
 ambari-web/app/models/config_group.js           |   9 +
 ambari-web/app/utils/config.js                  |   5 +
 6 files changed, 266 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/controllers/main/service/info/configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/configs.js 
b/ambari-web/app/controllers/main/service/info/configs.js
index abc2d72..5c9b97f 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -379,7 +379,7 @@ App.MainServiceInfoConfigsController = 
Em.Controller.extend({
     //STEP 3: Load advanced configs from server
     var advancedConfigs = App.config.loadAdvancedConfig(serviceName) || [];
     //STEP 4: Load on-site config by service from server
-     var configGroups = 
App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags'));
+    var configGroups = 
App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags'));
     //STEP 5: Merge global and on-site configs with pre-defined
     var configSet = App.config.mergePreDefinedWithLoaded(configGroups, 
advancedConfigs, this.get('serviceConfigTags'), serviceName);
     configSet = App.config.syncOrderWithPredefined(configSet);

http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js 
b/ambari-web/app/controllers/wizard.js
index 2a1351f..2a680dd 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -744,11 +744,15 @@ App.WizardController = Em.Controller.extend({
    */
   saveServiceConfigGroups: function (stepController) {
     var serviceConfigGroups = [];
+    var isForUpdate = false;
     stepController.get('stepConfigs').forEach(function (service) {
+      // mark group of installed service
+      if (service.get('selected') === false) isForUpdate = true;
       service.get('configGroups').forEach(function (configGroup) {
         var properties = [];
         configGroup.get('properties').forEach(function (property) {
           properties.push({
+            isRequiredByAgent: property.get('isRequiredByAgent'),
             name: property.get('name'),
             value: property.get('value'),
             filename: property.get('filename')
@@ -756,11 +760,13 @@ App.WizardController = Em.Controller.extend({
         });
         //configGroup copied into plain JS object to avoid Converting circular 
structure to JSON
         serviceConfigGroups.push({
+          id: configGroup.get('id'),
           name: configGroup.get('name'),
           description: configGroup.get('description'),
           hosts: configGroup.get('hosts'),
           properties: properties,
           isDefault: configGroup.get('isDefault'),
+          isForUpdate: isForUpdate,
           service: {id: configGroup.get('service.id')}
         });
       }, this)

http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/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 d4ef666..ae8636d 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -54,6 +54,8 @@ App.WizardStep7Controller = Em.Controller.extend({
 
   selectedConfigGroup: null,
 
+  serviceConfigsData: require('data/service_configs'),
+
   isSubmitDisabled: function () {
     return (!this.stepConfigs.filterProperty('showConfig', 
true).everyProperty('errorCount', 0) || this.get("miscModalVisible"));
   }.property('[email protected]', 'miscModalVisible'),
@@ -81,7 +83,223 @@ App.WizardStep7Controller = Em.Controller.extend({
     this.set('filter', '');
     this.get('filterColumns').setEach('selected', false);
   },
+  /**
+   *  Load config groups for installed services
+   */
+  loadInstalledServicesConfigGroups: function (servicesNames) {
+    if (servicesNames.indexOf('MISC') > -1)
+      servicesNames.splice(servicesNames.indexOf('MISC'), 1);
+    servicesNames.forEach(function(serviceName) {
+      App.ajax.send({
+        name: 'config.tags_and_groups',
+        sender: this,
+        data: {
+          serviceName: serviceName,
+          serviceConfigsDef: 
App.config.get('preDefinedServiceConfigs').findProperty('serviceName', 
serviceName)
+        },
+        success: 'loadServiceTagsSuccess'
+      });
+    }, this);
+  },
+
+ /**
+  * Load config groups success callback
+  */
+  loadServiceTagsSuccess: function (data, opt, params) {
+    var serviceConfigsDef = params.serviceConfigsDef;
+    var serviceName = params.serviceName;
+    var service = this.get('stepConfigs').findProperty('serviceName', 
serviceName);
+    console.debug("loadServiceConfigs(): data=", data);
+    // Create default configuration group
+    var defaultConfigGroupHosts = App.Host.find().mapProperty('hostName');
+    var selectedConfigGroup;
+    var siteToTagMap = {};
+    for (var site in data.Clusters.desired_configs) {
+      if (serviceConfigsDef.sites.indexOf(site) > -1) {
+        siteToTagMap[site] = data.Clusters.desired_configs[site].tag;
+      }
+    }
+    this.loadedClusterSiteToTagMap = siteToTagMap;
+    //parse loaded config groups
+    if (App.supports.hostOverrides) {
+      var configGroups = [];
+      if (data.config_groups.length) {
+        data.config_groups.forEach(function (item) {
+          item = item.ConfigGroup;
+          if (item.tag === serviceName) {
+            var groupHosts = item.hosts.mapProperty('host_name');
+            var newConfigGroup = App.ConfigGroup.create({
+              id: item.id,
+              name: item.group_name,
+              description: item.description,
+              isDefault: false,
+              parentConfigGroup: null,
+              service: App.Service.find().findProperty('serviceName', 
item.tag),
+              hosts: groupHosts,
+              configSiteTags: []
+            });
+            groupHosts.forEach(function (host) {
+              defaultConfigGroupHosts = defaultConfigGroupHosts.without(host);
+            }, this);
+            item.desired_configs.forEach(function (config) {
+              newConfigGroup.configSiteTags.push(App.ConfigSiteTag.create({
+                site: config.type,
+                tag: config.tag
+              }));
+            }, this);
+            configGroups.push(newConfigGroup);
+          }
+        }, this);
+      }
+    }
+    var defaultConfigGroup = App.ConfigGroup.create({
+      name: App.Service.DisplayNames[serviceName] + " Default",
+      description: "Default cluster level " + serviceName + " configuration",
+      isDefault: true,
+      hosts: defaultConfigGroupHosts,
+      parentConfigGroup: null,
+      service: Em.Object.create({
+        id: serviceName
+      }),
+      serviceName: serviceName,
+      configSiteTags: []
+    });
+    if (!selectedConfigGroup) {
+      selectedConfigGroup = defaultConfigGroup;
+    }
+    configGroups.sort(function(configGroupA, configGroupB){
+      return (configGroupA.name > configGroupB.name);
+    });
+    configGroups.unshift(defaultConfigGroup);
+    if (App.supports.hostOverrides) {
+      service.set('configGroups', configGroups);
+      var loadedGroupToOverrideSiteToTagMap = {};
+      if (App.supports.hostOverrides) {
+        var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') ? 
service.get('configGroups') : [selectedConfigGroup];
+        configGroupsWithOverrides.forEach(function (item) {
+          var groupName = item.get('name');
+          loadedGroupToOverrideSiteToTagMap[groupName] = {};
+          item.get('configSiteTags').forEach(function (siteTag) {
+            var site = siteTag.get('site');
+            var tag = siteTag.get('tag');
+            loadedGroupToOverrideSiteToTagMap[groupName][site] = tag;
+          }, this);
+        }, this);
+      }
+      App.config.loadServiceConfigHostsOverrides(service.get('configs'), 
loadedGroupToOverrideSiteToTagMap, service.get('configGroups'));
+      var serviceConfig = App.config.createServiceConfig(serviceName);
+      if (serviceConfig.get('serviceName') === 'HDFS') {
+        App.config.OnNnHAHideSnn(serviceConfig);
+      }
+      service.set('selectedConfigGroup', selectedConfigGroup);
+      this.loadComponentConfigs(service.get('configs'), serviceConfig, 
service);
+    }
+    service.set('configs', serviceConfig.get('configs'));
+  },
+
+  loadComponentConfigs: function (configs, componentConfig, component) {
+    var localDB = 
App.router.get('mainServiceInfoConfigsController').getInfoForDefaults();
+    var recommendedDefaults = {};
+    var s = this.get('serviceConfigsData').findProperty('serviceName', 
component.get('serviceName'));
+    var defaultGroupSelected = component.get('selectedConfigGroup.isDefault');
+    var defaults = [];
+    if (s.defaultsProviders) {
+      s.defaultsProviders.forEach(function(defaultsProvider) {
+        var d = defaultsProvider.getDefaults(localDB);
+        defaults.push(d);
+        for (var name in d) {
+          recommendedDefaults[name] = d[name];
+        }
+      });
+    }
+    if (s.configsValidator) {
+      s.configsValidator.set('recommendedDefaults', recommendedDefaults);
+    }
+    configs.forEach(function (_serviceConfigProperty) {
+      console.log("config", _serviceConfigProperty);
+      if (!_serviceConfigProperty) return;
+      var overrides = _serviceConfigProperty.get('overrides');
+      // we will populate the override properties below
+      _serviceConfigProperty.set('overrides', null);
+
+      if (_serviceConfigProperty.isOverridable === undefined) {
+        _serviceConfigProperty.set('isOverridable', true);
+      }
+      if (_serviceConfigProperty.displayType === 'checkbox') {
+        switch (_serviceConfigProperty.value) {
+          case 'true':
+            _serviceConfigProperty.set('value', true);
+            _serviceConfigProperty.set('defaultValue', true);
+            break;
+          case 'false':
+            _serviceConfigProperty.set('value', false);
+            _serviceConfigProperty.set('defaultValue', false);
+            break;
+        }
+      }
+      var serviceConfigProperty = 
App.ServiceConfigProperty.create(_serviceConfigProperty);
+      if (serviceConfigProperty.get('serviceName') === 
component.get('serviceName')) {
+        if (s.configsValidator) {
+          var validators = s.configsValidator.get('configValidators');
+          for (var validatorName in validators) {
+            if (serviceConfigProperty.name == validatorName) {
+              serviceConfigProperty.set('serviceValidator', 
s.configsValidator);
+            }
+          }
+        }
+        serviceConfigProperty.set('isVisible', true);
 
+        console.log("config result", serviceConfigProperty);
+      } else {
+        serviceConfigProperty.set('isVisible', false);
+      }
+      if (overrides != null) {
+        overrides.forEach(function (override) {
+          var newSCP = 
App.ServiceConfigProperty.create(_serviceConfigProperty);
+          newSCP.set('value', override.value);
+          newSCP.set('isOriginalSCP', false); // indicated this is overridden 
value,
+          newSCP.set('parentSCP', _serviceConfigProperty);
+          if (App.supports.hostOverrides && defaultGroupSelected) {
+            var group = component.get('configGroups').findProperty('name', 
override.group.get('name'));
+            // prevent cycle in proto object, clean link
+            if (group.get('properties').length == 0)
+              group.set('properties', Em.A([]));
+            group.get('properties').push(newSCP);
+            newSCP.set('group', override.group);
+            newSCP.set('isEditable', false);
+          }
+          var parentOverridesArray = serviceConfigProperty.get('overrides');
+          if (parentOverridesArray == null) {
+            parentOverridesArray = Ember.A([]);
+            serviceConfigProperty.set('overrides', parentOverridesArray);
+          }
+          serviceConfigProperty.get('overrides').pushObject(newSCP);
+          console.debug("createOverrideProperty(): Added:", newSCP, " to 
main-property:", serviceConfigProperty)
+        }, this);
+      } else {
+        serviceConfigProperty.set('overrides', Ember.A([]));
+      }
+      if (App.get('isAdmin')) {
+        if(defaultGroupSelected && !this.get('isHostsConfigsPage')){
+          serviceConfigProperty.set('isEditable', 
serviceConfigProperty.get('isReconfigurable'));
+        } else {
+          serviceConfigProperty.set('isEditable', false);
+        }
+      } else {
+        serviceConfigProperty.set('isEditable', false);
+      }
+      componentConfig.get('configs').pushObject(serviceConfigProperty);
+      serviceConfigProperty.validate();
+    }, this);
+    var overrideToAdd = this.get('overrideToAdd');
+    if (overrideToAdd) {
+      overrideToAdd = componentConfig.configs.findProperty('name', 
overrideToAdd.name);
+      if (overrideToAdd) {
+        this.addOverrideProperty(overrideToAdd);
+        component.set('overrideToAdd', null);
+      }
+    }
+  },
   /**
    * On load function
    */
@@ -131,6 +349,9 @@ App.WizardStep7Controller = Em.Controller.extend({
     this.set('stepConfigs', serviceConfigs);
     if (App.supports.hostOverridesInstaller) {
       this.loadConfigGroups(this.get('content.configGroups'));
+      var installedServicesConfigs = 
this.get('stepConfigs').filterProperty('selected', false);
+      if (installedServicesConfigs.length > 0 && !storedConfigs)
+        
this.loadInstalledServicesConfigGroups(installedServicesConfigs.mapProperty('serviceName'));
     }
     this.activateSpecialConfigs();
     this.set('selectedService', 
this.get('stepConfigs').filterProperty('showConfig', true).objectAt(0));
@@ -209,6 +430,7 @@ App.WizardStep7Controller = Em.Controller.extend({
     var serviceConfigs = this.get('selectedService.configs');
     var selectedGroup = this.get('selectedConfigGroup');
     var overrideToAdd = this.get('overrideToAdd');
+    if(!selectedGroup) return;
     var displayedConfigGroups = (selectedGroup.get('isDefault')) ?
         this.get('selectedService.configGroups').filterProperty('isDefault', 
false) :
         [this.get('selectedConfigGroup')];

http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/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 c607031..634ffc4 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -1485,6 +1485,7 @@ App.WizardStep8Controller = Em.Controller.extend({
     var configGroups = 
this.get('content.configGroups').filterProperty('isDefault', false);
     var clusterName = this.get('clusterName');
     var sendData = [];
+    var updateData = [];
     var serviceConfigController = 
App.router.get('mainServiceInfoConfigsController');
     configGroups.forEach(function (configGroup) {
       var groupConfigs = [];
@@ -1504,11 +1505,26 @@ App.WizardStep8Controller = Em.Controller.extend({
         groupConfigs.push(Em.Object.create(property));
       });
       groupData.desired_configs = 
serviceConfigController.buildGroupDesiredConfigs.call(serviceConfigController, 
groupConfigs);
-      sendData.push({"ConfigGroup": groupData});
+      // check for group from installed service
+      if (configGroup.isForUpdate === true) {
+        // if group is a new one, create it
+        if (!configGroup.id) {
+          sendData.push({"ConfigGroup": groupData});
+        } else {
+          // update an existing group
+          groupData.id = configGroup.id;
+          updateData.push({"ConfigGroup": groupData});
+        }
+      } else {
+        sendData.push({"ConfigGroup": groupData});
+      }
     }, this);
     if (sendData.length > 0) {
       this.applyConfigurationGroups(sendData);
     }
+    if (updateData.length > 0) {
+      this.applyInstalledServicesConfigurationGroup(updateData);
+    }
   },
 
   applyConfigurationGroups: function (sendData) {
@@ -1520,6 +1536,12 @@ App.WizardStep8Controller = Em.Controller.extend({
     });
   },
 
+  applyInstalledServicesConfigurationGroup: function (updateData) {
+    updateData.forEach(function(item) {
+      
App.router.get('mainServiceInfoConfigsController').putConfigGroupChanges(item);
+    });
+  },
+
   createGlobalSiteObj: function () {
     var globalSiteProperties = {};
     var globalSiteObj = this.get('globals');

http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/models/config_group.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/config_group.js 
b/ambari-web/app/models/config_group.js
index 1bfc348..0c19507 100644
--- a/ambari-web/app/models/config_group.js
+++ b/ambari-web/app/models/config_group.js
@@ -78,6 +78,15 @@ App.ConfigGroup = Ember.Object.extend({
   hosts: [],
 
   /**
+   * In add service wizard we have installed services.
+   * And on deploy step we need to update existing config groups
+   * also mark it for be sure that config group data came from
+   * installed service.
+   *
+   */
+  isForUpdate: false,
+
+  /**
    * Provides a display friendly name. This includes trimming
    * names to a certain length.
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/utils/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index c0f210f..610748a 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -391,6 +391,7 @@ App.config = Em.Object.create({
         configData.overrides = stored.overrides;
         configData.filename = stored.filename;
         configData.description = stored.description;
+        configData.isRequiredByAgent = (configData.isRequiredByAgent !== 
undefined) ? configData.isRequiredByAgent : true;
       } else if (!preDefined && stored) {
 
         configData = {
@@ -411,6 +412,7 @@ App.config = Em.Object.create({
         this.calculateConfigProperties(configData, isAdvanced, 
advancedConfigs);
       } else if (preDefined && !stored) {
         configData = preDefined;
+        configData.isRequiredByAgent = (configData.isRequiredByAgent !== 
undefined) ? configData.isRequiredByAgent : true;
         if (isAdvanced) {
           var advanced = advancedConfigs.findProperty('name', configData.name);
           configData.value = configData.displayType == "password" ? '' : 
advanced.value;
@@ -815,6 +817,9 @@ App.config = Em.Object.create({
           if (!(overrides in serviceConfig)) {
             serviceConfig.overrides = [];
           }
+          if (!serviceConfig.overrides) {
+           serviceConfig.set('overrides', []);
+          }
           console.log("loadServiceConfigHostsOverrides(): [" + group + "] 
OVERRODE(" + serviceConfig.name + "): " + serviceConfig.value + " -> " + 
hostOverrideValue);
           serviceConfig.overrides.push({value: hostOverrideValue, group: 
group});
         }

Reply via email to