aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2023-02-08 14:20:43 +0100
committerGitHub <noreply@github.com>2023-02-08 14:20:43 +0100
commit8940e48a6da3692cc20f8cbb071520dcf5e8d704 (patch)
tree3c37cfb8108b7ae7568d82289d7a5defb8ff346b /node-repository
parent8ceff780883d070e7916ee6eb2a241f437faa339 (diff)
parente9bb9b5a64353694d45d3b33528b3e5294b641ab (diff)
Merge pull request #25943 from vespa-engine/jonmv/private-endpoints-3
Split prepare and activate in LB provision clients
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java21
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java41
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java9
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());