summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSnapshot.java72
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/ApplicationIdSource.java13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java29
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();
}
-
}