Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Completes DnsRpc interface by adding methods and doc. Implements DefaultDnsRpc. #616

Merged
merged 4 commits into from
Feb 4, 2016
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public class DnsException extends BaseServiceException {

private static final long serialVersionUID = 490302380416260252L;

public DnsException(IOException exception, boolean idempotent) {
super(exception, idempotent);
public DnsException(IOException exception) {
super(exception, true);
}

//TODO(mderka) Add translation and retry functionality. Created issue #593.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import com.google.common.collect.ImmutableSet;
import com.google.gcloud.ServiceOptions;
import com.google.gcloud.spi.DefaultDnsRpc;
import com.google.gcloud.spi.DnsRpc;
import com.google.gcloud.spi.DnsRpcFactory;

Expand Down Expand Up @@ -46,8 +47,7 @@ public static class DefaultDnsRpcFactory implements DnsRpcFactory {

@Override
public DnsRpc create(DnsOptions options) {
// TODO(mderka) Implement when DefaultDnsRpc is available. Created issue #595.
return null;
return new DefaultDnsRpc(options);
}
}

Expand Down Expand Up @@ -80,7 +80,7 @@ protected DnsFactory defaultServiceFactory() {
@SuppressWarnings("unchecked")
@Override
protected DnsRpcFactory defaultRpcFactory() {
return null;
return DefaultDnsRpcFactory.INSTANCE;
}

@Override
Expand Down
178 changes: 178 additions & 0 deletions gcloud-java-dns/src/main/java/com/google/gcloud/spi/DefaultDnsRpc.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package com.google.gcloud.spi;

import static com.google.gcloud.spi.DnsRpc.Option.DNS_NAME;
import static com.google.gcloud.spi.DnsRpc.Option.DNS_TYPE;
import static com.google.gcloud.spi.DnsRpc.Option.FIELDS;
import static com.google.gcloud.spi.DnsRpc.Option.PAGE_SIZE;
import static com.google.gcloud.spi.DnsRpc.Option.PAGE_TOKEN;
import static com.google.gcloud.spi.DnsRpc.Option.SORTING_ORDER;
import static java.net.HttpURLConnection.HTTP_NOT_FOUND;

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.dns.Dns;
import com.google.api.services.dns.model.Change;
import com.google.api.services.dns.model.ChangesListResponse;
import com.google.api.services.dns.model.ManagedZone;
import com.google.api.services.dns.model.ManagedZonesListResponse;
import com.google.api.services.dns.model.Project;
import com.google.api.services.dns.model.ResourceRecordSet;
import com.google.api.services.dns.model.ResourceRecordSetsListResponse;
import com.google.gcloud.dns.DnsException;
import com.google.gcloud.dns.DnsOptions;

import java.io.IOException;
import java.util.Map;

/**
* A default implementation of the DnsRpc interface.
*/
public class DefaultDnsRpc implements DnsRpc {

private final Dns dns;
private final DnsOptions options;

private static DnsException translate(IOException exception) {
return new DnsException(exception);
}

/**
* Constructs an instance of this rpc client with provided {@link DnsOptions}.
*/
public DefaultDnsRpc(DnsOptions options) {
HttpTransport transport = options.httpTransportFactory().create();
HttpRequestInitializer initializer = options.httpRequestInitializer();
this.dns = new Dns.Builder(transport, new JacksonFactory(), initializer)
.setRootUrl(options.host())
.setApplicationName(options.applicationName())
.build();
this.options = options;
}

@Override
public ManagedZone create(ManagedZone zone) throws DnsException {

This comment was marked as spam.

This comment was marked as spam.

try {
return dns.managedZones().create(this.options.projectId(), zone).execute();
} catch (IOException ex) {
throw translate(ex);
}
}

@Override
public ManagedZone getZone(String zoneName, Map<Option, ?> options) throws DnsException {
// just fields option
try {
return dns.managedZones().get(this.options.projectId(), zoneName)
.setFields(FIELDS.getString(options)).execute();

This comment was marked as spam.

This comment was marked as spam.

} catch (IOException ex) {
throw translate(ex);

This comment was marked as spam.

This comment was marked as spam.

}
}

@Override
public Tuple<String, Iterable<ManagedZone>> listZones(Map<Option, ?> options)
throws DnsException {
// fields, page token, page size
try {
ManagedZonesListResponse zoneList = dns.managedZones().list(this.options.projectId())
.setFields(FIELDS.getString(options))
.setMaxResults(PAGE_SIZE.getInt(options))
.setPageToken(PAGE_TOKEN.getString(options))
.execute();
return Tuple.<String, Iterable<ManagedZone>>of(zoneList.getNextPageToken(),
zoneList.getManagedZones());
} catch (IOException ex) {
throw translate(ex);
}
}

@Override
public boolean deleteZone(String zoneName) throws DnsException {
try {
dns.managedZones().delete(this.options.projectId(), zoneName).execute();
return true;
} catch (IOException ex) {
DnsException serviceException = translate(ex);
if (serviceException.code() == HTTP_NOT_FOUND) {
return false;
}
throw serviceException;
}
}

@Override
public Tuple<String, Iterable<ResourceRecordSet>> listDnsRecords(String zoneName,
Map<Option, ?> options) throws DnsException {
// options are fields, page token, dns name, type
try {
ResourceRecordSetsListResponse response = dns.resourceRecordSets()
.list(this.options.projectId(), zoneName)
.setFields(FIELDS.getString(options))
.setPageToken(PAGE_TOKEN.getString(options))
.setMaxResults(PAGE_SIZE.getInt(options))
.setName(DNS_NAME.getString(options))
.setType(DNS_TYPE.getString(options))
.execute();
return Tuple.<String, Iterable<ResourceRecordSet>>of(response.getNextPageToken(),
response.getRrsets());
} catch (IOException ex) {
throw translate(ex);
}
}

@Override
public Project getProject(Map<Option, ?> options) throws DnsException {
try {
return dns.projects().get(this.options.projectId())
.setFields(FIELDS.getString(options)).execute();
} catch (IOException ex) {
throw translate(ex);

This comment was marked as spam.

This comment was marked as spam.

}
}

@Override
public Change applyChangeRequest(String zoneName, Change changeRequest, Map<Option, ?> options)
throws DnsException {
try {
return dns.changes().create(this.options.projectId(), zoneName, changeRequest)
.setFields(FIELDS.getString(options))
.execute();
} catch (IOException ex) {
throw translate(ex);
}
}

@Override
public Change getChangeRequest(String zoneName, String changeRequestId, Map<Option, ?> options)
throws DnsException {
try {
return dns.changes().get(this.options.projectId(), zoneName, changeRequestId)
.setFields(FIELDS.getString(options))
.execute();
} catch (IOException ex) {
throw translate(ex);

This comment was marked as spam.

This comment was marked as spam.

}
}

@Override
public Tuple<String, Iterable<Change>> listChangeRequests(String zoneName, Map<Option, ?> options)
throws DnsException {
// options are fields, page token, page size, sort order
try {
Dns.Changes.List request = dns.changes().list(this.options.projectId(), zoneName)
.setFields(FIELDS.getString(options))
.setMaxResults(PAGE_SIZE.getInt(options))
.setPageToken(PAGE_TOKEN.getString(options));
if (SORTING_ORDER.getString(options) != null) {
// this needs to be checked and changed if more sorting options are implemented, issue #604

This comment was marked as spam.

This comment was marked as spam.

String key = "changeSequence";

This comment was marked as spam.

This comment was marked as spam.

request = request.setSortBy(key).setSortOrder(SORTING_ORDER.getString(options));
}
ChangesListResponse response = request.execute();
return Tuple.<String, Iterable<Change>>of(response.getNextPageToken(), response.getChanges());
} catch (IOException ex) {
throw translate(ex);
}
}
}
117 changes: 116 additions & 1 deletion gcloud-java-dns/src/main/java/com/google/gcloud/spi/DnsRpc.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@

package com.google.gcloud.spi;

import com.google.api.services.dns.model.Change;
import com.google.api.services.dns.model.ManagedZone;
import com.google.api.services.dns.model.Project;
import com.google.api.services.dns.model.ResourceRecordSet;
import com.google.gcloud.dns.DnsException;

This comment was marked as spam.

This comment was marked as spam.

import java.util.Map;

public interface DnsRpc {
Expand Down Expand Up @@ -52,5 +58,114 @@ Integer getInt(Map<Option, ?> options) {
}
}

//TODO(mderka) add supported operations. Created issue #594.
class Tuple<X, Y> {

This comment was marked as spam.

This comment was marked as spam.


private final X x;
private final Y y;

private Tuple(X x, Y y) {
this.x = x;
this.y = y;
}

public static <X, Y> Tuple<X, Y> of(X x, Y y) {
return new Tuple<>(x, y);
}

public X x() {
return x;
}

public Y y() {
return y;
}
}

/**
* Creates a new zone.
*
* @param zone a zone to be created
* @return Updated {@link ManagedZone} object

This comment was marked as spam.

This comment was marked as spam.

* @throws DnsException upon failure
*/
ManagedZone create(ManagedZone zone) throws DnsException;

/**
* Retrieves and returns an existing zone.
*
* @param zoneName name of the zone to be returned
* @param options a map of options for the service call
* @return a zone or {@code null} if not found

This comment was marked as spam.

This comment was marked as spam.

* @throws DnsException upon failure
*/
ManagedZone getZone(String zoneName, Map<Option, ?> options) throws DnsException;

/**
* Lists the zones that exist within the project.
*
* @param options a map of options for the service call
* @throws DnsException upon failure
*/
Tuple<String, Iterable<ManagedZone>> listZones(Map<Option, ?> options) throws DnsException;

/**
* Deletes the zone identified by the name.
*
* @return {@code true} if the zone was deleted and {@code false} otherwise
* @throws DnsException upon failure
*/
boolean deleteZone(String zoneName) throws DnsException;

/**
* Lists DNS records for a given zone.
*
* @param zoneName name of the zone to be listed
* @param options a map of options for the service call
* @throws DnsException upon failure or if zone not found

This comment was marked as spam.

This comment was marked as spam.

*/
Tuple<String, Iterable<ResourceRecordSet>> listDnsRecords(String zoneName,
Map<Option, ?> options) throws DnsException;

/**
* Returns information about the current project.
*
* @param options a map of options for the service call
* @return up-to-date project information
* @throws DnsException upon failure
*/
Project getProject(Map<Option, ?> options) throws DnsException;

This comment was marked as spam.

This comment was marked as spam.


/**
* Applies change request to a zone.
*
* @param zoneName the name of a zone to which the {@link Change} should be applied

This comment was marked as spam.

This comment was marked as spam.

* @param changeRequest change to be applied
* @param options a map of options for the service call
* @return updated change object with server-assigned ID
* @throws DnsException upon failure or if zone not found

This comment was marked as spam.

This comment was marked as spam.

*/
Change applyChangeRequest(String zoneName, Change changeRequest, Map<Option, ?> options)
throws DnsException;

/**
* Returns an existing change request.
*
* @param zoneName the name of a zone to which the {@link Change} was be applied

This comment was marked as spam.

This comment was marked as spam.

* @param changeRequestId the unique id assigned to the change by the server
* @param options a map of options for the service call
* @return up-to-date change object
* @throws DnsException upon failure or if zone not found

This comment was marked as spam.

This comment was marked as spam.

*/
Change getChangeRequest(String zoneName, String changeRequestId, Map<Option, ?> options)
throws DnsException;

/**
* List an existing change requests for a zone.

This comment was marked as spam.

This comment was marked as spam.

*
* @param zoneName the name of a zone to which the {@link Change}s were be applied

This comment was marked as spam.

This comment was marked as spam.

* @param options a map of options for the service call
* @throws DnsException upon failure or if zone not found

This comment was marked as spam.

This comment was marked as spam.

*/
Tuple<String, Iterable<Change>> listChangeRequests(String zoneName, Map<Option, ?> options)
throws DnsException;
}