mirror of https://github.com/apache/jclouds.git
Issue 385: exposed underlying client and means to test
This commit is contained in:
parent
1063924f6a
commit
73c27dce6d
|
@ -35,11 +35,10 @@ import com.google.inject.Module;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class StandaloneComputeServiceContextBuilder extends
|
public class StandaloneComputeServiceContextBuilder<D> extends ComputeServiceContextBuilder<D, D> {
|
||||||
ComputeServiceContextBuilder<ComputeService, ComputeService> {
|
|
||||||
|
|
||||||
public StandaloneComputeServiceContextBuilder(Properties props) {
|
public StandaloneComputeServiceContextBuilder(Class<D> driverClass, Properties props) {
|
||||||
super(ComputeService.class, ComputeService.class, props);
|
super(driverClass, driverClass, props);
|
||||||
if (properties.size() == 0)
|
if (properties.size() == 0)
|
||||||
properties.putAll(new PropertiesBuilder().build());
|
properties.putAll(new PropertiesBuilder().build());
|
||||||
if (!properties.containsKey("jclouds.provider"))
|
if (!properties.containsKey("jclouds.provider"))
|
||||||
|
@ -54,7 +53,7 @@ public class StandaloneComputeServiceContextBuilder extends
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addClientModule(List<Module> modules) {
|
protected void addClientModule(List<Module> modules) {
|
||||||
modules.add(new StandaloneComputeServiceClientModule<ComputeService>(ComputeService.class));
|
modules.add(new StandaloneComputeServiceClientModule<D>(syncClientType));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -20,24 +20,34 @@
|
||||||
package org.jclouds.compute;
|
package org.jclouds.compute;
|
||||||
|
|
||||||
import org.jclouds.PropertiesBuilder;
|
import org.jclouds.PropertiesBuilder;
|
||||||
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
|
||||||
import org.jclouds.rest.RestContextSpec;
|
import org.jclouds.rest.RestContextSpec;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class StandaloneComputeServiceContextSpec<N, H, I, L> extends RestContextSpec<ComputeService, ComputeService> {
|
public class StandaloneComputeServiceContextSpec<D, N, H, I, L> extends RestContextSpec<D, D> {
|
||||||
|
public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity,
|
||||||
|
String credential, Class<D> driverClass,
|
||||||
|
Class<? extends StandaloneComputeServiceContextBuilder<D>> contextBuilderClass) {
|
||||||
|
this(provider, endpoint, apiVersion, identity, credential, driverClass, contextBuilderClass, ImmutableSet
|
||||||
|
.<Module> of());
|
||||||
|
}
|
||||||
|
|
||||||
|
public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity,
|
||||||
|
String credential, Class<D> driverClass,
|
||||||
|
Class<? extends StandaloneComputeServiceContextBuilder<D>> contextBuilderClass, Iterable<Module> modules) {
|
||||||
|
this(provider, endpoint, apiVersion, identity, credential, driverClass, PropertiesBuilder.class,
|
||||||
|
contextBuilderClass, modules);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity,
|
public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity,
|
||||||
String credential, StandaloneComputeServiceContextModule<N, H, I, L> contextModule, Iterable<Module> modules) {
|
String credential, Class<D> driverClass, Class<? extends PropertiesBuilder> propertiesBuilderClass,
|
||||||
super(provider, endpoint, apiVersion, identity, credential, ComputeService.class, ComputeService.class,
|
Class<? extends StandaloneComputeServiceContextBuilder<D>> contextBuilderClass, Iterable<Module> modules) {
|
||||||
PropertiesBuilder.class, (Class) StandaloneComputeServiceContextBuilder.class, Iterables.concat(
|
super(provider, endpoint, apiVersion, identity, credential, driverClass, driverClass,
|
||||||
ImmutableSet.of(contextModule), modules));
|
(Class) propertiesBuilderClass, (Class) contextBuilderClass, modules);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,7 +1,25 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.compute.config;
|
package org.jclouds.compute.config;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceAdapter;
|
import org.jclouds.compute.ComputeServiceAdapter;
|
||||||
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
|
||||||
import org.jclouds.compute.domain.Hardware;
|
import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
|
@ -10,6 +28,10 @@ import org.jclouds.domain.Location;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.inject.TypeLiteral;
|
import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
public class JCloudsNativeStandaloneComputeServiceContextModule extends
|
public class JCloudsNativeStandaloneComputeServiceContextModule extends
|
||||||
StandaloneComputeServiceContextModule<NodeMetadata, Hardware, Image, Location> {
|
StandaloneComputeServiceContextModule<NodeMetadata, Hardware, Image, Location> {
|
||||||
private final Class<? extends ComputeServiceAdapter<NodeMetadata, Hardware, Image, Location>> adapter;
|
private final Class<? extends ComputeServiceAdapter<NodeMetadata, Hardware, Image, Location>> adapter;
|
||||||
|
|
|
@ -21,6 +21,7 @@ package org.jclouds.compute.stub;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
||||||
import org.jclouds.compute.stub.config.StubComputeServiceContextModule;
|
import org.jclouds.compute.stub.config.StubComputeServiceContextModule;
|
||||||
|
@ -31,10 +32,11 @@ import com.google.inject.Module;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class StubComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder {
|
@SuppressWarnings("rawtypes")
|
||||||
|
public class StubComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<ConcurrentMap> {
|
||||||
|
|
||||||
public StubComputeServiceContextBuilder(Properties props) {
|
public StubComputeServiceContextBuilder(Properties props) {
|
||||||
super(props);
|
super(ConcurrentMap.class, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -19,9 +19,16 @@
|
||||||
|
|
||||||
package org.jclouds.compute.stub.config;
|
package org.jclouds.compute.stub.config;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.compute.config.JCloudsNativeStandaloneComputeServiceContextModule;
|
import org.jclouds.compute.config.JCloudsNativeStandaloneComputeServiceContextModule;
|
||||||
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.concurrent.SingleThreaded;
|
import org.jclouds.concurrent.SingleThreaded;
|
||||||
|
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
@ -33,6 +40,14 @@ public class StubComputeServiceContextModule extends JCloudsNativeStandaloneComp
|
||||||
super(StubComputeServiceAdapter.class);
|
super(StubComputeServiceAdapter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that a plain class is able to be bound as getProviderSpecificContext.getApi()
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
ConcurrentMap provideApi(ConcurrentMap<String, NodeMetadata> in) {
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
install(new StubComputeServiceDependenciesModule());
|
install(new StubComputeServiceDependenciesModule());
|
||||||
|
|
|
@ -74,6 +74,7 @@ import org.jclouds.net.IPSocket;
|
||||||
import org.jclouds.predicates.RetryablePredicate;
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
import org.jclouds.predicates.SocketOpen;
|
import org.jclouds.predicates.SocketOpen;
|
||||||
import org.jclouds.rest.AuthorizationException;
|
import org.jclouds.rest.AuthorizationException;
|
||||||
|
import org.jclouds.rest.RestContextFactory;
|
||||||
import org.jclouds.scriptbuilder.domain.OsFamily;
|
import org.jclouds.scriptbuilder.domain.OsFamily;
|
||||||
import org.jclouds.ssh.ExecResponse;
|
import org.jclouds.ssh.ExecResponse;
|
||||||
import org.jclouds.ssh.SshClient;
|
import org.jclouds.ssh.SshClient;
|
||||||
|
@ -161,11 +162,15 @@ public abstract class BaseComputeServiceLiveTest {
|
||||||
if (context != null)
|
if (context != null)
|
||||||
context.close();
|
context.close();
|
||||||
Properties props = setupProperties();
|
Properties props = setupProperties();
|
||||||
context = new ComputeServiceContextFactory().createContext(provider,
|
context = new ComputeServiceContextFactory(getRestProperties()).createContext(provider,
|
||||||
ImmutableSet.of(new Log4JLoggingModule(), getSshModule()), props);
|
ImmutableSet.of(new Log4JLoggingModule(), getSshModule()), props);
|
||||||
client = context.getComputeService();
|
client = context.getComputeService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Properties getRestProperties() {
|
||||||
|
return RestContextFactory.getPropertiesFromResource("/rest.properties");
|
||||||
|
}
|
||||||
|
|
||||||
abstract protected Module getSshModule();
|
abstract protected Module getSshModule();
|
||||||
|
|
||||||
// wait up to 5 seconds for an auth exception
|
// wait up to 5 seconds for an auth exception
|
||||||
|
|
|
@ -19,10 +19,12 @@
|
||||||
|
|
||||||
package org.jclouds.compute;
|
package org.jclouds.compute;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
import org.jclouds.compute.domain.Hardware;
|
import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.stub.config.StubComputeServiceContextModule;
|
import org.jclouds.compute.stub.StubComputeServiceContextBuilder;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -39,10 +41,11 @@ public class ComputeServiceContextFactoryTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStandalone() {
|
public void testStandalone() {
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
ComputeServiceContext context = new ComputeServiceContextFactory()
|
ComputeServiceContext context = new ComputeServiceContextFactory()
|
||||||
.createContext(new StandaloneComputeServiceContextSpec<NodeMetadata, Hardware, Image, Location>("stub",
|
.createContext(new StandaloneComputeServiceContextSpec<ConcurrentMap, NodeMetadata, Hardware, Image, Location>(
|
||||||
"stub", "1", "identity", "credential", new StubComputeServiceContextModule(), ImmutableSet
|
"stub", "stub", "1", "identity", "credential", ConcurrentMap.class,
|
||||||
.<Module> of()));
|
StubComputeServiceContextBuilder.class, ImmutableSet.<Module> of()));
|
||||||
|
|
||||||
context.getComputeService().listNodes();
|
context.getComputeService().listNodes();
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,11 +195,13 @@ public class Utils {
|
||||||
|
|
||||||
public static <T extends Throwable> T getFirstThrowableOfType(ProvisionException e, Class<T> clazz) {
|
public static <T extends Throwable> T getFirstThrowableOfType(ProvisionException e, Class<T> clazz) {
|
||||||
for (Message message : e.getErrorMessages()) {
|
for (Message message : e.getErrorMessages()) {
|
||||||
|
if (message.getCause() != null) {
|
||||||
T cause = getFirstThrowableOfType(message.getCause(), clazz);
|
T cause = getFirstThrowableOfType(message.getCause(), clazz);
|
||||||
if (cause instanceof ProvisionException)
|
if (cause instanceof ProvisionException)
|
||||||
return getFirstThrowableOfType(ProvisionException.class.cast(cause), clazz);
|
return getFirstThrowableOfType(ProvisionException.class.cast(cause), clazz);
|
||||||
return cause;
|
return cause;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,12 @@ public class UtilsTest {
|
||||||
assertEquals(Utils.getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
assertEquals(Utils.getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testGetFirstThrowableOfTypeWhenCauseIsNull() {
|
||||||
|
Message message = new Message(ImmutableList.of(), "test", null);
|
||||||
|
ProvisionException pex = new ProvisionException(ImmutableSet.of(message));
|
||||||
|
assertEquals(Utils.getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
||||||
|
}
|
||||||
|
|
||||||
public void testReplaceTokens() throws UnsupportedEncodingException {
|
public void testReplaceTokens() throws UnsupportedEncodingException {
|
||||||
assertEquals(Utils.replaceTokens("hello {where}", ImmutableMap.of("where", "world")), "hello world");
|
assertEquals(Utils.replaceTokens("hello {where}", ImmutableMap.of("where", "world")), "hello world");
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,11 +25,8 @@ import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
||||||
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
|
||||||
import org.jclouds.libvirt.Datacenter;
|
|
||||||
import org.jclouds.libvirt.Image;
|
|
||||||
import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule;
|
import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule;
|
||||||
import org.libvirt.Domain;
|
import org.libvirt.Connect;
|
||||||
|
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
|
|
||||||
|
@ -37,10 +34,10 @@ import com.google.inject.Module;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder {
|
public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<Connect> {
|
||||||
|
|
||||||
public LibvirtComputeServiceContextBuilder(Properties props) {
|
public LibvirtComputeServiceContextBuilder(Properties props) {
|
||||||
super(props);
|
super(Connect.class, props);
|
||||||
|
|
||||||
if (!properties.containsKey(PROPERTY_LIBVIRT_DOMAIN_DIR))
|
if (!properties.containsKey(PROPERTY_LIBVIRT_DOMAIN_DIR))
|
||||||
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
|
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
|
||||||
|
@ -48,11 +45,6 @@ public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServic
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addContextModule(List<Module> modules) {
|
protected void addContextModule(List<Module> modules) {
|
||||||
modules.add(createContextModule());
|
modules.add(new LibvirtComputeServiceContextModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
public StandaloneComputeServiceContextModule<Domain, Domain, Image, Datacenter> createContextModule() {
|
|
||||||
return new LibvirtComputeServiceContextModule();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
package org.jclouds.libvirt.compute;
|
package org.jclouds.libvirt.compute;
|
||||||
|
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceContext;
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.libvirt.Connect;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,11 +18,6 @@ import org.testng.annotations.Test;
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit")
|
||||||
public class LibvirtComputeServiceContextBuilderTest {
|
public class LibvirtComputeServiceContextBuilderTest {
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateContextModule() {
|
|
||||||
assertNotNull(new LibvirtComputeServiceContextBuilder(new Properties()).createContextModule());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCanBuildWithComputeService() {
|
public void testCanBuildWithComputeService() {
|
||||||
ComputeServiceContext context = new ComputeServiceContextFactory()
|
ComputeServiceContext context = new ComputeServiceContextFactory()
|
||||||
|
@ -28,4 +25,34 @@ public class LibvirtComputeServiceContextBuilderTest {
|
||||||
// System.err.println(context.getComputeService().
|
// System.err.println(context.getComputeService().
|
||||||
context.close();
|
context.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanBuildWithRestProperties() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
|
||||||
|
restProperties.setProperty("libvirt.endpoint", "test:///default");
|
||||||
|
|
||||||
|
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("libvirt",
|
||||||
|
"identity", "credential");
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProviderSpecificContextIsCorrectType() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
|
||||||
|
restProperties.setProperty("libvirt.endpoint", "test:///default");
|
||||||
|
|
||||||
|
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("libvirt",
|
||||||
|
"identity", "credential");
|
||||||
|
|
||||||
|
RestContext<Connect, Connect> providerContext = context.getProviderSpecificContext();
|
||||||
|
|
||||||
|
assertEquals(providerContext.getApi().getClass(), Connect.class);
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package org.jclouds.libvirt.compute;
|
||||||
|
|
||||||
|
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jclouds.compute.BaseComputeServiceLiveTest;
|
||||||
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
|
import org.jclouds.compute.domain.OsFamily;
|
||||||
|
import org.jclouds.compute.domain.Template;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
|
import org.libvirt.Connect;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", enabled = true, sequential = true, testName = "libvirt.LibvirtComputeServiceLiveTest")
|
||||||
|
public class LibvirtComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
||||||
|
public LibvirtComputeServiceLiveTest() {
|
||||||
|
provider = "libvirt";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Properties getRestProperties() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
|
||||||
|
restProperties.setProperty("libvirt.endpoint", "test:///default");
|
||||||
|
return restProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTemplateBuilder() {
|
||||||
|
Template defaultTemplate = client.templateBuilder().build();
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "5.3");
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
|
||||||
|
assertEquals(defaultTemplate.getLocation().getId(), "1");
|
||||||
|
assertEquals(getCores(defaultTemplate.getHardware()), 0.5d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected JschSshClientModule getSshModule() {
|
||||||
|
return new JschSshClientModule();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAssignability() throws Exception {
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
RestContext<Connect, Connect> goGridContext = new ComputeServiceContextFactory().createContext(provider,
|
||||||
|
identity, credential).getProviderSpecificContext();
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere;
|
package org.jclouds.vi;
|
||||||
|
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere;
|
package org.jclouds.vi;
|
||||||
|
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere;
|
package org.jclouds.vi;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration properties and constants used in libvirt local connections.
|
* Configuration properties and constants used in libvirt local connections.
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute;
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
|
@ -17,30 +17,27 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute;
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
import static org.jclouds.vsphere.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
import static org.jclouds.vi.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
||||||
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
import org.jclouds.vi.compute.config.ViComputeServiceContextModule;
|
||||||
import org.jclouds.vsphere.Datacenter;
|
|
||||||
import org.jclouds.vsphere.Image;
|
|
||||||
import org.jclouds.vsphere.compute.domain.ViComputeServiceContextModule;
|
|
||||||
|
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.vmware.vim25.mo.VirtualMachine;
|
import com.vmware.vim25.mo.ServiceInstance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class ViComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder {
|
public class ViComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<ServiceInstance> {
|
||||||
|
|
||||||
public ViComputeServiceContextBuilder(Properties props) {
|
public ViComputeServiceContextBuilder(Properties props) {
|
||||||
super(props);
|
super(ServiceInstance.class, props);
|
||||||
|
|
||||||
if (!properties.containsKey(PROPERTY_LIBVIRT_DOMAIN_DIR))
|
if (!properties.containsKey(PROPERTY_LIBVIRT_DOMAIN_DIR))
|
||||||
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
|
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
|
||||||
|
@ -48,11 +45,7 @@ public class ViComputeServiceContextBuilder extends StandaloneComputeServiceCont
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addContextModule(List<Module> modules) {
|
protected void addContextModule(List<Module> modules) {
|
||||||
modules.add(createContextModule());
|
modules.add(new ViComputeServiceContextModule());
|
||||||
}
|
|
||||||
|
|
||||||
public StandaloneComputeServiceContextModule<VirtualMachine, VirtualMachine, Image, Datacenter> createContextModule() {
|
|
||||||
return new ViComputeServiceContextModule();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute;
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
import org.jclouds.PropertiesBuilder;
|
import org.jclouds.PropertiesBuilder;
|
||||||
import org.jclouds.compute.ComputeService;
|
import org.jclouds.compute.ComputeService;
|
|
@ -17,11 +17,11 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute;
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
import static org.jclouds.Constants.PROPERTY_API_VERSION;
|
import static org.jclouds.Constants.PROPERTY_API_VERSION;
|
||||||
import static org.jclouds.Constants.PROPERTY_ENDPOINT;
|
import static org.jclouds.Constants.PROPERTY_ENDPOINT;
|
||||||
import static org.jclouds.vsphere.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
import static org.jclouds.vi.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||||
import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED;
|
import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
|
@ -0,0 +1,147 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.vi.compute.config;
|
||||||
|
|
||||||
|
import static org.jclouds.vi.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.inject.Named;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.xpath.XPathExpressionException;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.commons.io.filefilter.WildcardFileFilter;
|
||||||
|
import org.jclouds.Constants;
|
||||||
|
import org.jclouds.compute.ComputeServiceAdapter;
|
||||||
|
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
||||||
|
import org.jclouds.compute.domain.Hardware;
|
||||||
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
|
import org.jclouds.compute.domain.TemplateBuilder;
|
||||||
|
import org.jclouds.compute.suppliers.DefaultLocationSupplier;
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.rest.annotations.Provider;
|
||||||
|
import org.jclouds.vi.Datacenter;
|
||||||
|
import org.jclouds.vi.Image;
|
||||||
|
import org.jclouds.vi.compute.functions.DatacenterToLocation;
|
||||||
|
import org.jclouds.vi.compute.functions.ViImageToImage;
|
||||||
|
import org.jclouds.vi.compute.functions.VirtualMachineToHardware;
|
||||||
|
import org.jclouds.vi.compute.functions.VirtualMachineToNodeMetadata;
|
||||||
|
import org.jclouds.vi.compute.strategy.ViComputeServiceAdapter;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.io.Files;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
import com.google.inject.Key;
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
import com.google.inject.name.Names;
|
||||||
|
import com.jamesmurty.utils.XMLBuilder;
|
||||||
|
import com.vmware.vim25.mo.ServiceInstance;
|
||||||
|
import com.vmware.vim25.mo.VirtualMachine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class ViComputeServiceContextModule extends
|
||||||
|
StandaloneComputeServiceContextModule<VirtualMachine, VirtualMachine, Image, Datacenter> {
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
super.configure();
|
||||||
|
bind(new TypeLiteral<ComputeServiceAdapter<VirtualMachine, VirtualMachine, Image, Datacenter>>() {
|
||||||
|
}).to(ViComputeServiceAdapter.class);
|
||||||
|
bind(new TypeLiteral<Supplier<Location>>() {
|
||||||
|
}).to(DefaultLocationSupplier.class);
|
||||||
|
bind(new TypeLiteral<Function<VirtualMachine, NodeMetadata>>() {
|
||||||
|
}).to(VirtualMachineToNodeMetadata.class);
|
||||||
|
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
|
||||||
|
}).to(ViImageToImage.class);
|
||||||
|
bind(new TypeLiteral<Function<VirtualMachine, Hardware>>() {
|
||||||
|
}).to(VirtualMachineToHardware.class);
|
||||||
|
bind(new TypeLiteral<Function<Datacenter, Location>>() {
|
||||||
|
}).to(DatacenterToLocation.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
protected ServiceInstance createConnection(@Provider URI endpoint,
|
||||||
|
@Named(Constants.PROPERTY_IDENTITY) String identity, @Named(Constants.PROPERTY_CREDENTIAL) String credential)
|
||||||
|
throws RemoteException, MalformedURLException {
|
||||||
|
System.out.println(endpoint);
|
||||||
|
System.out.println(identity);
|
||||||
|
System.out.println(credential);
|
||||||
|
return new ServiceInstance(endpoint.toURL(), identity, credential, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) {
|
||||||
|
String domainDir = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_LIBVIRT_DOMAIN_DIR)));
|
||||||
|
String hardwareId = searchForHardwareIdInDomainDir(domainDir);
|
||||||
|
String image = searchForImageIdInDomainDir(domainDir);
|
||||||
|
return template.hardwareId(hardwareId).imageId(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String searchForImageIdInDomainDir(String domainDir) {
|
||||||
|
// TODO
|
||||||
|
return "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private String searchForHardwareIdInDomainDir(String domainDir) {
|
||||||
|
|
||||||
|
Collection<File> xmlDomains = FileUtils.listFiles(new File(domainDir), new WildcardFileFilter("*.xml"), null);
|
||||||
|
String uuid = "";
|
||||||
|
try {
|
||||||
|
String fromXML = Files.toString(Iterables.get(xmlDomains, 0), Charsets.UTF_8);
|
||||||
|
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(fromXML)));
|
||||||
|
uuid = builder.xpathFind("/domain/uuid").getElement().getTextContent();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (SAXException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (XPathExpressionException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map<String, URI> regions = newLinkedHashMap(); for (String region :
|
||||||
|
* Splitter.on(',').split(regionString)) { regions.put( region,
|
||||||
|
* URI.create(injector.getInstance(Key.get(String.class, Names.named(Constants.PROPERTY_ENDPOINT
|
||||||
|
* + "." + region))))); } return regions;
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
|
@ -17,14 +17,14 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute.functions;
|
package org.jclouds.vi.compute.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
import org.jclouds.domain.internal.LocationImpl;
|
import org.jclouds.domain.internal.LocationImpl;
|
||||||
import org.jclouds.vsphere.Datacenter;
|
import org.jclouds.vi.Datacenter;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
|
@ -17,14 +17,14 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute.functions;
|
package org.jclouds.vi.compute.functions;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
import org.jclouds.domain.internal.LocationImpl;
|
import org.jclouds.domain.internal.LocationImpl;
|
||||||
import org.jclouds.vsphere.Datacenter;
|
import org.jclouds.vi.Datacenter;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute.functions;
|
package org.jclouds.vi.compute.functions;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
@ -36,13 +36,13 @@ import com.google.common.base.Function;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ViImageToImage implements Function<org.jclouds.vsphere.Image, Image> {
|
public class ViImageToImage implements Function<org.jclouds.vi.Image, Image> {
|
||||||
@Resource
|
@Resource
|
||||||
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image apply(org.jclouds.vsphere.Image from) {
|
public Image apply(org.jclouds.vi.Image from) {
|
||||||
|
|
||||||
ImageBuilder builder = new ImageBuilder();
|
ImageBuilder builder = new ImageBuilder();
|
||||||
builder.ids(from.id + "");
|
builder.ids(from.id + "");
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute.functions;
|
package org.jclouds.vi.compute.functions;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute.functions;
|
package org.jclouds.vi.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName;
|
import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName;
|
|
@ -17,10 +17,10 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute.strategy;
|
package org.jclouds.vi.compute.strategy;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.vsphere.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
import static org.jclouds.vi.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||||
|
|
||||||
import java.rmi.RemoteException;
|
import java.rmi.RemoteException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -33,8 +33,8 @@ import org.jclouds.compute.ComputeService;
|
||||||
import org.jclouds.compute.ComputeServiceAdapter;
|
import org.jclouds.compute.ComputeServiceAdapter;
|
||||||
import org.jclouds.compute.domain.Template;
|
import org.jclouds.compute.domain.Template;
|
||||||
import org.jclouds.domain.Credentials;
|
import org.jclouds.domain.Credentials;
|
||||||
import org.jclouds.vsphere.Datacenter;
|
import org.jclouds.vi.Datacenter;
|
||||||
import org.jclouds.vsphere.Image;
|
import org.jclouds.vi.Image;
|
||||||
|
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
|
@ -1,151 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* 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.vsphere.compute.domain;
|
|
||||||
|
|
||||||
import static org.jclouds.vsphere.ViConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.rmi.RemoteException;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import javax.inject.Named;
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.xpath.XPathExpressionException;
|
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
|
||||||
import org.apache.commons.io.filefilter.WildcardFileFilter;
|
|
||||||
import org.jclouds.Constants;
|
|
||||||
import org.jclouds.compute.ComputeServiceAdapter;
|
|
||||||
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
|
||||||
import org.jclouds.compute.domain.Hardware;
|
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
|
||||||
import org.jclouds.compute.domain.TemplateBuilder;
|
|
||||||
import org.jclouds.compute.suppliers.DefaultLocationSupplier;
|
|
||||||
import org.jclouds.domain.Location;
|
|
||||||
import org.jclouds.rest.annotations.Provider;
|
|
||||||
import org.jclouds.vsphere.Datacenter;
|
|
||||||
import org.jclouds.vsphere.Image;
|
|
||||||
import org.jclouds.vsphere.compute.functions.DatacenterToLocation;
|
|
||||||
import org.jclouds.vsphere.compute.functions.ViImageToImage;
|
|
||||||
import org.jclouds.vsphere.compute.functions.VirtualMachineToHardware;
|
|
||||||
import org.jclouds.vsphere.compute.functions.VirtualMachineToNodeMetadata;
|
|
||||||
import org.jclouds.vsphere.compute.strategy.ViComputeServiceAdapter;
|
|
||||||
import org.xml.sax.InputSource;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.base.Supplier;
|
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
import com.google.common.io.Files;
|
|
||||||
import com.google.inject.Injector;
|
|
||||||
import com.google.inject.Key;
|
|
||||||
import com.google.inject.Provides;
|
|
||||||
import com.google.inject.TypeLiteral;
|
|
||||||
import com.google.inject.name.Names;
|
|
||||||
import com.jamesmurty.utils.XMLBuilder;
|
|
||||||
import com.vmware.vim25.mo.ServiceInstance;
|
|
||||||
import com.vmware.vim25.mo.VirtualMachine;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
public class ViComputeServiceContextModule extends
|
|
||||||
StandaloneComputeServiceContextModule<VirtualMachine, VirtualMachine, Image, Datacenter> {
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
super.configure();
|
|
||||||
bind(new TypeLiteral<ComputeServiceAdapter<VirtualMachine, VirtualMachine, Image, Datacenter>>() {
|
|
||||||
}).to(ViComputeServiceAdapter.class);
|
|
||||||
bind(new TypeLiteral<Supplier<Location>>() {
|
|
||||||
}).to(DefaultLocationSupplier.class);
|
|
||||||
bind(new TypeLiteral<Function<VirtualMachine, NodeMetadata>>() {
|
|
||||||
}).to(VirtualMachineToNodeMetadata.class);
|
|
||||||
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
|
|
||||||
}).to(ViImageToImage.class);
|
|
||||||
bind(new TypeLiteral<Function<VirtualMachine, Hardware>>() {
|
|
||||||
}).to(VirtualMachineToHardware.class);
|
|
||||||
bind(new TypeLiteral<Function<Datacenter, Location>>() {
|
|
||||||
}).to(DatacenterToLocation.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
protected ServiceInstance createConnection(@Provider URI endpoint, @Named(Constants.PROPERTY_IDENTITY) String identity,
|
|
||||||
@Named(Constants.PROPERTY_CREDENTIAL) String credential) throws RemoteException, MalformedURLException {
|
|
||||||
System.out.println(endpoint);
|
|
||||||
System.out.println(identity);
|
|
||||||
System.out.println(credential);
|
|
||||||
return new ServiceInstance(endpoint.toURL(), identity, credential, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) {
|
|
||||||
String domainDir = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_LIBVIRT_DOMAIN_DIR)));
|
|
||||||
String hardwareId = searchForHardwareIdInDomainDir(domainDir);
|
|
||||||
String image = searchForImageIdInDomainDir(domainDir);
|
|
||||||
return template.hardwareId(hardwareId).imageId(image) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String searchForImageIdInDomainDir(String domainDir) {
|
|
||||||
// TODO
|
|
||||||
return "1";
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private String searchForHardwareIdInDomainDir(String domainDir) {
|
|
||||||
|
|
||||||
Collection<File> xmlDomains = FileUtils.listFiles( new File(domainDir), new WildcardFileFilter("*.xml"), null);
|
|
||||||
String uuid = "";
|
|
||||||
try {
|
|
||||||
String fromXML = Files.toString(Iterables.get(xmlDomains, 0), Charsets.UTF_8);
|
|
||||||
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(fromXML)));
|
|
||||||
uuid = builder.xpathFind("/domain/uuid").getElement().getTextContent();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (ParserConfigurationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (SAXException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (XPathExpressionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Map<String, URI> regions = newLinkedHashMap();
|
|
||||||
for (String region : Splitter.on(',').split(regionString)) {
|
|
||||||
regions.put(
|
|
||||||
region,
|
|
||||||
URI.create(injector.getInstance(Key.get(String.class,
|
|
||||||
Names.named(Constants.PROPERTY_ENDPOINT + "." + region)))));
|
|
||||||
}
|
|
||||||
return regions;
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.vmware.vim25.mo.ServiceInstance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author andrea.turli
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class ViComputeServiceContextBuilderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanBuildWithContextSpec() {
|
||||||
|
ComputeServiceContext context = new ComputeServiceContextFactory().createContext(new ViComputeServiceContextSpec(
|
||||||
|
"https://localhost/sdk", "Administrator", "password"));
|
||||||
|
context.getComputeService().listNodes();
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanBuildWithRestProperties() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("vi.contextbuilder", ViComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("vi.propertiesbuilder", ViPropertiesBuilder.class.getName());
|
||||||
|
restProperties.setProperty("vi.endpoint", "https://localhost/sdk");
|
||||||
|
|
||||||
|
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("vi",
|
||||||
|
"identity", "credential");
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProviderSpecificContextIsCorrectType() {
|
||||||
|
ComputeServiceContext context = new ViComputeServiceContextBuilder(new Properties()).buildComputeServiceContext();
|
||||||
|
RestContext<ServiceInstance, ServiceInstance> providerContext = context.getProviderSpecificContext();
|
||||||
|
|
||||||
|
assertEquals(providerContext.getApi().getClass(), ServiceInstance.class);
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
|
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jclouds.compute.BaseComputeServiceLiveTest;
|
||||||
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
|
import org.jclouds.compute.domain.OsFamily;
|
||||||
|
import org.jclouds.compute.domain.Template;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.vmware.vim25.mo.ServiceInstance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", enabled = true, sequential = true, testName = "vi.ViComputeServiceLiveTest")
|
||||||
|
public class ViComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
||||||
|
public ViComputeServiceLiveTest() {
|
||||||
|
provider = "vi";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Properties getRestProperties() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("vi.contextbuilder", ViComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("vi.propertiesbuilder", ViPropertiesBuilder.class.getName());
|
||||||
|
restProperties.setProperty("vi.endpoint", "https://localhost/sdk");
|
||||||
|
return restProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTemplateBuilder() {
|
||||||
|
Template defaultTemplate = client.templateBuilder().build();
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "5.3");
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
|
||||||
|
assertEquals(defaultTemplate.getLocation().getId(), "1");
|
||||||
|
assertEquals(getCores(defaultTemplate.getHardware()), 0.5d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected JschSshClientModule getSshModule() {
|
||||||
|
return new JschSshClientModule();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAssignability() throws Exception {
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
RestContext<ServiceInstance, ServiceInstance> goGridContext = new ComputeServiceContextFactory().createContext(
|
||||||
|
provider, identity, credential).getProviderSpecificContext();
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jclouds.vsphere.compute;
|
package org.jclouds.vi.compute;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.Template;
|
import org.jclouds.compute.domain.Template;
|
||||||
import org.jclouds.vsphere.compute.ViComputeServiceContextSpec;
|
import org.jclouds.vi.compute.ViComputeServiceContextSpec;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
package org.jclouds.vsphere.compute;
|
|
||||||
|
|
||||||
import static org.testng.Assert.assertNotNull;
|
|
||||||
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceContext;
|
|
||||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
|
||||||
import org.jclouds.vsphere.compute.ViComputeServiceContextBuilder;
|
|
||||||
import org.jclouds.vsphere.compute.ViComputeServiceContextSpec;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author andrea.turli
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Test(groups = "unit")
|
|
||||||
public class ViComputeServiceContextBuilderTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateContextModule() {
|
|
||||||
assertNotNull(new ViComputeServiceContextBuilder(new Properties()).createContextModule());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCanBuildWithComputeService() {
|
|
||||||
ComputeServiceContext context = new ComputeServiceContextFactory()
|
|
||||||
.createContext(new ViComputeServiceContextSpec("https://localhost/sdk", "Administrator", "password"));
|
|
||||||
context.getComputeService().listNodes();
|
|
||||||
context.close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -22,63 +22,24 @@ package org.jclouds.servermanager.compute;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceAdapter;
|
|
||||||
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
||||||
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
import org.jclouds.servermanager.ServerManager;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.servermanager.compute.config.ServerManagerComputeServiceContextModule;
|
||||||
import org.jclouds.compute.suppliers.DefaultLocationSupplier;
|
|
||||||
import org.jclouds.domain.Location;
|
|
||||||
import org.jclouds.servermanager.Datacenter;
|
|
||||||
import org.jclouds.servermanager.Hardware;
|
|
||||||
import org.jclouds.servermanager.Image;
|
|
||||||
import org.jclouds.servermanager.Server;
|
|
||||||
import org.jclouds.servermanager.compute.functions.DatacenterToLocation;
|
|
||||||
import org.jclouds.servermanager.compute.functions.ServerManagerHardwareToHardware;
|
|
||||||
import org.jclouds.servermanager.compute.functions.ServerManagerImageToImage;
|
|
||||||
import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata;
|
|
||||||
import org.jclouds.servermanager.compute.strategy.ServerManagerComputeServiceAdapter;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.base.Supplier;
|
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.google.inject.TypeLiteral;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class ServerManagerComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder {
|
public class ServerManagerComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<ServerManager> {
|
||||||
|
|
||||||
public ServerManagerComputeServiceContextBuilder(Properties props) {
|
public ServerManagerComputeServiceContextBuilder(Properties props) {
|
||||||
super(props);
|
super(ServerManager.class, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addContextModule(List<Module> modules) {
|
protected void addContextModule(List<Module> modules) {
|
||||||
modules.add(createContextModule());
|
modules.add(new ServerManagerComputeServiceContextModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static StandaloneComputeServiceContextModule<Server, Hardware, Image, Datacenter> createContextModule() {
|
|
||||||
return new StandaloneComputeServiceContextModule<Server, Hardware, Image, Datacenter>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
super.configure();
|
|
||||||
bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Image, Datacenter>>() {
|
|
||||||
}).to(ServerManagerComputeServiceAdapter.class);
|
|
||||||
bind(new TypeLiteral<Supplier<Location>>() {
|
|
||||||
}).to(DefaultLocationSupplier.class);
|
|
||||||
bind(new TypeLiteral<Function<Server, NodeMetadata>>() {
|
|
||||||
}).to(ServerToNodeMetadata.class);
|
|
||||||
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
|
|
||||||
}).to(ServerManagerImageToImage.class);
|
|
||||||
bind(new TypeLiteral<Function<Hardware, org.jclouds.compute.domain.Hardware>>() {
|
|
||||||
}).to(ServerManagerHardwareToHardware.class);
|
|
||||||
bind(new TypeLiteral<Function<Datacenter, Location>>() {
|
|
||||||
}).to(DatacenterToLocation.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.servermanager.compute.config;
|
||||||
|
|
||||||
|
import org.jclouds.compute.ComputeServiceAdapter;
|
||||||
|
import org.jclouds.compute.config.StandaloneComputeServiceContextModule;
|
||||||
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
|
import org.jclouds.compute.suppliers.DefaultLocationSupplier;
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.servermanager.Datacenter;
|
||||||
|
import org.jclouds.servermanager.Hardware;
|
||||||
|
import org.jclouds.servermanager.Image;
|
||||||
|
import org.jclouds.servermanager.Server;
|
||||||
|
import org.jclouds.servermanager.compute.functions.DatacenterToLocation;
|
||||||
|
import org.jclouds.servermanager.compute.functions.ServerManagerHardwareToHardware;
|
||||||
|
import org.jclouds.servermanager.compute.functions.ServerManagerImageToImage;
|
||||||
|
import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata;
|
||||||
|
import org.jclouds.servermanager.compute.strategy.ServerManagerComputeServiceAdapter;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class ServerManagerComputeServiceContextModule extends
|
||||||
|
StandaloneComputeServiceContextModule<Server, Hardware, Image, Datacenter> {
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
super.configure();
|
||||||
|
bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Image, Datacenter>>() {
|
||||||
|
}).to(ServerManagerComputeServiceAdapter.class);
|
||||||
|
bind(new TypeLiteral<Supplier<Location>>() {
|
||||||
|
}).to(DefaultLocationSupplier.class);
|
||||||
|
bind(new TypeLiteral<Function<Server, NodeMetadata>>() {
|
||||||
|
}).to(ServerToNodeMetadata.class);
|
||||||
|
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
|
||||||
|
}).to(ServerManagerImageToImage.class);
|
||||||
|
bind(new TypeLiteral<Function<Hardware, org.jclouds.compute.domain.Hardware>>() {
|
||||||
|
}).to(ServerManagerHardwareToHardware.class);
|
||||||
|
bind(new TypeLiteral<Function<Datacenter, Location>>() {
|
||||||
|
}).to(DatacenterToLocation.class);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,16 +1,37 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.servermanager.compute;
|
package org.jclouds.servermanager.compute;
|
||||||
|
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceContext;
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
import org.jclouds.compute.StandaloneComputeServiceContextSpec;
|
import org.jclouds.compute.StandaloneComputeServiceContextSpec;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
import org.jclouds.servermanager.Datacenter;
|
import org.jclouds.servermanager.Datacenter;
|
||||||
import org.jclouds.servermanager.Hardware;
|
import org.jclouds.servermanager.Hardware;
|
||||||
import org.jclouds.servermanager.Image;
|
import org.jclouds.servermanager.Image;
|
||||||
import org.jclouds.servermanager.Server;
|
import org.jclouds.servermanager.Server;
|
||||||
|
import org.jclouds.servermanager.ServerManager;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
@ -24,11 +45,6 @@ import com.google.inject.Module;
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit")
|
||||||
public class ServerManagerComputeServiceContextBuilderTest {
|
public class ServerManagerComputeServiceContextBuilderTest {
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateContextModule() {
|
|
||||||
assertNotNull(ServerManagerComputeServiceContextBuilder.createContextModule());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCanBuildDirectly() {
|
public void testCanBuildDirectly() {
|
||||||
ComputeServiceContext context = new ServerManagerComputeServiceContextBuilder(new Properties())
|
ComputeServiceContext context = new ServerManagerComputeServiceContextBuilder(new Properties())
|
||||||
|
@ -37,13 +53,37 @@ public class ServerManagerComputeServiceContextBuilderTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCanBuildWithComputeService() {
|
public void testCanBuildWithContextSpec() {
|
||||||
ComputeServiceContext context = new ComputeServiceContextFactory()
|
ComputeServiceContext context = new ComputeServiceContextFactory()
|
||||||
.createContext(new StandaloneComputeServiceContextSpec<Server, Hardware, Image, Datacenter>(
|
.createContext(new StandaloneComputeServiceContextSpec<ServerManager, Server, Hardware, Image, Datacenter>(
|
||||||
"servermanager", "http://host", "1", "identity", "credential",
|
"servermanager", "http://host", "1", "identity", "credential", ServerManager.class,
|
||||||
ServerManagerComputeServiceContextBuilder.createContextModule(), ImmutableSet.<Module> of()));
|
ServerManagerComputeServiceContextBuilder.class, ImmutableSet.<Module> of()));
|
||||||
|
|
||||||
context.close();
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanBuildWithRestProperties() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("servermanager.contextbuilder",
|
||||||
|
ServerManagerComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("servermanager.endpoint", "http://host");
|
||||||
|
restProperties.setProperty("servermanager.apiversion", "1");
|
||||||
|
|
||||||
|
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("servermanager",
|
||||||
|
"identity", "credential");
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProviderSpecificContextIsCorrectType() {
|
||||||
|
ComputeServiceContext context = new ServerManagerComputeServiceContextBuilder(new Properties())
|
||||||
|
.buildComputeServiceContext();
|
||||||
|
RestContext<ServerManager, ServerManager> providerContext = context.getProviderSpecificContext();
|
||||||
|
|
||||||
|
assertEquals(providerContext.getApi().getClass(), ServerManager.class);
|
||||||
|
|
||||||
|
context.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
package org.jclouds.servermanager.compute;
|
||||||
|
|
||||||
|
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jclouds.compute.BaseComputeServiceLiveTest;
|
||||||
|
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||||
|
import org.jclouds.compute.domain.OsFamily;
|
||||||
|
import org.jclouds.compute.domain.Template;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.jclouds.servermanager.ServerManager;
|
||||||
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", enabled = true, sequential = true, testName = "servermanager.ServerManagerComputeServiceLiveTest")
|
||||||
|
public class ServerManagerComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
||||||
|
public ServerManagerComputeServiceLiveTest() {
|
||||||
|
provider = "servermanager";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Properties getRestProperties() {
|
||||||
|
Properties restProperties = new Properties();
|
||||||
|
restProperties.setProperty("servermanager.contextbuilder",
|
||||||
|
ServerManagerComputeServiceContextBuilder.class.getName());
|
||||||
|
restProperties.setProperty("servermanager.endpoint", "http://host");
|
||||||
|
restProperties.setProperty("servermanager.apiversion", "1");
|
||||||
|
return restProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTemplateBuilder() {
|
||||||
|
Template defaultTemplate = client.templateBuilder().build();
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "5.3");
|
||||||
|
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
|
||||||
|
assertEquals(defaultTemplate.getLocation().getId(), "1");
|
||||||
|
assertEquals(getCores(defaultTemplate.getHardware()), 0.5d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected JschSshClientModule getSshModule() {
|
||||||
|
return new JschSshClientModule();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAssignability() throws Exception {
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
RestContext<ServerManager, ServerManager> goGridContext = new ComputeServiceContextFactory().createContext(
|
||||||
|
provider, identity, credential).getProviderSpecificContext();
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,6 +28,7 @@ import org.jclouds.servermanager.Datacenter;
|
||||||
import org.jclouds.servermanager.Hardware;
|
import org.jclouds.servermanager.Hardware;
|
||||||
import org.jclouds.servermanager.Image;
|
import org.jclouds.servermanager.Image;
|
||||||
import org.jclouds.servermanager.Server;
|
import org.jclouds.servermanager.Server;
|
||||||
|
import org.jclouds.servermanager.ServerManager;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -59,9 +60,9 @@ public class ServerManagerExperimentLiveTest {
|
||||||
ComputeServiceContext context = null;
|
ComputeServiceContext context = null;
|
||||||
try {
|
try {
|
||||||
context = new ComputeServiceContextFactory()
|
context = new ComputeServiceContextFactory()
|
||||||
.createContext(new StandaloneComputeServiceContextSpec<Server, Hardware, Image, Datacenter>(
|
.createContext(new StandaloneComputeServiceContextSpec<ServerManager, Server, Hardware, Image, Datacenter>(
|
||||||
"servermanager", endpoint, apiversion, identity, credential,
|
"servermanager", endpoint, apiversion, identity, credential, ServerManager.class,
|
||||||
ServerManagerComputeServiceContextBuilder.createContextModule(), ImmutableSet.<Module> of()));
|
ServerManagerComputeServiceContextBuilder.class, ImmutableSet.<Module> of()));
|
||||||
|
|
||||||
context.getComputeService().listNodes();
|
context.getComputeService().listNodes();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue