You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by at...@apache.org on 2013/12/25 14:06:49 UTC

[1/2] git commit: AMBARI-4166 Improve responsiveness on step 9 when deploy in progress. (atkach)

Updated Branches:
  refs/heads/trunk 8108ca459 -> aafadc5d5


AMBARI-4166 Improve responsiveness on step 9 when deploy in progress. (atkach)


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

Branch: refs/heads/trunk
Commit: d522edb374c5421f9f0ed31f664e76ec5cffbc83
Parents: 8108ca4
Author: atkach <at...@hortonworks.com>
Authored: Wed Dec 25 12:40:51 2013 +0200
Committer: atkach <at...@hortonworks.com>
Committed: Wed Dec 25 15:05:24 2013 +0200

----------------------------------------------------------------------
 .../app/controllers/wizard/step8_controller.js  |   9 +-
 .../app/controllers/wizard/step9_controller.js  | 147 +++++++++----------
 ambari-web/test/installer/step9_test.js         |  44 +++---
 3 files changed, 91 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/d522edb3/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 288456f..a5b6738 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -1387,10 +1387,7 @@ App.WizardStep8Controller = Em.Controller.extend({
       this.ajax({
         type: 'POST',
         url: url,
-        data: JSON.stringify(data),
-        beforeSend: function () {
-          console.log('BeforeSend: registerHostsToComponent for ' + queryStr + ' and component ' + componentName);
-        }
+        data: JSON.stringify(data)
       });
     }, this);
   },
@@ -1765,7 +1762,6 @@ App.WizardStep8Controller = Em.Controller.extend({
     this.set('ajaxQueueLeft', this.get('ajaxQueue').length);
 
     this.set('ajaxBusy', true);
-    console.log('AJAX send ' + first.url);
     $.ajax(first);
 
   },
@@ -1859,10 +1855,7 @@ App.WizardStep8Controller = Em.Controller.extend({
         // console.log('Step8: Error message is: ' + request.responseText);
       },
       success: function (data) {
-        var jsonData = jQuery.parseJSON(data);
         console.log("TRACE: STep8 -> In success function");
-        console.log("TRACE: STep8 -> value of the url is: " + params.url);
-        console.log("TRACE: STep8 -> value of the received data is: " + jsonData);
       }
     }, params);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/d522edb3/ambari-web/app/controllers/wizard/step9_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step9_controller.js b/ambari-web/app/controllers/wizard/step9_controller.js
