/******************************************************************************* * Copyright (c) 2012 GigaSpaces Technologies Ltd. All rights reserved * * Licensed 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. ******************************************************************************/ package org.cloudifysource.esc.byon; import groovy.lang.GString; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.cloudifysource.domain.cloud.Cloud; import org.cloudifysource.domain.cloud.compute.ComputeTemplate; import org.cloudifysource.dsl.internal.DSLException; import org.cloudifysource.dsl.internal.ServiceReader; import org.cloudifysource.dsl.utils.IPUtils; import org.cloudifysource.esc.driver.provisioning.CloudProvisioningException; import org.cloudifysource.esc.driver.provisioning.ComputeDriverConfiguration; import org.cloudifysource.esc.driver.provisioning.CustomNode; import org.cloudifysource.esc.driver.provisioning.byon.ByonProvisioningDriver; import org.cloudifysource.esc.driver.provisioning.byon.CustomNodeImpl; import org.cloudifysource.esc.driver.provisioning.context.DefaultProvisioningDriverClassContext; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; @Ignore /** * This class tests the parsing of different ID/IP configurations in byoun-cloud.groovy. * * @author noak * */ public class ParseByonCloudNodesTest { private static final String PROVIDER = "BYON"; private static final String CLOUD_NODES_LIST = "nodesList"; private static final String TEST_RESOURCES = "testResources/byon"; @Test public void testByonWithGstring() throws IOException, DSLException, CloudProvisioningException { final File cloudFile = new File("src/test/resources/byon-gstring/testbyon-cloud.groovy"); final Cloud cloud = ServiceReader.readCloud(cloudFile); validateCloud(cloud); ByonProvisioningDriver driver = new ByonProvisioningDriver(); driver.setProvisioningDriverClassContext(new DefaultProvisioningDriverClassContext()); final ComputeDriverConfiguration config = new ComputeDriverConfiguration(); config.setAdmin(null); config.setCloud(cloud); config.setCloudTemplate(cloud.getCloudCompute().getTemplates().keySet().iterator().next()); config.setManagement(true); config.setServiceName("test"); driver.setConfig(config); Cloud modifiedCloud = driver.getCloud(); // make sure there were no modifications to the cloud object validateCloud(modifiedCloud); ByonDeployer deployer = driver.getDeployer(); Set<CustomNode> nodes = deployer.getAllNodesByTemplateName(cloud.getCloudCompute(). getTemplates().keySet().iterator().next()); Assert.assertNotNull(nodes); Assert.assertEquals(1, nodes.size()); CustomNode node = nodes.iterator().next(); Assert.assertEquals("pc-lab100", node.getHostName()); Assert.assertEquals("byon-pc-lab1", node.getId()); } private void validateCloud(final Cloud cloud) { Assert.assertNotNull(cloud); Assert.assertTrue(cloud.getCloudCompute().getTemplates().size() == 1); ComputeTemplate template = cloud.getCloudCompute().getTemplates().values().iterator().next(); Assert.assertNotNull(template.getCustom()); List<Object> list = (List<Object>) template.getCustom().get("nodesList"); Assert.assertTrue(list.size() == 1); Map<Object, Object> map = (Map<Object, Object>) list.iterator().next(); Assert.assertTrue(map.containsKey("host-list")); final Object hostList = map.get("host-list"); Assert.assertTrue(hostList instanceof GString); } /** * Test parsing. */ @Test public void test() { try { // load the cloud file final File cloudFile = new File(TEST_RESOURCES + "/testbyon-cloud.groovy"); System.out.println("Trying to read cloud file " + cloudFile.getAbsolutePath()); final Cloud cloud = ServiceReader.readCloud(cloudFile); System.out.println("Creating BYON deployer"); final ByonDeployer deployer = new ByonDeployer(); List<Map<String, String>> nodesList = null; final Map<String, ComputeTemplate> templatesMap = cloud.getCloudCompute().getTemplates(); for (final String templateName : templatesMap.keySet()) { final Map<String, Object> customSettings = cloud.getCloudCompute().getTemplates().get(templateName).getCustom(); Assert.assertNotNull("Custom settings not found for template " + templateName, customSettings); if (customSettings != null) { nodesList = (List<Map<String, String>>) customSettings.get(CLOUD_NODES_LIST); } Assert.assertNotNull("NodesList not found for template " + templateName, nodesList); if (nodesList == null) { System.out.println("Failed to create cloud deployer, invalid configuration, nodesList is null"); throw new CloudProvisioningException("Failed to create BYON cloud deployer, invalid configuration"); } deployer.addNodesList(templateName, templatesMap.get(templateName), nodesList); } Set<CustomNode> allNodes = deployer.getAllNodesByTemplateName("SMALL_LINUX"); Set<CustomNode> expectedNodes = new HashSet<CustomNode>(); // id, ip, username, credential expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test01", "0.0.0.1", null, "tgrid1", "tgrid1", null/*keyFile*/, "byon-test01")); // id, ip expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test02", "0.0.0.2", null, null, null, null/*keyFile*/, "byon-test02")); // idPrefix, ipList expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test11", IPUtils.resolveHostNameToIp("pc-lab39"), "pc-lab39", null, null, null/*keyFile*/, "byon-test11")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test12", IPUtils.resolveHostNameToIp("pc-lab40"), "pc-lab40", null, null, null/*keyFile*/, "byon-test12")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test13", "0.0.0.5", null, null, null, null/*keyFile*/, "byon-test13")); // id (template), ipList expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test21", "0.0.0.6", null, null, null, null/*keyFile*/, "byon-test21")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test22", "0.0.0.7", null, null, null, null/*keyFile*/, "byon-test22")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test23", "0.0.0.8", null, null, null, null/*keyFile*/, "byon-test23")); // id, ipRange expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test31", "0.0.0.9", null, null, null, null/*keyFile*/, "byon-test31")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test32", "0.0.0.10", null, null, null, null/*keyFile*/, "byon-test32")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test33", "0.0.0.11", null, null, null, null/*keyFile*/, "byon-test33")); // id, CIDR expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test41", "0.0.0.12", null, null, null, null/*keyFile*/, "byon-test41")); expectedNodes.add(new CustomNodeImpl(PROVIDER, "byon-test42", "0.0.0.13", null, null, null, null/*keyFile*/, "byon-test42")); System.out.println(Arrays.toString(allNodes.toArray())); for (CustomNode node : allNodes) { Assert.assertTrue(node + " does not exist in nodes", expectedNodes.contains(node)); } } catch (final Exception e) { System.out.println("Failed to create cloud deployer, exception thrown: " + e.getMessage()); e.printStackTrace(); throw new IllegalStateException("Failed to create cloud deployer", e); } } }