mirror of https://github.com/apache/jclouds.git
Issue 412: elastichosts drive now verifies ssh opens properly
This commit is contained in:
parent
c57e09c5ae
commit
70fbb3a5b8
|
@ -119,6 +119,8 @@ public interface CommonElasticStackClient {
|
||||||
* <p/>
|
* <p/>
|
||||||
* Sends the server an ACPI power-down event. Server reverts to a stopped status if it is
|
* Sends the server an ACPI power-down event. Server reverts to a stopped status if it is
|
||||||
* persistent and is automatically destroyed otherwise.
|
* persistent and is automatically destroyed otherwise.
|
||||||
|
* <h4>note</h4> behaviour on shutdown depends on how your server OS is set up to respond to an
|
||||||
|
* ACPI power button signal.
|
||||||
*
|
*
|
||||||
* @param uuid
|
* @param uuid
|
||||||
* what to shutdown
|
* what to shutdown
|
||||||
|
|
|
@ -130,6 +130,13 @@ public class Server extends Item {
|
||||||
return new Server(uuid, name, cpu, smp, mem, persistent, devices, bootDeviceIds, tags, userMetadata, nics,
|
return new Server(uuid, name, cpu, smp, mem, persistent, devices, bootDeviceIds, tags, userMetadata, nics,
|
||||||
vnc, description);
|
vnc, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Builder fromServer(Server in) {
|
||||||
|
return new Builder().uuid(in.getUuid()).name(in.getName()).cpu(in.getCpu()).mem(in.getMem())
|
||||||
|
.persistent(in.isPersistent()).description(in.getDescription()).devices(in.getDevices())
|
||||||
|
.bootDeviceIds(in.getBootDeviceIds()).tags(in.getTags()).userMetadata(in.getUserMetadata())
|
||||||
|
.nics(in.getNics()).vnc(in.getVnc());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final int cpu;
|
protected final int cpu;
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.jclouds.elasticstack.util;
|
||||||
|
|
||||||
|
import org.jclouds.elasticstack.domain.IDEDevice;
|
||||||
|
import org.jclouds.elasticstack.domain.Model;
|
||||||
|
import org.jclouds.elasticstack.domain.NIC;
|
||||||
|
import org.jclouds.elasticstack.domain.Server;
|
||||||
|
import org.jclouds.elasticstack.domain.VNC;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class Servers {
|
||||||
|
/**
|
||||||
|
* Helper to create a small persistent server
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* what to name the server
|
||||||
|
* @param driveUuuid
|
||||||
|
* id of the boot drive
|
||||||
|
* @param vncPassword
|
||||||
|
* password for vnc
|
||||||
|
* @return a builder for a persistent 1Ghz 512m server with DHCP enabled network.
|
||||||
|
*/
|
||||||
|
public static Server.Builder small(String name, String driveUuuid, String vncPassword) {
|
||||||
|
return new Server.Builder().name(name).cpu(1000).mem(512).persistent(true)
|
||||||
|
.devices(ImmutableMap.of("ide:0:0", new IDEDevice.Builder(0, 0).uuid(driveUuuid).build()))
|
||||||
|
.bootDeviceIds(ImmutableSet.of("ide:0:0"))
|
||||||
|
.nics(ImmutableSet.of(new NIC.Builder().model(Model.E1000).dhcp("auto").build()))
|
||||||
|
.vnc(new VNC(null, vncPassword, false));
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,6 +26,7 @@ import static org.testng.Assert.assertNotNull;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import org.jclouds.Constants;
|
import org.jclouds.Constants;
|
||||||
import org.jclouds.elasticstack.domain.ClaimType;
|
import org.jclouds.elasticstack.domain.ClaimType;
|
||||||
|
@ -39,17 +40,19 @@ import org.jclouds.elasticstack.domain.NIC;
|
||||||
import org.jclouds.elasticstack.domain.Server;
|
import org.jclouds.elasticstack.domain.Server;
|
||||||
import org.jclouds.elasticstack.domain.ServerInfo;
|
import org.jclouds.elasticstack.domain.ServerInfo;
|
||||||
import org.jclouds.elasticstack.domain.ServerStatus;
|
import org.jclouds.elasticstack.domain.ServerStatus;
|
||||||
import org.jclouds.elasticstack.domain.VNC;
|
|
||||||
import org.jclouds.elasticstack.predicates.DriveClaimed;
|
import org.jclouds.elasticstack.predicates.DriveClaimed;
|
||||||
|
import org.jclouds.elasticstack.util.Servers;
|
||||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||||
|
import org.jclouds.net.IPSocket;
|
||||||
|
import org.jclouds.predicates.InetSocketAddressConnect;
|
||||||
import org.jclouds.predicates.RetryablePredicate;
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
import org.jclouds.rest.RestContext;
|
import org.jclouds.rest.RestContext;
|
||||||
import org.jclouds.rest.RestContextFactory;
|
import org.jclouds.rest.RestContextFactory;
|
||||||
import org.testng.annotations.AfterGroups;
|
import org.testng.annotations.AfterGroups;
|
||||||
import org.testng.annotations.AfterTest;
|
|
||||||
import org.testng.annotations.BeforeGroups;
|
import org.testng.annotations.BeforeGroups;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
@ -68,6 +71,7 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
protected static final String VNC_PASSWORD = "XXXXXXXX";
|
protected static final String VNC_PASSWORD = "XXXXXXXX";
|
||||||
protected S client;
|
protected S client;
|
||||||
protected RestContext<S, A> context;
|
protected RestContext<S, A> context;
|
||||||
|
protected Predicate<IPSocket> socketTester;
|
||||||
|
|
||||||
protected String provider = "elasticstack";
|
protected String provider = "elasticstack";
|
||||||
protected String identity;
|
protected String identity;
|
||||||
|
@ -105,14 +109,9 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
overrides);
|
overrides);
|
||||||
|
|
||||||
client = context.getApi();
|
client = context.getApi();
|
||||||
driveNotClaimed = new RetryablePredicate<DriveInfo>(Predicates.not(new DriveClaimed(client)), 30, 1,
|
driveNotClaimed = new RetryablePredicate<DriveInfo>(Predicates.not(new DriveClaimed(client)), 120, 1,
|
||||||
TimeUnit.SECONDS);
|
TimeUnit.SECONDS);
|
||||||
}
|
socketTester = new RetryablePredicate<IPSocket>(new InetSocketAddressConnect(), 120, 1, TimeUnit.SECONDS);
|
||||||
|
|
||||||
@AfterGroups(groups = "live")
|
|
||||||
void tearDown() {
|
|
||||||
if (context != null)
|
|
||||||
context.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -211,13 +210,12 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testSetDriveData")
|
@Test(dependsOnMethods = "testSetDriveData")
|
||||||
public void testCreateAndStartServer() throws Exception {
|
public void testCreateAndStartServer() throws Exception {
|
||||||
|
Logger.getAnonymousLogger().info("preparing drive");
|
||||||
prepareDrive();
|
prepareDrive();
|
||||||
Server serverRequest = new Server.Builder().name(prefix).cpu(1000).mem(512).persistent(true)
|
|
||||||
.devices(ImmutableMap.of("ide:0:0", new IDEDevice.Builder(0, 0).uuid(drive.getUuid()).build()))
|
|
||||||
.bootDeviceIds(ImmutableSet.of("ide:0:0")).nics(ImmutableSet.of(new NIC.Builder().model(Model.E1000).
|
|
||||||
|
|
||||||
build())).vnc(new VNC(null, VNC_PASSWORD, false)).build();
|
Server serverRequest = Servers.small(prefix, drive.getUuid(), VNC_PASSWORD).build();
|
||||||
|
|
||||||
|
Logger.getAnonymousLogger().info("starting server");
|
||||||
server = client.createAndStartServer(serverRequest);
|
server = client.createAndStartServer(serverRequest);
|
||||||
checkCreatedServer();
|
checkCreatedServer();
|
||||||
|
|
||||||
|
@ -240,6 +238,7 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
ImmutableMap.of("ide:0:0", new IDEDevice.Builder(0, 0).uuid(drive.getUuid()).build()));
|
ImmutableMap.of("ide:0:0", new IDEDevice.Builder(0, 0).uuid(drive.getUuid()).build()));
|
||||||
assertEquals(server.getBootDeviceIds(), ImmutableSet.of("ide:0:0"));
|
assertEquals(server.getBootDeviceIds(), ImmutableSet.of("ide:0:0"));
|
||||||
assertEquals(server.getNics(), ImmutableSet.of(new NIC.Builder()
|
assertEquals(server.getNics(), ImmutableSet.of(new NIC.Builder()
|
||||||
|
.dhcp(server.getVnc().getIp())
|
||||||
.model(Model.E1000)
|
.model(Model.E1000)
|
||||||
.block(
|
.block(
|
||||||
ImmutableList.of("tcp/43594", "tcp/5902", "udp/5060", "tcp/5900", "tcp/5901", "tcp/21", "tcp/22",
|
ImmutableList.of("tcp/43594", "tcp/5902", "udp/5060", "tcp/5900", "tcp/5901", "tcp/21", "tcp/22",
|
||||||
|
@ -247,25 +246,15 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
assertEquals(server.getStatus(), ServerStatus.ACTIVE);
|
assertEquals(server.getStatus(), ServerStatus.ACTIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
|
||||||
// @Test(dependsOnMethods = "testCreateAndStartServer")
|
|
||||||
// public void testSetServerConfiguration() throws Exception {
|
|
||||||
//
|
|
||||||
// ServerInfo server2 = client.setServerConfiguration(server.getUuid(), new
|
|
||||||
// Server.Builder().name("rediculous")
|
|
||||||
// .tags(ImmutableSet.of("networking", "security",
|
|
||||||
// "gateway")).userMetadata(ImmutableMap.of("foo", "bar"))
|
|
||||||
// .build());
|
|
||||||
//
|
|
||||||
// assertNotNull(server2.getUuid(), server.getUuid());
|
|
||||||
// assertEquals(server2.getName(), "rediculous");
|
|
||||||
// assertEquals(server2.getTags(), ImmutableSet.of("networking", "security", "gateway"));
|
|
||||||
// assertEquals(server2.getUserMetadata(), ImmutableMap.of("foo", "bar"));
|
|
||||||
// server = server2;
|
|
||||||
// }
|
|
||||||
// @Test(dependsOnMethods = "testSetServerConfiguration")
|
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testCreateAndStartServer")
|
@Test(dependsOnMethods = "testCreateAndStartServer")
|
||||||
|
public void testConnectivity() throws Exception {
|
||||||
|
Logger.getAnonymousLogger().info("awaiting vnc");
|
||||||
|
assert socketTester.apply(new IPSocket(server.getVnc().getIp(), 5900)) : server;
|
||||||
|
Logger.getAnonymousLogger().info("awaiting ssh");
|
||||||
|
assert socketTester.apply(new IPSocket(server.getNics().get(0).getDhcp(), 22)) : server;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testConnectivity")
|
||||||
public void testLifeCycle() throws Exception {
|
public void testLifeCycle() throws Exception {
|
||||||
client.stopServer(server.getUuid());
|
client.stopServer(server.getUuid());
|
||||||
assertEquals(client.getServerInfo(server.getUuid()).getStatus(), ServerStatus.STOPPED);
|
assertEquals(client.getServerInfo(server.getUuid()).getStatus(), ServerStatus.STOPPED);
|
||||||
|
@ -276,12 +265,32 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
client.resetServer(server.getUuid());
|
client.resetServer(server.getUuid());
|
||||||
assertEquals(client.getServerInfo(server.getUuid()).getStatus(), ServerStatus.ACTIVE);
|
assertEquals(client.getServerInfo(server.getUuid()).getStatus(), ServerStatus.ACTIVE);
|
||||||
|
|
||||||
// for some reason shutdown doesn't immediately occur
|
|
||||||
client.shutdownServer(server.getUuid());
|
client.shutdownServer(server.getUuid());
|
||||||
assertEquals(client.getServerInfo(server.getUuid()).getStatus(), ServerStatus.ACTIVE);
|
// behavior on shutdown depends on how your server OS is set up to respond to an ACPI power
|
||||||
|
// button signal
|
||||||
|
assert (client.getServerInfo(server.getUuid()).getStatus() == ServerStatus.ACTIVE || client.getServerInfo(
|
||||||
|
server.getUuid()).getStatus() == ServerStatus.STOPPED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testLifeCycle")
|
@Test(dependsOnMethods = "testLifeCycle")
|
||||||
|
public void testSetServerConfiguration() throws Exception {
|
||||||
|
client.stopServer(server.getUuid());
|
||||||
|
assertEquals(client.getServerInfo(server.getUuid()).getStatus(), ServerStatus.STOPPED);
|
||||||
|
|
||||||
|
ServerInfo server2 = client.setServerConfiguration(
|
||||||
|
server.getUuid(),
|
||||||
|
Server.Builder.fromServer(server).name("rediculous")
|
||||||
|
.tags(ImmutableSet.of("networking", "security", "gateway"))
|
||||||
|
.userMetadata(ImmutableMap.of("foo", "bar")).build());
|
||||||
|
|
||||||
|
assertNotNull(server2.getUuid(), server.getUuid());
|
||||||
|
assertEquals(server2.getName(), "rediculous");
|
||||||
|
assertEquals(server2.getTags(), ImmutableSet.of("networking", "security", "gateway"));
|
||||||
|
assertEquals(server2.getUserMetadata(), ImmutableMap.of("foo", "bar"));
|
||||||
|
server = server2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testSetServerConfiguration")
|
||||||
public void testDestroyServer() throws Exception {
|
public void testDestroyServer() throws Exception {
|
||||||
client.destroyServer(server.getUuid());
|
client.destroyServer(server.getUuid());
|
||||||
assertEquals(client.getServerInfo(server.getUuid()), null);
|
assertEquals(client.getServerInfo(server.getUuid()), null);
|
||||||
|
@ -293,8 +302,8 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
assertEquals(client.getDriveInfo(drive.getUuid()), null);
|
assertEquals(client.getDriveInfo(drive.getUuid()), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterTest
|
@AfterGroups(groups = "live")
|
||||||
public void cleanUp() {
|
protected void tearDown() {
|
||||||
try {
|
try {
|
||||||
client.destroyServer(server.getUuid());
|
client.destroyServer(server.getUuid());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -305,5 +314,7 @@ public abstract class CommonElasticStackClientLiveTest<S extends CommonElasticSt
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (context != null)
|
||||||
|
context.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.io.IOException;
|
||||||
|
|
||||||
import org.jclouds.elasticstack.domain.CreateDriveRequest;
|
import org.jclouds.elasticstack.domain.CreateDriveRequest;
|
||||||
import org.jclouds.elasticstack.domain.DriveInfo;
|
import org.jclouds.elasticstack.domain.DriveInfo;
|
||||||
|
import org.jclouds.elasticstack.domain.ImageConversionType;
|
||||||
import org.jclouds.io.Payloads;
|
import org.jclouds.io.Payloads;
|
||||||
import org.jclouds.util.Utils;
|
import org.jclouds.util.Utils;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
@ -68,7 +69,7 @@ public class ElasticStackClientLiveTest extends
|
||||||
@Override
|
@Override
|
||||||
protected void prepareDrive() {
|
protected void prepareDrive() {
|
||||||
System.err.println("before prepare" + client.getDriveInfo(drive.getUuid()));
|
System.err.println("before prepare" + client.getDriveInfo(drive.getUuid()));
|
||||||
client.imageDrive("e6111e4c-67af-4438-b1bc-189747d5a8e5", drive.getUuid());
|
client.imageDrive("e6111e4c-67af-4438-b1bc-189747d5a8e5", drive.getUuid(), ImageConversionType.GUNZIP);
|
||||||
assert driveNotClaimed.apply(drive) : client.getDriveInfo(drive.getUuid());
|
assert driveNotClaimed.apply(drive) : client.getDriveInfo(drive.getUuid());
|
||||||
System.err.println("after prepare" + client.getDriveInfo(drive.getUuid()));
|
System.err.println("after prepare" + client.getDriveInfo(drive.getUuid()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,6 @@ public class KeyValuesDelimitedByBlankLinesToServerInfoTest {
|
||||||
|
|
||||||
public void testNew() {
|
public void testNew() {
|
||||||
assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToServerInfoTest.class
|
assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToServerInfoTest.class
|
||||||
.getResourceAsStream("/new_server.txt")))), MapToServerInfoTest.ONE);
|
.getResourceAsStream("/new_server.txt")))), MapToServerInfoTest.NEW);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue