diff options
7 files changed, 25 insertions, 27 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 18ff3f18137..18d7bc53035 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 @@ -33,8 +33,8 @@ public class MemoryNameService implements NameService { } @Override - public Record createCname(RecordName name, RecordData canonicalName) { - var record = new Record(Record.Type.CNAME, name, canonicalName); + public Record createRecord(Record.Type type, RecordName name, RecordData canonicalName) { + var record = new Record(type, name, canonicalName); add(record); return record; } 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 eac657d8b75..505ff3850ab 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 @@ -12,13 +12,14 @@ import java.util.Set; public interface NameService { /** - * Create a new CNAME record + * Create a new record * - * @param name The alias to create (lhs of the record) - * @param canonicalName The canonical name which the alias should point to (rhs of the record). This must be a FQDN. + * @param type The DNS type of record to make, only a small set of types are supported, check with the implementation + * @param name Name of the record, e.g. a FQDN for records of type A + * @param data Data of the record, e.g. IP address for records of type A * @return The created record */ - Record createCname(RecordName name, RecordData canonicalName); + Record createRecord(Record.Type type, RecordName name, RecordData data); /** * Create a non-standard ALIAS record pointing to given targets. Implementations of this are expected to be diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockTesterCloud.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockTesterCloud.java index 63c2388b461..e53be91f94b 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockTesterCloud.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockTesterCloud.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.api.integration.stubs; import ai.vespa.http.DomainName; +import com.google.common.net.InetAddresses; import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId; import com.yahoo.vespa.hosted.controller.api.integration.LogEntry; import com.yahoo.vespa.hosted.controller.api.integration.deployment.TestReport; @@ -12,7 +13,6 @@ import com.yahoo.vespa.hosted.controller.api.integration.dns.RecordName; import java.net.InetAddress; import java.net.URI; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -60,12 +60,10 @@ public class MockTesterCloud implements TesterCloud { @Override public Optional<InetAddress> resolveHostName(DomainName hostname) { - try { - return Optional.of(InetAddress.getByAddress(new byte[]{ 1, 2, 3, 4 })); - } - catch (UnknownHostException e) { - throw new IllegalStateException("should not happen"); - } + return nameService.findRecords(Record.Type.A, RecordName.from(hostname.value())).stream() + .findFirst() + .map(record -> InetAddresses.forString(record.data().asString())) + .or(() -> Optional.of(InetAddresses.forString("1.2.3.4"))); } @Override diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java index 071d8a4d11f..91bca1e481c 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java @@ -268,9 +268,9 @@ public class RoutingController { // Register names in DNS Rotation rotation = rotationRepository.requireRotation(assignedRotation.rotationId()); for (var endpoint : rotationEndpoints) { - controller.nameServiceForwarder().createCname(RecordName.from(endpoint.dnsName()), - RecordData.fqdn(rotation.name()), - Priority.normal); + controller.nameServiceForwarder().createRecord( + new Record(Record.Type.CNAME, RecordName.from(endpoint.dnsName()), RecordData.fqdn(rotation.name())), + Priority.normal); List<String> names = List.of(endpoint.dnsName(), // Include rotation ID as a valid name of this container endpoint // (required by global routing health checks) @@ -305,9 +305,9 @@ public class RoutingController { ZoneId targetZone = targetZones.iterator().next(); String vipHostname = controller.zoneRegistry().getVipHostname(targetZone) .orElseThrow(() -> new IllegalArgumentException("No VIP configured for zone " + targetZone)); - controller.nameServiceForwarder().createCname(RecordName.from(endpoint.dnsName()), - RecordData.fqdn(vipHostname), - Priority.normal); + controller.nameServiceForwarder().createRecord( + new Record(Record.Type.CNAME, RecordName.from(endpoint.dnsName()), RecordData.fqdn(vipHostname)), + Priority.normal); } Map<ClusterSpec.Id, EndpointList> applicationEndpointsByCluster = applicationEndpoints.groupingBy(Endpoint::cluster); for (var kv : applicationEndpointsByCluster.entrySet()) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/CreateRecord.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/CreateRecord.java index 464e3eff203..344ffad80e9 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/CreateRecord.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/CreateRecord.java @@ -19,7 +19,7 @@ public class CreateRecord implements NameServiceRequest { /** DO NOT USE. Public for serialization purposes */ public CreateRecord(Record record) { this.record = Objects.requireNonNull(record, "record must be non-null"); - if (record.type() != Record.Type.CNAME) { + if (record.type() != Record.Type.CNAME && record.type() != Record.Type.A) { throw new IllegalArgumentException("Record of type " + record.type() + " is not supported: " + record); } } @@ -38,7 +38,7 @@ public class CreateRecord implements NameServiceRequest { } }); if (records.isEmpty()) { - nameService.createCname(record.name(), record.data()); + nameService.createRecord(record.type(), record.name(), record.data()); } } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/NameServiceForwarder.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/NameServiceForwarder.java index 540e8489e6d..9d2c7918252 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/NameServiceForwarder.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/dns/NameServiceForwarder.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.hosted.controller.dns; import com.yahoo.transaction.Mutex; -import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.hosted.controller.api.integration.dns.AliasTarget; import com.yahoo.vespa.hosted.controller.api.integration.dns.NameService; import com.yahoo.vespa.hosted.controller.api.integration.dns.Record; @@ -43,9 +42,9 @@ public class NameServiceForwarder { this.db = Objects.requireNonNull(db, "db must be non-null"); } - /** Create or update a CNAME record with given name and data */ - public void createCname(RecordName name, RecordData canonicalName, NameServiceQueue.Priority priority) { - forward(new CreateRecord(new Record(Record.Type.CNAME, name, canonicalName)), priority); + /** Create or update a given record */ + public void createRecord(Record record, NameServiceQueue.Priority priority) { + forward(new CreateRecord(record), priority); } /** Create or update an ALIAS record with given name and targets */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java index ac29f8952a0..683b16c803c 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java @@ -332,8 +332,8 @@ public class RoutingPolicies { private void updateZoneDnsOf(RoutingPolicy policy) { for (var endpoint : policy.zoneEndpointsIn(controller.system(), RoutingMethod.exclusive, controller.zoneRegistry())) { var name = RecordName.from(endpoint.dnsName()); - var data = RecordData.fqdn(policy.canonicalName().value()); - nameServiceForwarderIn(policy.id().zone()).createCname(name, data, Priority.normal); + var record = new Record(Record.Type.CNAME, name, RecordData.fqdn(policy.canonicalName().value())); + nameServiceForwarderIn(policy.id().zone()).createRecord(record, Priority.normal); } } |