aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2022-05-12 16:19:36 +0200
committerMartin Polden <mpolden@mpolden.no>2022-05-13 14:46:35 +0200
commitb5888fc62eb9bf8bcb9e42335480d4c18cd233f0 (patch)
tree5f2b838002daac16995d03d811030d469bab0132 /node-repository/src
parent8327b0e89d21a7122019a3e342baa880f23a9898 (diff)
Use cloud account in load balancer provisioning
Diffstat (limited to 'node-repository/src')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerInstance.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerService.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerServiceMock.java8
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/LoadBalancerSpec.java11
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java16
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java29
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java5
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java13
12 files changed, 77 insertions, 46 deletions
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 1548038e19d..edffa817f64 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
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.lb;
import ai.vespa.http.DomainName;
import com.google.common.collect.ImmutableSortedSet;
+import com.yahoo.config.provision.CloudAccount;
import java.util.Objects;
import java.util.Optional;
@@ -21,14 +22,16 @@ public class LoadBalancerInstance {
private final Set<Integer> ports;
private final Set<String> networks;
private final Set<Real> reals;
+ private final Optional<CloudAccount> cloudAccount;
public LoadBalancerInstance(DomainName hostname, Optional<DnsZone> dnsZone, Set<Integer> ports, Set<String> networks,
- Set<Real> reals) {
+ Set<Real> reals, Optional<CloudAccount> cloudAccount) {
this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null");
this.dnsZone = Objects.requireNonNull(dnsZone, "dnsZone must be non-null");
this.ports = ImmutableSortedSet.copyOf(requirePorts(ports));
this.networks = ImmutableSortedSet.copyOf(Objects.requireNonNull(networks, "networks must be non-null"));
this.reals = ImmutableSortedSet.copyOf(Objects.requireNonNull(reals, "targets must be non-null"));
+ this.cloudAccount = Objects.requireNonNull(cloudAccount, "cloudAccount must be non-null");
}
/** Fully-qualified domain name of this load balancer. This hostname can be used for query and feed */
@@ -56,9 +59,14 @@ public class LoadBalancerInstance {
return reals;
}
+ /** Cloud account of this load balancer. This is empty if the load balancer is in the zone's default account */
+ public Optional<CloudAccount> cloudAccount() {
+ return cloudAccount;
+ }
+
/** Returns a copy of this with reals set to given reals */
public LoadBalancerInstance withReals(Set<Real> reals) {
- return new LoadBalancerInstance(hostname, dnsZone, ports, networks, reals);
+ return new LoadBalancerInstance(hostname, dnsZone, ports, networks, reals, cloudAccount);
}
private static Set<Integer> requirePorts(Set<Integer> ports) {
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 ef127e04fba..0e388dac9dd 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
@@ -1,7 +1,6 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.lb;
-import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.NodeType;
@@ -22,8 +21,8 @@ public interface LoadBalancerService {
*/
LoadBalancerInstance create(LoadBalancerSpec spec, boolean force);
- /** Permanently remove load balancer for given application cluster */
- void remove(ApplicationId application, ClusterSpec.Id cluster);
+ /** Permanently remove given load balancer */
+ void remove(LoadBalancer loadBalancer);
/** Returns the protocol supported by this load balancer service */
Protocol protocol();
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 7da28bff930..df92a6ee44d 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
@@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.provision.lb;
import ai.vespa.http.DomainName;
import com.google.common.collect.ImmutableSet;
-import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.NodeType;
@@ -60,14 +59,15 @@ public class LoadBalancerServiceMock implements LoadBalancerService {
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.reals(),
+ spec.cloudAccount());
instances.put(id, instance);
return instance;
}
@Override
- public void remove(ApplicationId application, ClusterSpec.Id cluster) {
- instances.remove(new LoadBalancerId(application, cluster));
+ public void remove(LoadBalancer loadBalancer) {
+ instances.remove(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 f29cdeaa768..19739111415 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
@@ -3,9 +3,11 @@ package com.yahoo.vespa.hosted.provision.lb;
import com.google.common.collect.ImmutableSortedSet;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.ClusterSpec;
import java.util.Objects;
+import java.util.Optional;
import java.util.Set;
/**
@@ -18,11 +20,14 @@ public class LoadBalancerSpec {
private final ApplicationId application;
private final ClusterSpec.Id cluster;
private final Set<Real> reals;
+ private final Optional<CloudAccount> cloudAccount;
- public LoadBalancerSpec(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals) {
+ public LoadBalancerSpec(ApplicationId application, ClusterSpec.Id cluster, Set<Real> reals,
+ Optional<CloudAccount> cloudAccount) {
this.application = Objects.requireNonNull(application);
this.cluster = Objects.requireNonNull(cluster);
this.reals = ImmutableSortedSet.copyOf(Objects.requireNonNull(reals));
+ this.cloudAccount = Objects.requireNonNull(cloudAccount);
}
/** Owner of the load balancer */
@@ -40,4 +45,8 @@ public class LoadBalancerSpec {
return reals;
}
+ /** Cloud account to use when satisfying this */
+ public Optional<CloudAccount> cloudAccount() {
+ return cloudAccount;
+ }
}
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 fa9db9cd800..3d0cd3ef1e1 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
@@ -2,7 +2,6 @@
package com.yahoo.vespa.hosted.provision.lb;
import ai.vespa.http.DomainName;
-import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.NodeType;
@@ -11,11 +10,11 @@ import java.util.Optional;
import java.util.Set;
/**
- * This implementation of {@link LoadBalancerService} returns the load balancer(s) that exists by default in the shared
+ * This implementation of {@link LoadBalancerService} returns the load balancer(s) that exist by default in the shared
* routing layer.
*
- * Since such load balancers always exist, we can return the hostname of the routing layer VIP and the networks of the
- * proxy nodes directly. Nothing has to be provisioned.
+ * Since such load balancers always exist, we can return the hostname of the routing layer VIP directly. Nothing has to
+ * be provisioned.
*
* @author ogronnesby
*/
@@ -33,11 +32,12 @@ public class SharedLoadBalancerService implements LoadBalancerService {
Optional.empty(),
Set.of(4443),
Set.of(),
- spec.reals());
+ spec.reals(),
+ spec.cloudAccount());
}
@Override
- public void remove(ApplicationId application, ClusterSpec.Id cluster) {
+ public void remove(LoadBalancer loadBalancer) {
// Do nothing, we have no external state to modify
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
index fbc3d236421..36ca58e6ccd 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
@@ -80,7 +80,7 @@ public class LoadBalancerExpirer extends NodeRepositoryMaintainer {
try {
attempts.add(1);
log.log(Level.INFO, () -> "Removing expired inactive " + lb.id());
- service.remove(lb.id().application(), lb.id().cluster());
+ service.remove(lb);
db.removeLoadBalancer(lb.id());
} catch (Exception e){
failed.add(lb.id());
@@ -113,7 +113,7 @@ public class LoadBalancerExpirer extends NodeRepositoryMaintainer {
try {
attempts.add(1);
LOG.log(Level.INFO, () -> "Removing reals from inactive load balancer " + lb.id() + ": " + Sets.difference(lb.instance().get().reals(), reals));
- service.create(new LoadBalancerSpec(lb.id().application(), lb.id().cluster(), reals), true);
+ service.create(new LoadBalancerSpec(lb.id().application(), lb.id().cluster(), reals, lb.instance().get().cloudAccount()), true);
db.writeLoadBalancer(lb.with(lb.instance().map(instance -> instance.withReals(reals))), lb.state());
} catch (Exception e) {
failed.add(lb.id());
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java
index d953ab5b543..83180b2b136 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializer.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.provision.persistence;
import ai.vespa.http.DomainName;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
@@ -45,6 +46,7 @@ public class LoadBalancerSerializer {
private static final String realsField = "reals";
private static final String ipAddressField = "ipAddress";
private static final String portField = "port";
+ private static final String cloudAccountField = "cloudAccount";
public static byte[] toJson(LoadBalancer loadBalancer) {
Slime slime = new Slime();
@@ -66,6 +68,7 @@ public class LoadBalancerSerializer {
realObject.setString(ipAddressField, real.ipAddress());
realObject.setLong(portField, real.port());
}));
+ loadBalancer.instance().flatMap(LoadBalancerInstance::cloudAccount).ifPresent(cloudAccount -> root.setString(cloudAccountField, cloudAccount.value()));
try {
return SlimeUtils.toJsonBytes(slime);
} catch (IOException e) {
@@ -92,8 +95,9 @@ public class LoadBalancerSerializer {
Optional<DomainName> hostname = optionalString(object.field(hostnameField), Function.identity()).filter(s -> !s.isEmpty()).map(DomainName::of);
Optional<DnsZone> dnsZone = optionalString(object.field(dnsZoneField), DnsZone::new);
+ Optional<CloudAccount> cloudAccount = optionalString(object.field(cloudAccountField), CloudAccount::new);
Optional<LoadBalancerInstance> instance = hostname.map(h -> new LoadBalancerInstance(h, dnsZone, ports,
- networks, reals));
+ networks, reals, cloudAccount));
return new LoadBalancer(LoadBalancerId.fromSerializedForm(object.field(idField).asString()),
instance,
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java
index f76968d67fd..a62edec52e4 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisioner.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.provisioning;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.ApplicationTransaction;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.NodeType;
@@ -86,7 +87,7 @@ public class LoadBalancerProvisioner {
ClusterSpec.Id clusterId = effectiveId(cluster);
LoadBalancerId loadBalancerId = requireNonClashing(new LoadBalancerId(application, clusterId));
NodeList nodes = nodesOf(clusterId, application);
- prepare(loadBalancerId, nodes);
+ prepare(loadBalancerId, nodes, requestedNodes.cloudAccount());
}
}
@@ -177,10 +178,10 @@ public class LoadBalancerProvisioner {
return loadBalancerId;
}
- private void prepare(LoadBalancerId id, NodeList nodes) {
+ private void prepare(LoadBalancerId id, NodeList nodes, Optional<CloudAccount> cloudAccount) {
Instant now = nodeRepository.clock().instant();
Optional<LoadBalancer> loadBalancer = db.readLoadBalancer(id);
- Optional<LoadBalancerInstance> instance = provisionInstance(id, nodes, loadBalancer);
+ Optional<LoadBalancerInstance> instance = provisionInstance(id, nodes, loadBalancer, cloudAccount);
LoadBalancer newLoadBalancer;
LoadBalancer.State fromState = null;
if (loadBalancer.isEmpty()) {
@@ -199,8 +200,9 @@ public class LoadBalancerProvisioner {
LoadBalancerId id = new LoadBalancerId(transaction.application(), cluster);
Optional<LoadBalancer> loadBalancer = db.readLoadBalancer(id);
if (loadBalancer.isEmpty()) throw new IllegalArgumentException("Could not active load balancer that was never prepared: " + id);
+ if (loadBalancer.get().instance().isEmpty()) throw new IllegalArgumentException("Activating " + id + ", but prepare never provisioned a load balancer instance");
- Optional<LoadBalancerInstance> instance = provisionInstance(id, nodes, loadBalancer);
+ Optional<LoadBalancerInstance> instance = provisionInstance(id, nodes, loadBalancer, loadBalancer.get().instance().get().cloudAccount());
LoadBalancer.State state = instance.isPresent() ? LoadBalancer.State.active : loadBalancer.get().state();
LoadBalancer newLoadBalancer = loadBalancer.get().with(instance).with(state, now);
db.writeLoadBalancers(List.of(newLoadBalancer), loadBalancer.get().state(), transaction.nested());
@@ -208,7 +210,9 @@ public class LoadBalancerProvisioner {
}
/** Provision or reconfigure a load balancer instance, if necessary */
- private Optional<LoadBalancerInstance> provisionInstance(LoadBalancerId id, NodeList nodes, Optional<LoadBalancer> currentLoadBalancer) {
+ private Optional<LoadBalancerInstance> provisionInstance(LoadBalancerId id, NodeList nodes,
+ Optional<LoadBalancer> currentLoadBalancer,
+ Optional<CloudAccount> cloudAccount) {
boolean shouldDeactivateRouting = deactivateRouting.with(FetchVector.Dimension.APPLICATION_ID,
id.application().serializedForm())
.value();
@@ -221,7 +225,7 @@ public class LoadBalancerProvisioner {
if (hasReals(currentLoadBalancer, reals)) return currentLoadBalancer.get().instance();
log.log(Level.INFO, () -> "Provisioning instance for " + id + ", targeting: " + reals);
try {
- return Optional.of(service.create(new LoadBalancerSpec(id.application(), id.cluster(), reals),
+ return Optional.of(service.create(new LoadBalancerSpec(id.application(), id.cluster(), reals, cloudAccount),
shouldDeactivateRouting || allowEmptyReals(currentLoadBalancer)));
} catch (Exception e) {
log.log(Level.WARNING, e, () -> "Could not (re)configure " + id + ", targeting: " +
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java
index f5b0c791d0a..7686a9a4885 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LoadBalancersResponse.java
@@ -3,33 +3,30 @@ package com.yahoo.vespa.hosted.provision.restapi;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.container.jdisc.HttpRequest;
-import com.yahoo.container.jdisc.HttpResponse;
+import com.yahoo.restapi.SlimeJsonResponse;
import com.yahoo.slime.Cursor;
-import com.yahoo.slime.JsonFormat;
-import com.yahoo.slime.Slime;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerList;
import com.yahoo.vespa.hosted.provision.node.filter.ApplicationFilter;
-import java.io.IOException;
-import java.io.OutputStream;
import java.util.List;
import java.util.Optional;
/**
* @author mpolden
*/
-public class LoadBalancersResponse extends HttpResponse {
+public class LoadBalancersResponse extends SlimeJsonResponse {
private final NodeRepository nodeRepository;
private final HttpRequest request;
public LoadBalancersResponse(HttpRequest request, NodeRepository nodeRepository) {
- super(200);
this.request = request;
this.nodeRepository = nodeRepository;
+ Cursor root = slime.setObject();
+ toSlime(loadBalancers(), root);
}
private Optional<ApplicationId> application() {
@@ -48,16 +45,9 @@ public class LoadBalancersResponse extends HttpResponse {
return loadBalancers.asList();
}
- @Override
- public String getContentType() { return "application/json"; }
-
- @Override
- public void render(OutputStream stream) throws IOException {
- Slime slime = new Slime();
- Cursor root = slime.setObject();
- Cursor loadBalancerArray = root.setArray("loadBalancers");
-
- loadBalancers().forEach(lb -> {
+ private void toSlime(List<LoadBalancer> loadBalancers, Cursor object) {
+ Cursor loadBalancerArray = object.setArray("loadBalancers");
+ loadBalancers.forEach(lb -> {
Cursor lbObject = loadBalancerArray.addObject();
lbObject.setString("id", lb.id().serializedForm());
lbObject.setString("state", lb.state().name());
@@ -84,9 +74,10 @@ public class LoadBalancersResponse extends HttpResponse {
realObject.setLong("port", real.port());
});
});
+ lb.instance()
+ .flatMap(LoadBalancerInstance::cloudAccount)
+ .ifPresent(cloudAccount -> lbObject.setString("cloudAccount", cloudAccount.value()));
});
-
- new JsonFormat(true).encode(stream, slime);
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java
index d54b41bfcdd..825e46865fe 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerServiceTest.java
@@ -26,7 +26,7 @@ public class SharedLoadBalancerServiceTest {
@Test
public void test_create_lb() {
- var lb = loadBalancerService.create(new LoadBalancerSpec(applicationId, clusterId, reals), false);
+ var lb = loadBalancerService.create(new LoadBalancerSpec(applicationId, clusterId, reals, Optional.empty()), false);
assertEquals(HostName.of("vip.example.com"), lb.hostname());
assertEquals(Optional.empty(), lb.dnsZone());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java
index 1eecb442dc0..ce8fc2e9d03 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/LoadBalancerSerializerTest.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.persistence;
import ai.vespa.http.DomainName;
import com.google.common.collect.ImmutableSet;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.vespa.hosted.provision.lb.DnsZone;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
@@ -40,7 +41,8 @@ public class LoadBalancerSerializerTest {
4080),
new Real(DomainName.of("real-2"),
"127.0.0.2",
- 4080)))),
+ 4080)),
+ Optional.of(new CloudAccount("012345678912")))),
LoadBalancer.State.active,
now);
@@ -53,6 +55,7 @@ public class LoadBalancerSerializerTest {
assertEquals(loadBalancer.state(), serialized.state());
assertEquals(loadBalancer.changedAt().truncatedTo(MILLIS), serialized.changedAt());
assertEquals(loadBalancer.instance().get().reals(), serialized.instance().get().reals());
+ assertEquals(loadBalancer.instance().get().cloudAccount(), serialized.instance().get().cloudAccount());
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
index 08058ef7b04..15e07f92292 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
@@ -5,6 +5,7 @@ import ai.vespa.http.DomainName;
import com.google.common.collect.Iterators;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Capacity;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.ClusterResources;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.HostSpec;
@@ -17,6 +18,7 @@ import com.yahoo.vespa.flags.PermanentFlags;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeList;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
+import com.yahoo.vespa.hosted.provision.lb.LoadBalancerList;
import com.yahoo.vespa.hosted.provision.lb.Real;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.IP;
@@ -308,6 +310,17 @@ public class LoadBalancerProvisionerTest {
assertReals(app1, container1, Node.State.active);
}
+ @Test
+ public void load_balancer_with_custom_cloud_account() {
+ ClusterResources resources = new ClusterResources(3, 1, nodeResources);
+ CloudAccount cloudAccount = new CloudAccount("012345678912");
+ Capacity capacity = Capacity.from(resources, resources, false, true, Optional.of(cloudAccount));
+ tester.activate(app1, prepare(app1, capacity, clusterRequest(ClusterSpec.Type.container, ClusterSpec.Id.from("c1"))));
+ LoadBalancerList loadBalancers = tester.nodeRepository().loadBalancers().list();
+ assertEquals(1, loadBalancers.size());
+ assertEquals(cloudAccount, loadBalancers.first().get().instance().get().cloudAccount().get());
+ }
+
private void assertReals(ApplicationId application, ClusterSpec.Id cluster, Node.State... states) {
List<LoadBalancer> loadBalancers = tester.nodeRepository().loadBalancers().list(application).cluster(cluster).asList();
assertEquals(1, loadBalancers.size());