diff --git a/pom.xml b/pom.xml
index f44af4aeba..c72513516e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,7 +43,6 @@
core
extensions
scriptbuilder
- atmos
aws
azure
mezeo
diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java
index aa5c0f713d..d06fb17e06 100644
--- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java
+++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java
@@ -24,6 +24,7 @@
package org.jclouds.vcloud.terremark.compute;
import static com.google.common.base.Preconditions.checkArgument;
+import static org.jclouds.vcloud.terremark.options.AddInternetServiceOptions.Builder.withDescription;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -37,10 +38,12 @@ import javax.inject.Inject;
import org.jclouds.compute.Image;
import org.jclouds.logging.Logger;
import org.jclouds.vcloud.domain.Task;
+import org.jclouds.vcloud.domain.VApp;
import org.jclouds.vcloud.domain.VAppStatus;
import org.jclouds.vcloud.terremark.TerremarkVCloudClient;
import org.jclouds.vcloud.terremark.domain.InternetService;
import org.jclouds.vcloud.terremark.domain.Node;
+import org.jclouds.vcloud.terremark.domain.PublicIpAddress;
import org.jclouds.vcloud.terremark.domain.TerremarkVApp;
import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions;
@@ -111,18 +114,51 @@ public class TerremarkVCloudComputeClient {
logger.debug("<< on vApp(%s)", vApp.getId());
}
+ public InetAddress createPublicAddressMappedToPorts(VApp vApp, int... ports) {
+ PublicIpAddress sshIp = null;
+ InetAddress privateAddress = Iterables.getLast(vApp.getNetworkToAddresses().values());
+ for (int port : ports) {
+ InternetService is = null;
+ if (sshIp == null) {
+ logger.debug(">> creating InternetService %d", port);
+ is = tmClient.addInternetService(vApp.getName() + "-" + port, "TCP", port,
+ withDescription(String.format("port %d access to serverId: %s name: %s", port,
+ vApp.getId(), vApp.getName())));
+ sshIp = is.getPublicIpAddress();
+ } else {
+ logger.debug(">> adding InternetService %s:%d", sshIp.getAddress().getHostAddress(),
+ port);
+ is = tmClient.addInternetServiceToExistingIp(sshIp.getId() + "", vApp.getName() + "-"
+ + port, "TCP", port,
+ withDescription(String.format("port %d access to serverId: %s name: %s", port,
+ vApp.getId(), vApp.getName())));
+ }
+ logger.debug("<< created InternetService(%s) %s:%d", is.getId(), is.getPublicIpAddress()
+ .getAddress().getHostAddress(), is.getPort());
+ logger.debug(">> adding Node %s:%d -> %s:%d", is.getPublicIpAddress().getAddress()
+ .getHostAddress(), is.getPort(), privateAddress.getHostAddress(), port);
+ Node node = tmClient
+ .addNode(is.getId(), privateAddress, vApp.getName() + "-" + port, port);
+ logger.debug("<< added Node(%s)", node.getId());
+ }
+ return sshIp.getAddress();
+ }
+
public void stop(String id) {
TerremarkVApp vApp = tmClient.getVApp(id);
SERVICE: for (InternetService service : tmClient.getAllInternetServices()) {
for (Node node : tmClient.getNodes(service.getId())) {
if (vApp.getNetworkToAddresses().containsValue(node.getIpAddress())) {
- logger.debug(">> deleting Node(%s)", node.getId());
+ logger.debug(">> deleting Node(%s) %s:%d -> %s:%d", node.getId(), service
+ .getPublicIpAddress().getAddress().getHostAddress(), service.getPort(),
+ node.getIpAddress().getHostAddress(), node.getPort());
tmClient.deleteNode(node.getId());
logger.debug("<< deleted Node(%s)", node.getId());
SortedSet nodes = tmClient.getNodes(service.getId());
if (nodes.size() == 0) {
- logger.debug(">> deleting InternetService(%s)", service.getId());
+ logger.debug(">> deleting InternetService(%s) %s:%d", service.getId(), service
+ .getPublicIpAddress().getAddress().getHostAddress(), service.getPort());
tmClient.deleteInternetService(service.getId());
logger.debug("<< deleted InternetService(%s)", service.getId());
continue SERVICE;
diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java
index f65537cc6d..a3f2f5bd7e 100644
--- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java
+++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java
@@ -72,19 +72,10 @@ public class TerremarkVCloudComputeService implements ComputeService {
public CreateServerResponse createServer(String name, Profile profile, Image image) {
String id = computeClient.start(name, 1, 512, image);
VApp vApp = tmClient.getVApp(id);
- Iterable privateAddresses = vApp.getNetworkToAddresses().values();
-
- InetAddress sshIp = null;
- InternetService is;
- for (int port : new int[] { 22, 80, 8080 }) {
- is = tmClient.addInternetService(id + "-" + port, "TCP", port);
- tmClient.addNode(is.getId(), Iterables.getLast(privateAddresses), id + "-" + port, port);
- if (port == 22) {
- is.getPublicIpAddress().getAddress();
- }
- }
- return new CreateServerResponseImpl(id, vApp.getName(), ImmutableSet. of(sshIp),
- privateAddresses, 22, LoginType.SSH, new Credentials("vcloud", "p4ssw0rd"));
+ InetAddress publicIp = computeClient.createPublicAddressMappedToPorts(vApp, 22, 80, 8080);
+ return new CreateServerResponseImpl(vApp.getId(), vApp.getName(), ImmutableSet
+ . of(publicIp), vApp.getNetworkToAddresses().values(), 22, LoginType.SSH,
+ new Credentials("vcloud", "p4ssw0rd"));
}
@Override
diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/PropertiesTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/PropertiesTest.java
new file mode 100644
index 0000000000..68d79215ac
--- /dev/null
+++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/PropertiesTest.java
@@ -0,0 +1,36 @@
+package org.jclouds.vcloud.terremark.compute;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.jclouds.vcloud.terremark.TerremarkVCloudContextBuilder;
+import org.jclouds.vcloud.terremark.TerremarkVCloudPropertiesBuilder;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import com.google.common.io.Resources;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "compute.PropertiesTest")
+public class PropertiesTest {
+ private Properties properties;
+
+ @BeforeTest
+ public void setUp() throws IOException {
+ properties = new Properties();
+ properties.load(Resources.newInputStreamSupplier(Resources.getResource("compute.properties"))
+ .getInput());
+ }
+
+ public void testRimu() {
+ assertEquals(properties.getProperty("terremark.contextbuilder"),
+ TerremarkVCloudContextBuilder.class.getName());
+ assertEquals(properties.getProperty("terremark.propertiesbuilder"),
+ TerremarkVCloudPropertiesBuilder.class.getName());
+ }
+
+}
diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientLiveTest.java
new file mode 100644
index 0000000000..ce8393607e
--- /dev/null
+++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientLiveTest.java
@@ -0,0 +1,163 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.jclouds.vcloud.terremark.compute;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.compute.Image;
+import org.jclouds.logging.log4j.config.Log4JLoggingModule;
+import org.jclouds.ssh.jsch.config.JschSshClientModule;
+import org.jclouds.vcloud.domain.ResourceType;
+import org.jclouds.vcloud.domain.VAppStatus;
+import org.jclouds.vcloud.terremark.TerremarkVCloudClient;
+import org.jclouds.vcloud.terremark.TerremarkVCloudContextBuilder;
+import org.jclouds.vcloud.terremark.TerremarkVCloudPropertiesBuilder;
+import org.jclouds.vcloud.terremark.domain.TerremarkVApp;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.TypeLiteral;
+import com.google.inject.internal.ImmutableMap;
+
+/**
+ * Tests behavior of {@code TerremarkVCloudClient}
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "live", sequential = true, testName = "vcloud.TerremarkVCloudClientLiveTest")
+public class TerremarkVCloudComputeClientLiveTest {
+ TerremarkVCloudComputeClient client;
+ TerremarkVCloudClient tmClient;
+
+ private String id;
+ private InetAddress privateAddress;
+
+ public static final String PREFIX = System.getProperty("user.name") + "-terremark";
+
+ private static class Expectation {
+ final long hardDisk;
+ final String os;
+
+ public Expectation(long hardDisk, String os) {
+ this.hardDisk = hardDisk;
+ this.os = os;
+ }
+ }
+
+ private Map expectationMap = ImmutableMap. builder()
+ .put(Image.CENTOS_53,
+ new Expectation(4194304 / 4 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).put(
+ Image.RHEL_53,
+ new Expectation(4194304 / 4 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).put(
+ Image.UMBUNTU_90, new Expectation(4194304, "Ubuntu Linux (64-bit)")).put(
+ Image.UMBUNTU_JEOS, new Expectation(4194304, "Ubuntu Linux (32-bit)")).build();
+
+ private Predicate addressTester;
+
+ @Test
+ public void testPowerOn() throws InterruptedException, ExecutionException, TimeoutException,
+ IOException {
+ Image toTest = Image.CENTOS_53;
+
+ String serverName = getCompatibleServerName(toTest);
+ int processorCount = 1;
+ int memory = 512;
+
+ id = client.start(serverName, processorCount, memory, toTest);
+ Expectation expectation = expectationMap.get(toTest);
+
+ TerremarkVApp vApp = tmClient.getVApp(id);
+ verifyConfigurationOfVApp(vApp, serverName, expectation.os, processorCount, memory,
+ expectation.hardDisk);
+ assertEquals(vApp.getStatus(), VAppStatus.ON);
+ }
+
+ private String getCompatibleServerName(Image toTest) {
+ String serverName = toTest.toString().toLowerCase().replaceAll("_", "-").substring(0,
+ toTest.toString().length() <= 15 ? toTest.toString().length() : 14);
+ return serverName;
+ }
+
+ @Test(dependsOnMethods = "testPowerOn")
+ public void testGetAnyPrivateAddress() {
+ privateAddress = client.getAnyPrivateAddress(id);
+ assert !addressTester.apply(privateAddress);
+ }
+
+ @Test(dependsOnMethods = "testGetAnyPrivateAddress")
+ public void testSshLoadBalanceIp() {
+
+ InetAddress publicIp = client.createPublicAddressMappedToPorts(tmClient.getVApp(id), 22, 80);
+ assert addressTester.apply(publicIp);
+ // client.exec(publicIp, "uname -a");
+ }
+
+ private void verifyConfigurationOfVApp(TerremarkVApp vApp, String serverName, String expectedOs,
+ int processorCount, int memory, long hardDisk) {
+ assertEquals(vApp.getName(), serverName);
+ assertEquals(vApp.getOperatingSystemDescription(), expectedOs);
+ assertEquals(vApp.getResourceAllocationByType().get(ResourceType.PROCESSOR)
+ .getVirtualQuantity(), processorCount);
+ assertEquals(vApp.getResourceAllocationByType().get(ResourceType.SCSI_CONTROLLER)
+ .getVirtualQuantity(), 1);
+ assertEquals(
+ vApp.getResourceAllocationByType().get(ResourceType.MEMORY).getVirtualQuantity(),
+ memory);
+ assertEquals(vApp.getResourceAllocationByType().get(ResourceType.DISK_DRIVE)
+ .getVirtualQuantity(), hardDisk);
+ assertEquals(vApp.getSize().longValue(), vApp.getResourceAllocationByType().get(
+ ResourceType.DISK_DRIVE).getVirtualQuantity());
+ }
+
+ @AfterTest
+ void cleanup() throws InterruptedException, ExecutionException, TimeoutException {
+ if (id != null)
+ client.stop(id);
+ }
+
+ @BeforeGroups(groups = { "live" })
+ public void setupClient() {
+ String account = checkNotNull(System.getProperty("jclouds.test.user"), "jclouds.test.user");
+ String key = checkNotNull(System.getProperty("jclouds.test.key"), "jclouds.test.key");
+ Injector injector = new TerremarkVCloudContextBuilder(new TerremarkVCloudPropertiesBuilder(
+ account, key).relaxSSLHostname().build()).withModules(new Log4JLoggingModule(),
+ new JschSshClientModule()).buildInjector();
+ client = injector.getInstance(TerremarkVCloudComputeClient.class);
+ tmClient = injector.getInstance(TerremarkVCloudClient.class);
+ addressTester = injector.getInstance(Key.get(new TypeLiteral>() {
+ }));
+ }
+
+}