From 6e781152954975a8e929576c6e4af49738cf35ea Mon Sep 17 00:00:00 2001 From: Andrea Turli Date: Mon, 11 Nov 2013 17:38:33 +0100 Subject: [PATCH] JCLOUDS-373: Fix VirtualGuestToNodeMetadata when server returns SoftLayer_Exception_Order_Item_Duplicate * Wrap getOrderTemplate in VirtualGuestToNodeMetadata.getImage with try/catch * Address comments from @nacx and @demobox: - remove the fields of the custom SoftLayerOrderItemDuplicateException and propagate the HttpResponseException - use of order = null instead of return null - extend RuntimeException instead IllegalStateException in SoftLayerOrderItemDuplicateException --- .../functions/VirtualGuestToNodeMetadata.java | 19 +++++++++++++- .../SoftLayerOrderItemDuplicateException.java | 25 +++++++++++++++++++ .../handlers/SoftLayerErrorHandler.java | 3 +++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 providers/softlayer/src/main/java/org/jclouds/softlayer/exceptions/SoftLayerOrderItemDuplicateException.java diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java index 1d2f961b33..6527985303 100644 --- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java +++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java @@ -22,7 +22,9 @@ import static com.google.common.collect.FluentIterable.from; import java.util.Map; import java.util.Set; +import javax.annotation.Resource; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.collect.Memoized; @@ -32,12 +34,17 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata.Status; import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.functions.GroupNamingConvention; +import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; +import org.jclouds.http.HttpCommand; +import org.jclouds.http.HttpResponseException; import org.jclouds.location.predicates.LocationPredicates; +import org.jclouds.logging.Logger; import org.jclouds.softlayer.SoftLayerClient; import org.jclouds.softlayer.domain.ProductItem; import org.jclouds.softlayer.domain.ProductOrder; import org.jclouds.softlayer.domain.VirtualGuest; +import org.jclouds.softlayer.exceptions.SoftLayerOrderItemDuplicateException; import org.jclouds.softlayer.predicates.ProductItemPredicates; import com.google.common.base.Function; @@ -129,6 +136,10 @@ public class VirtualGuestToNodeMetadata implements Function items = Iterables.transform(order.getPrices(), ProductItems.item()); diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/exceptions/SoftLayerOrderItemDuplicateException.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/exceptions/SoftLayerOrderItemDuplicateException.java new file mode 100644 index 0000000000..a08a61b84d --- /dev/null +++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/exceptions/SoftLayerOrderItemDuplicateException.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.softlayer.exceptions; + +public class SoftLayerOrderItemDuplicateException extends RuntimeException { + + public SoftLayerOrderItemDuplicateException(String message, Exception exception) { + super(message, exception); + } + +} diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java index f6459618cd..1d708a14ec 100644 --- a/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java +++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java @@ -26,6 +26,7 @@ import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponseException; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.softlayer.exceptions.SoftLayerOrderItemDuplicateException; import org.jclouds.util.Strings2; import com.google.common.base.Throwables; @@ -64,6 +65,8 @@ public class SoftLayerErrorHandler implements HttpErrorHandler { exception = new ResourceNotFoundException(message, exception); } else if (message.indexOf("currently an active transaction") != -1) { exception = new IllegalStateException(message, exception); + } else if (message.indexOf("SoftLayer_Exception_Order_Item_Duplicate") != -1) { + exception = new SoftLayerOrderItemDuplicateException(message, exception); } } }