diff options
author | jonmv <venstad@gmail.com> | 2023-11-20 15:52:23 +0100 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-11-20 15:52:23 +0100 |
commit | da20229f3c9c168fd2680a523cef8d1d330e0dc4 (patch) | |
tree | 176d5e9d80f6a2d7f90954e967189f23bec4757c /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb | |
parent | 88ba68c235ce3160fb940d214debbedc10a94444 (diff) |
Move id seed to LoadBalancer
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb')
6 files changed, 30 insertions, 33 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java index 36f2eb4bb2c..f8de6e1db16 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancer.java @@ -17,12 +17,14 @@ import java.util.Set; public class LoadBalancer { private final LoadBalancerId id; + private final String idSeed; private final Optional<LoadBalancerInstance> instance; private final State state; private final Instant changedAt; - public LoadBalancer(LoadBalancerId id, Optional<LoadBalancerInstance> instance, State state, Instant changedAt) { + public LoadBalancer(LoadBalancerId id, String idSeed, Optional<LoadBalancerInstance> instance, State state, Instant changedAt) { this.id = Objects.requireNonNull(id, "id must be non-null"); + this.idSeed = Objects.requireNonNull(idSeed, "idSeed must be non-null"); this.instance = Objects.requireNonNull(instance, "instance must be non-null"); this.state = Objects.requireNonNull(state, "state must be non-null"); this.changedAt = Objects.requireNonNull(changedAt, "changedAt must be non-null"); @@ -40,6 +42,11 @@ public class LoadBalancer { return id; } + /** Seed to use for generating resource IDs for provisioned resources in this. */ + public String idSeed() { + return idSeed; + } + /** The instance associated with this */ public Optional<LoadBalancerInstance> instance() { return instance; @@ -64,12 +71,12 @@ public class LoadBalancer { if (this.state != State.reserved && state == State.reserved) { throw new IllegalArgumentException("Invalid state transition: " + this.state + " -> " + state); } - return new LoadBalancer(id, instance, state, changedAt); + return new LoadBalancer(id, idSeed, instance, state, changedAt); } /** Returns a copy of this with instance set to given instance */ public LoadBalancer with(LoadBalancerInstance instance) { - return new LoadBalancer(id, Optional.of(instance), state, changedAt); + return new LoadBalancer(id, idSeed, Optional.of(instance), state, changedAt); } public enum State { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java index 818858ef385..c0931ecbc70 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java @@ -20,7 +20,6 @@ import java.util.Set; */ public class LoadBalancerInstance { - private final String idSeed; private final Optional<DomainName> hostname; private final Optional<String> ip4Address; private final Optional<String> ip6Address; @@ -32,10 +31,9 @@ public class LoadBalancerInstance { private final List<PrivateServiceId> serviceIds; private final CloudAccount cloudAccount; - public LoadBalancerInstance(String idSeed, Optional<DomainName> hostname, Optional<String> ip4Address, Optional<String> ip6Address, + public LoadBalancerInstance(Optional<DomainName> hostname, Optional<String> ip4Address, Optional<String> ip6Address, Optional<DnsZone> dnsZone, Set<Integer> ports, Set<String> networks, Set<Real> reals, ZoneEndpoint settings, List<PrivateServiceId> serviceIds, CloudAccount cloudAccount) { - this.idSeed = Objects.requireNonNull(idSeed, "idSeed must be non-null"); this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null"); this.ip4Address = Objects.requireNonNull(ip4Address, "ip4Address must be non-null"); this.ip6Address = Objects.requireNonNull(ip6Address, "ip6Address must be non-null"); @@ -53,11 +51,6 @@ public class LoadBalancerInstance { } } - /** A unique seed to use when generating cloud-specific resource IDs for this load balancer instance. */ - public String idSeed() { - return idSeed; - } - /** Fully-qualified domain name of this load balancer. This hostname can be used for query and feed */ public Optional<DomainName> hostname() { return hostname; @@ -128,7 +121,7 @@ public class LoadBalancerInstance { public LoadBalancerInstance with(Set<Real> reals, ZoneEndpoint settings, Optional<PrivateServiceId> serviceId) { List<PrivateServiceId> ids = new ArrayList<>(serviceIds); serviceId.filter(id -> ! ids.contains(id)).ifPresent(ids::add); - return new LoadBalancerInstance(idSeed, hostname, ip4Address, ip6Address, dnsZone, ports, networks, + return new LoadBalancerInstance(hostname, ip4Address, ip6Address, dnsZone, ports, networks, reals, settings, ids, cloudAccount); } @@ -137,7 +130,7 @@ public class LoadBalancerInstance { public LoadBalancerInstance withServiceIds(List<PrivateServiceId> serviceIds) { List<PrivateServiceId> ids = new ArrayList<>(serviceIds); for (PrivateServiceId id : this.serviceIds) if ( ! ids.contains(id)) ids.add(id); - return new LoadBalancerInstance(idSeed, hostname, ip4Address, ip6Address, dnsZone, ports, networks, reals, settings, ids, cloudAccount); + return new LoadBalancerInstance(hostname, ip4Address, ip6Address, dnsZone, ports, networks, reals, settings, ids, cloudAccount); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java index 9e62edf8d4b..efd1536d108 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java @@ -18,10 +18,9 @@ public interface LoadBalancerService { * Provisions load balancers from the given specification. Implementations are expected to be idempotent * * @param spec Load balancer specification - * @param idSeed Seed for generating a unique ID for the load balancer instance * @return The provisioned load balancer instance */ - LoadBalancerInstance provision(LoadBalancerSpec spec, String idSeed); + LoadBalancerInstance provision(LoadBalancerSpec spec); /** * Configures load balancers for the given specification. Implementations are expected to be idempotent @@ -34,7 +33,7 @@ public interface LoadBalancerService { */ LoadBalancerInstance configure(LoadBalancerInstance instance, LoadBalancerSpec spec, boolean force); - void reallocate(LoadBalancerInstance provisioned, LoadBalancerSpec spec); + void reallocate(LoadBalancerSpec spec); /** Permanently remove given load balancer */ void remove(LoadBalancer loadBalancer); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java index 2b1007f75d4..2c672d0eada 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java @@ -36,7 +36,6 @@ public class LoadBalancerServiceMock implements LoadBalancerService { private final Map<Key, LoadBalancerInstance> instances = new HashMap<>(); private boolean throwOnCreate = false; private boolean supportsProvisioning = true; - private final AtomicBoolean uuid = new AtomicBoolean(true); public Map<LoadBalancerId, LoadBalancerInstance> instances() { return instances.entrySet().stream().collect(toMap(e -> new LoadBalancerId(e.getKey().application, e.getKey().cluster), @@ -66,10 +65,9 @@ public class LoadBalancerServiceMock implements LoadBalancerService { } @Override - public LoadBalancerInstance provision(LoadBalancerSpec spec, String idSeed) { + public LoadBalancerInstance provision(LoadBalancerSpec spec) { if (throwOnCreate) throw new IllegalStateException("Did not expect a new load balancer to be created"); var instance = new LoadBalancerInstance( - idSeed, Optional.of(DomainName.of("lb-" + spec.application().toShortString() + "-" + spec.cluster().value())), Optional.empty(), Optional.empty(), @@ -80,13 +78,13 @@ public class LoadBalancerServiceMock implements LoadBalancerService { spec.settings(), spec.settings().isPrivateEndpoint() ? List.of(PrivateServiceId.of("service")) : List.of(), spec.cloudAccount()); - instances.put(new Key(spec.application(), spec.cluster(), idSeed), instance); + instances.put(new Key(spec.application(), spec.cluster(), spec.idSeed()), instance); return instance; } @Override public LoadBalancerInstance configure(LoadBalancerInstance instance, LoadBalancerSpec spec, boolean force) { - var id = new Key(spec.application(), spec.cluster(), instance.idSeed()); + var id = new Key(spec.application(), spec.cluster(), spec.idSeed()); var oldInstance = requireNonNull(instances.get(id), "expected existing load balancer " + id); if (!force && !oldInstance.reals().isEmpty() && spec.reals().isEmpty()) { throw new IllegalArgumentException("Refusing to remove all reals from load balancer " + id); @@ -99,16 +97,16 @@ public class LoadBalancerServiceMock implements LoadBalancerService { } @Override - public void reallocate(LoadBalancerInstance provisioned, LoadBalancerSpec spec) { - instances.put(new Key(spec.application(), spec.cluster(), provisioned.idSeed()), - requireNonNull(instances.remove(new Key(null, null, provisioned.idSeed())))); // ᕙ༼◕_◕༽ᕤ + public void reallocate(LoadBalancerSpec spec) { + instances.put(new Key(spec.application(), spec.cluster(), spec.idSeed()), + requireNonNull(instances.remove(new Key(null, null, spec.idSeed())))); // ᕙ༼◕_◕༽ᕤ } @Override public void remove(LoadBalancer loadBalancer) { requireNonNull(instances.remove(new Key(loadBalancer.id().application(), loadBalancer.id().cluster(), - loadBalancer.instance().get().idSeed())), + loadBalancer.idSeed())), "expected load balancer to exist: " + loadBalancer.id()); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerSpec.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerSpec.java index bde736e7a28..8c0aee2b4c6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerSpec.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerSpec.java @@ -16,20 +16,21 @@ import java.util.Set; * @author mpolden */ public record LoadBalancerSpec(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals, - ZoneEndpoint settings, CloudAccount cloudAccount) { + ZoneEndpoint settings, CloudAccount cloudAccount, String idSeed) { public static final ApplicationId preProvisionOwner = ApplicationId.from("hosted-vespa", "pre-provision", "default"); - public static LoadBalancerSpec preProvisionSpec(ClusterSpec.Id slot, CloudAccount account) { - return new LoadBalancerSpec(preProvisionOwner, slot, Set.of(), ZoneEndpoint.defaultEndpoint, account); + public static LoadBalancerSpec preProvisionSpec(ClusterSpec.Id slot, CloudAccount account, String idSeed) { + return new LoadBalancerSpec(preProvisionOwner, slot, Set.of(), ZoneEndpoint.defaultEndpoint, account, idSeed); } public LoadBalancerSpec(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals, - ZoneEndpoint settings, CloudAccount cloudAccount) { + ZoneEndpoint settings, CloudAccount cloudAccount, String idSeed) { this.application = Objects.requireNonNull(application); this.cluster = Objects.requireNonNull(cluster); this.reals = ImmutableSortedSet.copyOf(Objects.requireNonNull(reals)); this.settings = Objects.requireNonNull(settings); this.cloudAccount = Objects.requireNonNull(cloudAccount); + this.idSeed = Objects.requireNonNull(idSeed); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java index f6de166ed01..1ca7442adf5 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java @@ -30,12 +30,11 @@ public class SharedLoadBalancerService implements LoadBalancerService { } @Override - public LoadBalancerInstance provision(LoadBalancerSpec spec, String idSeed) { + public LoadBalancerInstance provision(LoadBalancerSpec spec) { if ( ! spec.settings().isPublicEndpoint()) throw new IllegalArgumentException("non-public endpoints is not supported with " + getClass()); - return new LoadBalancerInstance(idSeed, - Optional.of(DomainName.of(vipHostname)), + return new LoadBalancerInstance(Optional.of(DomainName.of(vipHostname)), Optional.empty(), Optional.empty(), Optional.empty(), @@ -53,7 +52,7 @@ public class SharedLoadBalancerService implements LoadBalancerService { } @Override - public void reallocate(LoadBalancerInstance provisioned, LoadBalancerSpec spec) { + public void reallocate(LoadBalancerSpec spec) { throw new UnsupportedOperationException("reallocate is not supported with " + getClass()); } |