package io.cattle.platform.configitem.api.manager; import io.cattle.platform.api.auth.Policy; import io.cattle.platform.api.utils.ApiUtils; import io.cattle.platform.configitem.api.model.ConfigContent; import io.cattle.platform.configitem.api.request.ApiConfigItemRequest; import io.cattle.platform.configitem.model.DefaultItemVersion; import io.cattle.platform.configitem.model.ItemVersion; import io.cattle.platform.configitem.server.model.Request; import io.cattle.platform.configitem.server.service.ConfigItemServer; import io.github.ibuildthecloud.gdapi.context.ApiContext; import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException; import io.github.ibuildthecloud.gdapi.exception.ValidationErrorException; import io.github.ibuildthecloud.gdapi.model.ListOptions; import io.github.ibuildthecloud.gdapi.model.Schema.Method; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.resource.impl.AbstractNoOpResourceManager; import io.github.ibuildthecloud.gdapi.util.RequestUtils; import io.github.ibuildthecloud.gdapi.util.ResponseCodes; import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes; import java.io.IOException; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ConfigContentManager extends AbstractNoOpResourceManager { private static final Logger log = LoggerFactory.getLogger(ConfigContentManager.class); ConfigItemServer configItemServer; @Override public Class<?>[] getTypeClasses() { return new Class<?>[] { ConfigContent.class }; } @Override protected Object updateInternal(String type, String id, Object obj, ApiRequest request) { return handle(id, request, true); } @Override protected Object getByIdInternal(String type, String id, ListOptions options) { ApiRequest request = ApiContext.getContext().getApiRequest(); if (Method.GET.isMethod(request.getMethod())) { return handle(id, request, false); } else { return new Object(); } } protected Object handle(String id, ApiRequest request, boolean apply) { ConfigContent content = request.proxyRequestObject(ConfigContent.class); ItemVersion version = apply ? DefaultItemVersion.fromString(content.getVersion()) : null; ItemVersion current = null; if (!apply) { Object currentValue = RequestUtils.makeSingular(request.getRequestParams().get("current")); if (currentValue != null) { current = DefaultItemVersion.fromString(currentValue.toString()); } } Long agentId = request.proxyRequestObject(ConfigContent.class).getAgentId(); if (agentId == null) { String agentIdStr = ApiUtils.getPolicy().getOption(Policy.AGENT_ID); if (agentIdStr == null) { throw new ValidationErrorException(ValidationErrorCodes.MISSING_REQUIRED, "agentId"); } else { agentId = new Long(agentIdStr); } } try { ApiConfigItemRequest configRequest = new ApiConfigItemRequest(id, agentId, version, current, request); configItemServer.handleRequest(configRequest); if (configRequest.getResponseCode() == Request.NOT_FOUND) { throw new ClientVisibleException(ResponseCodes.NOT_FOUND); } } catch (IOException e) { log.error("Failed to download [{}] for agent [{}]", id, agentId, e); throw new IllegalStateException("Failed to download [" + id + "] for agent [" + agentId + "]", e); } return new Object(); } public ConfigItemServer getConfigItemServer() { return configItemServer; } @Inject public void setConfigItemServer(ConfigItemServer configItemServer) { this.configItemServer = configItemServer; } }