/** * 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. */ package org.apache.camel.component.jclouds; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.spring.CamelSpringTestSupport; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.junit.After; import org.junit.Ignore; import org.junit.Test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class JcloudsSpringComputeTest extends CamelSpringTestSupport { @EndpointInject(uri = "mock:result") protected MockEndpoint result; @EndpointInject(uri = "mock:resultlist") protected MockEndpoint resultlist; @After public void tearDown() throws Exception { template.sendBodyAndHeaders("direct:start", null, destroyHeaders(null, null)); } @Override protected AbstractApplicationContext createApplicationContext() { return new ClassPathXmlApplicationContext("classpath:compute-test.xml"); } @Test public void testListImages() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeader("direct:start", null, JcloudsConstants.OPERATION, JcloudsConstants.LIST_IMAGES); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> images = exchange.getIn().getBody(Set.class); assertTrue(images.size() > 0); for (Object obj : images) { assertTrue(obj instanceof Image); } } } } @Test public void testListHardware() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeader("direct:start", null, JcloudsConstants.OPERATION, JcloudsConstants.LIST_HARDWARE); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> hardwares = exchange.getIn().getBody(Set.class); assertTrue(hardwares.size() > 0); for (Object obj : hardwares) { assertTrue(obj instanceof Hardware); } } } } @Test public void testListNodes() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeader("direct:start", null, JcloudsConstants.OPERATION, JcloudsConstants.LIST_NODES); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> nodeMetadatas = exchange.getIn().getBody(Set.class); assertEquals("Nodes should be 0", 0, nodeMetadatas.size()); } } } @Test public void testCreateAndListNodes() throws InterruptedException { result.expectedMessageCount(2); template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "default")); template.sendBodyAndHeader("direct:start", null, JcloudsConstants.OPERATION, JcloudsConstants.LIST_NODES); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> nodeMetadatas = exchange.getIn().getBody(Set.class); assertEquals("Nodes should be 1", 1, nodeMetadatas.size()); } } } @Test public void testCreateAndListWithPredicates() throws InterruptedException { result.expectedMessageCount(6); //Create a node for the default group template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "default")); //Create a node for the group 'other' template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "other")); template.sendBodyAndHeaders("direct:start", null, createHeaders("2", "other")); template.sendBodyAndHeaders("direct:start", null, listNodeHeaders(null, "other", null)); template.sendBodyAndHeaders("direct:start", null, listNodeHeaders("3", "other", null)); template.sendBodyAndHeaders("direct:start", null, listNodeHeaders("3", "other", "RUNNING")); result.assertIsSatisfied(); } @Test public void testCreateAndDestroyNode() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "default")); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> nodeMetadatas = exchange.getIn().getBody(Set.class); assertEquals("There should be no node running", 1, nodeMetadatas.size()); for (Object obj : nodeMetadatas) { NodeMetadata nodeMetadata = (NodeMetadata) obj; template.sendBodyAndHeaders("direct:start", null, destroyHeaders(nodeMetadata.getId(), null)); } } } } @Test public void testCreateAndRebootNode() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "default")); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> nodeMetadatas = exchange.getIn().getBody(Set.class); assertEquals("There should be one node running", 1, nodeMetadatas.size()); for (Object obj : nodeMetadatas) { NodeMetadata nodeMetadata = (NodeMetadata) obj; template.sendBodyAndHeaders("direct:start", null, rebootHeaders(nodeMetadata.getId(), null)); } } } } @Test public void testCreateAndSuspendNode() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "default")); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> nodeMetadatas = exchange.getIn().getBody(Set.class); assertEquals("There should be one node running", 1, nodeMetadatas.size()); for (Object obj : nodeMetadatas) { NodeMetadata nodeMetadata = (NodeMetadata) obj; template.sendBodyAndHeaders("direct:start", null, suspendHeaders(nodeMetadata.getId(), null)); } } } } @Test public void testCreateSuspendAndResumeNode() throws InterruptedException { result.expectedMessageCount(1); template.sendBodyAndHeaders("direct:start", null, createHeaders("1", "default")); result.assertIsSatisfied(); List<Exchange> exchanges = result.getExchanges(); if (exchanges != null && !exchanges.isEmpty()) { for (Exchange exchange : exchanges) { Set<?> nodeMetadatas = exchange.getIn().getBody(Set.class); assertEquals("There should be one node running", 1, nodeMetadatas.size()); for (Object obj : nodeMetadatas) { NodeMetadata nodeMetadata = (NodeMetadata) obj; template.sendBodyAndHeaders("direct:start", null, resumeHeaders(nodeMetadata.getId(), null)); } } } } @SuppressWarnings("unchecked") @Ignore("For now not possible to combine stub provider with ssh module, required for runScript") @Test public void testRunScript() throws InterruptedException { Map<String, Object> runScriptHeaders = new HashMap<String, Object>(); runScriptHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.RUN_SCRIPT); Set<? extends NodeMetadata> nodeMetadatas = (Set<? extends NodeMetadata>) template.requestBodyAndHeaders("direct:in-out", null, createHeaders("1", "default")); assertEquals("There should be a node running", 1, nodeMetadatas.size()); for (NodeMetadata nodeMetadata : nodeMetadatas) { runScriptHeaders.put(JcloudsConstants.NODE_ID, nodeMetadata.getId()); template.requestBodyAndHeaders("direct:in-out", null, runScriptHeaders); template.sendBodyAndHeaders("direct:in-out", null, destroyHeaders(nodeMetadata.getId(), null)); } } /** * Returns a {@Map} with the create headers. * * @param imageId The imageId to use for creating the node. * @param group The group to be assigned to the node. */ protected Map<String, Object> createHeaders(String imageId, String group) { Map<String, Object> createHeaders = new HashMap<String, Object>(); createHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.CREATE_NODE); createHeaders.put(JcloudsConstants.IMAGE_ID, imageId); createHeaders.put(JcloudsConstants.GROUP, group); return createHeaders; } /** * Returns a {@Map} with the destroy headers. * * @param nodeId The id of the node to destroy. * @param group The group of the node to destroy. */ protected Map<String, Object> destroyHeaders(String nodeId, String group) { Map<String, Object> destroyHeaders = new HashMap<String, Object>(); destroyHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.DESTROY_NODE); if (nodeId != null) { destroyHeaders.put(JcloudsConstants.NODE_ID, nodeId); } if (group != null) { destroyHeaders.put(JcloudsConstants.GROUP, group); } return destroyHeaders; } /** * Returns a {@Map} with the destroy headers. * * @param nodeId The id of the node to destroy. * @param group The group of the node to destroy. */ protected Map<String, Object> listNodeHeaders(String nodeId, String group, Object state) { Map<String, Object> listHeaders = new HashMap<String, Object>(); listHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.LIST_NODES); if (nodeId != null) { listHeaders.put(JcloudsConstants.NODE_ID, nodeId); } if (group != null) { listHeaders.put(JcloudsConstants.GROUP, group); } if (state != null) { listHeaders.put(JcloudsConstants.NODE_STATE, state); } return listHeaders; } /** * Returns a {@Map} with the reboot headers. * * @param nodeId The id of the node to reboot. * @param group The group of the node to reboot. */ protected Map<String, Object> rebootHeaders(String nodeId, String group) { Map<String, Object> rebootHeaders = new HashMap<String, Object>(); rebootHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.REBOOT_NODE); if (nodeId != null) { rebootHeaders.put(JcloudsConstants.NODE_ID, nodeId); } if (group != null) { rebootHeaders.put(JcloudsConstants.GROUP, group); } return rebootHeaders; } /** * Returns a {@Map} with the suspend headers. * * @param nodeId The id of the node to suspend. * @param group The group of the node to suspend. */ protected Map<String, Object> suspendHeaders(String nodeId, String group) { Map<String, Object> rebootHeaders = new HashMap<String, Object>(); rebootHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.SUSPEND_NODE); if (nodeId != null) { rebootHeaders.put(JcloudsConstants.NODE_ID, nodeId); } if (group != null) { rebootHeaders.put(JcloudsConstants.GROUP, group); } return rebootHeaders; } /** * Returns a {@Map} with the suspend headers. * * @param nodeId The id of the node to resume. * @param group The group of the node to resume. */ protected Map<String, Object> resumeHeaders(String nodeId, String group) { Map<String, Object> rebootHeaders = new HashMap<String, Object>(); rebootHeaders.put(JcloudsConstants.OPERATION, JcloudsConstants.RESUME_NODE); if (nodeId != null) { rebootHeaders.put(JcloudsConstants.NODE_ID, nodeId); } if (group != null) { rebootHeaders.put(JcloudsConstants.GROUP, group); } return rebootHeaders; } }