package com.breakersoft.plow.thrift.dao.pgsql; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.UUID; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.breakersoft.plow.dao.AbstractDao; import com.breakersoft.plow.thrift.NodeFilterT; import com.breakersoft.plow.thrift.NodeState; import com.breakersoft.plow.thrift.NodeSystemT; import com.breakersoft.plow.thrift.NodeT; import com.breakersoft.plow.thrift.SlotMode; import com.breakersoft.plow.thrift.dao.ThriftNodeDao; import com.breakersoft.plow.util.JdbcUtils; import com.google.common.collect.Lists; @Repository @Transactional(readOnly=true) public class ThriftNodeDaoImpl extends AbstractDao implements ThriftNodeDao { public static final RowMapper<NodeT> MAPPER = new RowMapper<NodeT>() { @Override public NodeT mapRow(ResultSet rs, int rowNum) throws SQLException { final NodeT node = new NodeT(); node.setId(rs.getString("pk_node")); node.setName(rs.getString("str_name")); node.setLocked(rs.getBoolean("bool_locked")); node.setState(NodeState.findByValue( rs.getInt("int_state"))); node.setTags(JdbcUtils.toSet(rs.getArray("str_tags"))); node.setIpaddr(rs.getString("str_ipaddr")); node.setMode(SlotMode.findByValue(rs.getInt("int_slot_mode"))); node.setSlotCores(rs.getInt("int_slot_cores")); node.setSlotRam(rs.getInt("int_slot_ram")); node.setClusterId(rs.getString("pk_cluster")); node.setClusterName(rs.getString("cluster_name")); node.setBootTime(rs.getLong("time_booted")); node.setUpdatedTime(rs.getLong("time_updated")); node.setCreatedTime(rs.getLong("time_created")); node.setTotalRamMb(rs.getInt("int_ram")); node.setFreeRamMb(rs.getInt("int_free_ram")); node.setTotalCores(rs.getInt("int_cores")); node.setIdleCores(rs.getInt("int_idle_cores")); final NodeSystemT system = new NodeSystemT(); system.setCpuModel(rs.getString("str_cpu_model")); system.setPlatform(rs.getString("str_platform")); system.setTotalSwapMb(rs.getInt("int_swap")); system.setFreeSwapMb(rs.getInt("int_free_swap")); system.setTotalRamMb(rs.getInt("int_ram_sys")); system.setFreeRamMb(rs.getInt("int_free_ram_sys")); final List<Integer> loadFactor = Lists.newArrayListWithCapacity(3); for (final Float load: (Float[])rs.getArray("flt_load").getArray()) { loadFactor.add((int) (load * 100)); } system.setLoad(loadFactor); system.setLogicalCores(rs.getInt("int_log_cores")); system.setPhysicalCores(rs.getInt("int_phys_cores")); node.setSystem(system); return node; } }; private static final String GET = "SELECT " + "node.pk_node,"+ "node.pk_cluster,"+ "node.str_name,"+ "node.int_state, "+ "node.str_ipaddr,"+ "node.bool_locked,"+ "node.time_created,"+ "node.time_updated,"+ "node.str_tags,"+ "node.int_slot_mode,"+ "node.int_slot_cores,"+ "node.int_slot_ram,"+ "node_sys.int_phys_cores,"+ "node_sys.int_log_cores,"+ "node_sys.int_ram AS int_ram_sys, "+ "node_sys.int_free_ram AS int_free_ram_sys,"+ "node_sys.int_swap,"+ "node_sys.int_free_swap,"+ "node_sys.time_booted,"+ "node_sys.str_cpu_model,"+ "node_sys.str_platform, " + "node_sys.flt_load::float4[], " + "node_dsp.int_cores, "+ "node_dsp.int_idle_cores, "+ "node_dsp.int_ram,"+ "node_dsp.int_free_ram, " + "cluster.str_name AS cluster_name " + "FROM " + "node " + "INNER JOIN node_sys ON node.pk_node = node_sys.pk_node " + "INNER JOIN node_dsp ON node.pk_node = node_dsp.pk_node " + "INNER JOIN cluster ON node.pk_cluster = cluster.pk_cluster "; @Override public List<NodeT> getNodes(NodeFilterT filter) { return jdbc.query(GET, MAPPER); } private final String GET_BY_ID = GET + " WHERE node.pk_node=?"; private final String GET_BY_NAME = GET + " WHERE node.str_name=?"; @Override public NodeT getNode(UUID id) { return jdbc.queryForObject(GET_BY_ID, MAPPER, id); } @Override public NodeT getNode(String name) { if (name.length() == 36) { try { return jdbc.queryForObject(GET_BY_ID, MAPPER, UUID.fromString(name)); } catch (IllegalArgumentException e) { //pass } } return jdbc.queryForObject(GET_BY_NAME, MAPPER, name); } }