/** * Licensed to Cloudera, Inc. under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. Cloudera, Inc. licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cloudera.flume.master; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.io.IOException; import org.apache.thrift.transport.TTransportException; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.cloudera.flume.agent.DirectMasterRPC; import com.cloudera.flume.agent.FlumeNode; import com.cloudera.flume.agent.LivenessManager; import com.cloudera.flume.agent.MasterRPC; import com.cloudera.flume.conf.FlumeConfiguration; import com.cloudera.flume.conf.FlumeSpecException; import com.cloudera.flume.master.StatusManager.NodeState; import com.cloudera.util.NetUtils; import com.google.common.collect.Multimap; public class TestLogicalNodeMapping { FlumeMaster master = null; FlumeConfiguration cfg; @Before public void setCfg() throws IOException { // Isolate tests by only using simple cfg store cfg = FlumeConfiguration.createTestableConfiguration(); cfg.set(FlumeConfiguration.MASTER_STORE, "memory"); cfg.set(FlumeConfiguration.WEBAPPS_PATH, "build/webapps"); } @After public void shutdownMaster() { if (master != null) { master.shutdown(); master = null; } } /** * Checks to make sure that nodes specified at the master get spawned at the * node. * * Even though only two nodes are set, there should be three because we * currently have an invariant where each physical node must have at least on * logical node, which is named the same name as the physical node name. * * This may go away when we "bulkify" the node-master comms into one rpc call. */ @Test public void testMasterLogicalNodeCheckAutoLogicalNode() throws IOException { FlumeMaster master = new FlumeMaster(cfg); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "bar"); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "baz"); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); // the two added nodes, plus the always present physnode/logical assertEquals(3, node.getLogicalNodeManager().getNodes().size()); } /** * Checks to make sure that nodes specified at the master get spawned at the * node. */ @Test public void testMasterLogicalNodeSpawnedAtNode() throws IOException { FlumeMaster master = new FlumeMaster(cfg); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); master.getSpecMan().addLogicalNode(NetUtils.localhost(), node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "bar"); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "baz"); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); // the two added nodes, plus the always present physnode/logical assertEquals(3, node.getLogicalNodeManager().getNodes().size()); } /** * Checks to make sure that an unmapped node correctly transitions to * DECOMMISSIONED */ @Test public void testUnmappedLogicalNodeGetsDecommissioned() throws IOException, InterruptedException { FlumeMaster master = new FlumeMaster(cfg); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); master.getSpecMan().addLogicalNode(node.getPhysicalNodeName(), "foo"); master.getStatMan().updateHeartbeatStatus(NetUtils.localhost(), node.getPhysicalNodeName(), "foo", NodeState.ACTIVE, 10); master.getSpecMan().unmapLogicalNode(NetUtils.localhost(), "foo"); master.getStatMan().checkup(); assertEquals(NodeState.DECOMMISSIONED, master.getStatMan() .getNodeStatuses().get("foo").state); master.getSpecMan().addLogicalNode(node.getPhysicalNodeName(), "foo"); master.getStatMan().updateHeartbeatStatus(NetUtils.localhost(), node.getPhysicalNodeName(), "foo", NodeState.ACTIVE, 10); master.getStatMan().checkup(); assertEquals(NodeState.ACTIVE, master.getStatMan().getNodeStatuses().get( "foo").state); } /** * Checks to make sure that nodes specified at the master get spawned at the * node. */ @Test public void testMasterDecomission() throws IOException { FlumeMaster master = new FlumeMaster(cfg); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); master.getSpecMan().addLogicalNode(NetUtils.localhost(), node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "bar"); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "baz"); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); // the two added nodes, plus the always present physnode/logical assertEquals(3, node.getLogicalNodeManager().getNodes().size()); } @Test public void testUnmapLogicalNode() throws IOException { // use the simple command manger, non-gossip ackmanager FlumeMaster master = new FlumeMaster(new CommandManager(), new ConfigManager(), new StatusManager(), new MasterAckManager(), cfg); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); String local = NetUtils.localhost(); master.getSpecMan().addLogicalNode(local, node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(local, "bar"); master.getSpecMan().addLogicalNode(local, "baz"); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); assertEquals(local, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); master.getSpecMan().unmapLogicalNode(local, "bar"); liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); master.getSpecMan().unmapLogicalNode(local, "baz"); liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); master.getSpecMan().unmapLogicalNode(local, local); liveMan.checkLogicalNodes(); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); } @Test public void testDuplicateSpawn() throws IOException { // use the simple command manger, non-gossip ackmanager FlumeMaster master = new FlumeMaster(new CommandManager(), new ConfigManager(), new StatusManager(), new MasterAckManager(), cfg); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); String local = NetUtils.localhost(); // these are spawn commands master.getSpecMan().addLogicalNode(local, node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(local, "bar"); master.getSpecMan().addLogicalNode(local, "baz"); // there should not be duplicates in the mapping table. master.getSpecMan().addLogicalNode(local, node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(local, "bar"); master.getSpecMan().addLogicalNode(local, "baz"); Multimap<String, String> mapping = master.getSpecMan().getLogicalNodeMap(); assertEquals(3, mapping.size()); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); assertEquals(3, node.getLogicalNodeManager().getNodes().size()); } @Test public void testRemoveLogicalNode() throws IOException, FlumeSpecException { // use the simple command manger, non-gossip ackmanager FlumeMaster master = new FlumeMaster(new CommandManager(), new ConfigManager(), new StatusManager(), new MasterAckManager(), cfg); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); String local = NetUtils.localhost(); master.getSpecMan().addLogicalNode(local, node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(local, "bar"); master.getSpecMan().addLogicalNode(local, "baz"); master.getSpecMan().setConfig(local, "my-test-flow", "null", "null"); master.getSpecMan().setConfig("bar", "my-test-flow", "null", "null"); master.getSpecMan().setConfig("baz", "my-test-flow", "null", "null"); LivenessManager liveMan = node.getLivenessManager(); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertEquals(local, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNotNull(master.getSpecMan().getConfig("bar")); assertNotNull(master.getSpecMan().getConfig("baz")); assertNotNull(master.getSpecMan().getConfig(local)); master.getSpecMan().removeLogicalNode("bar"); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNotNull(master.getSpecMan().getConfig("baz")); assertNotNull(master.getSpecMan().getConfig(local)); master.getSpecMan().removeLogicalNode("baz"); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNotNull(master.getSpecMan().getConfig(local)); master.getSpecMan().removeLogicalNode(local); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); } /** * Checks to make sure that nodes specified at the master get spawned at the * node. */ @Test public void testZKMasterDecomission() throws IOException, TTransportException { // use the simple command manger, non-gossip ackmanager cfg.set(FlumeConfiguration.MASTER_STORE, "zookeeper"); master = new FlumeMaster(new CommandManager(), new ConfigManager(), new StatusManager(), new MasterAckManager(), cfg); master.serve(); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); master.getSpecMan().addLogicalNode(NetUtils.localhost(), node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "bar"); master.getSpecMan().addLogicalNode(NetUtils.localhost(), "baz"); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); // the two added nodes, plus the always present physnode/logical assertEquals(3, node.getLogicalNodeManager().getNodes().size()); } @Test public void testZKUnmapLogicalNode() throws IOException, TTransportException { // use the simple command manger, non-gossip ackmanager cfg.set(FlumeConfiguration.MASTER_STORE, "zookeeper"); master = new FlumeMaster(new CommandManager(), new ConfigManager(), new StatusManager(), new MasterAckManager(), cfg); master.serve(); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); String local = NetUtils.localhost(); master.getSpecMan().addLogicalNode(local, node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(local, "bar"); master.getSpecMan().addLogicalNode(local, "baz"); LivenessManager liveMan = node.getLivenessManager(); liveMan.checkLogicalNodes(); assertEquals(local, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); master.getSpecMan().unmapLogicalNode(local, "bar"); liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); master.getSpecMan().unmapLogicalNode(local, "baz"); liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); master.getSpecMan().unmapLogicalNode(local, local); liveMan.checkLogicalNodes(); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); } @Test public void testZKRemoveLogicalNode() throws IOException, FlumeSpecException, TTransportException { // use the simple command manger, non-gossip ackmanager cfg.set(FlumeConfiguration.MASTER_STORE, "zookeeper"); master = new FlumeMaster(new CommandManager(), new ConfigManager(), new StatusManager(), new MasterAckManager(), cfg); master.serve(); MasterRPC rpc = new DirectMasterRPC(master); FlumeNode node = new FlumeNode(rpc, false, false); // should have nothing. assertEquals(0, node.getLogicalNodeManager().getNodes().size()); String local = NetUtils.localhost(); master.getSpecMan().addLogicalNode(local, node.getPhysicalNodeName()); master.getSpecMan().addLogicalNode(local, "bar"); master.getSpecMan().addLogicalNode(local, "baz"); master.getSpecMan().setConfig(local, "my-test-flow", "null", "null"); master.getSpecMan().setConfig("bar", "my-test-flow", "null", "null"); master.getSpecMan().setConfig("baz", "my-test-flow", "null", "null"); LivenessManager liveMan = node.getLivenessManager(); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertEquals(local, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNotNull(master.getSpecMan().getConfig("bar")); assertNotNull(master.getSpecMan().getConfig("baz")); assertNotNull(master.getSpecMan().getConfig(local)); master.getSpecMan().removeLogicalNode("bar"); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(local, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNotNull(master.getSpecMan().getConfig("baz")); assertNotNull(master.getSpecMan().getConfig(local)); master.getSpecMan().removeLogicalNode("baz"); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNotNull(master.getSpecMan().getConfig(local)); master.getSpecMan().removeLogicalNode(local); liveMan.heartbeatChecks(); // liveMan.checkLogicalNodes(); assertNull(master.getSpecMan().getConfig("bar")); assertNull(master.getSpecMan().getConfig("baz")); assertNull(master.getSpecMan().getConfig(local)); assertEquals(null, master.getSpecMan().getPhysicalNode("bar")); assertEquals(null, master.getSpecMan().getPhysicalNode("baz")); assertEquals(local, master.getSpecMan().getPhysicalNode(local)); } }