| /** |
| * 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 App = require('app'); |
| require('mixins/wizard/assign_master_components'); |
| var c; |
| |
| describe('App.AssignMasterComponents', function () { |
| var baseObject = Em.Object.extend(App.AssignMasterComponents); |
| var data; |
| |
| beforeEach(function () { |
| c = baseObject.create(); |
| c.set('content', {}); |
| |
| var hosts = []; |
| for(var i = 1; i <= 4; ++i) { |
| hosts.push(App.Host.createRecord({ |
| 'host_name': 'h' + i |
| })); |
| } |
| c.set('hosts', hosts); |
| |
| data = { |
| "resources": [ |
| { |
| "recommendations": { |
| "blueprint": { |
| "host_groups": [ |
| { |
| "name": "host-group-1", |
| "components": [{"name": "c1"}, {"name": "c3"}, {"name": "c2"}] |
| }, |
| { |
| "name": "host-group-2", |
| "components": [{"name": "c1"}, {"name": "c2"}] |
| }, |
| { |
| "name": "host-group-3", |
| "components": [{"name": "c1"}] |
| } |
| ] |
| }, |
| "blueprint_cluster_binding": { |
| "host_groups": [ |
| { |
| "name": "host-group-1", |
| "hosts": [{"fqdn": "h1"}] |
| }, |
| { |
| "name": "host-group-3", |
| "hosts": [{"fqdn": "h3"}] |
| }, |
| { |
| "name": "host-group-2", |
| "hosts": [{"fqdn": "h2"}, {"fqdn": "h4"}] |
| } |
| ] |
| } |
| } |
| } |
| ] |
| }; |
| }); |
| |
| describe('#loadRecommendationsSuccessCallback', function () { |
| |
| it('should set recommendations', function() { |
| c.loadRecommendationsSuccessCallback(data); |
| expect(c.get('recommendations')).to.eq(data.resources[0].recommendations); |
| }); |
| |
| it('should set recommendedHostsForComponents and content.recommendations for wizard page', function() { |
| c.set('content.controllerName','installerController'); |
| c.loadRecommendationsSuccessCallback(data); |
| var expected = { |
| "c1": ["h1", "h2", "h4", "h3"], |
| "c3": ["h1"], |
| "c2": ["h1", "h2", "h4"] |
| }; |
| |
| expect(JSON.stringify(c.get('content.recommendedHostsForComponents'))).to.equal(JSON.stringify(expected)); |
| expect(c.get('content.recommendations')).to.eq(data.resources[0].recommendations); |
| }); |
| }); |
| |
| describe('#getHostForMaster', function () { |
| |
| var allMasters; |
| |
| beforeEach(function () { |
| allMasters = [ |
| { |
| "component_name": "c1", |
| "selectedHost": "h1" |
| }, |
| { |
| "component_name": "c1", |
| "selectedHost": "h2" |
| }, |
| { |
| "component_name": "c1", |
| "selectedHost": "h3" |
| }, |
| { |
| "component_name": "c1", |
| "selectedHost": "h4" |
| }, |
| { |
| "component_name": "c2", |
| "selectedHost": "h1" |
| }, |
| { |
| "component_name": "c5", |
| "selectedHost": "h1" |
| } |
| ]; |
| }); |
| |
| it('should return the recommended host', function() { |
| c.loadRecommendationsSuccessCallback(data); |
| expect(c.getHostForMaster('c2', allMasters)).to.eq('h2'); |
| }); |
| |
| it('should return the first available host from the list of existing hosts', function() { |
| c.loadRecommendationsSuccessCallback(data); |
| expect(c.getHostForMaster('c6', allMasters)).to.eq('h1'); |
| }); |
| |
| it('should return the next available host from the list of existing hosts', function() { |
| c.loadRecommendationsSuccessCallback(data); |
| expect(c.getHostForMaster('c5', allMasters)).to.eq('h2'); |
| }); |
| |
| it('should return false if the component is already on all hosts', function() { |
| c.loadRecommendationsSuccessCallback(data); |
| expect(c.getHostForMaster('c1', allMasters)).to.eq(false); |
| }); |
| |
| }); |
| |
| |
| describe('#sortComponentsByServiceName', function () { |
| |
| var components = [{ |
| "component_name": "METRICS_COLLECTOR", |
| "serviceId": "AMBARI_METRICS" |
| }, { |
| "component_name": "ZOOKEEPER_SERVER", |
| "serviceId": "ZOOKEEPER" |
| }, { |
| "component_name": "NAMENODE", |
| "serviceId": "HDFS" |
| }, { |
| "component_name": "DRPC_SERVER", |
| "serviceId": "STORM" |
| }, { |
| "component_name": "APP_TIMELINE_SERVER", |
| "serviceId": "YARN" |
| }, { |
| "component_name": "RESOURCEMANAGER", |
| "serviceId": "YARN" |
| }, { |
| "component_name": "SECONDARY_NAMENODE", |
| "serviceId": "HDFS" |
| }, { |
| "component_name": "ZOOKEEPER_SERVER", |
| "serviceId": "ZOOKEEPER" |
| }, { |
| "component_name": "HISTORYSERVER", |
| "serviceId": "MAPREDUCE2" |
| }, { |
| "component_name": "HAWQSTANDBY", |
| "serviceId": "HAWQ" |
| }, { |
| "component_name": "NIMBUS", |
| "serviceId": "STORM" |
| }, { |
| "component_name": "HAWQMASTER", |
| "serviceId": "HAWQ" |
| }, { |
| "component_name": "STORM_UI_SERVER", |
| "serviceId": "STORM" |
| }]; |
| |
| it('should place ZOOKEEPER_SERVER one after another', function () { |
| var sorted = c.sortComponentsByServiceName(components); |
| expect(sorted.mapProperty('component_name').join('|').contains('ZOOKEEPER_SERVER|ZOOKEEPER_SERVER')).to.be.true; |
| }); |
| |
| it('should place HAWQMASTER just before HAWQSTANDBY', function () { |
| var sorted = c.sortComponentsByServiceName(components); |
| expect(sorted.mapProperty('component_name').join('|').contains('HAWQMASTER|HAWQSTANDBY')).to.be.true; |
| }); |
| |
| }); |
| |
| App.TestAliases.testAsComputedOr(baseObject.create(), |
| 'nextButtonDisabled', ['App.router.btnClickInProgress', 'submitDisabled', 'validationInProgress', '!isLoaded']); |
| |
| }); |