package io.cattle.platform.docker.api;
import io.cattle.platform.api.action.ActionHandler;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.core.constants.InstanceConstants;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.docker.api.model.ContainerProxy;
import io.cattle.platform.docker.api.model.HostAccess;
import io.cattle.platform.docker.constants.DockerInstanceConstants;
import io.cattle.platform.docker.util.DockerUtils;
import io.cattle.platform.host.model.HostApiAccess;
import io.cattle.platform.host.service.HostApiService;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.util.type.CollectionUtils;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import java.util.Date;
import java.util.Map;
import javax.inject.Inject;
import com.netflix.config.DynamicLongProperty;
import com.netflix.config.DynamicStringProperty;
public class ContainerProxyActionHandler implements ActionHandler {
private static final DynamicStringProperty HOST_PROXY_PATH = ArchaiusUtil.getString("host.proxy.path");
private static final DynamicLongProperty EXPIRE_SECONDS = ArchaiusUtil.getLong("host.proxy.jwt.expiration.seconds");
@Inject
HostApiService apiService;
@Inject
ObjectManager objectManager;
@Override
public String getName() {
return "instance.proxy";
}
@Override
public Object perform(String name, Object obj, ApiRequest request) {
Host host = null;
Instance container = null;
if (obj instanceof Instance) {
container = (Instance) obj;
host = DockerUtils.getHostFromContainer(objectManager, container, null);
}
if (host == null) {
return null;
}
ContainerProxy proxy = request.proxyRequestObject(ContainerProxy.class);
String dockerId = DockerUtils.getDockerIdentifier(container);
String ipAddress = DataAccessor.fieldString(container, InstanceConstants.FIELD_PRIMARY_IP_ADDRESS);
if (ipAddress == null) {
return null;
}
Map<String, Object> data = CollectionUtils.asMap(DockerInstanceConstants.DOCKER_CONTAINER, dockerId,
"scheme", proxy.getScheme(),
"address", ipAddress + ":" + proxy.getPort());
Date expiration = new Date(System.currentTimeMillis() + EXPIRE_SECONDS.get() * 1000);
HostApiAccess apiAccess = apiService.getAccess(request, host.getId(), CollectionUtils.asMap("proxy", data),
expiration, HOST_PROXY_PATH.get());
if (apiAccess == null) {
return null;
}
HostAccess access = new HostAccess(apiAccess.getUrl().replaceFirst("ws", "http"), apiAccess.getAuthenticationToken());
return access;
}
}