99import com .yahoo .collections .Pair ;
1010import com .yahoo .component .Version ;
1111import com .yahoo .component .annotation .Inject ;
12+ import com .yahoo .component .provider .ComponentRegistry ;
1213import com .yahoo .config .FileReference ;
1314import com .yahoo .config .application .api .ApplicationFile ;
1415import com .yahoo .config .application .api .ApplicationMetaData ;
3132import com .yahoo .config .provision .RegionName ;
3233import com .yahoo .config .provision .SystemName ;
3334import com .yahoo .config .provision .TenantName ;
35+ import com .yahoo .config .provision .NodeSuspensionProvider ;
3436import com .yahoo .config .provision .Zone ;
3537import com .yahoo .config .provision .exception .ActivationConflictException ;
3638import com .yahoo .container .jdisc .HttpResponse ;
7779import com .yahoo .vespa .config .server .http .v2 .PrepareResult ;
7880import com .yahoo .vespa .config .server .http .v2 .response .DeploymentMetricsResponse ;
7981import com .yahoo .vespa .config .server .http .v2 .response .SearchNodeMetricsResponse ;
82+ import com .yahoo .vespa .config .server .metrics .ClusterDeploymentMetricsRetriever ;
8083import com .yahoo .vespa .config .server .metrics .DeploymentMetricsRetriever ;
8184import com .yahoo .vespa .config .server .metrics .SearchNodeMetricsRetriever ;
8285import com .yahoo .vespa .config .server .provision .HostProvisionerProvider ;
@@ -165,6 +168,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
165168 private final ClusterReindexingStatusClient clusterReindexingStatusClient ;
166169 private final ActiveTokenFingerprints activeTokenFingerprints ;
167170 private final FlagSource flagSource ;
171+ private final DeploymentMetricsRetriever deploymentMetricsRetriever ;
168172
169173 @ Inject
170174 public ApplicationRepository (TenantRepository tenantRepository ,
@@ -177,11 +181,12 @@ public ApplicationRepository(TenantRepository tenantRepository,
177181 TesterClient testerClient ,
178182 HealthCheckerProvider healthCheckers ,
179183 Metric metric ,
180- FlagSource flagSource ) {
184+ FlagSource flagSource ,
185+ ComponentRegistry <NodeSuspensionProvider > nodeSuspensionProviders ) {
181186 this (tenantRepository ,
182187 hostProvisionerProvider .getHostProvisioner (),
183188 infraDeployerProvider .getInfraDeployer (),
184- configConvergenceChecker ,
189+ configConvergenceChecker ,
185190 configStateChecker ,
186191 httpProxy ,
187192 EndpointsChecker .of (healthCheckers .getHealthChecker ()),
@@ -193,7 +198,20 @@ public ApplicationRepository(TenantRepository tenantRepository,
193198 new SecretStoreValidator (),
194199 new DefaultClusterReindexingStatusClient (),
195200 new ActiveTokenFingerprintsClient (),
196- flagSource );
201+ flagSource ,
202+ new DeploymentMetricsRetriever (new ClusterDeploymentMetricsRetriever (),
203+ nodeSuspensionProvider (nodeSuspensionProviders )));
204+ }
205+
206+ private static NodeSuspensionProvider nodeSuspensionProvider (ComponentRegistry <NodeSuspensionProvider > registry ) {
207+ var providers = registry .allComponents ();
208+ if (providers .size () > 1 ) {
209+ String providerDescriptions = providers .stream ()
210+ .map (provider -> provider .getClass ().getName ())
211+ .collect (Collectors .joining (", " ));
212+ throw new IllegalArgumentException ("Multiple NodeSuspensionProvider components registered: " + providerDescriptions );
213+ }
214+ return providers .isEmpty () ? NodeSuspensionProvider .EMPTY : providers .get (0 );
197215 }
198216
199217 private ApplicationRepository (TenantRepository tenantRepository ,
@@ -211,7 +229,8 @@ private ApplicationRepository(TenantRepository tenantRepository,
211229 SecretStoreValidator secretStoreValidator ,
212230 ClusterReindexingStatusClient clusterReindexingStatusClient ,
213231 ActiveTokenFingerprints activeTokenFingerprints ,
214- FlagSource flagSource ) {
232+ FlagSource flagSource ,
233+ DeploymentMetricsRetriever deploymentMetricsRetriever ) {
215234 this .tenantRepository = Objects .requireNonNull (tenantRepository );
216235 this .hostProvisioner = Objects .requireNonNull (hostProvisioner );
217236 this .infraDeployer = Objects .requireNonNull (infraDeployer );
@@ -228,6 +247,7 @@ private ApplicationRepository(TenantRepository tenantRepository,
228247 this .clusterReindexingStatusClient = Objects .requireNonNull (clusterReindexingStatusClient );
229248 this .activeTokenFingerprints = Objects .requireNonNull (activeTokenFingerprints );
230249 this .flagSource = flagSource ;
250+ this .deploymentMetricsRetriever = Objects .requireNonNull (deploymentMetricsRetriever );
231251 }
232252
233253 // Should be used by tests only (first constructor in this class makes sure we use injectable components where possible)
@@ -327,7 +347,8 @@ public ApplicationRepository build() {
327347 secretStoreValidator ,
328348 ClusterReindexingStatusClient .DUMMY_INSTANCE ,
329349 __ -> activeTokens ,
330- flagSource );
350+ flagSource ,
351+ new DeploymentMetricsRetriever ());
331352 }
332353
333354 }
@@ -983,7 +1004,6 @@ public SearchNodeMetricsResponse getSearchNodeMetrics(ApplicationId applicationI
9831004
9841005 public DeploymentMetricsResponse getDeploymentMetrics (ApplicationId applicationId ) {
9851006 Application application = getApplication (applicationId );
986- DeploymentMetricsRetriever deploymentMetricsRetriever = new DeploymentMetricsRetriever ();
9871007 return deploymentMetricsRetriever .getMetrics (application );
9881008 }
9891009
0 commit comments