diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-05-12 16:19:36 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-05-13 14:46:35 +0200 |
commit | b5888fc62eb9bf8bcb9e42335480d4c18cd233f0 (patch) | |
tree | 5f2b838002daac16995d03d811030d469bab0132 /node-repository/src | |
parent | 8327b0e89d21a7122019a3e342baa880f23a9898 (diff) |
Use cloud account in load balancer provisioning
Diffstat (limited to 'node-repository/src')
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()); |