diff options
3 files changed, 85 insertions, 29 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSnapshot.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSnapshot.java new file mode 100644 index 00000000000..e172c53163c --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSnapshot.java @@ -0,0 +1,72 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.api.integration; + +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.ApplicationName; +import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.TenantName; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @author freva + */ +public class ApplicationIdSnapshot { + private final Map<TenantName, Map<ApplicationName, List<InstanceName>>> instanceByApplicationByTenantName; + + public ApplicationIdSnapshot(Map<TenantName, Map<ApplicationName, List<InstanceName>>> instanceByApplicationByTenantName) { + this.instanceByApplicationByTenantName = instanceByApplicationByTenantName.entrySet().stream() + .collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, e -> e.getValue().entrySet().stream() + .collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, f -> List.copyOf(f.getValue()))))); + } + + public List<TenantName> tenants() { + return List.copyOf(instanceByApplicationByTenantName.keySet()); + } + + public List<ApplicationName> applications(TenantName tenantName) { + return Optional.ofNullable(instanceByApplicationByTenantName.get(tenantName)) + .map(a -> List.copyOf(a.keySet())) + .orElseGet(List::of); + } + + public List<InstanceName> instances(TenantName tenantName, ApplicationName applicationName) { + return instanceByApplicationByTenantName.getOrDefault(tenantName, Map.of()) + .getOrDefault(applicationName, List.of()); + } + + + public static class Builder { + private final Map<TenantName, Map<ApplicationName, List<InstanceName>>> instanceByApplicationByTenantName = new HashMap<>(); + + public Builder add(TenantName tenantName) { + instanceByApplicationByTenantName.computeIfAbsent(tenantName, t -> new HashMap<>()); + return this; + } + + public Builder add(TenantName tenantName, ApplicationName applicationName) { + instanceByApplicationByTenantName.computeIfAbsent(tenantName, t -> new HashMap<>()) + .computeIfAbsent(applicationName, a -> new ArrayList<>()); + return this; + } + + public Builder add(TenantName tenantName, ApplicationName applicationName, InstanceName instanceName) { + add(tenantName, applicationName); + instanceByApplicationByTenantName.get(tenantName).get(applicationName).add(instanceName); + return this; + } + + public Builder add(ApplicationId applicationId) { + return add(applicationId.tenant(), applicationId.application(), applicationId.instance()); + } + + public ApplicationIdSnapshot build() { + return new ApplicationIdSnapshot(instanceByApplicationByTenantName); + } + } +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSource.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSource.java index 0562ec91fb1..766ef71b25c 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSource.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSource.java @@ -1,16 +1,7 @@ package com.yahoo.vespa.hosted.controller.api.integration; -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.TenantName; - -import java.util.List; - public interface ApplicationIdSource { - /** Returns a list of all known application instance IDs. */ - List<ApplicationId> listApplications(); - - /** Returns a list of all known application instance IDs for the given tenant. */ - List<ApplicationId> listApplications(TenantName tenant); - + /** Returns a snapshot of all known tenants, applications and instances */ + ApplicationIdSnapshot applicationIdSnapshot(); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java index 33d372cffcc..246dd236b5a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java @@ -5,22 +5,21 @@ import com.google.inject.Inject; import com.yahoo.component.AbstractComponent; import com.yahoo.component.Version; import com.yahoo.component.Vtag; -import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.SystemName; -import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.flags.FlagSource; +import com.yahoo.vespa.hosted.controller.api.integration.ApplicationIdSnapshot; import com.yahoo.vespa.hosted.controller.api.integration.ApplicationIdSource; import com.yahoo.vespa.hosted.controller.api.integration.ServiceRegistry; import com.yahoo.vespa.hosted.controller.api.integration.maven.MavenRepository; import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry; import com.yahoo.vespa.hosted.controller.auditlog.AuditLogger; -import com.yahoo.vespa.hosted.controller.metric.ConfigServerMetrics; import com.yahoo.vespa.hosted.controller.deployment.JobController; import com.yahoo.vespa.hosted.controller.dns.NameServiceForwarder; +import com.yahoo.vespa.hosted.controller.metric.ConfigServerMetrics; import com.yahoo.vespa.hosted.controller.persistence.CuratorDb; import com.yahoo.vespa.hosted.controller.security.AccessControl; import com.yahoo.vespa.hosted.controller.versions.ControllerVersion; @@ -33,7 +32,6 @@ import com.yahoo.vespa.serviceview.bindings.ApplicationView; import java.time.Clock; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -281,19 +279,14 @@ public class Controller extends AbstractComponent implements ApplicationIdSource } @Override - public List<ApplicationId> listApplications() { - return applications().asList().stream() - .flatMap(application -> application.instances().keySet().stream() - .map(application.id()::instance)) - .collect(Collectors.toUnmodifiableList()); - } - - @Override - public List<ApplicationId> listApplications(TenantName tenant) { - return applications().asList(tenant).stream() - .flatMap(application -> application.instances().keySet().stream() - .map(application.id()::instance)) - .collect(Collectors.toUnmodifiableList()); + public ApplicationIdSnapshot applicationIdSnapshot() { + ApplicationIdSnapshot.Builder snapshotBuilder = new ApplicationIdSnapshot.Builder(); + tenants().asList().forEach(tenant -> snapshotBuilder.add(tenant.name())); + applications().asList().forEach(application -> { + snapshotBuilder.add(application.id().tenant(), application.id().application()); + application.instances().values().stream().map(Instance::id).forEach(snapshotBuilder::add); + }); + + return snapshotBuilder.build(); } - } |