package io.cattle.platform.host.stats.api;
import io.cattle.platform.api.link.LinkHandler;
import io.cattle.platform.core.constants.AccountConstants;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.constants.HostConstants;
import io.cattle.platform.core.constants.ProjectConstants;
import io.cattle.platform.core.model.Account;
import io.cattle.platform.core.model.Agent;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.host.model.HostApiAccess;
import io.cattle.platform.host.service.HostApiService;
import io.cattle.platform.host.stats.utils.StatsConstants;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.token.TokenService;
import io.github.ibuildthecloud.gdapi.context.ApiContext;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
public class HostStatsLinkHandler implements LinkHandler {
private static final String PROJECT_PATH = "/project/";
@Inject
HostApiService hostApiService;
@Inject
ObjectManager objectManager;
@Inject
TokenService tokenService;
@Override
public String[] getTypes() {
return new String[] { HostConstants.TYPE, ProjectConstants.TYPE };
}
@Override
public boolean handles(String type, String id, String link, ApiRequest request) {
return StatsConstants.HOST_STATS.equalsIgnoreCase(link) && (ProjectConstants.TYPE.equalsIgnoreCase(type) || HostConstants.TYPE.equalsIgnoreCase(type));
}
@Override
public Object link(String name, Object obj, ApiRequest request) throws IOException {
List<Host> hosts = new ArrayList<>();
boolean project = false;
if (obj instanceof Host) {
Host origHost = (Host) obj;
hosts.add(origHost);
}
if (obj instanceof Account && AccountConstants.PROJECT_KIND.equals(((Account) obj).getKind())) {
hosts.addAll(objectManager.mappedChildren(obj, Host.class));
project = true;
}
if (hosts.size() == 0) {
return new StatsAccess();
}
String metaUrl = null;
StatsAccess meta = new StatsAccess();
List<StatsAccess> serviceStatsQuery = new ArrayList<>();
for (Host host : hosts) {
Agent agent = objectManager.loadResource(Agent.class, host.getAgentId());
if (agent == null || !CommonStatesConstants.ACTIVE.equals(agent.getState())) {
continue;
}
Map<String, Object> payload = new HashMap<>();
payload.put("resourceId", ApiContext.getContext().getIdFormatter().formatId(objectManager.getType(host), host.getId()));
HostApiAccess apiAccess = hostApiService.getAccess(request, host.getId(), payload, new String[] { StatsConstants.HOST_STATS_PATH.get() });
if (apiAccess == null) {
continue;
}
String url = apiAccess.getUrl();
metaUrl = url + PROJECT_PATH;
StatsAccess statsAccess = new StatsAccess();
statsAccess.setToken(apiAccess.getAuthenticationToken());
statsAccess.setUrl(url.toString());
if (!project) {
return statsAccess;
}
serviceStatsQuery.add(statsAccess);
}
Map<String, Object> metaQueryPayload = new HashMap<>();
metaQueryPayload.put(ProjectConstants.TYPE, serviceStatsQuery);
meta.setToken(tokenService.generateToken(metaQueryPayload));
meta.setUrl(metaUrl);
return meta;
}
}