blob: 7f37814e657484d4ce15bc7c24fa2f124dfe97fd [file] [log] [blame]
/**
* 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 distribut
* ed 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.
*/
package org.apache.ambari.server.controller.internal;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.api.util.TreeNode;
import org.apache.ambari.server.api.util.TreeNodeImpl;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.StackConfigurationResponse;
import org.apache.ambari.server.controller.StackLevelConfigurationRequest;
import org.apache.ambari.server.controller.StackServiceRequest;
import org.apache.ambari.server.controller.StackServiceResponse;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.topology.Blueprint;
import org.apache.ambari.server.topology.HostGroup;
import org.apache.ambari.server.topology.HostGroupInfo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reset;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* ExportBlueprintRequest unit tests.
*/
@SuppressWarnings("unchecked")
public class ExportBlueprintRequestTest {
private static final String CLUSTER_NAME = "c1";
private static final String CLUSTER_ID = "2";
private AmbariManagementController controller = createNiceMock(AmbariManagementController.class);
@Before
public void setupTest() throws Exception {
Field f = ExportBlueprintRequest.class.getDeclaredField("controller");
f.setAccessible(true);
f.set(null, controller);
expect(controller.getStackServices((Set<StackServiceRequest>) anyObject())).andReturn(
Collections.<StackServiceResponse>emptySet()).anyTimes();
expect(controller.getStackLevelConfigurations((Set<StackLevelConfigurationRequest>) anyObject())).andReturn(
Collections.<StackConfigurationResponse>emptySet()).anyTimes();
replay(controller);
}
@After
public void tearDown() {
reset(controller);
}
//todo: test configuration processing
@Test
public void testExport_noConfigs() throws Exception {
Resource clusterResource = new ResourceImpl(Resource.Type.Cluster);
clusterResource.setProperty(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID, CLUSTER_NAME);
clusterResource.setProperty(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID, CLUSTER_ID);
clusterResource.setProperty(ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID, "TEST-1.0");
TreeNode<Resource> clusterNode = new TreeNodeImpl<Resource>(null, clusterResource, "cluster");
// add empty config child resource
Resource configResource = new ResourceImpl(Resource.Type.Configuration);
clusterNode.addChild(configResource, "configurations");
Resource hostsResource = new ResourceImpl(Resource.Type.Host);
Resource host1Resource = new ResourceImpl(Resource.Type.Host);
Resource host2Resource = new ResourceImpl(Resource.Type.Host);
Resource host3Resource = new ResourceImpl(Resource.Type.Host);
TreeNode<Resource> hostsNode = clusterNode.addChild(hostsResource, "hosts");
TreeNode<Resource> host1Node = hostsNode.addChild(host1Resource, "host_1");
TreeNode<Resource> host2Node = hostsNode.addChild(host2Resource, "host_2");
TreeNode<Resource> host3Node = hostsNode.addChild(host3Resource, "host_3");
host1Resource.setProperty("Hosts/host_name", "host1");
host2Resource.setProperty("Hosts/host_name", "host2");
host3Resource.setProperty("Hosts/host_name", "host3");
List<String> host1ComponentsList = Arrays.asList("NAMENODE", "HDFS_CLIENT", "ZOOKEEPER_SERVER", "SECONDARY_NAMENODE");
List<String> host2ComponentsList = Arrays.asList("DATANODE", "HDFS_CLIENT", "ZOOKEEPER_SERVER");
List<String> host3ComponentsList = Arrays.asList("DATANODE", "HDFS_CLIENT", "ZOOKEEPER_SERVER");
processHostGroupComponents(host1Node, host1ComponentsList);
processHostGroupComponents(host2Node, host2ComponentsList);
processHostGroupComponents(host3Node, host3ComponentsList);
// test
ExportBlueprintRequest exportBlueprintRequest = new ExportBlueprintRequest(clusterNode);
// assertions
assertEquals(CLUSTER_NAME, exportBlueprintRequest.getClusterName());
Blueprint bp = exportBlueprintRequest.getBlueprint();
assertEquals("exported-blueprint", bp.getName());
Map<String, HostGroup> hostGroups = bp.getHostGroups();
assertEquals(2, hostGroups.size());
String hg1Name = null;
String hg2Name = null;
for (HostGroup group : hostGroups.values()) {
Collection<String> components = group.getComponentNames();
if (components.containsAll(host1ComponentsList)) {
assertEquals(host1ComponentsList.size(), components.size());
assertEquals("1", group.getCardinality());
hg1Name = group.getName();
} else if (components.containsAll(host2ComponentsList)) {
assertEquals(host2ComponentsList.size(), components.size());
assertEquals("2", group.getCardinality());
hg2Name = group.getName();
} else {
fail("Host group contained invalid components");
}
}
assertNotNull(hg1Name);
assertNotNull(hg2Name);
HostGroupInfo host1Info = exportBlueprintRequest.getHostGroupInfo().get(hg1Name);
assertEquals(1, host1Info.getHostNames().size());
assertEquals("host1", host1Info.getHostNames().iterator().next());
HostGroupInfo host2Info = exportBlueprintRequest.getHostGroupInfo().get(hg2Name);
assertEquals(2, host2Info.getHostNames().size());
assertTrue(host2Info.getHostNames().contains("host2") && host2Info.getHostNames().contains("host3"));
}
private void processHostGroupComponents(TreeNode<Resource> hostNode, Collection<String> components) {
Resource hostComponentsResource = new ResourceImpl(Resource.Type.HostComponent);
TreeNode<Resource> hostComponentsNode = hostNode.addChild(hostComponentsResource, "host_components");
int componentCount = 1;
for (String component : components) {
Resource componentResource = new ResourceImpl(Resource.Type.HostComponent);
componentResource.setProperty("HostRoles/component_name", component);
hostComponentsNode.addChild(componentResource, "host_component_" + componentCount++);
}
}
}