Skip to content

Commit

Permalink
Implements DefaultDnsRpc. Progress in googleapis#595.
Browse files Browse the repository at this point in the history
  • Loading branch information
mderka committed Feb 3, 2016
1 parent 0338ead commit bc4b820
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 5 deletions.
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 {
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();
} catch (IOException ex) {
throw translate(ex);
}
}

@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);
}
}

@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);
}
}

@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
String key = "changeSequence";
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);
}
}
}

0 comments on commit bc4b820

Please sign in to comment.