package io.cattle.platform.core.dao.impl; import static io.cattle.platform.core.model.tables.ContainerEventTable.*; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.ContainerEventConstants; import io.cattle.platform.core.dao.ContainerEventDao; import io.cattle.platform.core.dao.GenericResourceDao; import io.cattle.platform.core.model.ContainerEvent; import io.cattle.platform.db.jooq.dao.impl.AbstractJooqDao; import io.cattle.platform.deferred.util.DeferredUtils; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import org.jooq.Record1; import org.jooq.impl.DSL; import com.netflix.config.DynamicIntProperty; @Named public class ContainerEventDaoImpl extends AbstractJooqDao implements ContainerEventDao { private static final DynamicIntProperty MAX_EVENTS = ArchaiusUtil.getInt("container.event.max.size"); @Inject GenericResourceDao resourceDao; @Override public boolean canCreate(Long hostId, String event) { if (!ContainerEventConstants.EVENT_START.equals(event)) { return true; } Record1<Integer> count = create().select(DSL.count()) .from(CONTAINER_EVENT) .where(CONTAINER_EVENT.HOST_ID.eq(hostId) .and(CONTAINER_EVENT.STATE.notEqual(CommonStatesConstants.CREATED))) .fetchAny(); return count.value1() < MAX_EVENTS.get(); } @Override public boolean createContainerEvent(final ContainerEvent event, final Map<String, Object> data) { Long hostId = event.getHostId(); if (hostId != null && !canCreate(hostId, event.getExternalStatus())) { return false; } DeferredUtils.defer(new Runnable() { @Override public void run() { resourceDao.createAndSchedule(event, data); } }); return true; } }