diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApi.java index fcf67780fb..19119f4f38 100644 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApi.java +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApi.java @@ -18,24 +18,34 @@ */ package org.jclouds.dynect.v3; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; + import java.io.Closeable; +import javax.inject.Named; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import org.jclouds.Fallbacks.NullOnNotFoundOr404; import org.jclouds.dynect.v3.domain.Job; import org.jclouds.dynect.v3.features.RecordApi; import org.jclouds.dynect.v3.features.SessionApi; import org.jclouds.dynect.v3.features.ZoneApi; +import org.jclouds.dynect.v3.filters.AlwaysAddContentType; +import org.jclouds.dynect.v3.filters.SessionManager; import org.jclouds.javax.annotation.Nullable; import org.jclouds.rest.annotations.Delegate; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.Headers; +import org.jclouds.rest.annotations.RequestFilters; /** * Provides access to DynECT Managed DNS through the API2 api *

* - * @see DynECTAsyncApi - * @see + * @see * @author Adrian Cole */ public interface DynECTApi extends Closeable { @@ -46,8 +56,15 @@ public interface DynECTApi extends Closeable { * The ID of the job * @return null, if not found */ + @Named("GetJob") + @GET + @Path("/Job/{jobId}") + @RequestFilters({ AlwaysAddContentType.class, SessionManager.class }) + @Headers(keys = "API-Version", values = "{jclouds.api-version}") + @Fallback(NullOnNotFoundOr404.class) + @Consumes(APPLICATION_JSON) @Nullable - Job getJob(long jobId); + Job getJob(@PathParam("jobId") long jobId); /** * Provides synchronous access to Session features. @@ -60,7 +77,7 @@ public interface DynECTApi extends Closeable { */ @Delegate ZoneApi getZoneApi(); - + /** * Provides synchronous access to Record features */ diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApiMetadata.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApiMetadata.java index 89be1afb5b..614d7faa4b 100644 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApiMetadata.java +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTApiMetadata.java @@ -23,8 +23,8 @@ import java.util.Properties; import org.jclouds.apis.ApiMetadata; import org.jclouds.dynect.v3.config.DynECTParserModule; -import org.jclouds.dynect.v3.config.DynECTRestClientModule; -import org.jclouds.rest.internal.BaseRestApiMetadata; +import org.jclouds.dynect.v3.config.DynECTHttpApiModule; +import org.jclouds.rest.internal.BaseHttpApiMetadata; import com.google.common.collect.ImmutableSet; import com.google.inject.Module; @@ -34,10 +34,8 @@ import com.google.inject.Module; * * @author Adrian Cole */ -public class DynECTApiMetadata extends BaseRestApiMetadata { +public class DynECTApiMetadata extends BaseHttpApiMetadata { - public static final String ANONYMOUS_IDENTITY = "ANONYMOUS"; - @Override public Builder toBuilder() { return new Builder().fromApiMetadata(this); @@ -52,27 +50,24 @@ public class DynECTApiMetadata extends BaseRestApiMetadata { } public static Properties defaultProperties() { - Properties properties = BaseRestApiMetadata.defaultProperties(); + Properties properties = BaseHttpApiMetadata.defaultProperties(); return properties; } - public static class Builder extends BaseRestApiMetadata.Builder { + public static class Builder extends BaseHttpApiMetadata.Builder { protected Builder() { - super(DynECTApi.class, DynECTAsyncApi.class); id("dynect") .name("DynECT API2") - .identityName("Username (or " + ANONYMOUS_IDENTITY + " if anonymous)") - .defaultIdentity(ANONYMOUS_IDENTITY) - .credentialName("Password") - .defaultCredential(ANONYMOUS_IDENTITY) + .identityName("${customer}:${userName}") + .credentialName("${password}") .documentation(URI.create("https://manage.dynect.net/help/docs/api2/rest/")) .version("3.3.8") .defaultEndpoint("https://api2.dynect.net/REST") .defaultProperties(DynECTApiMetadata.defaultProperties()) .defaultModules(ImmutableSet.>builder() .add(DynECTParserModule.class) - .add(DynECTRestClientModule.class).build()); + .add(DynECTHttpApiModule.class).build()); } @Override diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTAsyncApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTAsyncApi.java deleted file mode 100644 index 14f86b234f..0000000000 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/DynECTAsyncApi.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.dynect.v3; - -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; - -import java.io.Closeable; - -import javax.inject.Named; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; - -import org.jclouds.Fallbacks.NullOnNotFoundOr404; -import org.jclouds.dynect.v3.domain.Job; -import org.jclouds.dynect.v3.features.RecordAsyncApi; -import org.jclouds.dynect.v3.features.SessionAsyncApi; -import org.jclouds.dynect.v3.features.ZoneAsyncApi; -import org.jclouds.dynect.v3.filters.AlwaysAddContentType; -import org.jclouds.dynect.v3.filters.SessionManager; -import org.jclouds.rest.annotations.Delegate; -import org.jclouds.rest.annotations.Fallback; -import org.jclouds.rest.annotations.Headers; -import org.jclouds.rest.annotations.RequestFilters; - -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Provides access to DynECT Managed DNS through the API2 api - *

- * - * @see DynECTApi - * @see - * @author Adrian Cole - * @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(DynECTApi.class)} as - * {@link DynECTAsyncApi} interface will be removed in jclouds 1.7. - */ - -public interface DynECTAsyncApi extends Closeable { - /** - * @see DynECTApi#getJob - */ - @Named("GetJob") - @GET - @Path("/Job/{jobId}") - @RequestFilters({ AlwaysAddContentType.class, SessionManager.class }) - @Headers(keys = "API-Version", values = "{jclouds.api-version}") - @Fallback(NullOnNotFoundOr404.class) - @Consumes(APPLICATION_JSON) - ListenableFuture getJob(@PathParam("jobId") long jobId); - - /** - * Provides asynchronous access to Session features. - */ - @Delegate - SessionAsyncApi getSessionApi(); - - /** - * Provides asynchronous access to Zone features. - */ - @Delegate - ZoneAsyncApi getZoneApi(); - - /** - * Provides asynchronous access to Record features - */ - @Delegate - RecordAsyncApi getRecordApiForZone(@PathParam("zone") String zone); -} diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/binders/CreateRecordBinder.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/binders/CreateRecordBinder.java new file mode 100644 index 0000000000..6efd16b65d --- /dev/null +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/binders/CreateRecordBinder.java @@ -0,0 +1,55 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.dynect.v3.binders; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.http.Uris.uriBuilder; + +import java.net.URI; + +import javax.inject.Inject; + +import org.jclouds.dynect.v3.domain.CreateRecord; +import org.jclouds.http.HttpRequest; +import org.jclouds.json.Json; +import org.jclouds.rest.Binder; + +import com.google.common.collect.ImmutableMap; + +public class CreateRecordBinder implements Binder { + private final Json json; + + @Inject + CreateRecordBinder(Json json){ + this.json = checkNotNull(json, "json"); + } + + @SuppressWarnings("unchecked") + @Override + public R bindToRequest(R request, Object arg) { + CreateRecord in = CreateRecord.class.cast(checkNotNull(arg, "record to create")); + URI path = uriBuilder(request.getEndpoint()) + .build(ImmutableMap. builder() + .put("type", in.getType()) + .put("fqdn", in.getFQDN()).build()); + return (R) request.toBuilder() + .endpoint(path) + .payload(json.toJson(ImmutableMap.of("rdata", in.getRData(), "ttl", in.getTTL()))).build(); + } +} diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/binders/RecordIdBinder.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/binders/RecordIdBinder.java new file mode 100644 index 0000000000..e2ed0fe70c --- /dev/null +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/binders/RecordIdBinder.java @@ -0,0 +1,45 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.dynect.v3.binders; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.http.Uris.uriBuilder; + +import java.net.URI; + +import org.jclouds.dynect.v3.domain.RecordId; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.Binder; + +import com.google.common.collect.ImmutableMap; + +public class RecordIdBinder implements Binder { + @SuppressWarnings("unchecked") + @Override + public R bindToRequest(R request, Object recordId) { + RecordId valueToAppend = RecordId.class.cast(checkNotNull(recordId, "recordId")); + URI path = uriBuilder(request.getEndpoint()).appendPath("/{type}Record/{zone}/{fqdn}/{id}").build( + ImmutableMap. builder() + .put("type", valueToAppend.getType()) + .put("zone", valueToAppend.getZone()) + .put("fqdn", valueToAppend.getFQDN()) + .put("id", valueToAppend.getId()).build()); + return (R) request.toBuilder().endpoint(path).build(); + } +} \ No newline at end of file diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/config/DynECTRestClientModule.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/config/DynECTHttpApiModule.java similarity index 76% rename from providers/dynect/src/main/java/org/jclouds/dynect/v3/config/DynECTRestClientModule.java rename to providers/dynect/src/main/java/org/jclouds/dynect/v3/config/DynECTHttpApiModule.java index a56b23dcbc..a20c5ef97c 100644 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/config/DynECTRestClientModule.java +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/config/DynECTHttpApiModule.java @@ -19,13 +19,12 @@ package org.jclouds.dynect.v3.config; import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream; -import static org.jclouds.rest.config.BinderUtils.bindMappedHttpApi; +import static org.jclouds.rest.config.BinderUtils.bindHttpApi; import java.io.IOException; import java.net.HttpURLConnection; import java.net.Proxy; import java.net.URI; -import java.util.Map; import javax.inject.Inject; import javax.inject.Named; @@ -36,13 +35,7 @@ import javax.net.ssl.SSLContext; import org.jclouds.Constants; import org.jclouds.concurrent.SingleThreaded; import org.jclouds.dynect.v3.DynECTApi; -import org.jclouds.dynect.v3.DynECTAsyncApi; -import org.jclouds.dynect.v3.features.RecordApi; -import org.jclouds.dynect.v3.features.RecordAsyncApi; import org.jclouds.dynect.v3.features.SessionApi; -import org.jclouds.dynect.v3.features.SessionAsyncApi; -import org.jclouds.dynect.v3.features.ZoneApi; -import org.jclouds.dynect.v3.features.ZoneAsyncApi; import org.jclouds.dynect.v3.filters.SessionManager; import org.jclouds.dynect.v3.handlers.DynECTErrorHandler; import org.jclouds.dynect.v3.handlers.GetJobRedirectionRetryHandler; @@ -60,12 +53,11 @@ import org.jclouds.http.handlers.RedirectionRetryHandler; import org.jclouds.http.internal.HttpWire; import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService; import org.jclouds.io.ContentMetadataCodec; -import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.rest.config.RestClientModule; +import org.jclouds.rest.ConfiguresHttpApi; +import org.jclouds.rest.config.HttpApiModule; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.ListeningExecutorService; /** @@ -73,18 +65,12 @@ import com.google.common.util.concurrent.ListeningExecutorService; * * @author Adrian Cole */ -@ConfiguresRestClient +@ConfiguresHttpApi // only one job at a time or error "This session already has a job running" @SingleThreaded -public class DynECTRestClientModule extends RestClientModule { +public class DynECTHttpApiModule extends HttpApiModule { - public static final Map, Class> DELEGATE_MAP = ImmutableMap., Class> builder() - .put(SessionApi.class, SessionAsyncApi.class) - .put(ZoneApi.class, ZoneAsyncApi.class) - .put(RecordApi.class, RecordAsyncApi.class).build(); - - public DynECTRestClientModule() { - super(DELEGATE_MAP); + public DynECTHttpApiModule() { } @Override @@ -105,16 +91,15 @@ public class DynECTRestClientModule extends RestClientModule list() throws JobStillRunningException; /** - * Retrieves a list of resource record ids for all records of the fqdn in the given zone + * Retrieves a list of resource record ids for all records of the fqdn in the + * given zone * * @throws JobStillRunningException * if a different job in the session is still running */ - FluentIterable listByFQDN(String fqdn) throws JobStillRunningException; + @Named("GetRecord") + @GET + @Path("/AllRecord/{zone}/{fqdn}") + @ResponseParser(ToRecordIds.class) + @Fallback(EmptyFluentIterableOnNotFoundOr404.class) + FluentIterable listByFQDN(@PathParam("fqdn") String fqdn) throws JobStillRunningException; /** - * Retrieves a list of resource record ids for all records of the fqdn and type in the given zone + * Retrieves a list of resource record ids for all records of the fqdn and + * type in the given zone * * @throws JobStillRunningException * if a different job in the session is still running */ - FluentIterable listByFQDNAndType(String fqdn, String type) throws JobStillRunningException; + @Named("GetRecord") + @GET + @Path("/{type}Record/{zone}/{fqdn}") + @ResponseParser(ToRecordIds.class) + @Fallback(EmptyFluentIterableOnNotFoundOr404.class) + FluentIterable listByFQDNAndType(@PathParam("fqdn") String fqdn, @PathParam("type") String type) + throws JobStillRunningException; /** - * Schedules addition of a new record into the current session. Calling {@link ZoneApi#publish(String)} will publish - * the zone, creating the record. + * Schedules addition of a new record into the current session. Calling + * {@link ZoneApi#publish(String)} will publish the zone, creating the + * record. * * @param newRecord * record to create @@ -79,20 +123,31 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Job scheduleCreate(CreateRecord newRecord) throws JobStillRunningException; + @Named("CreateRecord") + @POST + @Path("/{type}Record/{zone}/{fqdn}") + @Consumes(APPLICATION_JSON) + @Produces(APPLICATION_JSON) + Job scheduleCreate(@BinderParam(CreateRecordBinder.class) CreateRecord newRecord) throws JobStillRunningException; /** - * Schedules deletion of a record into the current session. Calling {@link ZoneApi#publish(String)} will publish the - * changes, deleting the record. + * Schedules deletion of a record into the current session. Calling + * {@link ZoneApi#publish(String)} will publish the changes, deleting the + * record. * * @param recordId * record to delete - * @return job relating to the scheduled deletion or null, if the record never existed. + * @return job relating to the scheduled deletion or null, if the record + * never existed. * @throws JobStillRunningException * if a different job in the session is still running */ @Nullable - Job scheduleDelete(RecordId recordId) throws JobStillRunningException; + @Named("DeleteRecord") + @DELETE + @Fallback(NullOnNotFoundOr404.class) + @Consumes(APPLICATION_JSON) + Job scheduleDelete(@BinderParam(RecordIdBinder.class) RecordId recordId) throws JobStillRunningException; /** * retrieves a resource record without regard to type @@ -101,7 +156,13 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record> get(RecordId recordId) throws JobStillRunningException; + @Named("GetRecord") + @GET + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record> get(@BinderParam(RecordIdBinder.class) RecordId recordId) + throws JobStillRunningException; /** * Gets the {@link AAAARecord} or null if not present. @@ -114,7 +175,14 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getAAAA(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetAAAARecord") + @GET + @Path("/AAAARecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getAAAA(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; /** * Gets the {@link ARecord} or null if not present. @@ -127,7 +195,13 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getA(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetARecord") + @GET + @Path("/ARecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getA(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; /** * Gets the {@link CNAMERecord} or null if not present. @@ -140,7 +214,14 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getCNAME(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetCNAMERecord") + @GET + @Path("/CNAMERecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getCNAME(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; /** * Gets the {@link MXRecord} or null if not present. @@ -153,7 +234,13 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getMX(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetMXRecord") + @GET + @Path("/MXRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getMX(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; /** * Gets the {@link NSRecord} or null if not present. @@ -166,7 +253,13 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getNS(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetNSRecord") + @GET + @Path("/NSRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getNS(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; /** * Gets the {@link PTRRecord} or null if not present. @@ -179,7 +272,14 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getPTR(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetPTRRecord") + @GET + @Path("/PTRRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getPTR(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; /** * Gets the {@link SOARecord} or null if not present. @@ -192,7 +292,13 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - SOARecord getSOA(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetSOARecord") + @GET + @Path("/SOARecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + SOARecord getSOA(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; /** * Gets the {@link SPFRecord} or null if not present. @@ -205,7 +311,14 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getSPF(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetSPFRecord") + @GET + @Path("/SPFRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getSPF(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; /** * Gets the {@link SRVRecord} or null if not present. @@ -218,7 +331,14 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getSRV(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetSRVRecord") + @GET + @Path("/SRVRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getSRV(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; /** * Gets the {@link SSHFPRecord} or null if not present. @@ -231,7 +351,14 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getSSHFP(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetSSHFPRecord") + @GET + @Path("/SSHFPRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getSSHFP(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; /** * Gets the {@link TXTRecord} or null if not present. @@ -244,5 +371,12 @@ public interface RecordApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Record getTXT(String fqdn, long recordId) throws JobStillRunningException; + @Named("GetTXTRecord") + @GET + @Path("/TXTRecord/{zone}/{fqdn}/{id}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Record getTXT(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) + throws JobStillRunningException; } \ No newline at end of file diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/RecordAsyncApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/RecordAsyncApi.java deleted file mode 100644 index b6badf12cc..0000000000 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/RecordAsyncApi.java +++ /dev/null @@ -1,291 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds licenses this file - * to you under the Apache License, String 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.dynect.v3.features; - -import static com.google.common.base.Preconditions.checkNotNull; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static org.jclouds.http.Uris.uriBuilder; - -import java.net.URI; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; - -import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404; -import org.jclouds.Fallbacks.NullOnNotFoundOr404; -import org.jclouds.dynect.v3.DynECTExceptions.JobStillRunningException; -import org.jclouds.dynect.v3.domain.CreateRecord; -import org.jclouds.dynect.v3.domain.Job; -import org.jclouds.dynect.v3.domain.Record; -import org.jclouds.dynect.v3.domain.RecordId; -import org.jclouds.dynect.v3.domain.SOARecord; -import org.jclouds.dynect.v3.domain.rdata.AAAAData; -import org.jclouds.dynect.v3.domain.rdata.AData; -import org.jclouds.dynect.v3.domain.rdata.CNAMEData; -import org.jclouds.dynect.v3.domain.rdata.MXData; -import org.jclouds.dynect.v3.domain.rdata.NSData; -import org.jclouds.dynect.v3.domain.rdata.PTRData; -import org.jclouds.dynect.v3.domain.rdata.SPFData; -import org.jclouds.dynect.v3.domain.rdata.SRVData; -import org.jclouds.dynect.v3.domain.rdata.SSHFPData; -import org.jclouds.dynect.v3.domain.rdata.TXTData; -import org.jclouds.dynect.v3.filters.AlwaysAddContentType; -import org.jclouds.dynect.v3.filters.SessionManager; -import org.jclouds.dynect.v3.functions.ToRecordIds; -import org.jclouds.http.HttpRequest; -import org.jclouds.json.Json; -import org.jclouds.rest.Binder; -import org.jclouds.rest.annotations.BinderParam; -import org.jclouds.rest.annotations.Fallback; -import org.jclouds.rest.annotations.Headers; -import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.rest.annotations.ResponseParser; -import org.jclouds.rest.annotations.SelectJson; - -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableMap; -import com.google.common.util.concurrent.ListenableFuture; - -/** - * - * @see RecordApi - * @see doc - * @author Adrian Cole - */ -@Headers(keys = "API-Version", values = "{jclouds.api-version}") -@RequestFilters({ AlwaysAddContentType.class, SessionManager.class }) -public interface RecordAsyncApi { - - /** - * @see RecordApi#list - */ - @Named("GetAllRecord") - @GET - @Path("/AllRecord/{zone}") - @ResponseParser(ToRecordIds.class) - ListenableFuture> list() throws JobStillRunningException; - - /** - * @see RecordApi#listByFQDN - */ - @Named("GetRecord") - @GET - @Path("/AllRecord/{zone}/{fqdn}") - @ResponseParser(ToRecordIds.class) - @Fallback(EmptyFluentIterableOnNotFoundOr404.class) - ListenableFuture> listByFQDN(@PathParam("fqdn") String fqdn) - throws JobStillRunningException; - - /** - * @see RecordApi#listByFQDNAndType - */ - @Named("GetRecord") - @GET - @Path("/{type}Record/{zone}/{fqdn}") - @ResponseParser(ToRecordIds.class) - @Fallback(EmptyFluentIterableOnNotFoundOr404.class) - ListenableFuture> listByFQDNAndType(@PathParam("fqdn") String fqdn, - @PathParam("type") String type) throws JobStillRunningException; - - /** - * @see RecordApi#scheduleCreate - */ - @Named("CreateRecord") - @POST - @Path("/{type}Record/{zone}/{fqdn}") - @Consumes(APPLICATION_JSON) - @Produces(APPLICATION_JSON) - ListenableFuture scheduleCreate(@BinderParam(CreateRecordBinder.class) CreateRecord newRecord) - throws JobStillRunningException; - - static class CreateRecordBinder implements Binder { - private final Json json; - - @Inject - CreateRecordBinder(Json json){ - this.json = checkNotNull(json, "json"); - } - - @SuppressWarnings("unchecked") - @Override - public R bindToRequest(R request, Object arg) { - CreateRecord in = CreateRecord.class.cast(checkNotNull(arg, "record to create")); - URI path = uriBuilder(request.getEndpoint()) - .build(ImmutableMap. builder() - .put("type", in.getType()) - .put("fqdn", in.getFQDN()).build()); - return (R) request.toBuilder() - .endpoint(path) - .payload(json.toJson(ImmutableMap.of("rdata", in.getRData(), "ttl", in.getTTL()))).build(); - } - } - - /** - * @see RecordApi#scheduleDelete - */ - @Named("DeleteRecord") - @DELETE - @Fallback(NullOnNotFoundOr404.class) - @Consumes(APPLICATION_JSON) - ListenableFuture scheduleDelete(@BinderParam(RecordIdBinder.class) RecordId recordId) throws JobStillRunningException; - - /** - * @see RecordApi#get - */ - @Named("GetRecord") - @GET - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture>> get(@BinderParam(RecordIdBinder.class) RecordId recordId) throws JobStillRunningException; - - static class RecordIdBinder implements Binder { - @SuppressWarnings("unchecked") - @Override - public R bindToRequest(R request, Object recordId) { - RecordId valueToAppend = RecordId.class.cast(checkNotNull(recordId, "recordId")); - URI path = uriBuilder(request.getEndpoint()) - .appendPath("/{type}Record/{zone}/{fqdn}/{id}") - .build(ImmutableMap. builder() - .put("type", valueToAppend.getType()) - .put("zone", valueToAppend.getZone()) - .put("fqdn", valueToAppend.getFQDN()) - .put("id", valueToAppend.getId()).build()); - return (R) request.toBuilder().endpoint(path).build(); - } - } - - /** - * @see RecordApi#getAAAA - */ - @Named("GetAAAARecord") - @GET - @Path("/AAAARecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getAAAA(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getA - */ - @Named("GetARecord") - @GET - @Path("/ARecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getA(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getCNAME - */ - @Named("GetCNAMERecord") - @GET - @Path("/CNAMERecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getCNAME(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getMX - */ - @Named("GetMXRecord") - @GET - @Path("/MXRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getMX(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getNS - */ - @Named("GetNSRecord") - @GET - @Path("/NSRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getNS(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getPTR - */ - @Named("GetPTRRecord") - @GET - @Path("/PTRRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getPTR(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getSOA - */ - @Named("GetSOARecord") - @GET - @Path("/SOARecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture getSOA(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getSPF - */ - @Named("GetSPFRecord") - @GET - @Path("/SPFRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getSPF(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getSRV - */ - @Named("GetSRVRecord") - @GET - @Path("/SRVRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getSRV(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getSSHFP - */ - @Named("GetSSHFPRecord") - @GET - @Path("/SSHFPRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getSSHFP(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; - - /** - * @see RecordApi#getTXT - */ - @Named("GetTXTRecord") - @GET - @Path("/TXTRecord/{zone}/{fqdn}/{id}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture> getTXT(@PathParam("fqdn") String fqdn, @PathParam("id") long recordId) throws JobStillRunningException; -} diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionApi.java index fc6fcf2816..ce0505b2df 100644 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionApi.java +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionApi.java @@ -18,21 +18,46 @@ */ package org.jclouds.dynect.v3.features; +import javax.inject.Named; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +import org.jclouds.dynect.v3.DynECTFallbacks.FalseOn400; import org.jclouds.dynect.v3.domain.Session; import org.jclouds.dynect.v3.domain.SessionCredentials; +import org.jclouds.dynect.v3.filters.AlwaysAddContentType; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.Headers; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.SelectJson; +import org.jclouds.rest.binders.BindToJsonPayload; /** - * @see SessionAsyncApi * @see * @author Adrian Cole */ +@Headers(keys = "API-Version", values = "{jclouds.api-version}") +@Path("/Session") +@RequestFilters(AlwaysAddContentType.class) public interface SessionApi { - Session login(SessionCredentials credentials); + @Named("POST:Session") + @POST + @SelectJson("data") + Session login(@BinderParam(BindToJsonPayload.class) SessionCredentials credentials); - boolean isValid(String token); + @Named("GET:Session") + @GET + @Fallback(FalseOn400.class) + boolean isValid(@HeaderParam("Auth-Token") String token); - void logout(String token); + @Named("DELETE:Session") + @DELETE + void logout(@HeaderParam("Auth-Token") String token); } \ No newline at end of file diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionAsyncApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionAsyncApi.java deleted file mode 100644 index 5eabd50f95..0000000000 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/SessionAsyncApi.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.dynect.v3.features; - -import javax.inject.Named; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; - -import org.jclouds.dynect.v3.DynECTFallbacks.FalseOn400; -import org.jclouds.dynect.v3.domain.Session; -import org.jclouds.dynect.v3.domain.SessionCredentials; -import org.jclouds.dynect.v3.filters.AlwaysAddContentType; -import org.jclouds.rest.annotations.BinderParam; -import org.jclouds.rest.annotations.Fallback; -import org.jclouds.rest.annotations.Headers; -import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.rest.annotations.SelectJson; -import org.jclouds.rest.binders.BindToJsonPayload; - -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Provides access to DynECT Managed DNS through the API2 api - *

- * - * @see SessionApi - * @see - * @author Adrian Cole - */ -@Headers(keys = "API-Version", values = "{jclouds.api-version}") -@Path("/Session") -@RequestFilters(AlwaysAddContentType.class) -public interface SessionAsyncApi { - - /** - * @see SessionApi#create - */ - @Named("POST:Session") - @POST - @SelectJson("data") - ListenableFuture login(@BinderParam(BindToJsonPayload.class) SessionCredentials credentials); - - /** - * @see SessionApi#isValid - */ - @Named("GET:Session") - @GET - @Fallback(FalseOn400.class) - ListenableFuture isValid(@HeaderParam("Auth-Token") String token); - - /** - * @see SessionApi#logout - */ - @Named("DELETE:Session") - @DELETE - ListenableFuture logout(@HeaderParam("Auth-Token") String token); -} diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneApi.java index 0ebde9fdc1..e90d1d4cef 100644 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneApi.java +++ b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneApi.java @@ -18,21 +18,49 @@ */ package org.jclouds.dynect.v3.features; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; + +import javax.inject.Named; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; + +import org.jclouds.Fallbacks.NullOnNotFoundOr404; import org.jclouds.dynect.v3.DynECTExceptions.JobStillRunningException; import org.jclouds.dynect.v3.DynECTExceptions.TargetExistsException; import org.jclouds.dynect.v3.domain.CreatePrimaryZone; +import org.jclouds.dynect.v3.domain.CreatePrimaryZone.ToFQDN; import org.jclouds.dynect.v3.domain.Job; import org.jclouds.dynect.v3.domain.Zone; import org.jclouds.dynect.v3.domain.Zone.SerialStyle; +import org.jclouds.dynect.v3.filters.AlwaysAddContentType; +import org.jclouds.dynect.v3.filters.SessionManager; +import org.jclouds.dynect.v3.functions.ExtractZoneNames; import org.jclouds.javax.annotation.Nullable; import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.Headers; +import org.jclouds.rest.annotations.ParamParser; +import org.jclouds.rest.annotations.Payload; +import org.jclouds.rest.annotations.PayloadParam; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.SelectJson; +import org.jclouds.rest.annotations.Transform; +import org.jclouds.rest.binders.BindToJsonPayload; import com.google.common.collect.FluentIterable; /** - * @see ZoneAsyncApi * @author Adrian Cole */ +@Headers(keys = "API-Version", values = "{jclouds.api-version}") +@RequestFilters({ AlwaysAddContentType.class, SessionManager.class }) public interface ZoneApi { /** * Lists all zone ids. @@ -40,11 +68,16 @@ public interface ZoneApi { * @throws JobStillRunningException * if a different job in the session is still running */ + @Named("ListZones") + @GET + @Path("/Zone") + @SelectJson("data") + @Transform(ExtractZoneNames.class) FluentIterable list() throws JobStillRunningException; /** - * Schedules addition of a new primary zone into the current session. Calling {@link ZoneApi#publish(String)} will - * publish the zone, creating the zone. + * Schedules addition of a new primary zone into the current session. Calling + * {@link ZoneApi#publish(String)} will publish the zone, creating the zone. * * @param zone * required parameters to create the zone. @@ -54,11 +87,18 @@ public interface ZoneApi { * @throws TargetExistsException * if the same fqdn exists */ - Job scheduleCreate(CreatePrimaryZone zone) throws JobStillRunningException, TargetExistsException; + @Named("CreatePrimaryZone") + @POST + @Path("/Zone/{fqdn}") + @Consumes(APPLICATION_JSON) + Job scheduleCreate( + @PathParam("fqdn") @ParamParser(ToFQDN.class) @BinderParam(BindToJsonPayload.class) CreatePrimaryZone createZone) + throws JobStillRunningException, TargetExistsException; /** - * Schedules addition of a new primary zone with one hour default TTL and {@link SerialStyle#INCREMENT} into the - * current session. Calling {@link ZoneApi#publish(String)} will publish the zone, creating the zone. + * Schedules addition of a new primary zone with one hour default TTL and + * {@link SerialStyle#INCREMENT} into the current session. Calling + * {@link ZoneApi#publish(String)} will publish the zone, creating the zone. * * @param fqdn * fqdn of the zone to create {@ex. jclouds.org} @@ -70,42 +110,65 @@ public interface ZoneApi { * @throws TargetExistsException * if the same fqdn exists */ - Job scheduleCreateWithContact(String fqdn, String contact) throws JobStillRunningException, TargetExistsException; + @Named("CreatePrimaryZone") + @POST + @Produces(APPLICATION_JSON) + @Payload("%7B\"rname\":\"{contact}\",\"serial_style\":\"increment\",\"ttl\":3600%7D") + @Path("/Zone/{fqdn}") + @Consumes(APPLICATION_JSON) + Job scheduleCreateWithContact(@PathParam("fqdn") String fqdn, @PayloadParam("contact") String contact) + throws JobStillRunningException, TargetExistsException; /** * Retrieves information about the specified zone. * * @param fqdn - * fqdn of the zone to get information about. ex {@code jclouds.org} + * fqdn of the zone to get information about. ex + * {@code jclouds.org} * @return null if not found * @throws JobStillRunningException * if a different job in the session is still running */ + @Named("GetZone") + @GET + @Path("/Zone/{fqdn}") + @SelectJson("data") + @Fallback(NullOnNotFoundOr404.class) @Nullable - Zone get(String fqdn) throws JobStillRunningException; + Zone get(@PathParam("fqdn") String fqdn) throws JobStillRunningException; /** - * Deletes the zone. No need to call @link ZoneApi#publish(String)}. + * Deletes the zone. No need to call @link ZoneApi#publish(String)}. * * @param fqdn * zone to delete - * @return job relating to the scheduled deletion or null, if the zone never existed. + * @return job relating to the scheduled deletion or null, if the zone never + * existed. * @throws JobStillRunningException * if a different job in the session is still running */ + @Named("DeleteZone") + @DELETE + @Path("/Zone/{fqdn}") + @Fallback(NullOnNotFoundOr404.class) + @Consumes(APPLICATION_JSON) @Nullable - Job delete(String fqdn) throws JobStillRunningException; + Job delete(@PathParam("fqdn") String fqdn) throws JobStillRunningException; /** - * Deletes changes to the specified zone that have been created during the current session but not yet published to - * the zone. + * Deletes changes to the specified zone that have been created during the + * current session but not yet published to the zone. * * @param fqdn * fqdn of the zone to delete changes from ex {@code jclouds.org} * @throws JobStillRunningException * if a different job in the session is still running */ - Job deleteChanges(String fqdn) throws JobStillRunningException; + @Named("DeleteZoneChanges") + @DELETE + @Path("/ZoneChanges/{fqdn}") + @Consumes(APPLICATION_JSON) + Job deleteChanges(@PathParam("fqdn") String fqdn) throws JobStillRunningException; /** * Publishes the current zone @@ -117,7 +180,13 @@ public interface ZoneApi { * @throws ResourceNotFoundException * if the zone doesn't exist */ - Zone publish(String fqdn) throws JobStillRunningException, ResourceNotFoundException; + @Named("PublishZone") + @PUT + @Path("/Zone/{fqdn}") + @Produces(APPLICATION_JSON) + @Payload("{\"publish\":true}") + @SelectJson("data") + Zone publish(@PathParam("fqdn") String fqdn) throws JobStillRunningException, ResourceNotFoundException; /** * freezes the specified zone. @@ -127,7 +196,13 @@ public interface ZoneApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Job freeze(String fqdn) throws JobStillRunningException; + @Named("FreezeZone") + @PUT + @Path("/Zone/{fqdn}") + @Produces(APPLICATION_JSON) + @Payload("{\"freeze\":true}") + @Consumes(APPLICATION_JSON) + Job freeze(@PathParam("fqdn") String fqdn) throws JobStillRunningException; /** * thaws the specified zone. @@ -137,5 +212,11 @@ public interface ZoneApi { * @throws JobStillRunningException * if a different job in the session is still running */ - Job thaw(String fqdn) throws JobStillRunningException; + @Named("ThawZone") + @PUT + @Path("/Zone/{fqdn}") + @Produces(APPLICATION_JSON) + @Payload("{\"thaw\":true}") + @Consumes(APPLICATION_JSON) + Job thaw(@PathParam("fqdn") String fqdn) throws JobStillRunningException; } \ No newline at end of file diff --git a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneAsyncApi.java b/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneAsyncApi.java deleted file mode 100644 index 8569b814be..0000000000 --- a/providers/dynect/src/main/java/org/jclouds/dynect/v3/features/ZoneAsyncApi.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds licenses this file - * to you under the Apache License, String 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.dynect.v3.features; - -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; - -import javax.inject.Named; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; - -import org.jclouds.Fallbacks.NullOnNotFoundOr404; -import org.jclouds.dynect.v3.DynECTExceptions.JobStillRunningException; -import org.jclouds.dynect.v3.DynECTExceptions.TargetExistsException; -import org.jclouds.dynect.v3.domain.CreatePrimaryZone; -import org.jclouds.dynect.v3.domain.CreatePrimaryZone.ToFQDN; -import org.jclouds.dynect.v3.domain.Job; -import org.jclouds.dynect.v3.domain.Zone; -import org.jclouds.dynect.v3.filters.AlwaysAddContentType; -import org.jclouds.dynect.v3.filters.SessionManager; -import org.jclouds.dynect.v3.functions.ExtractZoneNames; -import org.jclouds.rest.ResourceNotFoundException; -import org.jclouds.rest.annotations.BinderParam; -import org.jclouds.rest.annotations.Fallback; -import org.jclouds.rest.annotations.Headers; -import org.jclouds.rest.annotations.ParamParser; -import org.jclouds.rest.annotations.Payload; -import org.jclouds.rest.annotations.PayloadParam; -import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.rest.annotations.SelectJson; -import org.jclouds.rest.annotations.Transform; -import org.jclouds.rest.binders.BindToJsonPayload; - -import com.google.common.collect.FluentIterable; -import com.google.common.util.concurrent.ListenableFuture; - -/** - * - * @see ZoneApi - * @see doc - * @author Adrian Cole - */ -@Headers(keys = "API-Version", values = "{jclouds.api-version}") -@RequestFilters({ AlwaysAddContentType.class, SessionManager.class }) -public interface ZoneAsyncApi { - - /** - * @see ZoneApi#list - */ - @Named("ListZones") - @GET - @Path("/Zone") - @SelectJson("data") - @Transform(ExtractZoneNames.class) - ListenableFuture> list() throws JobStillRunningException; - - /** - * @see ZoneApi#get - */ - @Named("GetZone") - @GET - @Path("/Zone/{fqdn}") - @SelectJson("data") - @Fallback(NullOnNotFoundOr404.class) - ListenableFuture get(@PathParam("fqdn") String fqdn) throws JobStillRunningException; - - /** - * @see ZoneApi#scheduleCreate - */ - @Named("CreatePrimaryZone") - @POST - @Path("/Zone/{fqdn}") - @Consumes(APPLICATION_JSON) - ListenableFuture scheduleCreate( - @PathParam("fqdn") @ParamParser(ToFQDN.class) @BinderParam(BindToJsonPayload.class) CreatePrimaryZone createZone) - throws JobStillRunningException, TargetExistsException; - - /** - * @see ZoneApi#scheduleCreateWithContact - */ - @Named("CreatePrimaryZone") - @POST - @Produces(APPLICATION_JSON) - @Payload("%7B\"rname\":\"{contact}\",\"serial_style\":\"increment\",\"ttl\":3600%7D") - @Path("/Zone/{fqdn}") - @Consumes(APPLICATION_JSON) - ListenableFuture scheduleCreateWithContact(@PathParam("fqdn") String fqdn, - @PayloadParam("contact") String contact) throws JobStillRunningException, TargetExistsException; - - /** - * @see ZoneApi#delete - */ - @Named("DeleteZone") - @DELETE - @Path("/Zone/{fqdn}") - @Fallback(NullOnNotFoundOr404.class) - @Consumes(APPLICATION_JSON) - ListenableFuture delete(@PathParam("fqdn") String fqdn) throws JobStillRunningException; - - /** - * @see ZoneApi#deleteChanges - */ - @Named("DeleteZoneChanges") - @DELETE - @Path("/ZoneChanges/{fqdn}") - @Consumes(APPLICATION_JSON) - ListenableFuture deleteChanges(@PathParam("fqdn") String fqdn) throws JobStillRunningException; - - /** - * @see ZoneApi#publish - */ - @Named("PublishZone") - @PUT - @Path("/Zone/{fqdn}") - @Produces(APPLICATION_JSON) - @Payload("{\"publish\":true}") - @SelectJson("data") - ListenableFuture publish(@PathParam("fqdn") String fqdn) throws JobStillRunningException, ResourceNotFoundException; - - /** - * @see ZoneApi#freeze - */ - @Named("FreezeZone") - @PUT - @Path("/Zone/{fqdn}") - @Produces(APPLICATION_JSON) - @Payload("{\"freeze\":true}") - @Consumes(APPLICATION_JSON) - ListenableFuture freeze(@PathParam("fqdn") String fqdn) throws JobStillRunningException; - - /** - * @see ZoneApi#thaw - */ - @Named("ThawZone") - @PUT - @Path("/Zone/{fqdn}") - @Produces(APPLICATION_JSON) - @Payload("{\"thaw\":true}") - @Consumes(APPLICATION_JSON) - ListenableFuture thaw(@PathParam("fqdn") String fqdn) throws JobStillRunningException; -} diff --git a/providers/dynect/src/test/java/org/jclouds/dynect/v3/internal/BaseDynECTExpectTest.java b/providers/dynect/src/test/java/org/jclouds/dynect/v3/internal/BaseDynECTExpectTest.java index 89ed0a5770..d502bfbb60 100644 --- a/providers/dynect/src/test/java/org/jclouds/dynect/v3/internal/BaseDynECTExpectTest.java +++ b/providers/dynect/src/test/java/org/jclouds/dynect/v3/internal/BaseDynECTExpectTest.java @@ -20,13 +20,13 @@ package org.jclouds.dynect.v3.internal; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import org.jclouds.dynect.v3.config.DynECTRestClientModule; +import org.jclouds.dynect.v3.config.DynECTHttpApiModule; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; import org.jclouds.http.config.SSLModule; import org.jclouds.io.Payload; import org.jclouds.io.Payloads; -import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.ConfiguresHttpApi; import org.jclouds.rest.internal.BaseRestApiExpectTest; import com.google.inject.Module; @@ -45,11 +45,11 @@ public class BaseDynECTExpectTest extends BaseRestApiExpectTest { @Override protected Module createModule() { - return new TestDynECTRestClientModule(); + return new TestDynECTHttpApiModule(); } - @ConfiguresRestClient - private static final class TestDynECTRestClientModule extends DynECTRestClientModule { + @ConfiguresHttpApi + private static final class TestDynECTHttpApiModule extends DynECTHttpApiModule { @Override protected void configure() { install(new SSLModule());