diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-02-06 14:06:06 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-02-06 14:40:04 +0100 |
commit | 6186a7b215fecda94d2e9e47de3b800ed4452f82 (patch) | |
tree | 80f22bd75a1edcd1a2fb2a403acabeaba221ea87 /controller-server | |
parent | 8adc7d48476437d33c910e46a6da85d36acedebe (diff) |
Add rotations to routing policy
Diffstat (limited to 'controller-server')
5 files changed, 45 insertions, 14 deletions
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 4934c29afe4..d71e9c99a24 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 @@ -2,14 +2,17 @@ package com.yahoo.vespa.hosted.controller.application; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableSortedSet; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostName; +import com.yahoo.config.provision.RotationName; 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.Set; import java.util.stream.Collectors; /** @@ -25,12 +28,15 @@ public class RoutingPolicy { private final String recordId; private final HostName alias; private final HostName canonicalName; + private final Set<RotationName> rotations; - public RoutingPolicy(ApplicationId owner, String recordId, HostName alias, HostName canonicalName) { + public RoutingPolicy(ApplicationId owner, String recordId, HostName alias, HostName canonicalName, + Set<RotationName> 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.rotations = ImmutableSortedSet.copyOf(Objects.requireNonNull(rotations, "rotations must be non-null")); } /** The application owning this */ @@ -53,6 +59,11 @@ public class RoutingPolicy { return canonicalName; } + /** The rotations in this policy */ + public Set<RotationName> rotations() { + return rotations; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -61,17 +72,19 @@ public class RoutingPolicy { return owner.equals(that.owner) && recordId.equals(that.recordId) && alias.equals(that.alias) && - canonicalName.equals(that.canonicalName); + canonicalName.equals(that.canonicalName) && + rotations.equals(that.rotations); } @Override public int hashCode() { - return Objects.hash(owner, recordId, alias, canonicalName); + return Objects.hash(owner, recordId, alias, canonicalName, rotations); } @Override public String toString() { - return String.format("%s: %s -> %s, owned by %s", recordId, alias, canonicalName, owner.toShortString()); + return String.format("%s: %s -> %s (rotations: %s), owned by %s", recordId, alias, canonicalName, + rotations, 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 800c1fa83c2..48e9caef1a5 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,7 @@ public class RoutingPolicyMaintainer extends Maintainer { } else { id = nameService.createCname(name, data); } - return new RoutingPolicy(application, id.asString(), alias, loadBalancer.hostname()); + return new RoutingPolicy(application, id.asString(), alias, loadBalancer.hostname(), 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 45dc6485805..0bc705ba485 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 @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.controller.persistence; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostName; +import com.yahoo.config.provision.RotationName; import com.yahoo.slime.ArrayTraverser; import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; @@ -26,6 +27,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 rotationsField = "rotations"; public Slime toSlime(Set<RoutingPolicy> routingPolicies) { Slime slime = new Slime(); @@ -36,6 +38,10 @@ public class RoutingPolicySerializer { policyObject.setString(recordIdField, policy.recordId()); policyObject.setString(aliasField, policy.alias().value()); policyObject.setString(canonicalNameField, policy.canonicalName().value()); + Cursor rotationArray = policyObject.setArray(rotationsField); + policy.rotations().forEach(rotation -> { + rotationArray.addString(rotation.value()); + }); }); return slime; } @@ -48,6 +54,8 @@ public class RoutingPolicySerializer { field = root.field(aliasesField); // TODO: Remove after 7.9 has been released } field.traverse((ArrayTraverser) (i, inspect) -> { + Set<RotationName> rotations = new LinkedHashSet<>(); + inspect.field(rotationsField).traverse((ArrayTraverser) (j, rotation) -> rotations.add(RotationName.from(rotation.asString()))); Inspector recordId = inspect.field(recordIdField); if (!recordId.valid()) { recordId = inspect.field(idField); // TODO: Remove after 7.9 has been released @@ -55,7 +63,8 @@ public class RoutingPolicySerializer { policies.add(new RoutingPolicy(owner, recordId.asString(), HostName.from(inspect.field(aliasField).asString()), - HostName.from(inspect.field(canonicalNameField).asString()))); + HostName.from(inspect.field(canonicalNameField).asString()), + rotations)); }); return Collections.unmodifiableSet(policies); } 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 558ab51638a..ceec3f04c81 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 @@ -119,15 +119,17 @@ public class RoutingPolicyMaintainerTest { } - private List<LoadBalancer> makeLoadBalancers(ZoneId zone, ApplicationId applicationId, int count) { + private List<LoadBalancer> makeLoadBalancers(ZoneId zone, ApplicationId application, int count) { List<LoadBalancer> loadBalancers = new ArrayList<>(); + Set<RotationName> rotations = Collections.singleton(RotationName.from("r1")); for (int i = 0; i < count; i++) { loadBalancers.add( new LoadBalancer("LB-" + i + "-Z-" + zone.value(), - applicationId, + application, ClusterSpec.Id.from("cluster-" + i), - HostName.from("loadbalancer-" + i + "-" + applicationId.serializedForm() + - "-zone-" + zone.value()))); + HostName.from("loadbalancer-" + i + "-" + application.serializedForm() + + "-zone-" + zone.value()), + 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 87609021ba5..1c64aaf16c2 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 @@ -4,10 +4,12 @@ package com.yahoo.vespa.hosted.controller.persistence; import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostName; +import com.yahoo.config.provision.RotationName; import com.yahoo.vespa.config.SlimeUtils; import com.yahoo.vespa.hosted.controller.application.RoutingPolicy; import org.junit.Test; +import java.util.Collections; import java.util.Set; import static org.junit.Assert.assertEquals; @@ -21,14 +23,17 @@ public class RoutingPolicySerializerTest { public void test_serialization() { RoutingPolicySerializer serializer = new RoutingPolicySerializer(); ApplicationId owner = ApplicationId.defaultId(); + Set<RotationName> rotations = Set.of(RotationName.from("r1"), RotationName.from("r2")); Set<RoutingPolicy> loadBalancers = ImmutableSet.of(new RoutingPolicy(owner, "record-id-1", HostName.from("my-pretty-alias"), - HostName.from("long-and-ugly-name")), + HostName.from("long-and-ugly-name"), + rotations), new RoutingPolicy(owner, "record-id-2", HostName.from("my-pretty-alias-2"), - HostName.from("long-and-ugly-name-2"))); + HostName.from("long-and-ugly-name-2"), + rotations)); Set<RoutingPolicy> serialized = serializer.fromSlime(owner, serializer.toSlime(loadBalancers)); assertEquals(loadBalancers, serialized); } @@ -54,11 +59,13 @@ public class RoutingPolicySerializerTest { Set<RoutingPolicy> loadBalancers = ImmutableSet.of(new RoutingPolicy(owner, "record-id-1", HostName.from("my-pretty-alias"), - HostName.from("long-and-ugly-name")), + HostName.from("long-and-ugly-name"), + Collections.emptySet()), new RoutingPolicy(owner, "record-id-2", HostName.from("my-pretty-alias-2"), - HostName.from("long-and-ugly-name-2"))); + HostName.from("long-and-ugly-name-2"), + Collections.emptySet())); RoutingPolicySerializer serializer = new RoutingPolicySerializer(); assertEquals(loadBalancers, serializer.fromSlime(owner, SlimeUtils.jsonToSlime(json))); } |