|
@@ -0,0 +1,166 @@
|
|
|
+/**
|
|
|
+ * 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 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_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.getComponents();
|
|
|
+ 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++);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|