diff options
Diffstat (limited to 'node-repository')
3 files changed, 70 insertions, 1 deletions
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 0e388dac9dd..17b7b16141e 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 @@ -12,6 +12,24 @@ import com.yahoo.config.provision.NodeType; public interface LoadBalancerService { /** + * Provisions load balancers from the given specification. Implementations are expected to be idempotent + * + * @param spec Load balancer specification + * @return The provisioned load balancer instance + */ + LoadBalancerInstance provision(LoadBalancerSpec spec); + + /** + * Configures load balancers for the given specification. Implementations are expected to be idempotent + * + * @param spec Load balancer specification + * @param force Whether reconfiguration should be forced (e.g. allow configuring an empty set of reals on a + * pre-existing load balancer, or removing an unused private endpoint service load balancer). + * @return The (re)configured load balancer instance + */ + LoadBalancerInstance configure(LoadBalancerSpec spec, boolean force); + + /** * Create a load balancer from the given specification. Implementations are expected to be idempotent * * @param spec Load balancer specification @@ -19,7 +37,8 @@ public interface LoadBalancerService { * pre-existing load balancer). * @return The provisioned load balancer instance */ - LoadBalancerInstance create(LoadBalancerSpec spec, boolean force); + // TODO jonmv: remove + default LoadBalancerInstance create(LoadBalancerSpec spec, boolean force) { provision(spec); return configure(spec, force); } /** 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 e74e3068674..e3510baf026 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 @@ -10,6 +10,7 @@ import com.yahoo.config.provision.ZoneEndpoint; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -48,6 +49,46 @@ public class LoadBalancerServiceMock implements LoadBalancerService { } @Override + public LoadBalancerInstance provision(LoadBalancerSpec spec) { + if (throwOnCreate) throw new IllegalStateException("Did not expect a new load balancer to be created"); + var id = new LoadBalancerId(spec.application(), spec.cluster()); + var instance = new LoadBalancerInstance( + Optional.of(DomainName.of("lb-" + spec.application().toShortString() + "-" + spec.cluster().value())), + Optional.empty(), + Optional.of(new DnsZone("zone-id-1")), + Collections.singleton(4443), + ImmutableSet.of("10.2.3.0/24", "10.4.5.0/24"), + spec.reals(), + spec.settings(), + spec.settings().isPrivateEndpoint() ? Optional.of(PrivateServiceId.of("service")) : Optional.empty(), + spec.cloudAccount()); + instances.put(id, instance); + return instance; + } + + @Override + public LoadBalancerInstance configure(LoadBalancerSpec spec, boolean force) { + if (throwOnCreate) throw new IllegalStateException("Did not expect a new load balancer to be created"); + var id = new LoadBalancerId(spec.application(), spec.cluster()); + var oldInstance = Objects.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); + } + var instance = new LoadBalancerInstance( + Optional.of(DomainName.of("lb-" + spec.application().toShortString() + "-" + spec.cluster().value())), + Optional.empty(), + Optional.of(new DnsZone("zone-id-1")), + Collections.singleton(4443), + ImmutableSet.of("10.2.3.0/24", "10.4.5.0/24"), + spec.reals(), + spec.settings(), + spec.settings().isPrivateEndpoint() ? Optional.of(PrivateServiceId.of("service")) : Optional.empty(), + spec.cloudAccount()); + instances.put(id, instance); + return instance; + } + + @Override public LoadBalancerInstance create(LoadBalancerSpec spec, boolean force) { if (throwOnCreate) throw new IllegalStateException("Did not expect a new load balancer to be created"); var id = new LoadBalancerId(spec.application(), spec.cluster()); 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 fa672c0fd1e..681bfa9eb3a 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 @@ -28,6 +28,15 @@ public class SharedLoadBalancerService implements LoadBalancerService { } @Override + public LoadBalancerInstance provision(LoadBalancerSpec spec) { + return create(spec, false); + } + + @Override + public LoadBalancerInstance configure(LoadBalancerSpec spec, boolean force) { + return create(spec, force); + } + public LoadBalancerInstance create(LoadBalancerSpec spec, boolean force) { if ( ! spec.settings().isPublicEndpoint()) throw new IllegalArgumentException("non-public endpoints is not supported with " + getClass()); |