diff options
author | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-10-07 12:15:12 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-10-10 13:32:41 +0200 |
commit | 9511540736b58f9b47fd3656ad5702eb7496666b (patch) | |
tree | 8a7bdf33bb681f5e8dd69a80c7a688fb8b9cf40f /controller-api | |
parent | b5cce0b85802e7b512bac7c1c2f2824f6d3f80a3 (diff) |
Support creating DIRECT records
Diffstat (limited to 'controller-api')
3 files changed, 29 insertions, 0 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java index 18d7bc53035..9a9270bdf7f 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java @@ -54,6 +54,20 @@ public class MemoryNameService implements NameService { } @Override + public List<Record> createDirect(RecordName name, Set<DirectTarget> targets) { + var records = targets.stream() + .sorted((a, b) -> Comparator.comparing((DirectTarget target) -> target.recordData().asString()).compare(a, b)) + .map(d -> new Record(Record.Type.DIRECT, name, d.pack())) + .collect(Collectors.toList()); + // Satisfy idempotency contract of interface + for (var r1 : records) { + this.records.removeIf(r2 -> conflicts(r1, r2)); + } + this.records.addAll(records); + return records; + } + + @Override public List<Record> createTxtRecords(RecordName name, List<RecordData> txtData) { var records = txtData.stream() .map(data -> new Record(Record.Type.TXT, name, data)) @@ -122,6 +136,11 @@ public class MemoryNameService implements NameService { AliasTarget t2 = AliasTarget.unpack(r2.data()); return t1.name().equals(t2.name()); // ALIAS records require distinct targets } + if (r1.type() == Record.Type.DIRECT && r1.type() == r2.type()) { + DirectTarget t1 = DirectTarget.unpack(r1.data()); + DirectTarget t2 = DirectTarget.unpack(r2.data()); + return t1.id().equals(t2.id()); // DIRECT records require distinct IDs + } return true; // Anything else is considered a conflict } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java index 505ff3850ab..72e983680d9 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java @@ -31,6 +31,15 @@ public interface NameService { List<Record> createAlias(RecordName name, Set<AliasTarget> targets); /** + * Create a non-standard record pointing to given targets. Implementations of this are expected to be + * idempotent + * + * @param targets Targets that should be resolved by this name. + * @return The created records. One per target. + */ + List<Record> createDirect(RecordName name, Set<DirectTarget> targets); + + /** * Create a new TXT record containing the provided data. * @param name Name of the created record * @param txtRecords TXT data values for the record, each consisting of one or more space-separated double-quoted diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java index 2f9312b2f89..e76445faa60 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java @@ -55,6 +55,7 @@ public record Record(Type type, AAAA, ALIAS, CNAME, + DIRECT, MX, NS, PTR, |