package com.breakersoft.plow.test.dao; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.junit.Test; import com.breakersoft.plow.Cluster; import com.breakersoft.plow.Defaults; import com.breakersoft.plow.Node; import com.breakersoft.plow.dao.ClusterDao; import com.breakersoft.plow.dao.NodeDao; import com.breakersoft.plow.rnd.thrift.Ping; import com.breakersoft.plow.test.AbstractTest; import com.breakersoft.plow.thrift.NodeState; import com.breakersoft.plow.thrift.SlotMode; import com.breakersoft.plow.util.JdbcUtils; import com.breakersoft.plow.util.PlowUtils; import com.google.common.collect.Sets; public class NodeDaoTests extends AbstractTest { @Resource NodeDao nodeDao; @Resource ClusterDao clusterDao; private static final String[] TAGS = new String[] { "test" } ; @Test public void create() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); assertEquals(cluster.getClusterId(), node.getClusterId()); assertEquals(ping.getHostname(), node.getName()); } @Test public void lock() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); nodeDao.setLocked(node, true); boolean locked = jdbc().queryForObject( "SELECT bool_locked FROM plow.node WHERE pk_node=?", Boolean.class, node.getNodeId()); assertEquals(true, locked); } @Test public void setCluster() { Ping ping = getTestNodePing(); Cluster cluster1 = clusterDao.create("test1", TAGS); Cluster cluster2 = clusterDao.create("test2", TAGS); Node node = nodeDao.create(cluster1, ping); nodeDao.setCluster(node, cluster2); Node copy = nodeDao.get(node.getNodeId()); assertEquals(cluster2.getClusterId(), copy.getClusterId()); } @Test public void setTags() { Ping ping = getTestNodePing(); Cluster cluster1 = clusterDao.create("test1", TAGS); Node node = nodeDao.create(cluster1, ping); nodeDao.setTags(node, Sets.newHashSet("a1", "b2", "c3")); List<String> tags = jdbc().query( "SELECT unnest(str_tags) FROM plow.node WHERE pk_node=?", JdbcUtils.STRING_MAPPER, node.getNodeId()); assertEquals(3, tags.size()); assertTrue(tags.contains("a1")); assertTrue(tags.contains("b2")); assertTrue(tags.contains("c3")); } @Test(expected=IllegalArgumentException.class) public void setSlotMode() { Ping ping = getTestNodePing(); Cluster cluster1 = clusterDao.create("test1", TAGS); Node node = nodeDao.create(cluster1, ping); nodeDao.setSlotMode(node, SlotMode.SLOTS, 1, 1024); int[] result = getSlotSettings(node); assertEquals(result[0], SlotMode.SLOTS.ordinal()); assertEquals(result[1], 1); assertEquals(result[2], 1024); nodeDao.setSlotMode(node, SlotMode.DYNAMIC, 1, 1024); result = getSlotSettings(node); assertEquals(result[0], SlotMode.DYNAMIC.ordinal()); assertEquals(result[1], 0); assertEquals(result[2], 0); nodeDao.setSlotMode(node, SlotMode.SINGLE, 0, 0); result = getSlotSettings(node); assertEquals(result[0], SlotMode.SINGLE.ordinal()); assertEquals(result[1], 0); assertEquals(result[2], 0); // Throws because the slot size has to be larger than 0. nodeDao.setSlotMode(node, SlotMode.SLOTS, 0, 0); } private int[] getSlotSettings(Node node) { int[] result = new int[3]; Map<String, Object> sql = simpleJdbcTemplate.queryForMap("SELECT int_slot_mode, int_slot_cores, int_slot_ram FROM node WHERE pk_node=?", node.getNodeId()); result[0] = (Integer) sql.get("int_slot_mode"); result[1] = (Integer) sql.get("int_slot_cores"); result[2] = (Integer) sql.get("int_slot_ram"); return result; } @Test public void update() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); nodeDao.update(node, ping); int swap = simpleJdbcTemplate.queryForInt("SELECT int_swap FROM node_sys WHERE pk_node=?", node.getNodeId()); assertEquals(ping.hw.totalSwapMb, swap); } @Test public void allocateResources() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); int reserved = PlowUtils.getReservedRam(ping.hw.totalRamMb); assertEquals(ping.hw.totalRamMb - reserved, simpleJdbcTemplate.queryForInt("SELECT int_free_ram FROM node_dsp WHERE pk_node=?", node.getNodeId())); nodeDao.allocate(node, 1, 1024); // Check to ensure the procs/memory were subtracted from the host. assertEquals(ping.hw.physicalCpus - 1, simpleJdbcTemplate.queryForInt("SELECT int_idle_cores FROM node_dsp WHERE pk_node=?", node.getNodeId())); assertEquals(ping.hw.totalRamMb - 1024 - reserved, simpleJdbcTemplate.queryForInt("SELECT int_free_ram FROM node_dsp WHERE pk_node=?", node.getNodeId())); } public void allocateResourcesFailed() { Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, getTestNodePing()); nodeDao.allocate(node, 100, 1000000); } @Test public void freeResources() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); nodeDao.allocate(node, 1, 1024); nodeDao.free(node, 1, 1024); assertEquals(ping.hw.physicalCpus, simpleJdbcTemplate.queryForInt("SELECT int_idle_cores FROM node_dsp WHERE pk_node=?", node.getNodeId())); assertEquals(ping.hw.totalRamMb - PlowUtils.getReservedRam(ping.hw.totalRamMb), simpleJdbcTemplate.queryForInt("SELECT int_free_ram FROM node_dsp WHERE pk_node=?", node.getNodeId())); } @Test public void setState() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); assertEquals(NodeState.UP.ordinal(), simpleJdbcTemplate.queryForInt("SELECT int_state FROM node WHERE pk_node=?", node.getNodeId())); nodeDao.setState(node, NodeState.DOWN); assertEquals(NodeState.DOWN.ordinal(), simpleJdbcTemplate.queryForInt("SELECT int_state FROM node WHERE pk_node=?", node.getNodeId())); } @Test public void getUnresponsive() { Ping ping = getTestNodePing(); Cluster cluster = clusterDao.create("test", TAGS); Node node = nodeDao.create(cluster, ping); assertEquals(0, nodeDao.getUnresponsiveNodes().size()); jdbc().update("UPDATE plow.node SET time_updated = time_updated - (86400 * 1000) WHERE pk_node=?", node.getNodeId()); assertFalse(nodeDao.getUnresponsiveNodes().isEmpty()); } }