diff --git a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSApi.java b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSApi.java index 7753a7ba87..647acd8432 100644 --- a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSApi.java +++ b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSApi.java @@ -36,6 +36,7 @@ import org.jclouds.ultradns.ws.features.ResourceRecordApi; import org.jclouds.ultradns.ws.features.RoundRobinPoolApi; import org.jclouds.ultradns.ws.features.TaskApi; import org.jclouds.ultradns.ws.features.TrafficControllerPoolApi; +import org.jclouds.ultradns.ws.features.TransactionApi; import org.jclouds.ultradns.ws.features.ZoneApi; import org.jclouds.ultradns.ws.filters.SOAPWrapWithPasswordAuth; import org.jclouds.ultradns.ws.xml.AccountHandler; @@ -127,4 +128,10 @@ public interface UltraDNSWSApi extends Closeable { */ @Delegate TaskApi getTaskApi(); + + /** + * Provides access to Transaction features. + */ + @Delegate + TransactionApi getTransactionApi(); } diff --git a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSExceptions.java b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSExceptions.java index 72afc867e2..08d7f795a1 100644 --- a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSExceptions.java +++ b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/UltraDNSWSExceptions.java @@ -18,6 +18,8 @@ */ package org.jclouds.ultradns.ws; +import org.jclouds.rest.InsufficientResourcesException; + /** * Exceptions likely to be encountered when using {@link UltraDNSWSApi} * @@ -46,4 +48,15 @@ public interface UltraDNSWSExceptions { super(message, cause); } } + + /** + * Error 9010: Ultra API only allows 3 concurrent transactions per user + */ + public static class TooManyTransactionsException extends InsufficientResourcesException { + private static final long serialVersionUID = 1L; + + public TooManyTransactionsException(String message, Throwable cause) { + super(message, cause); + } + } } diff --git a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/features/TransactionApi.java b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/features/TransactionApi.java new file mode 100644 index 0000000000..0a555eaab5 --- /dev/null +++ b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/features/TransactionApi.java @@ -0,0 +1,85 @@ +/** + * 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.ultradns.ws.features; + +import javax.inject.Named; +import javax.ws.rs.POST; + +import org.jclouds.Fallbacks.VoidOnNotFoundOr404; +import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.Payload; +import org.jclouds.rest.annotations.PayloadParam; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.VirtualHost; +import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.ultradns.ws.UltraDNSWSExceptions.TooManyTransactionsException; +import org.jclouds.ultradns.ws.filters.SOAPWrapWithPasswordAuth; +import org.jclouds.ultradns.ws.xml.ElementTextHandler; + +/** + * + * @see + * @see + * @author Adrian Cole + */ +@RequestFilters(SOAPWrapWithPasswordAuth.class) +@VirtualHost +public interface TransactionApi { + /** + * Starts a transaction, if possible. Note that 3 simultaneous ones are + * allowed per account, and they have a 1 hr timeout. All write commands will + * use this transaction until delete is called. + * + * @return id of the transaction created + * @throws TooManyTransactionsException + * if the maximum concurrent exception limit was hit. + */ + @Named("startTransaction") + @POST + @XMLResponseParser(ElementTextHandler.TransactionID.class) + @Payload("") + String start() throws TooManyTransactionsException; + + /** + * This request commits all of a transaction’s requests and writes them to + * the Neustar Ultra Services + * + * @param transactionID + * transaction id to commit. + * @throws ResourceNotFoundException + * if the transaction has already been committed or never existed. + */ + @Named("commitTransaction") + @POST + @Payload("{transactionID}") + void commit(@PayloadParam("transactionID") String transactionID) throws ResourceNotFoundException; + + /** + * This request rolls back any changes included in a transaction. This will + * not error, if the transaction has timed out or does not exist. + * + * @param transactionID + * transaction id to rollback. + */ + @Named("rollbackTransaction") + @POST + @Payload("{transactionID}") + @Fallback(VoidOnNotFoundOr404.class) + void rollback(@PayloadParam("transactionID") String transactionID); +} diff --git a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandler.java b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandler.java index 647db520b0..7aa7e49d1c 100644 --- a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandler.java +++ b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandler.java @@ -33,6 +33,7 @@ import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.ultradns.ws.UltraDNSWSError; import org.jclouds.ultradns.ws.UltraDNSWSExceptions.DirectionalGroupOverlapException; import org.jclouds.ultradns.ws.UltraDNSWSExceptions.ResourceAlreadyExistsException; +import org.jclouds.ultradns.ws.UltraDNSWSExceptions.TooManyTransactionsException; import org.jclouds.ultradns.ws.UltraDNSWSResponseException; import org.jclouds.ultradns.ws.xml.UltraWSExceptionHandler; @@ -79,6 +80,10 @@ public class UltraDNSWSErrorHandler implements HttpErrorHandler { */ static final class ErrorCodes { static final int UNKNOWN = 0; + /** + * No transaction with Id Y found for the user Y + */ + static final int TX_NOT_FOUND = 1602; /** * Zone does not exist in the system. */ @@ -131,6 +136,10 @@ public class UltraDNSWSErrorHandler implements HttpErrorHandler { * Geolocation/Source IP overlap(s) found */ static final int DIRECTIONALPOOL_OVERLAP = 7021; + /** + * Ultra API only allows 3 concurrent transactions per user + */ + static final int EXCEEDED_TX_LIMIT = 9010; } private Exception refineException(UltraDNSWSResponseException exception) { @@ -141,6 +150,7 @@ public class UltraDNSWSErrorHandler implements HttpErrorHandler { return exception; if (exception.getError().getDescription().get().indexOf("Cannot find") == -1) return exception; + case ErrorCodes.TX_NOT_FOUND: case ErrorCodes.ZONE_NOT_FOUND: case ErrorCodes.RESOURCE_RECORD_NOT_FOUND: case ErrorCodes.ACCOUNT_NOT_FOUND: @@ -157,6 +167,8 @@ public class UltraDNSWSErrorHandler implements HttpErrorHandler { return new ResourceAlreadyExistsException(message, exception); case ErrorCodes.DIRECTIONALPOOL_OVERLAP: return new DirectionalGroupOverlapException(message, exception); + case ErrorCodes.EXCEEDED_TX_LIMIT: + return new TooManyTransactionsException(message, exception); } return exception; } diff --git a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/xml/ElementTextHandler.java b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/xml/ElementTextHandler.java index 66fc90ca83..392d3b94b1 100644 --- a/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/xml/ElementTextHandler.java +++ b/providers/ultradns-ws/src/main/java/org/jclouds/ultradns/ws/xml/ElementTextHandler.java @@ -66,6 +66,12 @@ public abstract class ElementTextHandler extends ParseSax.HandlerForGeneratedReq } } + public static class TransactionID extends ElementTextHandler { + public TransactionID() { + super("transactionId"); + } + } + private final String textElement; private StringBuilder currentText = new StringBuilder(); diff --git a/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/features/TransactionApiExpectTest.java b/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/features/TransactionApiExpectTest.java new file mode 100644 index 0000000000..59019672a1 --- /dev/null +++ b/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/features/TransactionApiExpectTest.java @@ -0,0 +1,99 @@ +/** + * 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.ultradns.ws.features; +import static com.google.common.net.HttpHeaders.HOST; +import static javax.ws.rs.HttpMethod.POST; +import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static javax.ws.rs.core.Response.Status.OK; +import static org.testng.Assert.assertEquals; + +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.ultradns.ws.UltraDNSWSApi; +import org.jclouds.ultradns.ws.UltraDNSWSExceptions.TooManyTransactionsException; +import org.jclouds.ultradns.ws.internal.BaseUltraDNSWSApiExpectTest; +import org.testng.annotations.Test; +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "TransactionApiExpectTest") +public class TransactionApiExpectTest extends BaseUltraDNSWSApiExpectTest { + HttpRequest start = HttpRequest.builder().method(POST) + .endpoint("https://ultra-api.ultradns.com:8443/UltraDNS_WS/v01") + .addHeader(HOST, "ultra-api.ultradns.com:8443") + .payload(payloadFromResourceWithContentType("/start_tx.xml", "application/xml")).build(); + + HttpResponse startResponse = HttpResponse.builder().statusCode(OK.getStatusCode()) + .payload(payloadFromResourceWithContentType("/tx_started.xml", "application/xml")).build(); + + public void testStartWhenResponseIs2xx() { + UltraDNSWSApi success = requestSendsResponse(start, startResponse); + + assertEquals(success.getTransactionApi().start().toString(), "jclouds-37562"); + } + + HttpResponse tooManyResponse = HttpResponse.builder().message("Server Error").statusCode(INTERNAL_SERVER_ERROR.getStatusCode()) + .payload(payloadFromResource("/tx_toomany.xml")).build(); + + @Test(expectedExceptions = TooManyTransactionsException.class, expectedExceptionsMessageRegExp = "Ultra API only allows 3 concurrent transactions per user") + public void testStartWhenResponseError9010() { + UltraDNSWSApi tooMany = requestSendsResponse(start, tooManyResponse); + tooMany.getTransactionApi().start(); + } + + HttpRequest commit = HttpRequest.builder().method(POST) + .endpoint("https://ultra-api.ultradns.com:8443/UltraDNS_WS/v01") + .addHeader(HOST, "ultra-api.ultradns.com:8443") + .payload(payloadFromResourceWithContentType("/commit_tx.xml", "application/xml")).build(); + + HttpResponse commitResponse = HttpResponse.builder().statusCode(OK.getStatusCode()) + .payload(payloadFromResourceWithContentType("/tx_committed.xml", "application/xml")).build(); + + public void testCommitWhenResponseIs2xx() { + UltraDNSWSApi success = requestSendsResponse(commit, commitResponse); + success.getTransactionApi().commit("jclouds-37562"); + } + + HttpResponse txDoesntExist = HttpResponse.builder().message("Server Error").statusCode(INTERNAL_SERVER_ERROR.getStatusCode()) + .payload(payloadFromResource("/tx_doesnt_exist.xml")).build(); + + @Test(expectedExceptions = ResourceNotFoundException.class, expectedExceptionsMessageRegExp = "No transaction with Id AAAAAAAAAAAAAAAA found for the user .*") + public void testCommitWhenResponseError1602() { + UltraDNSWSApi notFound = requestSendsResponse(commit, txDoesntExist); + notFound.getTransactionApi().commit("jclouds-37562"); + } + + HttpRequest rollback = HttpRequest.builder().method(POST) + .endpoint("https://ultra-api.ultradns.com:8443/UltraDNS_WS/v01") + .addHeader(HOST, "ultra-api.ultradns.com:8443") + .payload(payloadFromResourceWithContentType("/rollback_tx.xml", "application/xml")).build(); + + HttpResponse rollbackResponse = HttpResponse.builder().statusCode(OK.getStatusCode()) + .payload(payloadFromResourceWithContentType("/tx_rolledback.xml", "application/xml")).build(); + + public void testRollbackWhenResponseIs2xx() { + UltraDNSWSApi success = requestSendsResponse(rollback, rollbackResponse); + success.getTransactionApi().rollback("jclouds-37562"); + } + + public void testRollbackWhenResponseError1602IsOK() { + UltraDNSWSApi notFound = requestSendsResponse(rollback, txDoesntExist); + notFound.getTransactionApi().rollback("jclouds-37562"); + } +} diff --git a/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/features/TransactionApiLiveTest.java b/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/features/TransactionApiLiveTest.java new file mode 100644 index 0000000000..74d89736dd --- /dev/null +++ b/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/features/TransactionApiLiveTest.java @@ -0,0 +1,78 @@ +/** + * 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.ultradns.ws.features; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.List; + +import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.ultradns.ws.UltraDNSWSExceptions.TooManyTransactionsException; +import org.jclouds.ultradns.ws.internal.BaseUltraDNSWSApiLiveTest; +import org.testng.annotations.Test; + +import com.google.common.collect.Lists; + +/** + * @author Adrian Cole + */ +@Test(groups = "live", singleThreaded = true, testName = "TransactionApiLiveTest") +public class TransactionApiLiveTest extends BaseUltraDNSWSApiLiveTest { + + @Test + public void commitTransaction() { + String tx = api().start(); + assertNotNull(tx); + api().commit(tx); + } + + @Test + public void rollbackTransaction() { + String tx = api().start(); + assertNotNull(tx); + api().rollback(tx); + } + + @Test(expectedExceptions = TooManyTransactionsException.class, expectedExceptionsMessageRegExp = "Ultra API only allows 3 concurrent transactions per user") + public void only3Transactions() { + List txIds = Lists.newArrayList(); + try { + while (true) + txIds.add(api().start()); + } finally { + for (String tx : txIds) + api().rollback(tx); + assertEquals(txIds.size(), 3); + } + } + + @Test(expectedExceptions = ResourceNotFoundException.class, expectedExceptionsMessageRegExp = "No transaction with Id AAAAAAAAAAAAAAAA found for the user .*") + public void commitTransactionWhenNotFound() { + api().commit("AAAAAAAAAAAAAAAA"); + } + + @Test + public void testRollbackTransactionWhenNotFound() { + api().rollback("AAAAAAAAAAAAAAAA"); + } + + protected TransactionApi api() { + return api.getTransactionApi(); + } +} diff --git a/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandlerTest.java b/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandlerTest.java index 91d3c946a2..dc544da61e 100644 --- a/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandlerTest.java +++ b/providers/ultradns-ws/src/test/java/org/jclouds/ultradns/ws/handlers/UltraDNSWSErrorHandlerTest.java @@ -35,6 +35,7 @@ import org.jclouds.io.Payload; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.ultradns.ws.UltraDNSWSExceptions.DirectionalGroupOverlapException; import org.jclouds.ultradns.ws.UltraDNSWSExceptions.ResourceAlreadyExistsException; +import org.jclouds.ultradns.ws.UltraDNSWSExceptions.TooManyTransactionsException; import org.jclouds.ultradns.ws.UltraDNSWSResponseException; import org.testng.annotations.Test; @@ -364,6 +365,54 @@ public class UltraDNSWSErrorHandlerTest { assertEquals(exception.getError().getCode(), 2705); } + @Test + public void testCode1602SetsResourceNotFoundException() throws IOException { + HttpRequest request = HttpRequest.builder().method(POST) + .endpoint("https://ultra-api.ultradns.com:8443/UltraDNS_WS/v01") + .addHeader(HOST, "ultra-api.ultradns.com:8443") + .payload(payloadFromResource("/delete_directionalrecord.xml")).build(); + HttpCommand command = new HttpCommand(request); + HttpResponse response = HttpResponse.builder() + .message(INTERNAL_SERVER_ERROR.getReasonPhrase()) + .statusCode(INTERNAL_SERVER_ERROR.getStatusCode()) + .payload(payloadFromResource("/tx_doesnt_exist.xml")).build(); + + function.handleError(command, response); + + assertEquals(command.getException().getClass(), ResourceNotFoundException.class); + assertEquals(command.getException().getMessage(), "No transaction with Id AAAAAAAAAAAAAAAA found for the user jclouds"); + + UltraDNSWSResponseException exception = UltraDNSWSResponseException.class.cast(command.getException().getCause()); + + assertEquals(exception.getMessage(), "Error 1602: No transaction with Id AAAAAAAAAAAAAAAA found for the user jclouds"); + assertEquals(exception.getError().getDescription().get(), "No transaction with Id AAAAAAAAAAAAAAAA found for the user jclouds"); + assertEquals(exception.getError().getCode(), 1602); + } + + @Test + public void testCode9010SetsTooManyTransactionsException() throws IOException { + HttpRequest request = HttpRequest.builder().method(POST) + .endpoint("https://ultra-api.ultradns.com:8443/UltraDNS_WS/v01") + .addHeader(HOST, "ultra-api.ultradns.com:8443") + .payload(payloadFromResource("/create_directionalrecord_newgroup.xml")).build(); + HttpCommand command = new HttpCommand(request); + HttpResponse response = HttpResponse.builder() + .message(INTERNAL_SERVER_ERROR.getReasonPhrase()) + .statusCode(INTERNAL_SERVER_ERROR.getStatusCode()) + .payload(payloadFromResource("/tx_toomany.xml")).build(); + + function.handleError(command, response); + + assertEquals(command.getException().getClass(), TooManyTransactionsException.class); + assertEquals(command.getException().getMessage(), "Ultra API only allows 3 concurrent transactions per user"); + + UltraDNSWSResponseException exception = UltraDNSWSResponseException.class.cast(command.getException().getCause()); + + assertEquals(exception.getMessage(), "Error 9010: Ultra API only allows 3 concurrent transactions per user"); + assertEquals(exception.getError().getDescription().get(), "Ultra API only allows 3 concurrent transactions per user"); + assertEquals(exception.getError().getCode(), 9010); + } + @Test public void testCode7021SetsDirectionalGroupOverlapException() throws IOException { HttpRequest request = HttpRequest.builder().method(POST) diff --git a/providers/ultradns-ws/src/test/resources/commit_tx.xml b/providers/ultradns-ws/src/test/resources/commit_tx.xml new file mode 100644 index 0000000000..3db768cf57 --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/commit_tx.xml @@ -0,0 +1 @@ +identitycredentialjclouds-37562 \ No newline at end of file diff --git a/providers/ultradns-ws/src/test/resources/rollback_tx.xml b/providers/ultradns-ws/src/test/resources/rollback_tx.xml new file mode 100644 index 0000000000..188f37bc3f --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/rollback_tx.xml @@ -0,0 +1 @@ +identitycredentialjclouds-37562 \ No newline at end of file diff --git a/providers/ultradns-ws/src/test/resources/start_tx.xml b/providers/ultradns-ws/src/test/resources/start_tx.xml new file mode 100644 index 0000000000..58929f31a2 --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/start_tx.xml @@ -0,0 +1 @@ +identitycredential \ No newline at end of file diff --git a/providers/ultradns-ws/src/test/resources/tx_committed.xml b/providers/ultradns-ws/src/test/resources/tx_committed.xml new file mode 100644 index 0000000000..d5e5196ba5 --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/tx_committed.xml @@ -0,0 +1,8 @@ + + + + Successful + + + diff --git a/providers/ultradns-ws/src/test/resources/tx_doesnt_exist.xml b/providers/ultradns-ws/src/test/resources/tx_doesnt_exist.xml new file mode 100644 index 0000000000..4f5266912f --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/tx_doesnt_exist.xml @@ -0,0 +1,16 @@ + + + + soap:Server + Fault occurred while processing. + + + 1602 + No transaction with Id AAAAAAAAAAAAAAAA found for the user jclouds + + + + + diff --git a/providers/ultradns-ws/src/test/resources/tx_rolledback.xml b/providers/ultradns-ws/src/test/resources/tx_rolledback.xml new file mode 100644 index 0000000000..7fd4515737 --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/tx_rolledback.xml @@ -0,0 +1,8 @@ + + + + Successful + + + diff --git a/providers/ultradns-ws/src/test/resources/tx_started.xml b/providers/ultradns-ws/src/test/resources/tx_started.xml new file mode 100644 index 0000000000..375ac0e25a --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/tx_started.xml @@ -0,0 +1,8 @@ + + + + jclouds-37562 + + + diff --git a/providers/ultradns-ws/src/test/resources/tx_toomany.xml b/providers/ultradns-ws/src/test/resources/tx_toomany.xml new file mode 100644 index 0000000000..229e1812a5 --- /dev/null +++ b/providers/ultradns-ws/src/test/resources/tx_toomany.xml @@ -0,0 +1,16 @@ + + + + soap:Server + Fault occurred while processing. + + + 9010 + Ultra API only allows 3 concurrent transactions per user + + + + +