You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2017/01/10 14:39:13 UTC

ambari git commit: AMBARI-19445. Add macros `existsInByKey` and `notExistsInByKey` (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk ba99a2944 -> 67d17f060


AMBARI-19445. Add macros `existsInByKey` and `notExistsInByKey` (onechiporenko)


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

Branch: refs/heads/trunk
Commit: 67d17f060e87530b1ad7ffe47bee9eba8ce43652
Parents: ba99a29
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Tue Jan 10 15:32:49 2017 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Tue Jan 10 16:38:12 2017 +0200

----------------------------------------------------------------------
 ambari-web/app/utils/ember_computed.js          | 52 ++++++++++++++
 .../main/alerts/definition_details_view.js      |  4 +-
 .../main/host/details/host_component_view.js    | 12 +---
 ambari-web/app/views/main/service/menu.js       |  4 +-
 .../test/aliases/computed/existsInByKey.js      | 59 ++++++++++++++++
 .../test/aliases/computed/notExistsInByKey.js   | 59 ++++++++++++++++
 ambari-web/test/app_test.js                     |  8 ++-
 ambari-web/test/init_computed_aliases.js        |  2 +
 ambari-web/test/utils/ember_computed_test.js    | 72 ++++++++++++++++++++
 .../main/alerts/definition_details_view_test.js | 32 +--------
 .../host/details/host_component_view_test.js    | 40 ++---------
 ambari-web/test/views/main/service/menu_test.js | 15 ++++
 12 files changed, 274 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/app/utils/ember_computed.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ember_computed.js b/ambari-web/app/utils/ember_computed.js
index e21f4d3..b64d4a9 100644
--- a/ambari-web/app/utils/ember_computed.js
+++ b/ambari-web/app/utils/ember_computed.js
@@ -966,6 +966,32 @@ computed.existsIn = function (dependentKey, neededValues) {
 };
 
 /**
+ * A computed property that returns true if dependent property exists in the property with needed values
+ * <pre>
+ * var o = Em.Object.create({
+ *  p1: 2,
+ *  p2: Em.computed.existsInByKey('p1', 'p3'),
+ *  p3: [1, 2, 3]
+ * });
+ * console.log(o.get('p2')); // true
+ * o.set('p1', 4);
+ * console.log(o.get('p2')); // false
+ * </pre>
+ *
+ * @method existsIn
+ * @param {string} dependentKey
+ * @param {string} neededValuesKey
+ * @returns {Ember.ComputedProperty}
+ */
+computed.existsInByKey = function (dependentKey, neededValuesKey) {
+  return computed(dependentKey, `${neededValuesKey}.[]`, function () {
+    var value = smartGet(this, dependentKey);
+    var neededValues = smartGet(this, neededValuesKey);
+    return makeArray(neededValues).contains(value);
+  });
+};
+
+/**
  * A computed property that returns true if dependent property doesn't exist in the needed values
  * <pre>
  * var o = Em.Object.create({
@@ -990,6 +1016,32 @@ computed.notExistsIn = function (dependentKey, neededValues) {
 };
 
 /**
+ * A computed property that returns true if dependent property doesn't exist in the property with needed values
+ * <pre>
+ * var o = Em.Object.create({
+ *  p1: 2,
+ *  p2: Em.computed.notExistsInByKey('p1', 'p3'),
+ *  p3: [1, 2, 3]
+ * });
+ * console.log(o.get('p2')); // false
+ * o.set('p1', 4);
+ * console.log(o.get('p2')); // true
+ * </pre>
+ *
+ * @method notExistsInByKey
+ * @param {string} dependentKey
+ * @param {string} neededValuesKey
+ * @returns {Ember.ComputedProperty}
+ */
+computed.notExistsInByKey = function (dependentKey, neededValuesKey) {
+  return computed(dependentKey, `${neededValuesKey}.[]`, function () {
+    var value = smartGet(this, dependentKey);
+    var neededValues = smartGet(this, neededValuesKey);
+    return !makeArray(neededValues).contains(value);
+  });
+};
+
+/**
  * A computed property that returns result of calculation <code>(dependentProperty1/dependentProperty2 * 100)</code>
  * If accuracy is 0 (by default), result is rounded to integer
  * Otherwise - result is float with provided accuracy

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/app/views/main/alerts/definition_details_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/alerts/definition_details_view.js b/ambari-web/app/views/main/alerts/definition_details_view.js
index fc80c89..5c8efff 100644
--- a/ambari-web/app/views/main/alerts/definition_details_view.js
+++ b/ambari-web/app/views/main/alerts/definition_details_view.js
@@ -326,9 +326,7 @@ App.AlertInstanceServiceHostView = Em.View.extend({
   /**
    * Define whether show link for transition to service page
    */
-  serviceIsLink: function () {
-    return App.get('services.all').contains(this.get('instance.service.serviceName'));
-  }.property('instance.service.serviceName'),
+  serviceIsLink: Em.computed.existsInByKey('instance.service.serviceName', 'App.services.all'),
 
   /**
    * Define whether show separator between service and hosts labels

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/app/views/main/host/details/host_component_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/host/details/host_component_view.js b/ambari-web/app/views/main/host/details/host_component_view.js
index b5ea711..92cf0c6 100644
--- a/ambari-web/app/views/main/host/details/host_component_view.js
+++ b/ambari-web/app/views/main/host/details/host_component_view.js
@@ -173,9 +173,7 @@ App.HostComponentView = Em.View.extend({
    * Shows whether we need to show Delete button
    * @type {bool}
    */
-  isDeletableComponent: function () {
-    return App.get('components.deletable').contains(this.get('content.componentName'));
-  }.property('content'),
+  isDeletableComponent: Em.computed.existsInByKey('content.componentName', 'App.components.deletable'),
 
   /**
    * Host component with some <code>workStatus</code> can't be moved (so, disable such action in the dropdown list)
@@ -230,9 +228,7 @@ App.HostComponentView = Em.View.extend({
    * Check if component is restartable
    * @type {bool}
    */
-  isRestartableComponent: function() {
-    return App.get('components.restartable').contains(this.get('content.componentName'));
-  }.property('content'),
+  isRestartableComponent: Em.computed.existsInByKey('content.componentName', 'App.components.restartable'),
 
   /**
    * Host component with some <code>workStatus</code> can't be restarted (so, disable such action in the dropdown list)
@@ -244,9 +240,7 @@ App.HostComponentView = Em.View.extend({
    * Check if component configs can be refreshed
    * @type {bool}
    */
-  isRefreshConfigsAllowed: function() {
-    return App.get('components.refreshConfigsAllowed').contains(this.get('content.componentName'));
-  }.property('content'),
+  isRefreshConfigsAllowed: Em.computed.existsInByKey('content.componentName', 'App.components.refreshConfigsAllowed'),
 
   willInsertElement: function() {
     //make link to view instance to get decommission state

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/app/views/main/service/menu.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/menu.js b/ambari-web/app/views/main/service/menu.js
index 2c9ac5c..aad718d 100644
--- a/ambari-web/app/views/main/service/menu.js
+++ b/ambari-web/app/views/main/service/menu.js
@@ -75,9 +75,7 @@ App.MainServiceMenuView = Em.CollectionView.extend({
 
     hasCriticalAlerts: Em.computed.alias('content.hasCriticalAlerts'),
 
-    isConfigurable: function () {
-      return !App.get('services.noConfigTypes').contains(this.get('content.serviceName'));
-    }.property('App.services.noConfigTypes','content.serviceName'),
+    isConfigurable: Em.computed.notExistsInByKey('content.serviceName', 'App.services.noConfigTypes'),
 
     link: function() {
       var stateName = (['summary','configs'].contains(App.router.get('currentState.name')))

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/aliases/computed/existsInByKey.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/aliases/computed/existsInByKey.js b/ambari-web/test/aliases/computed/existsInByKey.js
new file mode 100644
index 0000000..6086c6a
--- /dev/null
+++ b/ambari-web/test/aliases/computed/existsInByKey.js
@@ -0,0 +1,59 @@
+/**
+ * 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 helpers = App.TestAliases.helpers;
+
+/**
+ *
+ * @param {Em.Object} context
+ * @param {string} propertyName
+ * @param {string} dependentKey
+ * @param {string} neededValuesKey
+ * @params {array} listOfValues
+ */
+App.TestAliases.testAsComputedExistsInByKey = function (context, propertyName, dependentKey, neededValuesKey, listOfValues) {
+
+  Ember.assert('`listOfValues` should be an array', Ember.isArray(listOfValues));
+
+  describe('#' + propertyName + ' as Em.computed.existsInByKey', function () {
+
+    afterEach(function () {
+      helpers.smartRestoreGet(context);
+    });
+
+    it('has valid dependent keys', function () {
+      expect(Em.meta(context).descs[propertyName]._dependentKeys).to.eql([dependentKey, neededValuesKey + '.[]']);
+    });
+
+    listOfValues.forEach(function (neededValue) {
+
+      it('should be `true` if ' + JSON.stringify(dependentKey) + ' is equal to ' + JSON.stringify(neededValue), function () {
+        var hash = {};
+        hash[dependentKey] = neededValue;
+        hash[neededValuesKey] = listOfValues;
+        helpers.smartStubGet(context, hash)
+          .propertyDidChange(context, propertyName);
+        var value = helpers.smartGet(context, propertyName);
+        expect(value).to.be.true;
+      });
+
+    });
+
+  });
+
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/aliases/computed/notExistsInByKey.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/aliases/computed/notExistsInByKey.js b/ambari-web/test/aliases/computed/notExistsInByKey.js
new file mode 100644
index 0000000..6d1b195
--- /dev/null
+++ b/ambari-web/test/aliases/computed/notExistsInByKey.js
@@ -0,0 +1,59 @@
+/**
+ * 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 helpers = App.TestAliases.helpers;
+
+/**
+ *
+ * @param {Em.Object} context
+ * @param {string} propertyName
+ * @param {string} dependentKey
+ * @param {string} neededValuesKey
+ * @params {array} listOfValues
+ */
+App.TestAliases.testAsComputedNotExistsInByKey = function (context, propertyName, dependentKey, neededValuesKey, listOfValues) {
+
+  Ember.assert('`listOfValues` should be an array', Ember.isArray(listOfValues));
+
+  describe('#' + propertyName + ' as Em.computed.notExistsInByKey', function () {
+
+    afterEach(function () {
+      helpers.smartRestoreGet(context);
+    });
+
+    it('has valid dependent keys', function () {
+      expect(Em.meta(context).descs[propertyName]._dependentKeys).to.eql([dependentKey, neededValuesKey + '.[]']);
+    });
+
+    listOfValues.forEach(function (neededValue) {
+
+      it('should be `false` if ' + JSON.stringify(dependentKey) + ' is equal to ' + JSON.stringify(neededValue), function () {
+        var hash = {};
+        hash[dependentKey] = neededValue;
+        hash[neededValuesKey] = listOfValues;
+        helpers.smartStubGet(context, hash)
+          .propertyDidChange(context, propertyName);
+        var value = helpers.smartGet(context, propertyName);
+        expect(value).to.be.false;
+      });
+
+    });
+
+  });
+
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/app_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/app_test.js b/ambari-web/test/app_test.js
index 42789d5..c87215f 100644
--- a/ambari-web/test/app_test.js
+++ b/ambari-web/test/app_test.js
@@ -406,9 +406,11 @@ describe('App', function () {
 
     testCases.forEach(function (test) {
       it(test.key + ' should contain ' + test.result, function () {
-        expect(App.get('components.' + test.key)).to.eql(test.result);
-      })
-    })
+        var key = 'components.' + test.key;
+        App.components.propertyDidChange(test.key);
+        expect(App.get(key)).to.eql(test.result);
+      });
+    });
   });
 
   describe('#upgradeIsRunning', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/init_computed_aliases.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/init_computed_aliases.js b/ambari-web/test/init_computed_aliases.js
index 612d831..477d034 100644
--- a/ambari-web/test/init_computed_aliases.js
+++ b/ambari-web/test/init_computed_aliases.js
@@ -193,7 +193,9 @@ require('test/aliases/computed/countBasedMessage');
 require('test/aliases/computed/firstNotBlank');
 require('test/aliases/computed/percents');
 require('test/aliases/computed/existsIn');
+require('test/aliases/computed/existsInByKey');
 require('test/aliases/computed/notExistsIn');
+require('test/aliases/computed/notExistsInByKey');
 require('test/aliases/computed/alias');
 require('test/aliases/computed/gte');
 require('test/aliases/computed/gt');

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/utils/ember_computed_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/ember_computed_test.js b/ambari-web/test/utils/ember_computed_test.js
index e5754f5..a3569b8 100644
--- a/ambari-web/test/utils/ember_computed_test.js
+++ b/ambari-web/test/utils/ember_computed_test.js
@@ -1235,6 +1235,42 @@ describe('Ember.computed macros', function () {
 
   });
 
+  describe('#existsInByKey', function () {
+
+    beforeEach(function () {
+      this.obj = Em.Object.create({
+        prop1: 'v1',
+        prop2: Em.computed.existsInByKey('prop1', 'prop3'),
+        prop3: ['v1', 'v2']
+      });
+    });
+
+    it('`true` if dependent value is in the array', function () {
+      expect(this.obj.get('prop2')).to.be.true;
+    });
+
+    it('`true` if dependent value is in the array (2)', function () {
+      this.obj.set('prop1', 'v2');
+      expect(this.obj.get('prop2')).to.be.true;
+    });
+
+    it('`false` if dependent value is not in the array', function () {
+      this.obj.set('prop1', 'v3');
+      expect(this.obj.get('prop2')).to.be.false;
+    });
+
+    it('`false` if dependent value is not in the array (2)', function () {
+      this.obj.set('prop1', 'v1');
+      this.obj.set('prop3', ['v2', 'v3']);
+      expect(this.obj.get('prop2')).to.be.false;
+    });
+
+    it('prop2 dependent keys are valid', function () {
+      expect(Em.meta(this.obj).descs.prop2._dependentKeys).to.eql(['prop1', 'prop3.[]']);
+    });
+
+  });
+
   describe('#percents', function () {
 
     beforeEach(function () {
@@ -1492,6 +1528,42 @@ describe('Ember.computed macros', function () {
 
   });
 
+  describe('#notExistsInByKey', function () {
+
+    beforeEach(function () {
+      this.obj = Em.Object.create({
+        prop1: 'v1',
+        prop2: Em.computed.notExistsInByKey('prop1', 'prop3'),
+        prop3: ['v1', 'v2']
+      });
+    });
+
+    it('`false` if dependent value is in the array', function () {
+      expect(this.obj.get('prop2')).to.be.false;
+    });
+
+    it('`false` if dependent value is in the array (2)', function () {
+      this.obj.set('prop1', 'v2');
+      expect(this.obj.get('prop2')).to.be.false;
+    });
+
+    it('`true` if dependent value is not in the array', function () {
+      this.obj.set('prop1', 'v3');
+      expect(this.obj.get('prop2')).to.be.true;
+    });
+
+    it('`true` if dependent value is not in the array (2)', function () {
+      this.obj.set('prop1', 'v1');
+      this.obj.set('prop3', ['v2', 'v3']);
+      expect(this.obj.get('prop2')).to.be.true;
+    });
+
+    it('prop2 dependent keys are valid', function () {
+      expect(Em.meta(this.obj).descs.prop2._dependentKeys).to.eql(['prop1', 'prop3.[]']);
+    });
+
+  });
+
   describe('#firstNotBlank', function () {
 
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/views/main/alerts/definition_details_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/alerts/definition_details_view_test.js b/ambari-web/test/views/main/alerts/definition_details_view_test.js
index e468968..b3c4712 100644
--- a/ambari-web/test/views/main/alerts/definition_details_view_test.js
+++ b/ambari-web/test/views/main/alerts/definition_details_view_test.js
@@ -376,38 +376,8 @@ function getInstanceView() {
 
 describe('App.AlertInstanceServiceHostView', function () {
 
-  var instanceView;
-
-  beforeEach(function() {
-    instanceView = getInstanceView();
-  });
-
   App.TestAliases.testAsComputedAnd(getInstanceView(), 'showSeparator', ['instance.serviceDisplayName', 'instance.hostName']);
 
-  describe("#serviceIsLink", function() {
+  App.TestAliases.testAsComputedExistsInByKey(getInstanceView(), 'serviceIsLink', 'instance.service.serviceName', 'App.services.all', ['HDFS', 'ZOOKEEPER']);
 
-    beforeEach(function() {
-      sinon.stub(App, 'get').returns(['S1']);
-    });
-    afterEach(function() {
-      App.get.restore();
-    });
-
-    it("service belongs to all", function() {
-      instanceView.set('instance', Em.Object.create({
-        service: Em.Object.create({
-          serviceName: 'S1'
-        })
-      }));
-      expect(instanceView.get('serviceIsLink')).to.be.true;
-    });
-    it("service does not belong to all", function() {
-      instanceView.set('instance', Em.Object.create({
-        service: Em.Object.create({
-          serviceName: 'S2'
-        })
-      }));
-      expect(instanceView.get('serviceIsLink')).to.be.false;
-    });
-  });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/views/main/host/details/host_component_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/host/details/host_component_view_test.js b/ambari-web/test/views/main/host/details/host_component_view_test.js
index 50197bc..f78c71e 100644
--- a/ambari-web/test/views/main/host/details/host_component_view_test.js
+++ b/ambari-web/test/views/main/host/details/host_component_view_test.js
@@ -384,24 +384,7 @@ describe('App.HostComponentView', function() {
     });
   });
 
-  describe("#isDeletableComponent", function() {
-    beforeEach(function(){
-      sinon.stub(App, 'get').returns(['C1']);
-    });
-    afterEach(function(){
-      App.get.restore();
-    });
-    it("component deletable", function() {
-      hostComponentView.set('content.componentName', 'C1');
-      hostComponentView.propertyDidChange('isDeletableComponent');
-      expect(hostComponentView.get('isDeletableComponent')).to.be.true;
-    });
-    it("component is not deletable", function() {
-      hostComponentView.set('content.componentName', 'C2');
-      hostComponentView.propertyDidChange('isDeletableComponent');
-      expect(hostComponentView.get('isDeletableComponent')).to.be.false;
-    });
-  });
+  App.TestAliases.testAsComputedExistsInByKey(getView(), 'isDeletableComponent', 'content.componentName', 'App.components.deletable', ['DATANODE', 'HDFS_CLIENT', 'NFS_GATEWAY'])
 
   describe("#isMoveComponentDisabled", function() {
     beforeEach(function(){
@@ -476,24 +459,9 @@ describe('App.HostComponentView', function() {
     });
   });
 
-  describe("#isRestartableComponent", function() {
-    beforeEach(function(){
-      sinon.stub(App, 'get').returns(['C1']);
-    });
-    afterEach(function(){
-      App.get.restore();
-    });
-    it("component deletable", function() {
-      hostComponentView.set('content.componentName', 'C1');
-      hostComponentView.propertyDidChange('isRestartableComponent');
-      expect(hostComponentView.get('isRestartableComponent')).to.be.true;
-    });
-    it("component is not deletable", function() {
-      hostComponentView.set('content.componentName', 'C2');
-      hostComponentView.propertyDidChange('isRestartableComponent');
-      expect(hostComponentView.get('isRestartableComponent')).to.be.false;
-    });
-  });
+  App.TestAliases.testAsComputedExistsInByKey(getView(), 'isRestartableComponent', 'content.componentName', 'App.components.restartable', ['DATANODE', 'JOURNALNODE', 'NAMENODE']);
+
+  App.TestAliases.testAsComputedExistsInByKey(getView(), 'isRefreshConfigsAllowed', 'content.componentName', 'App.components.refreshConfigsAllowed', ['FLUME_HANDLER']);
 
   describe("#isRefreshConfigsAllowed", function() {
     beforeEach(function(){

http://git-wip-us.apache.org/repos/asf/ambari/blob/67d17f06/ambari-web/test/views/main/service/menu_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/service/menu_test.js b/ambari-web/test/views/main/service/menu_test.js
index 15f0c15..275006a 100644
--- a/ambari-web/test/views/main/service/menu_test.js
+++ b/ambari-web/test/views/main/service/menu_test.js
@@ -19,6 +19,10 @@
 var App = require('app');
 require('views/main/service/menu');
 
+function getView() {
+  return App.MainServiceMenuView.create();
+}
+
 describe('App.MainServiceMenuView', function () {
 
   var mainServiceMenuView;
@@ -64,4 +68,15 @@ describe('App.MainServiceMenuView', function () {
       expect(mainServiceMenuView.get('itemViewClass.alertsCount')).to.equal(item.result);
     });
   });
+
+  describe('#itemViewClass', function () {
+
+    function getItemViewClass() {
+      return getView().get('itemViewClass').create();
+    }
+
+    App.TestAliases.testAsComputedNotExistsInByKey(getItemViewClass(), 'isConfigurable', 'content.serviceName', 'App.services.noConfigTypes', ['HDFS', 'ZOOKEEPER']);
+
+  });
+
 });