added better logging to softlayer tests

This commit is contained in:
Adrian Cole 2011-10-03 16:36:49 -07:00
parent d5e243f396
commit 98b28d7873
5 changed files with 163 additions and 104 deletions

View File

@ -36,10 +36,9 @@ import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* Converts a ProductOrder into a json string * Converts a ProductOrder into a json string valid for placing an order via the softlayer api The
* valid for placing an order via the softlayer api * String is set into the payload of the HttpRequest
* The String is set into the payload of the HttpRequest *
*
* @author Jason King * @author Jason King
*/ */
public class ProductOrderToJson implements Binder { public class ProductOrderToJson implements Binder {
@ -53,7 +52,7 @@ public class ProductOrderToJson implements Binder {
@Override @Override
public <R extends HttpRequest> R bindToRequest(R request, Object input) { public <R extends HttpRequest> R bindToRequest(R request, Object input) {
checkNotNull(input,"order"); checkNotNull(input, "order");
ProductOrder order = ProductOrder.class.cast(input); ProductOrder order = ProductOrder.class.cast(input);
request.setPayload(buildJson(order)); request.setPayload(buildJson(order));
return request; return request;
@ -61,34 +60,34 @@ public class ProductOrderToJson implements Binder {
/** /**
* Builds a Json string suitable for sending to the softlayer api * Builds a Json string suitable for sending to the softlayer api
*
* @param order * @param order
* @return * @return
*/ */
String buildJson(ProductOrder order) { String buildJson(ProductOrder order) {
Iterable<Price> prices = Iterables.transform(order.getPrices(), Iterable<Price> prices = Iterables.transform(order.getPrices(), new Function<ProductItemPrice, Price>() {
new Function<ProductItemPrice,Price>() { @Override
@Override public Price apply(ProductItemPrice productItemPrice) {
public Price apply(ProductItemPrice productItemPrice) { return new Price(productItemPrice.getId());
return new Price(productItemPrice.getId()); }
} });
});
Iterable<HostnameAndDomain> hosts = Iterables.transform(order.getVirtualGuests(), Iterable<HostnameAndDomain> hosts = Iterables.transform(order.getVirtualGuests(),
new Function<VirtualGuest,HostnameAndDomain>() { new Function<VirtualGuest, HostnameAndDomain>() {
@Override @Override
public HostnameAndDomain apply(VirtualGuest virtualGuest) { public HostnameAndDomain apply(VirtualGuest virtualGuest) {
return new HostnameAndDomain(virtualGuest.getHostname(),virtualGuest.getDomain()); return new HostnameAndDomain(virtualGuest.getHostname(), virtualGuest.getDomain());
} }
}); });
OrderData data = new OrderData(order.getPackageId(),order.getLocation(), OrderData data = new OrderData(order.getPackageId(), order.getLocation(), Sets.newLinkedHashSet(prices), Sets
Sets.newLinkedHashSet(prices),Sets.newLinkedHashSet(hosts), .newLinkedHashSet(hosts), order.getQuantity(), order.getUseHourlyPricing());
order.getQuantity(),order.getUseHourlyPricing());
return json.toJson(ImmutableMap.of("parameters", ImmutableList.<OrderData>of(data))); return json.toJson(ImmutableMap.of("parameters", ImmutableList.<OrderData> of(data)));
} }
@SuppressWarnings("unused")
private static class OrderData { private static class OrderData {
private String complexType = "SoftLayer_Container_Product_Order_Virtual_Guest"; private String complexType = "SoftLayer_Container_Product_Order_Virtual_Guest";
private long packageId = -1; private long packageId = -1;
@ -98,30 +97,31 @@ public class ProductOrderToJson implements Binder {
private long quantity; private long quantity;
private boolean useHourlyPricing; private boolean useHourlyPricing;
public OrderData( long packageId, String location, public OrderData(long packageId, String location, Set<Price> prices, Set<HostnameAndDomain> virtualGuests,
Set<Price> prices,Set<HostnameAndDomain> virtualGuests, long quantity, boolean useHourlyPricing) {
long quantity, boolean useHourlyPricing ) {
this.packageId = packageId; this.packageId = packageId;
this.location = location; this.location = location;
this.prices = prices; this.prices = prices;
this.virtualGuests = virtualGuests; this.virtualGuests = virtualGuests;
this.quantity = quantity; this.quantity = quantity;
this.useHourlyPricing = useHourlyPricing; this.useHourlyPricing = useHourlyPricing;
} }
} }
@SuppressWarnings("unused")
private static class HostnameAndDomain { private static class HostnameAndDomain {
private String hostname; private String hostname;
private String domain; private String domain;
public HostnameAndDomain(String hostname,String domain) { public HostnameAndDomain(String hostname, String domain) {
this.hostname = hostname; this.hostname = hostname;
this.domain = domain; this.domain = domain;
} }
} }
@SuppressWarnings("unused")
private static class Price { private static class Price {
private long id; private long id;

View File

@ -20,7 +20,6 @@ package org.jclouds.softlayer.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.parseGroupFromName; import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
import static org.jclouds.softlayer.compute.functions.ProductItemsToHardware.CORE_SPEED;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -28,11 +27,13 @@ import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import org.jclouds.collect.FindResourceInSet; import org.jclouds.collect.FindResourceInSet;
import org.jclouds.collect.Memoized; import org.jclouds.collect.Memoized;
import org.jclouds.compute.domain.*; import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.http.HttpResponseException; import org.jclouds.http.HttpResponseException;
@ -41,12 +42,14 @@ import org.jclouds.softlayer.domain.Datacenter;
import org.jclouds.softlayer.domain.ProductItem; import org.jclouds.softlayer.domain.ProductItem;
import org.jclouds.softlayer.domain.ProductOrder; import org.jclouds.softlayer.domain.ProductOrder;
import org.jclouds.softlayer.domain.VirtualGuest; import org.jclouds.softlayer.domain.VirtualGuest;
import org.jclouds.softlayer.predicates.ProductItemPredicates;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import org.jclouds.softlayer.predicates.ProductItemPredicates; import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -56,7 +59,7 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
public static final Map<VirtualGuest.State, NodeState> serverStateToNodeState = ImmutableMap public static final Map<VirtualGuest.State, NodeState> serverStateToNodeState = ImmutableMap
.<VirtualGuest.State, NodeState> builder().put(VirtualGuest.State.HALTED, NodeState.PENDING).put( .<VirtualGuest.State, NodeState> builder().put(VirtualGuest.State.HALTED, NodeState.PENDING).put(
VirtualGuest.State.PAUSED, NodeState.SUSPENDED).put(VirtualGuest.State.RUNNING, NodeState.RUNNING) VirtualGuest.State.PAUSED, NodeState.SUSPENDED).put(VirtualGuest.State.RUNNING, NodeState.RUNNING)
.put(VirtualGuest.State.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); .put(VirtualGuest.State.UNRECOGNIZED, NodeState.UNRECOGNIZED).build();
private final Map<String, Credentials> credentialStore; private final Map<String, Credentials> credentialStore;
@ -67,9 +70,7 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
@Inject @Inject
VirtualGuestToNodeMetadata(Map<String, Credentials> credentialStore, VirtualGuestToNodeMetadata(Map<String, Credentials> credentialStore,
FindLocationForVirtualGuest findLocationForVirtualGuest, FindLocationForVirtualGuest findLocationForVirtualGuest,
GetHardwareForVirtualGuest getHardwareForVirtualGuest, GetHardwareForVirtualGuest getHardwareForVirtualGuest, GetImageForVirtualGuest getImageForVirtualGuest) {
GetImageForVirtualGuest getImageForVirtualGuest
) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.findLocationForVirtualGuest = checkNotNull(findLocationForVirtualGuest, "findLocationForVirtualGuest"); this.findLocationForVirtualGuest = checkNotNull(findLocationForVirtualGuest, "findLocationForVirtualGuest");
this.getHardwareForVirtualGuest = checkNotNull(getHardwareForVirtualGuest, "getHardwareForVirtualGuest"); this.getHardwareForVirtualGuest = checkNotNull(getHardwareForVirtualGuest, "getHardwareForVirtualGuest");
@ -87,13 +88,14 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
builder.group(parseGroupFromName(from.getHostname())); builder.group(parseGroupFromName(from.getHostname()));
Image image = getImageForVirtualGuest.getImage(from); Image image = getImageForVirtualGuest.getImage(from);
if (image!=null) { if (image != null) {
builder.imageId(image.getId()); builder.imageId(image.getId());
builder.operatingSystem(image.getOperatingSystem()); builder.operatingSystem(image.getOperatingSystem());
} }
Hardware hardware = getHardwareForVirtualGuest.getHardware(from); Hardware hardware = getHardwareForVirtualGuest.getHardware(from);
if (hardware!=null) builder.hardware(hardware); if (hardware != null)
builder.hardware(hardware);
builder.state(serverStateToNodeState.get(from.getPowerState().getKeyName())); builder.state(serverStateToNodeState.get(from.getPowerState().getKeyName()));
@ -136,13 +138,14 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
public Hardware getHardware(VirtualGuest guest) { public Hardware getHardware(VirtualGuest guest) {
// 'bad' orders have no start cpu's and cause the order lookup to fail. // 'bad' orders have no start cpu's and cause the order lookup to fail.
if (guest.getStartCpus()<1) return null; if (guest.getStartCpus() < 1)
return null;
try { try {
ProductOrder order = client.getVirtualGuestClient().getOrderTemplate(guest.getId()); ProductOrder order = client.getVirtualGuestClient().getOrderTemplate(guest.getId());
Iterable<ProductItem> items = Iterables.transform(order.getPrices(),ProductItems.item()); Iterable<ProductItem> items = Iterables.transform(order.getPrices(), ProductItems.item());
return new ProductItemsToHardware().apply(Sets.newLinkedHashSet(items)); return new ProductItemsToHardware().apply(Sets.newLinkedHashSet(items));
} catch (HttpResponseException e) { } catch (HttpResponseException e) {
//Shouldn't happen any more - was blowing up in Singapore // Shouldn't happen any more - was blowing up in Singapore
return null; return null;
} }
} }
@ -160,14 +163,15 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
public Image getImage(VirtualGuest guest) { public Image getImage(VirtualGuest guest) {
// 'bad' orders have no start cpu's and cause the order lookup to fail. // 'bad' orders have no start cpu's and cause the order lookup to fail.
if (guest.getStartCpus()<1) return null; if (guest.getStartCpus() < 1)
return null;
try { try {
ProductOrder order = client.getVirtualGuestClient().getOrderTemplate(guest.getId()); ProductOrder order = client.getVirtualGuestClient().getOrderTemplate(guest.getId());
Iterable<ProductItem> items = Iterables.transform(order.getPrices(),ProductItems.item()); Iterable<ProductItem> items = Iterables.transform(order.getPrices(), ProductItems.item());
ProductItem os = Iterables.find(items, ProductItemPredicates.categoryCode("os")); ProductItem os = Iterables.find(items, ProductItemPredicates.categoryCode("os"));
return new ProductItemToImage().apply(os); return new ProductItemToImage().apply(os);
} catch (HttpResponseException e) { } catch (HttpResponseException e) {
//Shouldn't happen any more - was blowing up in Singapore // Shouldn't happen any more - was blowing up in Singapore
return null; return null;
} }
} }

View File

@ -18,13 +18,12 @@
*/ */
package org.jclouds.softlayer.domain; package org.jclouds.softlayer.domain;
import com.google.common.collect.ImmutableSet; import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.Sets;
import java.util.Set; import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.ImmutableSet;
import static com.google.common.base.Strings.emptyToNull; import com.google.common.collect.Sets;
/** /**
* *

View File

@ -18,20 +18,15 @@
*/ */
package org.jclouds.softlayer.compute; package org.jclouds.softlayer.compute;
import com.google.inject.Module;
import org.jclouds.compute.BaseComputeServiceLiveTest; import org.jclouds.compute.BaseComputeServiceLiveTest;
import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.compute.ComputeServiceContextFactory;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.domain.LocationScope;
import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContext;
import org.jclouds.softlayer.SoftLayerAsyncClient; import org.jclouds.softlayer.SoftLayerAsyncClient;
import org.jclouds.softlayer.SoftLayerClient; import org.jclouds.softlayer.SoftLayerClient;
import org.jclouds.sshj.config.SshjSshClientModule; import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.io.IOException; import com.google.inject.Module;
import static org.testng.Assert.assertEquals;
/** /**
* *

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- <!--
For more configuration infromation and examples see the Apache Log4j For more configuration infromation and examples see the Apache
website: http://logging.apache.org/log4j/ Log4j website: http://logging.apache.org/log4j/
--> -->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false"> debug="false">
<!-- A time/date based rolling appender --> <!-- A time/date based rolling appender -->
<appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender"> <appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
@ -19,72 +19,133 @@
<param name="Threshold" value="TRACE" /> <param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout"> <layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message${symbol_escape}n --> <!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" /> <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!-- <!--
The full pattern: Date MS Priority [Category] (Thread:NDC) Message${symbol_escape}n The full pattern: Date MS Priority [Category]
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) (Thread:NDC) Message\n <param name="ConversionPattern"
%m%n"/> value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
--> -->
</layout> </layout>
</appender> </appender>
<!-- A time/date based rolling appender --> <!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds.log" /> <param name="File" value="target/test-data/jclouds.log" />
<param name="Append" value="true" /> <param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- Rollover at midnight each day --> <!-- A time/date based rolling appender -->
<param name="DatePattern" value="'.'yyyy-MM-dd" /> <appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-compute.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="SSHFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-ssh.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="COMPUTEFILE" />
</appender>
<param name="Threshold" value="TRACE" /> <appender name="ASYNCSSH" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="SSHFILE" />
<layout class="org.apache.log4j.PatternLayout"> </appender>
<!-- The default pattern: Date Priority [Category] Message${symbol_escape}n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" /> <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="FILE" />
<!-- </appender>
The full pattern: Date MS Priority [Category] (Thread:NDC) Message${symbol_escape}n
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x)
%m%n"/>
-->
</layout>
</appender>
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender"> <appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="WIREFILE" /> <appender-ref ref="WIREFILE" />
</appender> </appender>
<!-- ================ --> <!-- ================ -->
<!-- Limit categories --> <!-- Limit categories -->
<!-- ================ --> <!-- ================ -->
<category name="org.jclouds"> <category name="org.jclouds">
<priority value="DEBUG" /> <priority value="DEBUG" />
<appender-ref ref="ASYNC" /> <appender-ref ref="ASYNC" />
</category> </category>
<category name="jclouds.headers"> <category name="jclouds.headers">
<priority value="DEBUG" /> <priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" /> <appender-ref ref="ASYNCWIRE" />
</category> </category>
<category name="jclouds.ssh">
<priority value="DEBUG" />
<appender-ref ref="ASYNCSSH" />
</category>
<category name="jclouds.wire"> <category name="jclouds.wire">
<priority value="DEBUG" /> <priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" /> <appender-ref ref="ASYNCWIRE" />
</category> </category>
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<root> <category name="jclouds.compute">
<priority value="WARN" /> <priority value="TRACE" />
</root> <appender-ref ref="ASYNCCOMPUTE" />
</category>
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<root>
<priority value="WARN" />
</root>
</log4j:configuration> </log4j:configuration>