index 35bd222..a8e1489 100644
--- a/ambari-web/app/controllers/wizard/step9_controller.js
+++ b/ambari-web/app/controllers/wizard/step9_controller.js
@@ -49,23 +49,8 @@ App.WizardStep9Controller = Em.Controller.extend({
   numPolls: 1,
   POLL_INTERVAL: 4000,
 
-  status: function () {
-    if (this.get('hosts').someProperty('status', 'failed')) {
-      return 'failed';
-    }
-    if (this.get('hosts').someProperty('status', 'warning')) {
-      if (this.isStepFailed()) {
-        return 'failed';
-      } else {
-        return 'warning';
-      }
-    }
-    if(this.get('progress') == '100') {
-      this.set('isStepCompleted', true);
-      return 'success';
-    }
-    return 'info';
-  }.property('hosts.@each.status', 'progress'),
+  visibleHosts: [],
+  status: 'info',
 
   showRetry: function () {
     return this.get('content.cluster.status') == 'INSTALL FAILED';
@@ -112,19 +97,43 @@ App.WizardStep9Controller = Em.Controller.extend({
     return categories;
   }.property(),
   category: false,
-  visibleHosts: function(){
+
+  hostStatusObserver: function(){
+    Ember.run.once(this, 'hostStatusUpdates');
+  }.observes('hosts.@each.status'),
+
+  hostStatusUpdates: function () {
+    this.updateVisibleHosts();
+    this.updateStatus();
+  },
+
+  updateVisibleHosts: function () {
     var targetStatus = this.get('category.hostStatus');
-    var visibleHosts =  this.get('hosts').filter(function(_host) {
-      if (targetStatus == 'all') {
-        return true;
-      }
+    var visibleHosts = (targetStatus === 'all') ? this.get('hosts') : this.get('hosts').filter(function (_host) {
       if (targetStatus == 'inProgress') {   // queued, pending, in_progress map to inProgress
         return (_host.get('status') !== 'success' && _host.get('status') !== 'failed' && _host.get('status') !== 'warning');
       }
       return (_host.get('status') == targetStatus);
     }, this);
-    return visibleHosts;
-  }.property('category', 'hosts.@each.status'),
+    this.set('visibleHosts', visibleHosts);
+  }.observes('category'),
+
+  updateStatus: function () {
+    var status = 'info';
+    if (this.get('hosts').someProperty('status', 'failed')) {
+      status = 'failed';
+    } else if (this.get('hosts').someProperty('status', 'warning')) {
+      if (this.isStepFailed()) {
+        status = 'failed';
+      } else {
+        status = 'warning';
+      }
+    } else if (this.get('progress') == '100') {
+      this.set('isStepCompleted', true);
+      status = 'success';
+    }
+    this.set('status', status);
+  }.observes('progress'),
 
   logTasksChangesCounter: 0,
 
@@ -199,7 +208,7 @@ App.WizardStep9Controller = Em.Controller.extend({
   loadStep: function () {
     console.log("TRACE: Loading step9: Install, Start and Test");
     this.clearStep();
-    this.renderHosts(this.loadHosts());
+    this.loadHosts();
   },
   /**
    * reset status and message of all hosts when retry install
@@ -214,33 +223,20 @@ App.WizardStep9Controller = Em.Controller.extend({
   },
 
   loadHosts: function () {
-    var hostInfo = this.get('content.hosts');
-    var hosts = new Ember.Set();
-    for (var index in hostInfo) {
-      var obj = Em.Object.create(hostInfo[index]);
-      obj.message = (obj.message) ? obj.message : 'Waiting';
-      obj.progress = 0;
-      obj.status = (obj.status) ? obj.status : 'info';
-      obj.tasks = [];
-      obj.logTasks = [];
-      hosts.add(obj);
+    var hosts = this.get('content.hosts');
+    for (var index in hosts) {
+      if (hosts[index].bootStatus === 'REGISTERED') {
+        var hostInfo = App.HostInfo.create({
+          name: hosts[index].name,
+          status: (hosts[index].status) ? hosts[index].status : 'info',
+          tasks: [],
+          logTasks: [],
+          message: (hosts[index].message) ? hosts[index].message : 'Waiting',
+          progress: 0
+        });
+        this.get('hosts').pushObject(hostInfo);
+      }
     }
-    return hosts.filterProperty('bootStatus', 'REGISTERED');
-  },
-
-  // sets this.hosts, where each element corresponds to a status and progress info on a host
-  renderHosts: function (hostsInfo) {
-    hostsInfo.forEach(function (_hostInfo) {
-      var hostInfo = App.HostInfo.create({
-        name: _hostInfo.name,
-        status: _hostInfo.status,
-        tasks: _hostInfo.tasks,
-        logTasks: _hostInfo.logTasks,
-        message: _hostInfo.message,
-        progress: _hostInfo.progress
-      });
-      this.get('hosts').pushObject(hostInfo);
-    }, this);
   },
 
   replacePolledData: function (polledData) {
@@ -450,7 +446,6 @@ App.WizardStep9Controller = Em.Controller.extend({
 
   // marks a host's status as "success" if all tasks are in COMPLETED state
   onSuccessPerHost: function (actions, contentHost) {
-    if (!actions) return;
     if (actions.everyProperty('Tasks.status', 'COMPLETED') && this.get('content.cluster.status') === 'INSTALLED') {
       contentHost.set('status', 'success');
     }
@@ -482,7 +477,6 @@ App.WizardStep9Controller = Em.Controller.extend({
   },
 
   onInProgressPerHost: function (actions, contentHost) {
-    if (!actions) return;
     var runningAction = actions.findProperty('Tasks.status', 'IN_PROGRESS');
     if (runningAction === undefined || runningAction === null) {
       runningAction = actions.findProperty('Tasks.status', 'QUEUED');
@@ -505,13 +499,14 @@ App.WizardStep9Controller = Em.Controller.extend({
   progressPerHost: function (actions, contentHost) {
     var progress = 0;
     var actionsPerHost = actions.length;
-    // TODO: consolidate to a single filter function for better performance
-    var completedActions = actions.filterProperty('Tasks.status', 'COMPLETED').length
-      + actions.filterProperty('Tasks.status', 'FAILED').length
-      + actions.filterProperty('Tasks.status', 'ABORTED').length
-      + actions.filterProperty('Tasks.status', 'TIMEDOUT').length;
-    var queuedActions = actions.filterProperty('Tasks.status', 'QUEUED').length;
-    var inProgressActions = actions.filterProperty('Tasks.status', 'IN_PROGRESS').length;
+    var completedActions = 0;
+    var queuedActions = 0;
+    var inProgressActions = 0;
+    actions.forEach(function (action) {
+      completedActions += +(['COMPLETED', 'FAILED', 'ABORTED', 'TIMEDOUT'].contains(action.Tasks.status));
+      queuedActions += +(action.Tasks.status === 'QUEUED');
+      inProgressActions += +(action.Tasks.status === 'IN_PROGRESS');
+    }, this);
     /** for the install phase (PENDING), % completed per host goes up to 33%; floor(100 / 3)
      * for the start phase (INSTALLED), % completed starts from 34%
      * when task in queued state means it's completed on 9%
@@ -667,15 +662,15 @@ App.WizardStep9Controller = Em.Controller.extend({
 
   // This is done at HostRole level.
   setLogTasksStatePerHost: function (tasksPerHost, host) {
-    if (!tasksPerHost) return;
     tasksPerHost.forEach(function (_task) {
       var task = host.logTasks.findProperty('Tasks.id', _task.Tasks.id);
       if (task) {
-        host.logTasks.removeObject(task);
+        task.Tasks.status = _task.Tasks.status;
+        task.Tasks.exit_code = _task.Tasks.exit_code;
+      } else {
+        host.logTasks.pushObject(_task);
       }
-      host.logTasks.pushObject(_task);
     }, this);
-    this.set('logTasksChangesCounter', this.get('logTasksChangesCounter') + 1);
   },
 
   parseHostInfo: function (polledData) {
@@ -695,19 +690,18 @@ App.WizardStep9Controller = Em.Controller.extend({
       // current requestId.
       return false;
     }
-    tasksData.setEach('Tasks.stderr', '');
-    tasksData.setEach('Tasks.stdout', '');
-    if (this.get('currentOpenTaskId')) {
-      var currentTask = tasksData.findProperty('Tasks.id', this.get('currentOpenTaskId'));
-      var log = this.get('currentOpenTaskLog');
-      if (currentTask && log) {
-        currentTask.Tasks.stderr = log.stderr;
-        currentTask.Tasks.stdout = log.stdout;
-      }
-    }
     this.replacePolledData(tasksData);
+    var tasksHostMap = {};
+    tasksData.forEach(function(task){
+      if(tasksHostMap[task.Tasks.host_name]) {
+        tasksHostMap[task.Tasks.host_name].push(task);
+      } else {
+        tasksHostMap[task.Tasks.host_name] = [task];
+      }
+    });
+
     this.get('hosts').forEach(function (_host) {
-      var actionsPerHost = tasksData.filterProperty('Tasks.host_name', _host.name); // retrieved from polled Data
+      var actionsPerHost = tasksHostMap[_host.name] || []; // retrieved from polled Data
       if (actionsPerHost.length === 0) {
         if(this.get('content.cluster.status') === 'PENDING') {
           _host.set('progress', '33');
@@ -729,6 +723,7 @@ App.WizardStep9Controller = Em.Controller.extend({
         _host.set('status', 'pending');
       }
     }, this);
+    this.set('logTasksChangesCounter', this.get('logTasksChangesCounter') + 1);
     totalProgress = Math.floor(totalProgress / this.get('hosts.length'));
     this.set('progress', totalProgress.toString());
     console.log("INFO: right now the progress is: " + this.get('progress'));
@@ -743,7 +738,7 @@ App.WizardStep9Controller = Em.Controller.extend({
   getUrl: function (requestId) {
     var clusterName = this.get('content.cluster.name');
     var requestId = requestId || this.get('content.cluster.requestId');
-    var url = App.apiPrefix + '/clusters/' + clusterName + '/requests/' + requestId + '?fields=*,tasks/Tasks/command,tasks/Tasks/exit_code,tasks/Tasks/host_name,tasks/Tasks/id,tasks/Tasks/role,tasks/Tasks/status';
+    var url = App.apiPrefix + '/clusters/' + clusterName + '/requests/' + requestId + '?fields=tasks/Tasks/command,tasks/Tasks/exit_code,tasks/Tasks/host_name,tasks/Tasks/id,tasks/Tasks/role,tasks/Tasks/status';
     console.log("URL for step9 is: " + url);
     return url;
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/d522edb3/ambari-web/test/installer/step9_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/installer/step9_test.js b/ambari-web/test/installer/step9_test.js
index b0bb7b2..1b6fb9e 100644
--- a/ambari-web/test/installer/step9_test.js
+++ b/ambari-web/test/installer/step9_test.js
@@ -21,6 +21,7 @@ var Ember = require('ember');
 var App = require('app');
 require('models/hosts');
 require('controllers/wizard/step9_controller');
+require('utils/helper');
 
 describe('App.InstallerStep9Controller', function () {
 
@@ -98,6 +99,7 @@ describe('App.InstallerStep9Controller', function () {
     ];
     tests.forEach(function(test) {
       var controller = App.WizardStep9Controller.create({hosts: test.hosts, isStepFailed: function(){return test.isStepFailed}, progress: test.progress});
+      controller.updateStatus();
       it(test.m, function() {
         expect(controller.get('status')).to.equal(test.e);
       });
@@ -191,7 +193,8 @@ describe('App.InstallerStep9Controller', function () {
   
   describe('#loadHosts', function() {
     var controller = App.WizardStep9Controller.create({content: {hosts: hosts_for_load_and_render}});
-    var loaded_hosts = controller.loadHosts();
+    controller.loadHosts();
+    var loaded_hosts = controller.get('hosts');
     it('Only REGISTERED hosts', function() {
       expect(loaded_hosts.length).to.equal(2);
     });
@@ -207,15 +210,6 @@ describe('App.InstallerStep9Controller', function () {
     });
   });
 
-  describe('#renderHosts', function() {
-    var controller = App.WizardStep9Controller.create({content: {hosts: hosts_for_load_and_render}});
-    var loaded_hosts = controller.loadHosts();
-    controller.renderHosts(loaded_hosts);
-    it('All host should be rendered', function() {
-      expect(controller.get('hosts.length')).to.equal(loaded_hosts.length);
-    });
-  });
-
   describe('#hostHasClientsOnly', function() {
     var tests = [
       {
@@ -668,9 +662,9 @@ describe('App.InstallerStep9Controller', function () {
     it('check requestId priority', function() {
       cluster.set('content.cluster.requestId', 123);
       var url = cluster.getUrl(321);
-      expect(url).to.equal(App.apiPrefix + '/clusters/' + clusterName + '/requests/' + '321' + '?fields=tasks/*');
+      expect(url).to.equal(App.apiPrefix + '/clusters/' + clusterName + '/requests/' + '321' + '?fields=tasks/Tasks/command,tasks/Tasks/exit_code,tasks/Tasks/host_name,tasks/Tasks/id,tasks/Tasks/role,tasks/Tasks/status');
       url = cluster.getUrl();
-      expect(url).to.equal(App.apiPrefix + '/clusters/' + clusterName + '/requests/' + '123' + '?fields=tasks/*');
+      expect(url).to.equal(App.apiPrefix + '/clusters/' + clusterName + '/requests/' + '123' + '?fields=tasks/Tasks/command,tasks/Tasks/exit_code,tasks/Tasks/host_name,tasks/Tasks/id,tasks/Tasks/role,tasks/Tasks/status');
     });
   });
 
@@ -795,38 +789,36 @@ describe('App.InstallerStep9Controller', function () {
   describe('#setLogTasksStatePerHost', function() {
     var tests = [
       {
-        tasksPerHost: [{Tasks: {id: 1,message: '2'}},{Tasks: {id: 2,message: '2'}}],
+        tasksPerHost: [{Tasks: {id: 1,status: 'COMPLETED'}},{Tasks: {id: 2,status: 'COMPLETED'}}],
         tasks: [],
-        e: {m: '2',l: 2},
+        e: {m: 'COMPLETED',l: 2},
         m: 'host didn\'t have tasks and got 2 new'
       },
       {
-        tasksPerHost: [{Tasks: {id: 1,message: '2'}},{Tasks: {id: 2,message: '2'}}],
-        tasks: [{Tasks: {id: 1,message: '1'}},{Tasks: {id: 2,message: '1'}}],
-        e: {m: '2',l: 2},
+        tasksPerHost: [{Tasks: {id: 1,status: 'COMPLETED'}},{Tasks: {id: 2,status: 'COMPLETED'}}],
+        tasks: [{Tasks: {id: 1,status: 'IN_PROGRESS'}},{Tasks: {id: 2,status: 'IN_PROGRESS'}}],
+        e: {m: 'COMPLETED',l: 2},
         m: 'host had 2 tasks and got both updated'
       },
       {
         tasksPerHost: [],
-        tasks: [{Tasks: {id: 1,message: '1'}},{Tasks: {id: 2,message: '1'}}],
-        e: {m: '1',l: 2},
+        tasks: [{Tasks: {id: 1,status: 'IN_PROGRESS'}},{Tasks: {id: 2,status: 'IN_PROGRESS'}}],
+        e: {m: 'IN_PROGRESS',l: 2},
         m: 'host had 2 tasks and didn\'t get updates'
       },
       {
-        tasksPerHost: [{Tasks: {id: 1,message: '2'}},{Tasks: {id: 2,message: '2'}},{Tasks: {id: 3,message: '2'}}],
-        tasks: [{Tasks: {id: 1,message: '1'}},{Tasks: {id: 2,message: '1'}}],
-        e: {m: '2',l: 3},
+        tasksPerHost: [{Tasks: {id: 1,status: 'COMPLETED'}},{Tasks: {id: 2,status: 'COMPLETED'}},{Tasks: {id: 3,status: 'COMPLETED'}}],
+        tasks: [{Tasks: {id: 1,status: 'IN_PROGRESS'}},{Tasks: {id: 2,status: 'IN_PROGRESS'}}],
+        e: {m: 'COMPLETED',l: 3},
         m: 'host had 2 tasks and got both updated and 1 new'
       }
     ];
     tests.forEach(function(test) {
       it(test.m, function() {
         var controller = App.WizardStep9Controller.create({hosts: [Em.Object.create({logTasks: test.tasks})]});
-        var logTasksChangesCounter = controller.get('logTasksChangesCounter');
         controller.setLogTasksStatePerHost(test.tasksPerHost, controller.get('hosts')[0]);
-        expect(controller.get('hosts')[0].get('logTasks').everyProperty('Tasks.message', test.e.m)).to.equal(true);
+        expect(controller.get('hosts')[0].get('logTasks').everyProperty('Tasks.status', test.e.m)).to.equal(true);
         expect(controller.get('hosts')[0].get('logTasks.length')).to.equal(test.e.l);
-        expect(controller.get('logTasksChangesCounter')).to.equal(logTasksChangesCounter + 1);
       });
     });
   });
@@ -965,7 +957,9 @@ describe('App.InstallerStep9Controller', function () {
     tests.forEach(function(test) {
       it(test.m, function() {
         var controller = App.WizardStep9Controller.create({hosts: test.hosts, content: {cluster:{status: test.cluster.status}}, finishState: function(){return false;}});
+        var logTasksChangesCounter = controller.get('logTasksChangesCounter');
         controller.parseHostInfo(test.polledData);
+        expect(controller.get('logTasksChangesCounter')).to.equal(logTasksChangesCounter + 1);
         for (var name in test.e.hosts) {
           expect(controller.get('hosts').findProperty('name', name).get('progress')).to.equal(test.e.hosts[name].progress);
         }


[2/2] git commit: AMBARI-4003 Add Service Wizard: Customize Services configs are not displayed. (Denys Buzhor via atkach)

Posted by at...@apache.org.
AMBARI-4003 Add Service Wizard: Customize Services configs are not displayed. (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/aafadc5d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/aafadc5d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/aafadc5d

Branch: refs/heads/trunk
Commit: aafadc5d5072e5daa63daed2fa2934492cc5753c
Parents: d522edb
Author: atkach <at...@hortonworks.com>
Authored: Wed Dec 25 15:06:29 2013 +0200
Committer: atkach <at...@hortonworks.com>
Committed: Wed Dec 25 15:06:29 2013 +0200

----------------------------------------------------------------------
 ambari-web/app/controllers/installer.js                   |  8 --------
 ambari-web/app/controllers/main/service/add_controller.js |  4 +++-
 ambari-web/app/controllers/wizard.js                      | 10 +++++++++-
 ambari-web/app/routes/add_service_routes.js               |  3 +++
 4 files changed, 15 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/aafadc5d/ambari-web/app/controllers/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/installer.js b/ambari-web/app/controllers/installer.js
index 358542e..0bf7e6b 100644
--- a/ambari-web/app/controllers/installer.js
+++ b/ambari-web/app/controllers/installer.js
@@ -311,14 +311,6 @@ App.InstallerController = App.WizardController.extend({
 
     this.set('content.advancedServiceConfig', this.getDBProperty('advancedServiceConfig'));
   },
-  /**
-   * Load config groups from local DB
-   */
-  loadServiceConfigGroups: function () {
-    var serviceConfigGroups = this.getDBProperty('serviceConfigGroups') || [];
-    this.set('content.configGroups', serviceConfigGroups);
-    console.log("InstallerController.configGroups: loaded config ", serviceConfigGroups);
-  },
 
   /**
    * Load information about hosts with clients components

http://git-wip-us.apache.org/repos/asf/ambari/blob/aafadc5d/ambari-web/app/controllers/main/service/add_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/add_controller.js b/ambari-web/app/controllers/main/service/add_controller.js
index 12039db..7d73262 100644
--- a/ambari-web/app/controllers/main/service/add_controller.js
+++ b/ambari-web/app/controllers/main/service/add_controller.js
@@ -51,7 +51,8 @@ App.AddServiceController = App.WizardController.extend({
     masterComponentHosts: null,
     serviceConfigProperties: null,
     advancedServiceConfig: null,
-    controllerName: 'addServiceController'
+    controllerName: 'addServiceController',
+    configGroups: []
   }),
 
   setCurrentStep: function (currentStep, completed) {
@@ -388,6 +389,7 @@ App.AddServiceController = App.WizardController.extend({
       case '5':
         this.load('cluster');
       case '4':
+        this.loadServiceConfigGroups();
         this.loadServiceConfigProperties();
       case '3':
         this.loadServices();

http://git-wip-us.apache.org/repos/asf/ambari/blob/aafadc5d/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js
index d6e6e25..2a1351f 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -518,6 +518,14 @@ App.WizardController = Em.Controller.extend({
     this.set('content.services', apiService);
     this.setDBProperty('service',apiService);
   },
+  /**
+   * Load config groups from local DB
+   */
+  loadServiceConfigGroups: function () {
+    var serviceConfigGroups = this.getDBProperty('serviceConfigGroups') || [];
+    this.set('content.configGroups', serviceConfigGroups);
+    console.log("InstallerController.configGroups: loaded config ", serviceConfigGroups);
+  },
 
   registerErrPopup: function (header, message) {
     App.ModalPopup.show({
@@ -760,4 +768,4 @@ App.WizardController = Em.Controller.extend({
     this.setDBProperty('serviceConfigGroups', serviceConfigGroups);
     this.set('content.serviceConfigProperties', serviceConfigGroups);
   }
-});
\ No newline at end of file
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/aafadc5d/ambari-web/app/routes/add_service_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/add_service_routes.js b/ambari-web/app/routes/add_service_routes.js
index bc4e16b..1c845e1 100644
--- a/ambari-web/app/routes/add_service_routes.js
+++ b/ambari-web/app/routes/add_service_routes.js
@@ -205,6 +205,9 @@ module.exports = Em.Route.extend({
       var addServiceController = router.get('addServiceController');
       var wizardStep7Controller = router.get('wizardStep7Controller');
       addServiceController.saveServiceConfigProperties(wizardStep7Controller);
+      if (App.supports.hostOverrides) {
+        addServiceController.saveServiceConfigGroups(wizardStep7Controller);
+      }
       router.transitionTo('step5');
     }
   }),