Skip to content
This repository was archived by the owner on Dec 19, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all 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
3 changes: 2 additions & 1 deletion cli/supportedProviders.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ denominator.designate.DesignateProvider
denominator.dynect.DynECTProvider
denominator.mock.MockProvider
denominator.route53.Route53Provider
denominator.ultradns.UltraDNSProvider
denominator.ultradns.UltraDNSProvider
denominator.verisigndns.VerisignDnsProvider
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

public class ModelAssertions extends Assertions {

public static ResourceRecordSetAssert assertThat(ResourceRecordSet actual) {
public static ResourceRecordSetAssert assertThat(ResourceRecordSet<?> actual) {
return new ResourceRecordSetAssert(actual);
}

Expand Down
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
rootProject.name='denominator'

include 'model', 'core', 'route53', 'ultradns', 'dynect', 'clouddns', 'designate', 'cli'
include 'model', 'core', 'route53', 'ultradns', 'verisigndns', 'dynect', 'clouddns', 'designate', 'cli'

rootProject.children.each { childProject ->
childProject.name = 'denominator-' + childProject.name
Expand Down
5 changes: 5 additions & 0 deletions verisigndns/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## Notable Behaviors
The following are notable when compared to different providers.
* `Zone.id()` is the `Zone.name()`
* Zone lists are 1 + N requests in order to zip with the SOA's ttl and rname.
* The default ttl for record sets is 86400.
21 changes: 21 additions & 0 deletions verisigndns/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
apply plugin: 'java'

sourceCompatibility = 1.6

test {
systemProperty 'verisigndns.url', System.getProperty('verisignmdns.url', '')
systemProperty 'verisigndns.username', System.getProperty('verisignmdns.username', '')
systemProperty 'verisigndns.password', System.getProperty('verisignmdns.password', '')
systemProperty 'verisigndns.zone', System.getProperty('verisignmdns.zone', '')
}

dependencies {
compile project(':denominator-core')
compile 'com.netflix.feign:feign-core:8.10.0'
compile 'com.netflix.feign:feign-sax:8.10.0'
testCompile project(':denominator-model').sourceSets.test.output
testCompile project(':denominator-core').sourceSets.test.output
testCompile 'junit:junit:4.12'
testCompile 'org.assertj:assertj-core:1.7.1' // last version supporting JDK 7
testCompile 'com.squareup.okhttp:mockwebserver:2.5.0'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package denominator.verisigndns;

import javax.inject.Inject;

import denominator.CheckConnection;
import denominator.verisigndns.VerisignDnsEncoder.Paging;

public class HostedZonesReadable implements CheckConnection {

private final VerisignDns api;

@Inject
HostedZonesReadable(VerisignDns api) {
this.api = api;
}

@Override
public boolean ok() {
try {
api.getZones(new Paging(1, 1));
return true;
} catch (RuntimeException e) {
return false;
}
}

@Override
public String toString() {
return "HostedZonesReadable";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package denominator.verisigndns;

import static denominator.common.Util.peekingIterator;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import denominator.common.PeekingIterator;
import denominator.common.Util;
import denominator.model.ResourceRecordSet;
import denominator.model.ResourceRecordSet.Builder;
import denominator.verisigndns.VerisignDnsContentHandlers.Page;
import denominator.verisigndns.VerisignDnsContentHandlers.ResourceRecord;
import denominator.verisigndns.VerisignDnsEncoder.GetRRList;

final class ResourceRecordByNameAndTypeIterator implements Iterator<ResourceRecordSet<?>> {

private final VerisignDns api;
private final GetRRList getRRList;
private final String zoneSuffix;
private PeekingIterator<ResourceRecord> peekingIterator;

public ResourceRecordByNameAndTypeIterator(VerisignDns api, GetRRList getRRList) {
this.api = api;
this.getRRList = getRRList;
zoneSuffix = "." + getRRList.getZoneName() + ".";
}

@Override
public boolean hasNext() {
if (peekingIterator == null || !peekingIterator.hasNext()) {
nextPeekingIterator();
}
return peekingIterator.hasNext();
}

private void nextPeekingIterator() {
if (getRRList.nextPage()) {
Page<ResourceRecord> rrPage = api.getResourceRecords(getRRList.getZoneName(), getRRList);
getRRList.setTotal(rrPage.getCount());
peekingIterator = peekingIterator(rrPage.getList().iterator());
}
}

private String relativeName(String name, String root) {
if (name.endsWith(root)) {
name = name.substring(0, name.length() - root.length());
}
return name;
}

@Override
public ResourceRecordSet<?> next() {
if (peekingIterator == null) {
nextPeekingIterator();
}
ResourceRecord record = peekingIterator.next();
if (record == null) {
return null;
}

String owner = relativeName(record.getName(), zoneSuffix);
String type = record.getType();
Builder<Map<String, Object>> builder =
ResourceRecordSet.builder().name(owner).type(type).ttl(record.getTtl());
builder.add(getRRTypeAndRdata(type, record.getRdata()));

while (hasNext()) {
ResourceRecord next = peekingIterator.peek();
if (fqdnAndTypeEquals(next, record)) {
peekingIterator.next();
builder.add(getRRTypeAndRdata(type, next.getRdata()));
} else {
break;
}
}
return builder.build();
}

@Override
public void remove() {
throw new UnsupportedOperationException();
}

private static boolean fqdnAndTypeEquals(ResourceRecord actual, ResourceRecord expected) {
return actual.getName().equals(expected.getName()) && actual.getType().equals(expected.getType());
}

private static final int NAPTR_FIELD_FLAGS = 2;
private static final int NAPTR_FIELD_SERVICE = 3;

private static Map<String, Object> getRRTypeAndRdata(String type, String rdata) {

rdata = rdata.replace("\"", "");
try {
if ("AAAA".equals(type)) {
rdata = rdata.toUpperCase();
} else if ("NAPTR".equals(type)) {
List<String> parts = Util.split(' ', rdata);

if (parts.size() > NAPTR_FIELD_SERVICE) {
parts.set(NAPTR_FIELD_FLAGS, parts.get(NAPTR_FIELD_FLAGS).toUpperCase());

String service = parts.get(NAPTR_FIELD_SERVICE);
List<String> serviceParts = Util.split('+', service);
serviceParts.set(0, serviceParts.get(0).toUpperCase());
parts.set(NAPTR_FIELD_SERVICE, Util.join('+', serviceParts.toArray()));

rdata = Util.join(' ', parts.toArray());
}
}
return Util.toMap(type, rdata);
} catch (IllegalArgumentException e) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put(type, rdata);
return map;
}
}
}
44 changes: 44 additions & 0 deletions verisigndns/src/main/java/denominator/verisigndns/VerisignDns.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package denominator.verisigndns;

import denominator.model.ResourceRecordSet;
import denominator.model.Zone;
import denominator.verisigndns.VerisignDnsContentHandlers.Page;
import denominator.verisigndns.VerisignDnsContentHandlers.ResourceRecord;
import denominator.verisigndns.VerisignDnsEncoder.GetRRList;
import denominator.verisigndns.VerisignDnsEncoder.Paging;
import feign.Param;
import feign.RequestLine;

interface VerisignDns {

@RequestLine("POST")
void createZone(@Param("createZone") Zone zone);

@RequestLine("POST")
void updateSoa(@Param("updateSoa") Zone zone);

@RequestLine("POST")
void deleteZone(@Param("deleteZone") String zone);

@RequestLine("POST")
Page<Zone> getZones(@Param("getZoneList") Paging paging);

@RequestLine("POST")
Zone getZone(@Param("getZone") String zone);

@RequestLine("POST")
void createResourceRecords(@Param("zone") String zone,
@Param("rrSet") ResourceRecordSet<?> rrSet, @Param("oldRRSet") ResourceRecordSet<?> oldRRSet);

@RequestLine("POST")
void updateResourceRecords(@Param("zone") String zone,
@Param("rrSet") ResourceRecordSet<?> rrSet, @Param("oldRRSet") ResourceRecordSet<?> oldRRSet);

@RequestLine("POST")
Page<ResourceRecord> getResourceRecords(@Param("zone") String zone,
@Param("getRRList") GetRRList rrRequest);

@RequestLine("POST")
void deleteResourceRecords(@Param("zone") String zone,
@Param("deleteRRSet") ResourceRecordSet<?> rrSet);
}
Loading