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.model.Host; import io.cattle.platform.core.model.Instance; import io.cattle.platform.docker.api.model.ContainerExec; 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.util.type.CollectionUtils; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import java.util.Map; import javax.inject.Inject; import com.netflix.config.DynamicStringProperty; public class ExecActionHandler implements ActionHandler { private static final DynamicStringProperty EXEC_AGENT_PATH = ArchaiusUtil.getString("exec.agent.path"); HostApiService apiService; ObjectManager objectManager; @Override public String getName() { return "instance.execute"; } @Override public Object perform(String name, Object obj, ApiRequest request) { Host host = null; Instance instance = null; if (obj instanceof Instance) { instance = (Instance) obj; host = DockerUtils.getHostFromContainer(objectManager, instance, null); } if (host == null) { return null; } ContainerExec exec = request.proxyRequestObject(ContainerExec.class); String dockerId = DockerUtils.getDockerIdentifier(instance); Map<String, Object> data = CollectionUtils.asMap(DockerInstanceConstants.DOCKER_ATTACH_STDIN, exec.getAttachStdin(), DockerInstanceConstants.DOCKER_ATTACH_STDOUT, exec.getAttachStdout(), DockerInstanceConstants.DOCKER_TTY, exec.getTty(), DockerInstanceConstants.DOCKER_CMD, exec.getCommand(), DockerInstanceConstants.DOCKER_CONTAINER, dockerId); HostApiAccess apiAccess = apiService.getAccess(request, host.getId(), CollectionUtils.asMap("exec", data), EXEC_AGENT_PATH.get()); if (apiAccess == null) { return null; } return new HostAccess(apiAccess.getUrl(), apiAccess.getAuthenticationToken()); } public HostApiService getApiService() { return apiService; } @Inject public void setApiService(HostApiService apiService) { this.apiService = apiService; } public ObjectManager getObjectManager() { return objectManager; } @Inject public void setObjectManager(ObjectManager objectManager) { this.objectManager = objectManager; } }