diff options
author | jonmv <venstad@gmail.com> | 2022-12-01 14:12:33 +0100 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-12-01 14:12:33 +0100 |
commit | 4226f2d67552c31e07a5be772691be213770a1b7 (patch) | |
tree | 8ae23d295a385dd286a6b2b080fc7a8715ab39c8 /config-provisioning | |
parent | 2925f225b34ad7fa3eb515bbddcc8c774e514131 (diff) |
Write new settings only on activation
Diffstat (limited to 'config-provisioning')
3 files changed, 36 insertions, 6 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java index afa3c0a4062..83a2258976e 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java @@ -21,7 +21,8 @@ public class ClusterMembership { protected ClusterMembership() {} - private ClusterMembership(String stringValue, Version vespaVersion, Optional<DockerImage> dockerImageRepo) { + private ClusterMembership(String stringValue, Version vespaVersion, Optional<DockerImage> dockerImageRepo, + LoadBalancerSettings loadBalancerSettings) { String[] components = stringValue.split("/"); if (components.length < 4) throw new RuntimeException("Could not parse '" + stringValue + "' to a cluster membership. " + @@ -49,6 +50,7 @@ public class ClusterMembership { .exclusive(exclusive) .combinedId(combinedId.map(ClusterSpec.Id::from)) .dockerImageRepository(dockerImageRepo) + .loadBalancerSettings(loadBalancerSettings) .stateful(stateful) .build(); this.index = Integer.parseInt(components[3]); @@ -123,7 +125,12 @@ public class ClusterMembership { public String toString() { return stringValue(); } public static ClusterMembership from(String stringValue, Version vespaVersion, Optional<DockerImage> dockerImageRepo) { - return new ClusterMembership(stringValue, vespaVersion, dockerImageRepo); + return from(stringValue, vespaVersion, dockerImageRepo, LoadBalancerSettings.empty); + } + + public static ClusterMembership from(String stringValue, Version vespaVersion, Optional<DockerImage> dockerImageRepo, + LoadBalancerSettings loadBalancerSettings) { + return new ClusterMembership(stringValue, vespaVersion, dockerImageRepo, loadBalancerSettings); } public static ClusterMembership from(ClusterSpec cluster, int index) { diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java b/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java index 3973b042bde..01bb0ca45ff 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java @@ -1,10 +1,12 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision.serialization; +import com.yahoo.component.Version; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostSpec; +import com.yahoo.config.provision.LoadBalancerSettings; import com.yahoo.config.provision.NodeResources; import com.yahoo.slime.ArrayTraverser; import com.yahoo.slime.Cursor; @@ -38,6 +40,8 @@ public class AllocatedHostsSerializer { private static final String hostSpecKey = "hostSpec"; private static final String hostSpecHostNameKey = "hostName"; private static final String hostSpecMembershipKey = "membership"; + private static final String loadBalancerSettingsKey = "loadBalancerSettings"; + private static final String allowedUrnsKey = "allowedUrns"; private static final String realResourcesKey = "realResources"; private static final String advertisedResourcesKey = "advertisedResources"; @@ -81,6 +85,9 @@ public class AllocatedHostsSerializer { host.membership().ifPresent(membership -> { object.setString(hostSpecMembershipKey, membership.stringValue()); object.setString(hostSpecVespaVersionKey, membership.cluster().vespaVersion().toFullString()); + if ( ! membership.cluster().loadBalancerSettings().isEmpty()) + membership.cluster().loadBalancerSettings().allowedUrns() + .forEach(object.setObject(loadBalancerSettingsKey).setArray(allowedUrnsKey)::addString); membership.cluster().dockerImageRepo().ifPresent(repo -> object.setString(hostSpecDockerImageRepoKey, repo.untagged())); }); toSlime(host.realResources(), object.setObject(realResourcesKey)); @@ -125,7 +132,7 @@ public class AllocatedHostsSerializer { nodeResourcesFromSlime(object.field(advertisedResourcesKey)), optionalNodeResourcesFromSlime(object.field(requestedResourcesKey)), // TODO: Make non-optional when we serialize NodeResources.unspecified() membershipFromSlime(object), - optionalString(object.field(hostSpecCurrentVespaVersionKey)).map(com.yahoo.component.Version::new), + optionalString(object.field(hostSpecCurrentVespaVersionKey)).map(Version::new), NetworkPortsSerializer.fromSlime(object.field(hostSpecNetworkPortsKey)), optionalDockerImage(object.field(hostSpecDockerImageRepoKey))); } @@ -211,10 +218,15 @@ public class AllocatedHostsSerializer { private static ClusterMembership membershipFromSlime(Inspector object) { return ClusterMembership.from(object.field(hostSpecMembershipKey).asString(), - com.yahoo.component.Version.fromString(object.field(hostSpecVespaVersionKey).asString()), + Version.fromString(object.field(hostSpecVespaVersionKey).asString()), object.field(hostSpecDockerImageRepoKey).valid() - ? Optional.of(DockerImage.fromString(object.field(hostSpecDockerImageRepoKey).asString())) - : Optional.empty()); + ? Optional.of(DockerImage.fromString(object.field(hostSpecDockerImageRepoKey).asString())) + : Optional.empty(), + object.field(loadBalancerSettingsKey).valid() + ? new LoadBalancerSettings(SlimeUtils.entriesStream(object.field(loadBalancerSettingsKey).field(allowedUrnsKey)) + .map(Inspector::asString) + .toList()) + : LoadBalancerSettings.empty); } private static Optional<String> optionalString(Inspector inspector) { diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java index 172e0875767..bcb3b8cd4aa 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostSpec; +import com.yahoo.config.provision.LoadBalancerSettings; import com.yahoo.config.provision.NetworkPorts; import com.yahoo.config.provision.NodeResources; import org.junit.jupiter.api.Test; @@ -19,6 +20,7 @@ import java.util.Set; import static com.yahoo.config.provision.serialization.AllocatedHostsSerializer.fromJson; import static com.yahoo.config.provision.serialization.AllocatedHostsSerializer.toJson; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * @author bratseth @@ -62,6 +64,15 @@ public class AllocatedHostsSerializerTest { Optional.empty()), Optional.of(Version.fromString("3.4.5")), Optional.empty(), Optional.empty())); + hosts.add(new HostSpec("with-load-balancer-settings", + smallSlowDiskSpeedNode, + bigSlowDiskSpeedNode, + anyDiskSpeedNode, + ClusterMembership.from("container/test/0/0", Version.fromString("6.73.1"), + Optional.empty(), new LoadBalancerSettings(List.of("burn"))), + Optional.empty(), + Optional.empty(), + Optional.empty())); hosts.add(new HostSpec("with-ports", smallSlowDiskSpeedNode, bigSlowDiskSpeedNode, |