package com.breakersoft.plow.dao.pgsql; import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import com.breakersoft.plow.Cluster; import com.breakersoft.plow.Node; import com.breakersoft.plow.Proc; import com.breakersoft.plow.Project; import com.breakersoft.plow.Quota; import com.breakersoft.plow.QuotaE; import com.breakersoft.plow.Task; import com.breakersoft.plow.dao.AbstractDao; import com.breakersoft.plow.dao.QuotaDao; import com.breakersoft.plow.util.JdbcUtils; @Repository public class QuotaDaoImpl extends AbstractDao implements QuotaDao { public static final RowMapper<Quota> MAPPER = new RowMapper<Quota>() { @Override public Quota mapRow(ResultSet rs, int rowNum) throws SQLException { QuotaE quota = new QuotaE(); quota.setQuotaId((UUID)rs.getObject(1)); quota.setClusterId((UUID)rs.getObject(2)); quota.setProjectId((UUID)rs.getObject(3)); return quota; } }; private static final String GET = "SELECT " + "pk_quota,"+ "pk_cluster,"+ "pk_project " + "FROM " + "plow.quota " + "WHERE " + "pk_quota=?"; @Override public Quota get(UUID id) { return jdbc.queryForObject(GET, MAPPER, id); } private static final String INSERT = JdbcUtils.Insert("plow.quota", "pk_quota", "pk_project", "pk_cluster", "int_size", "int_burst"); @Override public Quota create(Project project, Cluster cluster, int size, int burst) { final UUID id = UUID.randomUUID(); jdbc.update(INSERT, id, project.getProjectId(), cluster.getClusterId(), size, burst); final QuotaE quota = new QuotaE(); quota.setQuotaId(id); quota.setProjectId(project.getProjectId()); quota.setClusterId(cluster.getClusterId()); return quota; } public Quota getQuota(UUID id) { return null; } private static final String GET_BY_TASK = "SELECT " + "quota.pk_quota,"+ "quota.pk_cluster,"+ "quota.pk_project " + "FROM " + "plow.quota, " + "plow.job " + "WHERE " + "job.pk_project = quota.pk_project " + "AND " + "job.pk_job = ? " + "AND " + "quota.pk_cluster = ?"; @Override public Quota getQuota(Node node, Task task) { return jdbc.queryForObject(GET_BY_TASK, MAPPER, task.getJobId(), node.getClusterId()); } private static final String GET_BY_PROC = "SELECT " + "quota.pk_quota,"+ "quota.pk_cluster,"+ "quota.pk_project " + "FROM " + "plow.quota, " + "plow.job, " + "plow.node " + "WHERE " + "job.pk_project = quota.pk_project " + "AND " + "quota.pk_cluster = node.pk_cluster " + "AND " + "job.pk_job = ? " + "AND " + "node.pk_node = ?"; @Override public Quota getQuota(Proc proc) { return jdbc.queryForObject(GET_BY_PROC, MAPPER, proc.getJobId(), proc.getNodeId()); } private static final String ALLOCATE_RESOURCES = "UPDATE " + "plow.quota " + "SET " + "int_cores_run = int_cores_run + ? " + "WHERE " + "quota.pk_project = ? " + "AND " + "quota.pk_cluster = ? "; @Override public void allocate(Cluster cluster, Project project, int cores) { // Relies on check constraint to throw. jdbc.update(ALLOCATE_RESOURCES, cores, project.getProjectId(), cluster.getClusterId()); } private static final String FREE_RESOURCE = "UPDATE " + "plow.quota " + "SET " + "int_cores_run = int_cores_run - ? " + "WHERE " + "quota.pk_quota = ?"; @Override public void free(Quota quota, int cores) { jdbc.update(FREE_RESOURCE, cores, quota.getQuotaId()); } private static final String QUOTA_CHECK = "SELECT " + "COUNT(1) " + "FROM " + "plow.quota " + "WHERE " + "quota.pk_project = ? " + "AND " + "quota.pk_cluster = ? " + "AND " + "int_cores_run < int_burst"; @Override public boolean check(Cluster cluster, Project project) { return jdbc.queryForObject(QUOTA_CHECK, Integer.class, project.getProjectId(), cluster.getClusterId()) == 1; } @Override public void setSize(Quota quota, int size) { jdbc.update("UPDATE plow.quota SET int_size=? WHERE pk_quota=?", size, quota.getQuotaId()); } @Override public void setBurst(Quota quota, int burst) { jdbc.update("UPDATE plow.quota SET int_burst=? WHERE pk_quota=?", burst, quota.getQuotaId()); } @Override public void setLocked(Quota quota, boolean locked) { jdbc.update("UPDATE plow.quota SET bool_locked=? WHERE pk_quota=?", locked, quota.getQuotaId()); } }