blob: e3662042dda5d3bbc8c9a32eee7e3259e896df56 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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 org.apache.ignite.internal.client.thin;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.Ignite;
import org.apache.ignite.client.ClientClusterGroup;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.G;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.junit.Test;
/**
* Checks cluster groups for thin client.
*/
public class ClusterGroupTest extends AbstractThinClientTest {
/** Grid index attribute name. */
private static final String GRID_IDX_ATTR_NAME = "GRID_IDX";
/** Some custom attribute name. */
private static final String CUSTOM_ATTR_NAME = "CUSTOM_ATTR";
/** Custom attribute value. */
private static final String CUSTOM_ATTR_VAL = "VAL";
/** Client. */
private static IgniteClient client;
/** {@inheritDoc} */
@Override protected void beforeTestsStarted() throws Exception {
super.beforeTestsStarted();
startGrid(0, false, null);
startGrid(1, false, null);
startGrid(2, false, F.asMap(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL));
startGrid(3, true, null);
startGrid(4, true, F.asMap(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL));
client = startClient(0);
}
/** {@inheritDoc} */
@Override protected void afterTestsStopped() throws Exception {
super.afterTestsStopped();
client.close();
}
/**
* Test that thin client ClusterNode instances have the same field values as server ClusterNode instances.
*/
@Test
public void testClusterNodeFields() {
for (Ignite ignite : G.allGrids()) {
ClusterNode igniteNode = ignite.cluster().localNode();
ClusterNode clientNode = client.cluster().node(igniteNode.id());
assertEquals(igniteNode.id(), clientNode.id());
assertEquals(igniteNode.consistentId(), clientNode.consistentId());
// Some attribute values identical by content, but not equals after marshalling/unmarshalling
// (for example values of type byte[]), so we can't compare whole attribute maps using assertEquals.
assertEquals(igniteNode.attributes().keySet(), clientNode.attributes().keySet());
assertEquals((Integer)igniteNode.attribute(GRID_IDX_ATTR_NAME), clientNode.attribute(GRID_IDX_ATTR_NAME));
assertEquals(igniteNode.attribute(CUSTOM_ATTR_NAME), clientNode.attribute(CUSTOM_ATTR_NAME));
assertEquals(new HashSet<>(igniteNode.addresses()), new HashSet<>(clientNode.addresses()));
assertEquals(new HashSet<>(igniteNode.hostNames()), new HashSet<>(clientNode.hostNames()));
assertEquals(igniteNode.order(), clientNode.order());
assertEquals(igniteNode.version(), clientNode.version());
assertEquals(igniteNode.isDaemon(), clientNode.isDaemon());
assertEquals(igniteNode.isClient(), clientNode.isClient());
}
}
/**
* Test forNode(), forNodes() methods.
*/
@Test
public void testForNodes() {
ClusterNode node0 = client.cluster().node(grid(0).localNode().id());
ClusterNode node1 = client.cluster().node(grid(1).localNode().id());
assertNodes(client.cluster().forNode(node0, node1), 0, 1);
assertNodes(client.cluster().forNode(node0), 0);
assertNodes(client.cluster().forNode(node1), 1);
assertNodes(client.cluster().forNodes(F.asList(node0, node1)), 0, 1);
assertNodes(client.cluster().forNodes(F.asList(node0)), 0);
assertNodes(client.cluster().forNodes(F.asList(node0, node1)).forNode(node0), 0);
assertNodes(client.cluster().forNode(node0, node1).forNodes(F.asList(node0, node1)), 0, 1);
assertNodes(client.cluster().forNode(node0).forNodes(F.asList(node0, node1)), 0);
assertNodes(client.cluster().forNode(node0).forNodes(F.asList(node1)));
}
/**
* Test forOthers() methods.
*/
@Test
public void testForOthers() {
ClusterNode node0 = client.cluster().node(grid(0).localNode().id());
ClusterNode node1 = client.cluster().node(grid(1).localNode().id());
assertNodes(client.cluster().forOthers(node0, node1), 2, 3, 4);
assertNodes(client.cluster().forOthers(client.cluster().forOthers(node0, node1)), 0, 1);
assertNodes(client.cluster().forOthers(node0).forOthers(node1), 2, 3, 4);
assertNodes(client.cluster().forOthers(node0, node1).forOthers(node1), 2, 3, 4);
assertNodes(client.cluster().forOthers(node0).forOthers(client.cluster().forOthers(node0, node1)), 1);
}
/**
* Test forNodeId(), forNodeIds() methods.
*/
@Test
public void testForNodeIds() {
UUID id0 = nodeId(0);
UUID id1 = nodeId(1);
assertNodes(client.cluster().forNodeId(id0, id1), 0, 1);
assertNodes(client.cluster().forNodeId(id0), 0);
assertNodes(client.cluster().forNodeId(id1), 1);
assertNodes(client.cluster().forNodeIds(F.asList(id0, id1)), 0, 1);
assertNodes(client.cluster().forNodeIds(F.asList(id0)), 0);
assertNodes(client.cluster().forNodeIds(F.asList(id0, id1)).forNodeId(id0), 0);
assertNodes(client.cluster().forNodeId(id0, id1).forNodeIds(F.asList(id0, id1)), 0, 1);
assertNodes(client.cluster().forNodeId(id0).forNodeIds(F.asList(id0, id1)), 0);
assertNodes(client.cluster().forNodeId(id0).forNodeIds(F.asList(id1)));
assertNodes(client.cluster().forNodeId(UUID.randomUUID()));
assertNodes(client.cluster().forNodeIds(F.asList(UUID.randomUUID())));
}
/**
* Test forPredicate() method.
*/
@Test
public void testForPredicate() {
assertNodes(client.cluster().forPredicate(ClusterNode::isClient), 3, 4);
assertNodes(client.cluster().forPredicate(n -> n.order() == 1), 0);
assertNodes(client.cluster().forPredicate(ClusterNode::isClient).forPredicate(n -> !n.isClient()));
assertNodes(client.cluster().forPredicate(ClusterNode::isClient).forPredicate(n -> n.order() == 5), 4);
}
/**
* Test forAttribute() method.
*/
@Test
public void testForAttribute() {
assertNodes(client.cluster().forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL), 2, 4);
assertNodes(client.cluster().forAttribute(CUSTOM_ATTR_NAME, null), 2, 4);
assertNodes(client.cluster().forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL)
.forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL), 2, 4);
assertNodes(client.cluster().forAttribute(CUSTOM_ATTR_NAME, null)
.forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL), 2, 4);
assertNodes(client.cluster().forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL)
.forAttribute(CUSTOM_ATTR_NAME, null), 2, 4);
assertNodes(client.cluster().forAttribute(GRID_IDX_ATTR_NAME, 0), 0);
assertNodes(client.cluster().forAttribute(GRID_IDX_ATTR_NAME, 0).forAttribute(GRID_IDX_ATTR_NAME, 1));
assertNodes(client.cluster().forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL)
.forAttribute(GRID_IDX_ATTR_NAME, 2), 2);
}
/**
* Test forServers()/forClients() methods.
*/
@Test
public void testForServersForClients() {
assertNodes(client.cluster().forServers(), 0, 1, 2);
assertNodes(client.cluster().forClients(), 3, 4);
assertNodes(client.cluster().forServers().forServers(), 0, 1, 2);
assertNodes(client.cluster().forClients().forClients(), 3, 4);
assertNodes(client.cluster().forServers().forClients());
}
/**
* Test forRandom()/forOldest()/forYoungest() methods.
*/
@Test
public void testOneNodeFilters() {
assertEquals(1, client.cluster().forRandom().nodes().size());
assertNodes(client.cluster().forOldest(), 0);
assertNodes(client.cluster().forYoungest(), 4);
assertNodes(client.cluster().forOldest().forYoungest(), 0);
assertNodes(client.cluster().forYoungest().forOldest(), 4);
assertNodes(client.cluster().forOldest().forYoungest().forRandom(), 0);
assertEquals(grid(0).localNode(), client.cluster().forOldest().node());
assertEquals(grid(4).localNode(), client.cluster().forYoungest().node());
}
/**
* Test forHost() methods.
*/
@Test
public void testForHost() {
ClusterNode node0 = grid(0).localNode();
String hostName = F.first(node0.hostNames());
assertNodes(client.cluster().forHost(node0), 0, 1, 2, 3, 4);
assertNodes(client.cluster().forHost(hostName), 0, 1, 2, 3, 4);
assertNodes(client.cluster().forHost(node0).forHost(hostName), 0, 1, 2, 3, 4);
assertNodes(client.cluster().forHost(hostName, hostName), 0, 1, 2, 3, 4);
assertNodes(client.cluster().forHost("-"));
assertNodes(client.cluster().forHost("-", hostName), 0, 1, 2, 3, 4);
assertNodes(client.cluster().forHost("-").forHost(node0));
}
/**
* Test combination of different for... methods.
*/
@Test
public void testForFiltersCombinations() {
assertNodes(client.cluster(), 0, 1, 2, 3, 4);
assertNodes(client.cluster().forServers().forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL), 2);
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(1), nodeId(4))
.forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL).forPredicate(ClusterNode::isClient), 4);
assertNodes(client.cluster().forClients().forOthers(grid(4).localNode()), 3);
// Check resultFilter chaining.
assertNodes(client.cluster().forOldest().forClients());
assertNodes(client.cluster().forNodeId(nodeId(0)).forOldest().forNodeId(nodeId(0)), 0);
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(1)).forOldest()
.forNodeId(nodeId(1)));
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forOldest().forClients());
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forYoungest().forClients(), 4);
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forOldest()
.forPredicate(ClusterNode::isClient));
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forYoungest()
.forPredicate(ClusterNode::isClient), 4);
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forOldest()
.forAttribute(CUSTOM_ATTR_NAME, null));
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forYoungest()
.forAttribute(CUSTOM_ATTR_NAME, null), 4);
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forOldest()
.forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL));
assertNodes(client.cluster().forNodeId(nodeId(0), nodeId(4)).forYoungest()
.forAttribute(CUSTOM_ATTR_NAME, CUSTOM_ATTR_VAL), 4);
}
/**
* Test that ClusterNode doesn't requested each time from the server.
*/
@Test
public void testClusterNodeCaching() {
ClientClusterGroup grp = client.cluster().forServers();
Collection<ClusterNode> nodes1 = grp.nodes();
Collection<ClusterNode> nodes2 = grp.nodes();
assertEquals(3, nodes1.size());
assertEquals(3, nodes2.size());
int foundCnt = 0;
for (ClusterNode node1 : nodes1) {
for (ClusterNode node2 : nodes2) {
if (F.eq(node1.id(), node2.id())) {
assertTrue(node1 == node2); // Should be exactly the same instance.
foundCnt++;
}
}
}
assertEquals(3, foundCnt);
}
/**
* Test node(UUID) method.
*/
@Test
public void testNodeById() {
UUID rndId = UUID.randomUUID();
ClusterNode node0 = client.cluster().node(nodeId(0));
assertNotNull(node0);
assertNull(client.cluster().node(rndId));
assertNull(client.cluster().forNodeId(rndId).node(rndId));
assertEquals(node0, client.cluster().forNodeId(nodeId(0)).node(nodeId(0)));
assertNull(client.cluster().forNodeId(nodeId(0)).node(nodeId(1)));
assertEquals(node0, client.cluster().forNode(node0).node(nodeId(0)));
assertNull(client.cluster().forNode(node0).node(nodeId(1)));
assertEquals(node0, client.cluster().forServers().node(nodeId(0)));
assertNull(client.cluster().forServers().node(nodeId(3)));
assertEquals(node0, client.cluster().forAttribute(GRID_IDX_ATTR_NAME, 0).node(nodeId(0)));
assertNull(client.cluster().forAttribute(GRID_IDX_ATTR_NAME, 0).node(nodeId(1)));
assertEquals(node0, client.cluster().forOldest().node(nodeId(0)));
assertNull(client.cluster().forOldest().node(nodeId(1)));
assertEquals(node0, client.cluster().forServers().forNodeId(nodeId(0), nodeId(1),
nodeId(3)).forOldest().node(nodeId(0)));
assertNull(client.cluster().forServers().forNodeId(nodeId(0), nodeId(1), nodeId(3))
.forOldest().node(nodeId(1)));
}
/**
* Test nodeIds() method.
*/
@Test
public void testNodeIds() {
// Check default projection.
assertNull(((ClientClusterImpl)client.cluster()).defaultClusterGroup().nodeIds());
// Check filter only by node id.
Collection<UUID> nodeIds = ((ClientClusterGroupImpl)client.cluster().forNodeId(nodeId(0),
nodeId(1), UUID.randomUUID())).nodeIds();
assertTrue(nodeIds.contains(nodeId(0)));
assertTrue(nodeIds.contains(nodeId(1)));
assertFalse(nodeIds.contains(nodeId(2)));
assertFalse(nodeIds.contains(nodeId(3)));
assertFalse(nodeIds.contains(nodeId(4)));
// Check server-side filter.
nodeIds = ((ClientClusterGroupImpl)client.cluster().forClients()).nodeIds();
assertEquals(new HashSet<>(F.asList(nodeId(3), nodeId(4))),
new HashSet<>(nodeIds));
// Check client-side filters.
nodeIds = ((ClientClusterGroupImpl)client.cluster().forPredicate(ClusterNode::isClient)).nodeIds();
assertEquals(new HashSet<>(F.asList(nodeId(3), nodeId(4))), new HashSet<>(nodeIds));
nodeIds = ((ClientClusterGroupImpl)client.cluster().forOldest()).nodeIds();
assertEquals(Collections.singleton(nodeId(0)), new HashSet<>(nodeIds));
// Check filters combination.
nodeIds = ((ClientClusterGroupImpl)client.cluster().forServers().forClients()).nodeIds();
assertTrue(nodeIds.isEmpty());
nodeIds = ((ClientClusterGroupImpl)client.cluster().forServers().forNodeId(nodeId(0),
nodeId(1))).nodeIds();
assertEquals(new HashSet<>(F.asList(nodeId(0), nodeId(1))),
new HashSet<>(nodeIds));
nodeIds = ((ClientClusterGroupImpl)client.cluster().forNodeId(nodeId(1), nodeId(2),
nodeId(3), UUID.randomUUID()).forServers().forYoungest()).nodeIds();
assertEquals(Collections.singleton(nodeId(2)), new HashSet<>(nodeIds));
}
/**
* Asserts that cluster group has the same nodes set as expected.
*
* @param grp Group.
* @param nodeIdxs Node idxs.
*/
private void assertNodes(ClientClusterGroup grp, int... nodeIdxs) {
Collection<ClusterNode> expNodes = U.newHashSet(nodeIdxs.length);
if (nodeIdxs == null) {
assertTrue(F.isEmpty(grp.nodes()));
return;
}
for (int nodeIdx : nodeIdxs)
expNodes.add(grid(nodeIdx).localNode());
assertEquals(expNodes, new HashSet<>(grp.nodes()));
}
/**
* Start grid node with defined parameters.
*/
private void startGrid(int idx, boolean client, Map<String, Object> attrs) throws Exception {
IgniteConfiguration cfg = getConfiguration(getTestIgniteInstanceName(idx));
if (attrs == null)
attrs = F.asMap(GRID_IDX_ATTR_NAME, idx);
else
attrs.put(GRID_IDX_ATTR_NAME, idx);
cfg.setUserAttributes(attrs);
cfg.setClientMode(client);
cfg.setDiscoverySpi(new TestDiscoverySpi().setIpFinder(((TcpDiscoverySpi)cfg.getDiscoverySpi()).getIpFinder()));
startGrid(cfg);
}
/**
* SPI to override hosts for ClusterNodes.
*/
private static class TestDiscoverySpi extends TcpDiscoverySpi {
/** {@inheritDoc} */
@Override protected void initLocalNode(int srvPort, boolean addExtAddrAttr) {
super.initLocalNode(srvPort, addExtAddrAttr);
locNode.hostNames().add("dummy");
}
}
}