aboutsummaryrefslogtreecommitdiffstats
path: root/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/ClusterListRequest.java
blob: ae9453d67876590e70fb4d05621f7cf6190da866 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.clustercontroller.core.restapiv2.requests;

import com.yahoo.vespa.clustercontroller.core.RemoteClusterControllerTask;
import com.yahoo.vespa.clustercontroller.core.RemoteClusterControllerTaskScheduler;
import com.yahoo.vespa.clustercontroller.core.restapiv2.*;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.errors.StateRestApiException;
import com.yahoo.vespa.clustercontroller.utils.staterestapi.response.UnitResponse;

import java.util.Map;

public class ClusterListRequest extends Request<UnitResponse> {
    private final int recursive;
    private final ClusterControllerStateRestAPI.FleetControllerResolver resolver;

    public ClusterListRequest(int recursive,
                              ClusterControllerStateRestAPI.FleetControllerResolver resolver)
    {
        super(MasterState.NEED_NOT_BE_MASTER);
        this.recursive = recursive;
        this.resolver = resolver;
    }

    @Override
    public UnitResponse calculateResult(RemoteClusterControllerTask.Context context) throws StateRestApiException, OtherMasterIndexException {
        return calculateResult();
    }

    /**
     * The cluster list request is outside of the fleet controllers, and can thus not use a
     * context (thus it is null all the time). Thus it must recurse into fleetcontrollers if
     * needed. Adding function without context to make this obvious and hinder bad usage.
     */
    private UnitResponse calculateResult() throws StateRestApiException, OtherMasterIndexException {
        Response.ClusterListResponse response = new Response.ClusterListResponse();
        for (Map.Entry<String, RemoteClusterControllerTaskScheduler> e : resolver.getFleetControllers().entrySet()) {
            Id.Cluster clusterId = new Id.Cluster(e.getKey());
            if (recursive > 0) {
                ClusterStateRequest csr = new ClusterStateRequest(clusterId, recursive - 1);
                e.getValue().schedule(csr);
                csr.waitForCompletion();
                response.addEntry("cluster", clusterId.getClusterId(), csr.getResult());
            } else {
                response.addLink("cluster", clusterId.getClusterId(), clusterId.toString());
            }
        }
        return response;
    }
}