summaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-06-17 13:30:55 +0200
committerMartin Polden <mpolden@mpolden.no>2020-06-17 13:56:59 +0200
commit68c3ecd41b82efe6fb30645774d5349b2fd37c48 (patch)
treec6c31f84c5ab7bb137306c6901b3a53068933e2f /controller-api
parent544ba2e3d8cc1e4f1766ead5651712401d98a86f (diff)
Handle existing A record for config server LB
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java27
1 files changed, 20 insertions, 7 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 b54446c071e..59324079e6f 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
@@ -5,6 +5,7 @@ package com.yahoo.vespa.hosted.controller.api.integration.dns;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
@@ -22,11 +23,11 @@ public class MemoryNameService implements NameService {
return Collections.unmodifiableSet(records);
}
- private void add(Record record) {
- if (records.stream().anyMatch(r -> r.type().equals(record.type()) &&
- r.name().equals(record.name()) &&
- r.data().equals(record.data()))) {
- throw new IllegalArgumentException("Record already exists: " + record);
+ public void add(Record record) {
+ Optional<Record> conflict = records.stream().filter(r -> conflicts(r, record)).findFirst();
+ if (conflict.isPresent()) {
+ throw new AssertionError("'" + record + "' conflicts with existing record '" +
+ conflict.get() + "'");
}
records.add(record);
}
@@ -45,8 +46,9 @@ public class MemoryNameService implements NameService {
.map(target -> new Record(Record.Type.ALIAS, name, target.asData()))
.collect(Collectors.toList());
// Satisfy idempotency contract of interface
- removeRecords(records);
- records.forEach(this::add);
+ records.stream()
+ .filter(r -> !this.records.contains(r))
+ .forEach(this::add);
return records;
}
@@ -108,4 +110,15 @@ public class MemoryNameService implements NameService {
this.records.removeAll(records);
}
+ /**
+ * Returns whether record r1 and r2 can co-exist in a name service. This attempts to enforce the same constraints as
+ * most real name services.
+ */
+ private static boolean conflicts(Record r1, Record r2) {
+ if (!r1.name().equals(r2.name())) return false; // Distinct names never conflict
+ if (r1.type() == Record.Type.ALIAS && r1.type() == r2.type()) // ALIAS records only require distinct data
+ return r1.data().equals(r2.data());
+ return true; // Anything else is considered a conflict
+ }
+
}