package io.cattle.platform.iaas.api.filter.containerevent;
import io.cattle.platform.api.auth.Policy;
import io.cattle.platform.api.utils.ApiUtils;
import io.cattle.platform.core.dao.AgentDao;
import io.cattle.platform.core.dao.ContainerEventDao;
import io.cattle.platform.core.model.Agent;
import io.cattle.platform.core.model.ContainerEvent;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.iaas.api.filter.common.AbstractDefaultResourceManagerFilter;
import io.cattle.platform.object.ObjectManager;
import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException;
import io.github.ibuildthecloud.gdapi.exception.ValidationErrorException;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager;
import io.github.ibuildthecloud.gdapi.util.ResponseCodes;
import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes;
import java.util.Map;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ContainerEventFilter extends AbstractDefaultResourceManagerFilter {
public static final String HOST_PARAM = "hostId";
public static final String VERIFY_AGENT = "CantVerifyAgent";
public static final String TOO_MANY = "TooManyContainerEvents";
private static final Logger log = LoggerFactory.getLogger(ContainerEventFilter.class);
@Inject
AgentDao agentDao;
@Inject
ContainerEventDao containerEventDao;
@Inject
ObjectManager objectManager;
@Override
public Class<?>[] getTypeClasses() {
return new Class<?>[] { ContainerEvent.class };
}
@Override
public Object create(String type, ApiRequest request, ResourceManager next) {
ContainerEvent event = request.proxyRequestObject(ContainerEvent.class);
Policy policy = ApiUtils.getPolicy();
Agent agent = objectManager.loadResource(Agent.class, policy.getOption(Policy.AGENT_ID));
if (agent == null) {
throw new ClientVisibleException(ResponseCodes.FORBIDDEN, VERIFY_AGENT);
}
Map<String, Host> hosts = agentDao.getHosts(agent.getId());
Host host = hosts.get(event.getReportedHostUuid());
if ( host == null ) {
throw new ValidationErrorException(ValidationErrorCodes.INVALID_REFERENCE, HOST_PARAM);
}
if (!containerEventDao.canCreate(host.getId(), event.getExternalStatus())) {
log.info("Dropping container event from agent for host [{}]", host.getId());
throw new ClientVisibleException(ResponseCodes.CONFLICT, TOO_MANY);
}
event.setHostId(host.getId());
return super.create(type, request, next);
}
}