package io.teknek.nibiru.cluster; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import io.teknek.nibiru.ServerShutdown; import io.teknek.nibiru.Configuration; import io.teknek.nibiru.Server; import io.teknek.nibiru.TestUtil; import io.teknek.nibiru.client.ClientException; import io.teknek.nibiru.client.MetaDataClient; import io.teknek.nibiru.engine.DefaultColumnFamily; import io.teknek.nibiru.metadata.StoreMetaData; import io.teknek.tunit.TUnit; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import com.google.common.collect.Sets; public class TestCluster extends ServerShutdown { @Rule public TemporaryFolder node1Folder = new TemporaryFolder(); @Rule public TemporaryFolder node2Folder = new TemporaryFolder(); @Rule public TemporaryFolder node3Folder = new TemporaryFolder(); @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void letTwoNodesDiscoverEachOther() throws InterruptedException, ClientException{ final Server [] s = new Server[3]; { Configuration conf = TestUtil.aBasicConfiguration(node1Folder); Map<String,Object> clusterProperties = new HashMap<>(); conf.setClusterMembershipProperties(clusterProperties); conf.setTransportHost("127.0.0.1"); clusterProperties.put(GossipClusterMembership.HOSTS, Arrays.asList("127.0.0.1")); s[0] = registerServer(new Server(conf)); } { Configuration conf = TestUtil.aBasicConfiguration(node2Folder); Map<String,Object> clusterProperties = new HashMap<>(); conf.setClusterMembershipProperties(clusterProperties); clusterProperties.put(GossipClusterMembership.HOSTS, Arrays.asList("127.0.0.1")); conf.setTransportHost("127.0.0.2"); s[1] = registerServer(new Server(conf)); } { Configuration conf = TestUtil.aBasicConfiguration(node3Folder); Map<String,Object> clusterProperties = new HashMap<>(); conf.setClusterMembershipProperties(clusterProperties); clusterProperties.put(GossipClusterMembership.HOSTS, Arrays.asList("127.0.0.1")); conf.setTransportHost("127.0.0.3"); s[2] = registerServer(new Server(conf)); } for (Server server : s){ server.init(); } TUnit.assertThat( new Callable(){ public Object call() throws Exception { return s[2].getClusterMembership().getLiveMembers().size(); }}).afterWaitingAtMost(11, TimeUnit.SECONDS).isEqualTo(2); Assert.assertEquals(2 , s[2].getClusterMembership().getLiveMembers().size()); Assert.assertEquals("127.0.0.1", s[2].getClusterMembership().getLiveMembers().get(0).getHost()); MetaDataClient c = new MetaDataClient("127.0.0.1", s[1].getConfiguration().getTransportPort(), 20000, 20000); c.createOrUpdateKeyspace("abc", new HashMap<String,Object>(), true); for (final Server server : s) { TUnit.assertThat(new Callable() { public Object call() throws Exception { return server.getKeyspaces().get("abc") != null; } }).afterWaitingAtMost(1000, TimeUnit.MILLISECONDS).isEqualTo(true); } Map<String,Object> stuff = new HashMap<String,Object>(); stuff.put(StoreMetaData.IMPLEMENTING_CLASS, DefaultColumnFamily.class.getName()); c.createOrUpdateStore("abc", "def", stuff, true); Thread.sleep(1000); for (Server server : s){ Assert.assertNotNull(server.getKeyspaces().get("abc").getStores().get("def")); Set<String> livingHosts = new TreeSet<>(); for (ClusterMember cm : c.getLiveMembers()){ livingHosts.add(cm.getHost()); } Assert.assertEquals(Sets.newHashSet("127.0.0.1", "127.0.0.2", "127.0.0.3"), livingHosts); } } }