Kaynağa Gözat

[AMBARI-24747] Fix Add Component to host functionality (#2431)

* [AMBARI-24747] Fix Add Component to host functionality

* Unit test fixes.
Jason Golieb 7 yıl önce
ebeveyn
işleme
34d2c00b38

+ 1 - 5
ambari-web/app/controllers/global/cluster_controller.js

@@ -288,11 +288,7 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
   },
 
   loadComponentWithStaleConfigsSuccessCallback: function(json) {
-    json.items.forEach((item) => {
-      const componentName = item.ServiceComponentInfo.component_name;
-      const hosts = item.host_components.mapProperty('HostRoles.host_name') || [];
-      App.componentsStateMapper.updateStaleConfigsHosts(componentName, hosts);
-    });
+    json.items.forEach(item => App.componentsStateMapper.updateStaleConfigsHosts(item.HostRoles.component_name, item.HostRoles.host_name));
   },
 
   loadConfigProperties: function() {

+ 16 - 3
ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js

@@ -193,7 +193,12 @@ App.KerberosWizardController = App.WizardController.extend(App.InstallComponent,
   createKerberosResources: function (callback) {
     var self = this;
     this.createKerberosService().done(function () {
-      self.updateAndCreateServiceComponent('KERBEROS_CLIENT').done(function () {
+      self.updateAndCreateServiceComponent(Em.Object.create({
+        componentName: 'KERBEROS_CLIENT',
+        serviceName: 'KERBEROS',
+        displayName: 'Kerberos Client',
+        serviceGroupName: 'KERBEROS' //TODO: mpacks - service group hard coded for now; no idea how this will work for Kerberos service
+      })).done(function () {
         self.createKerberosHostComponents().done(callback);
       });
     });
@@ -204,7 +209,13 @@ App.KerberosWizardController = App.WizardController.extend(App.InstallComponent,
       name: 'wizard.step8.create_selected_services',
       sender: this,
       data: {
-        data: '{"ServiceInfo": { "service_name": "KERBEROS"}}',
+        data: JSON.stringify({
+          'ServiceInfo': {
+            'service_name': 'KERBEROS',
+            'service_type': 'KERBEROS',
+            'service_group_name': 'KERBEROS' //TODO: mpacks - needs to be revisited when we are no longer hard coding service groups to be named for mpacks
+          }
+        }),
         cluster: App.get('clusterName')
       }
     });
@@ -264,7 +275,9 @@ App.KerberosWizardController = App.WizardController.extend(App.InstallComponent,
         "host_components": [
           {
             "HostRoles": {
-              "component_name": 'KERBEROS_CLIENT'
+              "component_name": 'KERBEROS_CLIENT',
+              "service_name": 'KERBEROS',
+              "service_group_name": 'KERBEROS' //TODO: mpacks - hard coded for now
             }
           }
         ]

+ 5 - 1
ambari-web/app/controllers/main/service/info/configs.js

@@ -609,7 +609,11 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.AddSecurityConfi
       var clusterController = App.get('router.clusterController');
       var self = this;
       mainController.isLoading.call(clusterController, 'clusterEnv').done(function () {
-        var isExternalRangerSetup = clusterController.get("clusterEnv")["properties"]["enable_external_ranger"];
+        const clusterEnv = clusterController.get("clusterEnv");
+        let isExternalRangerSetup = false;
+        if (clusterEnv && clusterEnv.properties) {
+          isExternalRangerSetup = clusterEnv.properties.enable_external_ranger;
+        }
         if (isExternalRangerSetup) {
           self.setVisibilityForRangerProperties(selectedService);
         } else {

+ 5 - 1
ambari-web/app/controllers/wizard/step7_controller.js

@@ -639,7 +639,11 @@ App.WizardStep7Controller = App.WizardStepController.extend(App.ServerValidatorM
         var mainController = App.get('router.mainController');
         var clusterController = App.get('router.clusterController');
         mainController.isLoading.call(clusterController, 'clusterEnv').done(function () {
-          isExternalRangerSetup = clusterController.get("clusterEnv")["properties"]["enable_external_ranger"];
+          const clusterEnv = clusterController.get("clusterEnv");
+          let isExternalRangerSetup = false;
+          if (clusterEnv && clusterEnv.properties) {
+            isExternalRangerSetup = clusterEnv.properties.enable_external_ranger;
+          } 
           if (isExternalRangerSetup !== "true") {
             App.config.removeRangerConfigs(self.get('stepConfigs'));
           }

+ 6 - 5
ambari-web/app/mappers/service_metrics_mapper.js

@@ -25,10 +25,14 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
 
   model: App.Service,
   config: {
-    id: 'ServiceInfo.service_name',
+    id: 'ServiceInfo.id',
     service_name: 'ServiceInfo.service_name',
+    service_group_name: 'ServiceInfo.service_group_name',
     work_status: 'ServiceInfo.state',
     passive_state: 'ServiceInfo.passive_state',
+    mpack_name: 'ServiceInfo.mpack_name',
+    mpack_version: 'ServiceInfo.mpack_version',
+    tool_tip_content: 'ServiceInfo.tool_tip_content',
     $rand: Math.random(),
     $alerts: [1, 2, 3],
     host_components: 'host_components',
@@ -225,7 +229,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       /**
        * services contains constructed service-components structure from components array
        */
-      services.setEach('components', []);
+      services.forEach(s => s.components = []);
 
       json.items.forEach(function (component) {
         var serviceName = component.ServiceComponentInfo.service_name;
@@ -298,9 +302,6 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
         }
       }, this);
 
-      var stackServices = App.StackService.find().mapProperty('serviceName');
-      result = misc.sortByOrder(stackServices, result);
-
       //load services to model
       App.store.safeLoadMany(this.get('model'), result);
 

+ 1 - 1
ambari-web/app/mixins/common/blueprint.js

@@ -47,7 +47,7 @@ App.BlueprintMixin = Em.Mixin.create({
           return {
             mpack_instance: Em.get(c, 'serviceGroupName'),
             //service_instance: Em.get(c, 'serviceInstance'), // TODO: this should work in the future;
-            service_instance: Em.get(c, 'serviceName'),       // for now, we use the service name as the service instance name.
+            service_instance: Em.get(c, 'serviceName') || Em.get(c, 'service.serviceName'), // for now, we use the service name as the service instance name.
             name: Em.get(c, 'componentName')
           };
         }) : []

+ 27 - 20
ambari-web/app/mixins/main/host/details/host_components/install_component.js

@@ -21,11 +21,10 @@ var App = require('app');
 App.InstallComponent = Em.Mixin.create({
 
   installHostComponentCall: function (hostName, component) {
-    const self = this,
-      dfd = $.Deferred(),
-      componentName = component.get('componentName'),
-      displayName = component.get('displayName');
-    this.updateAndCreateServiceComponent(componentName).done(function () {
+    const self = this;
+    const dfd = $.Deferred();
+    
+    this.updateAndCreateServiceComponent(component).done(function () {
       return App.ajax.send({
         name: 'host.host_component.add_new_component',
         sender: self,
@@ -34,13 +33,15 @@ App.InstallComponent = Em.Mixin.create({
           component: component,
           data: JSON.stringify({
             RequestInfo: {
-              "context": Em.I18n.t('requestInfo.installHostComponent') + " " + displayName
+              "context": Em.I18n.t('requestInfo.installHostComponent') + " " + component.get('displayName')
             },
             Body: {
               host_components: [
                 {
                   HostRoles: {
-                    component_name: componentName
+                    component_name: component.get('componentName'),
+                    service_name: component.get('serviceName'),
+                    service_group_name: component.get('serviceGroupName')
                   }
                 }
               ]
@@ -51,6 +52,7 @@ App.InstallComponent = Em.Mixin.create({
         error: 'ajaxErrorCallback'
       }).then(dfd.resolve, dfd.reject);
     });
+
     return dfd.promise();
   },
 
@@ -100,13 +102,13 @@ App.InstallComponent = Em.Mixin.create({
    * @param componentName
    * @returns {*}
    */
-  updateAndCreateServiceComponent: function (componentName) {
+  updateAndCreateServiceComponent: function (component) {
     var self = this;
     var dfd = $.Deferred();
     var updater = App.router.get('updateController');
     updater.updateComponentsState(function () {
       updater.updateServiceMetric(function () {
-        self.createServiceComponent(componentName, dfd);
+        self.createServiceComponent(component, dfd);
       });
     });
     return dfd.promise();
@@ -114,18 +116,22 @@ App.InstallComponent = Em.Mixin.create({
 
   /**
    *
-   * @param {string} componentName
+   * @param {object} component
    * @param {$.Deferred} dfd
    * @returns {$.ajax|null}
    */
-  createServiceComponent: function (componentName, dfd) {
-    var allServiceComponents = [];
-    var services = App.Service.find().mapProperty('serviceName');
-    services.forEach(function (_service) {
-      var _serviceComponents = App.Service.find(_service).get('serviceComponents');
-      allServiceComponents = allServiceComponents.concat(_serviceComponents);
-    }, this);
-    if (allServiceComponents.contains(componentName)) {
+  createServiceComponent: function (component, dfd) {
+    let componentExists = false;
+
+    App.Service.find().forEach(service => {
+      if (service.get('serviceName') === component.get('serviceName')
+        && service.get('serviceGroupName') === component.get('serviceGroupName')
+        && service.get('serviceComponents').contains(component.get('componentName'))) {
+        componentExists = true;
+      }
+    });
+
+    if (componentExists) {
       dfd.resolve();
       return null;
     } else {
@@ -133,8 +139,9 @@ App.InstallComponent = Em.Mixin.create({
         name: 'common.create_component',
         sender: this,
         data: {
-          componentName: componentName,
-          serviceName: App.StackServiceComponent.find().findProperty('componentName', componentName).get('serviceName')
+          componentName: component.get('componentName'),
+          serviceName: component.get('serviceName'),
+          serviceGroupName: component.get('serviceGroupName') //TODO: service group hard coded for now
         }
       }).complete(function () {
         dfd.resolve();

+ 16 - 7
ambari-web/app/mixins/wizard/wizardProgressPageController.js

@@ -413,12 +413,14 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create(App.InstallComponent, {
    * @param {string[]} hostNames
    * @return {$.ajax}
    */
-  checkInstalledComponents: function (componentName, hostNames) {
+  checkInstalledComponents: function (componentName, hostNames, serviceName, serviceGroupName) {
     return App.ajax.send({
       name: 'host_component.installed.on_hosts',
       sender: this,
       data: {
         componentName: componentName,
+        serviceName: serviceName,
+        serviceGroupName: serviceGroupName,
         hostNames: hostNames.join(',')
       }
     });
@@ -533,13 +535,13 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create(App.InstallComponent, {
    * @param {(string|string[])} hostName - host/hosts where components should be installed
    * @param {string} serviceName - name of the services
    */
-  createComponent: function (componentName, hostName, serviceName) {
+  createComponent: function (componentName, hostName, serviceName, serviceGroupName) {
     var hostNames = (Array.isArray(hostName)) ? hostName : [hostName];
     var self = this;
 
     this.set('showRetry', false);
 
-    this.checkInstalledComponents(componentName, hostNames).then(function (data) {
+    this.checkInstalledComponents(componentName, hostNames, serviceName, serviceGroupName).then(function (data) {
       var hostsWithComponents = data.items.mapProperty('HostRoles.host_name');
       var result = hostNames.map(function(item) {
         return {
@@ -560,14 +562,21 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create(App.InstallComponent, {
           "host_components": [
             {
               "HostRoles": {
-                "component_name": componentName
+                "component_name": componentName,
+                "service_name": serviceName,
+                "service_group_name": serviceGroupName
               }
             }
           ]
         }
       };
       if (!!hostsWithoutComponents.length) {
-        self.updateAndCreateServiceComponent(componentName).done(function () {
+        self.updateAndCreateServiceComponent({
+          componentName: componentName,
+          serviceName: serviceName,
+          displayName: componentName, //probably ok to just use componentName here, since this is only used to pass the Context string to the server
+          serviceGroupName: serviceGroupName
+        }).done(function () {
           App.ajax.send({
             name: 'wizard.step8.register_host_to_component',
             sender: self,
@@ -796,10 +805,10 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create(App.InstallComponent, {
    *
    * @see createComponent
    */
-  createInstallComponentTask: function(componentName, hostName, serviceName, options) {
+  createInstallComponentTask: function(componentName, hostName, serviceName, serviceGroupName) {
     var self = this;
     App.get('router.mainAdminKerberosController').getKDCSessionState(function() {
-      self.createComponent(componentName, hostName, serviceName);
+      self.createComponent(componentName, hostName, serviceName, serviceGroupName);
     }, function() {
       self.onTaskError();
     });

+ 6 - 2
ambari-web/app/models/service.js

@@ -124,8 +124,12 @@ App.Service = DS.Model.extend({
     var hc = {};
 
     serviceComponents.forEach(function(component) {
-      var displayName = component.get('displayName');
-      component.get('staleConfigHosts').forEach(function(hostName) {
+      let displayName = component.get('displayName');
+      
+      let staleConfigHosts = component.get('staleConfigHosts');
+      staleConfigHosts = Array.isArray(staleConfigHosts) ? staleConfigHosts : [staleConfigHosts];
+      
+      staleConfigHosts.forEach(function (hostName) {
         if (!hc[hostName]) {
           hc[hostName] = [];
         }

+ 1 - 1
ambari-web/app/utils/ajax/ajax.js

@@ -1465,7 +1465,7 @@ var urls = {
     'mock': ''
   },
   'common.create_component': {
-    'real': '/clusters/{clusterName}/servicegroups/{defaultServiceGroupName}/services?ServiceInfo/service_name={serviceName}',
+    'real': '/clusters/{clusterName}/servicegroups/{serviceGroupName}/services?ServiceInfo/service_name={serviceName}',
     'mock': '',
     'type': 'POST',
     'format': function (data) {

+ 5 - 3
ambari-web/app/views/main/host/summary.js

@@ -219,10 +219,10 @@ App.MainHostSummaryView = Em.View.extend(App.HiveInteractiveCheck, App.TimeRange
     if (this.get('content.hostComponents')) {
       var installedComponents = this.get('content.hostComponents').mapProperty('componentName');
       var addableToHostComponents = App.StackServiceComponent.find().filterProperty('isAddableToHost');
-      var installedServices = this.get('installedServices');
+      var installedServices = App.Service.find().map(s => ({ serviceName: s.get('serviceName'), serviceGroupName: s.get('serviceGroupName') }));
 
       addableToHostComponents.forEach(function (addableComponent) {
-        if (installedServices.contains(addableComponent.get('serviceName'))
+        if (installedServices.find(s => s.serviceName === addableComponent.get('serviceName') && s.serviceGroupName === addableComponent.get('stackName'))
             && !installedComponents.contains(addableComponent.get('componentName'))
             && !this.hasCardinalityConflict(addableComponent.get('componentName'))) {
           if ((addableComponent.get('componentName') === 'OOZIE_SERVER') && !App.router.get('mainHostDetailsController.isOozieServerAddable') ||
@@ -231,7 +231,9 @@ App.MainHostSummaryView = Em.View.extend(App.HiveInteractiveCheck, App.TimeRange
           }
           components.pushObject(self.addableComponentObject.create({
             'componentName': addableComponent.get('componentName'),
-            'serviceName': addableComponent.get('serviceName')
+            'serviceName': addableComponent.get('serviceName'),
+            'displayName': addableComponent.get('displayName'),
+            'serviceGroupName': addableComponent.get('stackName') //TODO: service group hard coded for now
           }));
         }
       }, this);

+ 5 - 11
ambari-web/test/controllers/global/cluster_controller_test.js

@@ -830,21 +830,15 @@ describe('App.clusterController', function () {
       var json = {
         items: [
           {
-            ServiceComponentInfo: {
-              component_name: 'C1'
-            },
-            host_components: [
-              {
-                HostRoles: {
-                  host_name: 'host1'
-                }
-              }
-            ]
+            HostRoles: {
+              component_name: 'C1',
+              host_name: 'host1'
+            }
           }
         ]
       };
       controller.loadComponentWithStaleConfigsSuccessCallback(json);
-      expect(App.componentsStateMapper.updateStaleConfigsHosts.calledWith('C1', ['host1'])).to.be.true;
+      expect(App.componentsStateMapper.updateStaleConfigsHosts.calledWith('C1', 'host1')).to.be.true;
     });
   });
 });

+ 13 - 3
ambari-web/test/controllers/main/admin/kerberos/kerberos_wizard_controler_test.js

@@ -311,7 +311,12 @@ describe('App.KerberosWizardController', function() {
     });
 
     it("updateAndCreateServiceComponent should be called", function() {
-      expect(controller.updateAndCreateServiceComponent.calledWith('KERBEROS_CLIENT')).to.be.true;
+      expect(controller.updateAndCreateServiceComponent.calledWith(Em.Object.create({
+        componentName: 'KERBEROS_CLIENT',
+        serviceName: 'KERBEROS',
+        displayName: 'Kerberos Client',
+        serviceGroupName: 'KERBEROS' //TODO: mpacks - service group hard coded for now; no idea how this will work for Kerberos service
+      }))).to.be.true;
     });
 
     it("createKerberosHostComponents should be called", function() {
@@ -324,7 +329,6 @@ describe('App.KerberosWizardController', function() {
   });
 
   describe("#createKerberosService()", function () {
-
     it("App.ajax.send should be called", function() {
       App.set('clusterName', 'c1');
       controller.createKerberosService();
@@ -333,7 +337,13 @@ describe('App.KerberosWizardController', function() {
         name: 'wizard.step8.create_selected_services',
         sender: controller,
         data: {
-          data: '{"ServiceInfo": { "service_name": "KERBEROS"}}',
+          data: JSON.stringify({
+            'ServiceInfo': {
+              'service_name': 'KERBEROS',
+              'service_type': 'KERBEROS',
+              'service_group_name': 'KERBEROS'
+            }
+          }),
           cluster: 'c1'
         }
       });

+ 21 - 14
ambari-web/test/mixins/main/host/details/host_components/install_component_test.js

@@ -43,7 +43,7 @@ describe('App.InstallComponent', function () {
     });
 
     it("updateAndCreateServiceComponent should be called", function() {
-      expect(installComponent.updateAndCreateServiceComponent.calledWith('C1')).to.be.true;
+      expect(installComponent.updateAndCreateServiceComponent.calledWith(component)).to.be.true;
     });
 
     it("App.ajax.send should be called", function() {
@@ -151,38 +151,45 @@ describe('App.InstallComponent', function () {
     var dfd = {resolve: Em.K};
 
     beforeEach(function() {
-      sinon.stub(App.StackServiceComponent, 'find').returns([Em.Object.create({
-        componentName: 'C2',
-        serviceName: 'S1'
+      sinon.stub(App.Service, 'find').returns([Em.Object.create({
+        serviceComponents: ['C1'],
+        serviceName: 'S1',
+        serviceGroupName: 'SG1'
       })]);
+
       sinon.spy(dfd, 'resolve');
 
       App.ajax.send.restore();
       sinon.stub(App.ajax, 'send').returns({complete: Em.clb});
-      this.mock = sinon.stub(App.Service, 'find');
-      this.mock.returns([{serviceName: "S1"}]);
-      this.mock.withArgs('S1').returns(Em.Object.create({serviceComponents: ['C1']}))
-
     });
-    afterEach(function() {
-      App.StackServiceComponent.find.restore();
+
+    afterEach(function () {
+      App.Service.find.restore();
       dfd.resolve.restore();
-      this.mock.restore();
     });
 
     it("component already created", function() {
-      expect(installComponent.createServiceComponent('C1', dfd)).to.be.null;
+      expect(installComponent.createServiceComponent(Em.Object.create({
+        serviceName: 'S1',
+        serviceGroupName: 'SG1',
+        componentName: 'C1'
+      }), dfd)).to.be.null;
       expect(dfd.resolve.calledOnce).to.be.true;
     });
 
     it("component not created", function() {
-      installComponent.createServiceComponent('C2', dfd);
+      installComponent.createServiceComponent(Em.Object.create({
+        serviceName: 'S1',
+        serviceGroupName: 'SG1',
+        componentName: 'C2'
+      }), dfd);
       var args = testHelpers.findAjaxRequest('name', 'common.create_component');
       expect(args[0]).exists;
       expect(args[0].sender).to.be.eql(installComponent);
       expect(args[0].data).to.be.eql({
         componentName: 'C2',
-        serviceName: 'S1'
+        serviceName: 'S1',
+        serviceGroupName: 'SG1'
       });
       expect(dfd.resolve.calledOnce).to.be.true;
     });

+ 2 - 2
ambari-web/test/mixins/wizard/wizardProgressPageController_test.js

@@ -190,9 +190,9 @@ describe('App.wizardProgressPageControllerMixin', function() {
       this.KDCStub.returns({
         getKDCSessionState: Em.clb
       });
-      mixedObjectInstance.createInstallComponentTask('componentName', 'hostName', 'serviceName');
+      mixedObjectInstance.createInstallComponentTask('componentName', 'hostName', 'serviceName', 'serviceGroupName');
       assert.isTrue(mixedObjectInstance.createComponent.calledOnce, 'createComponent should be called');
-      assert.equal(JSON.stringify(mixedObjectInstance.createComponent.args[0]), JSON.stringify(['componentName', 'hostName', 'serviceName']), 'passed argument order should be the same');
+      assert.equal(JSON.stringify(mixedObjectInstance.createComponent.args[0]), JSON.stringify(['componentName', 'hostName', 'serviceName', 'serviceGroupName']), 'passed argument order should be the same');
     });
 
     it('when credentials are expired and KDC dialog cancelled task status should be changed to failed', function() {

+ 15 - 8
ambari-web/test/views/main/host/summary_test.js

@@ -102,10 +102,12 @@ describe('App.MainHostSummaryView', function() {
 
     beforeEach(function() {
       this.mock = sinon.stub(App.StackServiceComponent, 'find');
+      this.mock2 = sinon.stub(App.Service, 'find');
       sinon.stub(mainHostSummaryView, 'hasCardinalityConflict').returns(false);
     });
     afterEach(function() {
       App.StackServiceComponent.find.restore();
+      App.Service.find.restore();
       mainHostSummaryView.hasCardinalityConflict.restore();
     });
 
@@ -115,22 +117,26 @@ describe('App.MainHostSummaryView', function() {
           Em.Object.create({
             serviceName: 'HDFS',
             componentName: 'DATANODE',
+            stackName: 'serviceGroupName',
             isAddableToHost: true
           }),
           Em.Object.create({
             serviceName: 'HDFS',
             componentName: 'HDFS_CLIENT',
+            stackName: 'serviceGroupName',
             isAddableToHost: true
           })
         ],
         content: Em.Object.create({
           hostComponents: Em.A([
             Em.Object.create({
-              componentName: 'HDFS_CLIENT'
+              serviceName: 'HDFS',
+              componentName: 'HDFS_CLIENT',
+              serviceGroupName: 'serviceGroupName'
             })
           ])
         }),
-        services: ['HDFS'],
+        services: [Em.Object.create({serviceName: 'HDFS', serviceGroupName: 'serviceGroupName'})],
         e: ['DATANODE'],
         m: 'some components are already installed'
       },
@@ -139,17 +145,20 @@ describe('App.MainHostSummaryView', function() {
           Em.Object.create({
             serviceName: 'HDFS',
             componentName: 'HDFS_CLIENT',
-            isAddableToHost: true
+            isAddableToHost: true,
+            stackName: 'serviceGroupName'
           })
         ],
         content: Em.Object.create({
           hostComponents: Em.A([
             Em.Object.create({
-              componentName: 'HDFS_CLIENT'
+              serviceName: 'HDFS',
+              componentName: 'HDFS_CLIENT',
+              serviceGroupName: 'serviceGroupName'
             })
           ])
         }),
-        services: ['HDFS'],
+        services: [Em.Object.create({serviceName: 'HDFS', serviceGroupName: 'serviceGroupName'})],
         e: [],
         m: 'all components are already installed'
       }
@@ -158,10 +167,8 @@ describe('App.MainHostSummaryView', function() {
     tests.forEach(function(test) {
       it(test.m, function() {
         this.mock.returns(test.addableToHostComponents);
+        this.mock2.returns(test.services);
         mainHostSummaryView.set('content', test.content);
-        mainHostSummaryView.reopen({
-          installedServices: test.services
-        });
         mainHostSummaryView.propertyDidChange('addableComponents');
         expect(mainHostSummaryView.get('addableComponents').mapProperty('componentName')).to.eql(test.e);
       });