Skip to content

Commit

Permalink
issue Netflix#55: Ultradns add,remove,replace
Browse files Browse the repository at this point in the history
Included support for adding records to a round-robin pool if they can be in there (A or AAAA)
fixed issue in the iterator
Temporarily changed expected values for the mocks as we are using the full list for now until the api is updated.
Search for pools by name and type - Temporarily storing type in the pool description
Updated to use jclouds snapshot 1.6
  • Loading branch information
jdamick committed Mar 8, 2013
1 parent 67294a5 commit f68dc36
Show file tree
Hide file tree
Showing 8 changed files with 391 additions and 91 deletions.
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ buildscript {

allprojects {
repositories { mavenLocal()
mavenCentral() }
mavenCentral()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } }
}

apply from: file('gradle/convention.gradle')
Expand Down
5 changes: 3 additions & 2 deletions providers/denominator-ultradns/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@ eclipse {
test {
systemProperty 'ultradns.username', System.getProperty('ultradns.username', '')
systemProperty 'ultradns.password', System.getProperty('ultradns.password', '')
systemProperty 'ultradns.zone', System.getProperty('ultradns.zone', '')
}

dependencies {
compile project(':denominator-core')
testCompile project(':denominator-core').sourceSets.test.output
compile 'org.jclouds.labs:ultradns-ws:1.6.0-alpha.4'
compile 'org.jclouds.driver:jclouds-slf4j:1.6.0-alpha.4'
compile 'org.jclouds.labs:ultradns-ws:1.6.0-SNAPSHOT'
compile 'org.jclouds.driver:jclouds-slf4j:1.6.0-SNAPSHOT'
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

package denominator.ultradns;

import java.util.List;
import java.util.Map;

import org.jclouds.ultradns.ws.domain.ResourceRecord;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.google.common.primitives.UnsignedInteger;

import denominator.ResourceTypeToValue;
import denominator.model.rdata.AAAAData;
import denominator.model.rdata.AData;
import denominator.model.rdata.CNAMEData;
import denominator.model.rdata.MXData;
import denominator.model.rdata.NSData;
import denominator.model.rdata.PTRData;
import denominator.model.rdata.SOAData;
import denominator.model.rdata.SPFData;
import denominator.model.rdata.SRVData;
import denominator.model.rdata.TXTData;

final class Converters {
private Converters() { /* */}


static Map<String, Object> toRdataMap(ResourceRecord record) {
List<String> parts = record.getRData();
String type = new ResourceTypeToValue().inverse().get(record.getType());
if ("A".equals(type)) {
return AData.create(parts.get(0));
} else if ("AAAA".equals(type)) {
return AAAAData.create(parts.get(0));
} else if ("CNAME".equals(type)) {
return CNAMEData.create(parts.get(0));
} else if ("MX".equals(type)) {
return MXData.create(UnsignedInteger.valueOf(parts.get(0)), parts.get(1));
} else if ("NS".equals(type)) {
return NSData.create(parts.get(0));
} else if ("PTR".equals(type)) {
return PTRData.create(parts.get(0));
} else if ("SOA".equals(type)) {
return SOAData.builder()
.mname(parts.get(0))
.rname(parts.get(1))
.serial(UnsignedInteger.valueOf(parts.get(2)))
.refresh(UnsignedInteger.valueOf(parts.get(3)))
.retry(UnsignedInteger.valueOf(parts.get(4)))
.expire(UnsignedInteger.valueOf(parts.get(5)))
.minimum(UnsignedInteger.valueOf(parts.get(6))).build();
} else if ("SPF".equals(type)) {
return SPFData.create(parts.get(0));
} else if ("SRV".equals(type)) {
return SRVData.builder()
.priority(UnsignedInteger.valueOf(parts.get(0)))
.weight(UnsignedInteger.valueOf(parts.get(1)))
.port(UnsignedInteger.valueOf(parts.get(2)))
.target(parts.get(3)).build();
} else if ("TXT".equals(type)) {
return TXTData.create(parts.get(0));
} else {
return ImmutableMap.<String, Object> of("rdata", Joiner.on(' ').join(parts));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,38 +1,22 @@
package denominator.ultradns;

import static com.google.common.collect.Iterators.peekingIterator;
import static denominator.ultradns.Converters.toRdataMap;

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

import org.jclouds.ultradns.ws.ResourceTypeToValue;
import org.jclouds.ultradns.ws.domain.ResourceRecord;
import org.jclouds.ultradns.ws.domain.ResourceRecordMetadata;

import com.google.common.base.Joiner;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.PeekingIterator;
import com.google.common.primitives.UnsignedInteger;

import denominator.ResourceTypeToValue;
import denominator.model.ResourceRecordSet;
import denominator.model.ResourceRecordSet.Builder;
import denominator.model.rdata.AAAAData;
import denominator.model.rdata.AData;
import denominator.model.rdata.CNAMEData;
import denominator.model.rdata.MXData;
import denominator.model.rdata.NSData;
import denominator.model.rdata.PTRData;
import denominator.model.rdata.SOAData;
import denominator.model.rdata.SPFData;
import denominator.model.rdata.SRVData;
import denominator.model.rdata.TXTData;

class GroupByRecordNameAndTypeIterator implements Iterator<ResourceRecordSet<?>> {

private final PeekingIterator<ResourceRecordMetadata> peekingIterator;
private final static BiMap<UnsignedInteger, String> valueToType = new ResourceTypeToValue().inverse();

public GroupByRecordNameAndTypeIterator(Iterator<ResourceRecordMetadata> sortedIterator) {
this.peekingIterator = peekingIterator(sortedIterator);
Expand All @@ -48,16 +32,16 @@ public ResourceRecordSet<?> next() {
ResourceRecord record = peekingIterator.next().getRecord();
Builder<Map<String, Object>> builder = ResourceRecordSet.builder()
.name(record.getName())
.type(valueToType.get(record.getType()))
.type(new ResourceTypeToValue().inverse().get(record.getType()))
.ttl(record.getTTL());

builder.add(parseRdataList(valueToType.get(record.getType()), record.getRData()));
builder.add(toRdataMap(record));

while (hasNext()) {
ResourceRecord next = peekingIterator.peek().getRecord();
if (fqdnAndTypeEquals(next, record)) {
peekingIterator.next();
builder.add(parseRdataList(valueToType.get(next.getType()), next.getRData()));
builder.add(toRdataMap(next));
} else {
break;
}
Expand All @@ -72,42 +56,5 @@ public void remove() {

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

static Map<String, Object> parseRdataList(String type, List<String> parts) {
if ("A".equals(type)) {
return AData.create(parts.get(0));
} else if ("AAAA".equals(type)) {
return AAAAData.create(parts.get(0));
} else if ("CNAME".equals(type)) {
return CNAMEData.create(parts.get(0));
} else if ("MX".equals(type)) {
return MXData.create(UnsignedInteger.valueOf(parts.get(0)), parts.get(1));
} else if ("NS".equals(type)) {
return NSData.create(parts.get(0));
} else if ("PTR".equals(type)) {
return PTRData.create(parts.get(0));
} else if ("SOA".equals(type)) {
return SOAData.builder()
.mname(parts.get(0))
.rname(parts.get(1))
.serial(UnsignedInteger.valueOf(parts.get(2)))
.refresh(UnsignedInteger.valueOf(parts.get(3)))
.retry(UnsignedInteger.valueOf(parts.get(4)))
.expire(UnsignedInteger.valueOf(parts.get(5)))
.minimum(UnsignedInteger.valueOf(parts.get(6))).build();
} else if ("SPF".equals(type)) {
return SPFData.create(parts.get(0));
} else if ("SRV".equals(type)) {
return SRVData.builder()
.priority(UnsignedInteger.valueOf(parts.get(0)))
.weight(UnsignedInteger.valueOf(parts.get(1)))
.port(UnsignedInteger.valueOf(parts.get(2)))
.target(parts.get(3)).build();
} else if ("TXT".equals(type)) {
return TXTData.create(parts.get(0));
} else {
return ImmutableMap.<String, Object> of("rdata", Joiner.on(' ').join(parts));
}
}
}
}
Loading

0 comments on commit f68dc36

Please sign in to comment.