/**
* 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.availability;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Test;
import com.cloudera.flume.conf.Context;
import com.cloudera.flume.conf.FlumeSpecException;
import com.cloudera.flume.core.CompositeSink;
/**
* This tests the failover chain manager's generated code.
*/
public class TestFailChainManager {
static final Logger LOG = LoggerFactory.getLogger(TestFailChainManager.class);
String[] collectors =
{ "collector 1", "collector 2", "collector 3", "collector 4",
"collector 5" };
@Test
public void testConsistentHashAvailMan() throws FlumeSpecException,
IOException {
FailoverChainManager am = new ConsistentHashFailoverChainManager(3);
for (String c : collectors) {
am.addCollector(c);
}
String agent1 =
am.getFailChainSinkSpec("agent1", "{lazyOpen => counter(\"%s\")}");
LOG.info(agent1);
assertEquals(
"failChain(\"{lazyOpen => counter(\\\"%s\\\")}\",\"collector 2\",\"collector 3\",\"collector 1\")",
agent1);
CompositeSink snk1 = new CompositeSink(new Context(), agent1);
snk1.open();
snk1.close();
String agent2 =
am.getFailChainSinkSpec("agent2", "{lazyOpen => counter(\"%s\")}");
LOG.info(agent2);
assertEquals(
"failChain(\"{lazyOpen => counter(\\\"%s\\\")}\",\"collector 1\",\"collector 4\",\"collector 5\")",
agent2);
CompositeSink snk2 = new CompositeSink(new Context(), agent2);
snk2.open();
snk2.close();
String agent3 =
am.getFailChainSinkSpec("agent3", "{lazyOpen => counter(\"%s\")}");
LOG.info(agent3);
assertEquals(
"failChain(\"{lazyOpen => counter(\\\"%s\\\")}\",\"collector 1\",\"collector 2\",\"collector 5\")",
agent3);
CompositeSink snk3 = new CompositeSink(new Context(), agent3);
snk3.open();
snk3.close();
}
/**
* The specs generated will be deterministic because it the seeds are based
* off a hash of the agent name.
*/
@Test
public void testRandomAvailMan() throws FlumeSpecException, IOException {
FailoverChainManager am = new RandomFailoverChainManager(3);
for (String c : collectors) {
am.addCollector(c);
}
String agent1 =
am.getFailChainSinkSpec("agent1", "{lazyOpen => counter(\"%s\")}");
LOG.info(agent1);
assertEquals(
"failChain(\"{lazyOpen => counter(\\\"%s\\\")}\",\"collector 5\",\"collector 1\",\"collector 3\")",
agent1);
CompositeSink snk1 = new CompositeSink(new Context(), agent1);
snk1.open();
snk1.close();
String agent2 =
am.getFailChainSinkSpec("agent2", "{lazyOpen => counter(\"%s\")}");
LOG.info(agent2);
assertEquals(
"failChain(\"{lazyOpen => counter(\\\"%s\\\")}\",\"collector 2\",\"collector 1\",\"collector 3\")",
agent2);
CompositeSink snk2 = new CompositeSink(new Context(), agent2);
snk2.open();
snk2.close();
String agent3 =
am.getFailChainSinkSpec("agent3", "{lazyOpen => counter(\"%s\")}");
LOG.info(agent3);
assertEquals(
"failChain(\"{lazyOpen => counter(\\\"%s\\\")}\",\"collector 5\",\"collector 1\",\"collector 2\")",
agent3);
CompositeSink snk3 = new CompositeSink(new Context(), agent3);
snk3.open();
snk3.close();
}
}