From dd11f96374d43d11e9f2b36e017078506871ade0 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Wed, 6 Feb 2019 15:21:14 +0100 Subject: Add DNS zone to routing policy --- .../api/integration/configserver/LoadBalancer.java | 10 +++++++++- .../hosted/controller/application/RoutingPolicy.java | 17 +++++++++++++---- .../controller/maintenance/RoutingPolicyMaintainer.java | 3 ++- .../controller/persistence/RoutingPolicySerializer.java | 9 +++++++++ .../maintenance/RoutingPolicyMaintainerTest.java | 2 ++ .../persistence/RoutingPolicySerializerTest.java | 5 +++++ 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/LoadBalancer.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/LoadBalancer.java index ec5321cb3b6..9f686570da1 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/LoadBalancer.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/LoadBalancer.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.RotationName; import java.util.Objects; +import java.util.Optional; import java.util.Set; /** @@ -21,13 +22,16 @@ public class LoadBalancer { private final ApplicationId application; private final ClusterSpec.Id cluster; private final HostName hostname; + private final Optional dnsZone; private final Set rotations; - public LoadBalancer(String id, ApplicationId application, ClusterSpec.Id cluster, HostName hostname, Set rotations) { + public LoadBalancer(String id, ApplicationId application, ClusterSpec.Id cluster, HostName hostname, + Optional dnsZone, Set rotations) { this.id = Objects.requireNonNull(id, "id must be non-null"); this.application = Objects.requireNonNull(application, "application must be non-null"); this.cluster = Objects.requireNonNull(cluster, "cluster must be non-null"); this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null"); + this.dnsZone = Objects.requireNonNull(dnsZone, "dnsZone must be non-null"); this.rotations = ImmutableSortedSet.copyOf(Objects.requireNonNull(rotations, "rotations must be non-null")); } @@ -47,6 +51,10 @@ public class LoadBalancer { return hostname; } + public Optional dnsZone() { + return dnsZone; + } + public Set rotations() { return rotations; } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java index d71e9c99a24..41e3a6086d2 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/RoutingPolicy.java @@ -12,6 +12,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -28,14 +29,16 @@ public class RoutingPolicy { private final String recordId; private final HostName alias; private final HostName canonicalName; + private final Optional dnsZone; private final Set rotations; public RoutingPolicy(ApplicationId owner, String recordId, HostName alias, HostName canonicalName, - Set rotations) { + Optional dnsZone, Set rotations) { this.owner = Objects.requireNonNull(owner, "owner must be non-null"); this.recordId = Objects.requireNonNull(recordId, "recordId must be non-null"); this.alias = Objects.requireNonNull(alias, "alias must be non-null"); this.canonicalName = Objects.requireNonNull(canonicalName, "canonicalName must be non-null"); + this.dnsZone = Objects.requireNonNull(dnsZone, "dnsZone must be non-null"); this.rotations = ImmutableSortedSet.copyOf(Objects.requireNonNull(rotations, "rotations must be non-null")); } @@ -59,6 +62,11 @@ public class RoutingPolicy { return canonicalName; } + /** DNS zone for this, if any */ + public Optional dnsZone() { + return dnsZone; + } + /** The rotations in this policy */ public Set rotations() { return rotations; @@ -73,18 +81,19 @@ public class RoutingPolicy { recordId.equals(that.recordId) && alias.equals(that.alias) && canonicalName.equals(that.canonicalName) && + dnsZone.equals(that.dnsZone) && rotations.equals(that.rotations); } @Override public int hashCode() { - return Objects.hash(owner, recordId, alias, canonicalName, rotations); + return Objects.hash(owner, recordId, alias, canonicalName, dnsZone, rotations); } @Override public String toString() { - return String.format("%s: %s -> %s (rotations: %s), owned by %s", recordId, alias, canonicalName, - rotations, owner.toShortString()); + return String.format("%s: %s -> %s [rotations: %s%s], owned by %s", recordId, alias, canonicalName, rotations, + dnsZone.map(z -> ", DNS zone: " + z).orElse(""), owner.toShortString()); } public static String createAlias(ClusterSpec.Id clusterId, ApplicationId applicationId, ZoneId zoneId) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java index 48e9caef1a5..42e8a572815 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainer.java @@ -107,7 +107,8 @@ public class RoutingPolicyMaintainer extends Maintainer { } else { id = nameService.createCname(name, data); } - return new RoutingPolicy(application, id.asString(), alias, loadBalancer.hostname(), loadBalancer.rotations()); + return new RoutingPolicy(application, id.asString(), alias, loadBalancer.hostname(), loadBalancer.dnsZone(), + loadBalancer.rotations()); } /** Find all load balancers assigned to application in given zone */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java index 0bc705ba485..479d87cbe71 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializer.java @@ -12,7 +12,9 @@ import com.yahoo.vespa.hosted.controller.application.RoutingPolicy; import java.util.Collections; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; +import java.util.function.Function; /** * Serializer and deserializer for a {@link RoutingPolicy}. @@ -27,6 +29,7 @@ public class RoutingPolicySerializer { private static final String recordIdField = "recordId"; private static final String aliasField = "alias"; private static final String canonicalNameField = "canonicalName"; + private static final String dnsZoneField = "dnsZone"; private static final String rotationsField = "rotations"; public Slime toSlime(Set routingPolicies) { @@ -38,6 +41,7 @@ public class RoutingPolicySerializer { policyObject.setString(recordIdField, policy.recordId()); policyObject.setString(aliasField, policy.alias().value()); policyObject.setString(canonicalNameField, policy.canonicalName().value()); + policy.dnsZone().ifPresent(dnsZone -> policyObject.setString(dnsZoneField, dnsZone)); Cursor rotationArray = policyObject.setArray(rotationsField); policy.rotations().forEach(rotation -> { rotationArray.addString(rotation.value()); @@ -64,9 +68,14 @@ public class RoutingPolicySerializer { recordId.asString(), HostName.from(inspect.field(aliasField).asString()), HostName.from(inspect.field(canonicalNameField).asString()), + optionalField(inspect.field(dnsZoneField), Function.identity()), rotations)); }); return Collections.unmodifiableSet(policies); } + private static Optional optionalField(Inspector field, Function fieldMapper) { + return Optional.of(field).filter(Inspector::valid).map(Inspector::asString).map(fieldMapper); + } + } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java index ceec3f04c81..f1c571da451 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Supplier; @@ -129,6 +130,7 @@ public class RoutingPolicyMaintainerTest { ClusterSpec.Id.from("cluster-" + i), HostName.from("loadbalancer-" + i + "-" + application.serializedForm() + "-zone-" + zone.value()), + Optional.of("dns-zone-1"), rotations)); } return loadBalancers; diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializerTest.java index 1c64aaf16c2..7dc31581d3b 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/RoutingPolicySerializerTest.java @@ -10,6 +10,7 @@ import com.yahoo.vespa.hosted.controller.application.RoutingPolicy; import org.junit.Test; import java.util.Collections; +import java.util.Optional; import java.util.Set; import static org.junit.Assert.assertEquals; @@ -28,11 +29,13 @@ public class RoutingPolicySerializerTest { "record-id-1", HostName.from("my-pretty-alias"), HostName.from("long-and-ugly-name"), + Optional.of("zone1"), rotations), new RoutingPolicy(owner, "record-id-2", HostName.from("my-pretty-alias-2"), HostName.from("long-and-ugly-name-2"), + Optional.empty(), rotations)); Set serialized = serializer.fromSlime(owner, serializer.toSlime(loadBalancers)); assertEquals(loadBalancers, serialized); @@ -60,11 +63,13 @@ public class RoutingPolicySerializerTest { "record-id-1", HostName.from("my-pretty-alias"), HostName.from("long-and-ugly-name"), + Optional.empty(), Collections.emptySet()), new RoutingPolicy(owner, "record-id-2", HostName.from("my-pretty-alias-2"), HostName.from("long-and-ugly-name-2"), + Optional.empty(), Collections.emptySet())); RoutingPolicySerializer serializer = new RoutingPolicySerializer(); assertEquals(loadBalancers, serializer.fromSlime(owner, SlimeUtils.jsonToSlime(json))); -- cgit v1.2.3