|
18 | 18 | */
|
19 | 19 | package org.elasticsearch.transport;
|
20 | 20 |
|
21 |
| -import org.elasticsearch.core.internal.io.IOUtils; |
22 | 21 | import org.elasticsearch.Version;
|
23 | 22 | import org.elasticsearch.action.ActionListener;
|
24 | 23 | import org.elasticsearch.action.LatchedActionListener;
|
|
30 | 29 | import org.elasticsearch.common.settings.ClusterSettings;
|
31 | 30 | import org.elasticsearch.common.settings.Settings;
|
32 | 31 | import org.elasticsearch.common.transport.TransportAddress;
|
| 32 | +import org.elasticsearch.core.internal.io.IOUtils; |
33 | 33 | import org.elasticsearch.test.ESTestCase;
|
| 34 | +import org.elasticsearch.test.VersionUtils; |
34 | 35 | import org.elasticsearch.test.transport.MockTransportService;
|
35 | 36 | import org.elasticsearch.threadpool.TestThreadPool;
|
36 | 37 | import org.elasticsearch.threadpool.ThreadPool;
|
|
40 | 41 | import java.net.InetSocketAddress;
|
41 | 42 | import java.util.Arrays;
|
42 | 43 | import java.util.Collections;
|
| 44 | +import java.util.EnumSet; |
43 | 45 | import java.util.HashMap;
|
44 | 46 | import java.util.HashSet;
|
45 | 47 | import java.util.List;
|
|
50 | 52 | import java.util.concurrent.TimeUnit;
|
51 | 53 | import java.util.concurrent.atomic.AtomicReference;
|
52 | 54 | import java.util.function.BiFunction;
|
| 55 | +import java.util.function.Predicate; |
53 | 56 |
|
54 | 57 | import static org.hamcrest.CoreMatchers.containsString;
|
55 | 58 | import static org.hamcrest.CoreMatchers.instanceOf;
|
@@ -279,6 +282,75 @@ public void testRemoteNodeAttribute() throws IOException, InterruptedException {
|
279 | 282 | }
|
280 | 283 | }
|
281 | 284 |
|
| 285 | + public void testRemoteNodeRoles() throws IOException, InterruptedException { |
| 286 | + final Settings settings = Settings.EMPTY; |
| 287 | + final List<DiscoveryNode> knownNodes = new CopyOnWriteArrayList<>(); |
| 288 | + final Settings data = Settings.builder().put("node.master", false).build(); |
| 289 | + final Settings dedicatedMaster = Settings.builder().put("node.data", false).put("node.ingest", "false").build(); |
| 290 | + try (MockTransportService c1N1 = |
| 291 | + startTransport("cluster_1_node_1", knownNodes, Version.CURRENT, dedicatedMaster); |
| 292 | + MockTransportService c1N2 = |
| 293 | + startTransport("cluster_1_node_2", knownNodes, Version.CURRENT, data); |
| 294 | + MockTransportService c2N1 = |
| 295 | + startTransport("cluster_2_node_1", knownNodes, Version.CURRENT, dedicatedMaster); |
| 296 | + MockTransportService c2N2 = |
| 297 | + startTransport("cluster_2_node_2", knownNodes, Version.CURRENT, data)) { |
| 298 | + final DiscoveryNode c1N1Node = c1N1.getLocalDiscoNode(); |
| 299 | + final DiscoveryNode c1N2Node = c1N2.getLocalDiscoNode(); |
| 300 | + final DiscoveryNode c2N1Node = c2N1.getLocalDiscoNode(); |
| 301 | + final DiscoveryNode c2N2Node = c2N2.getLocalDiscoNode(); |
| 302 | + knownNodes.add(c1N1Node); |
| 303 | + knownNodes.add(c1N2Node); |
| 304 | + knownNodes.add(c2N1Node); |
| 305 | + knownNodes.add(c2N2Node); |
| 306 | + Collections.shuffle(knownNodes, random()); |
| 307 | + |
| 308 | + try (MockTransportService transportService = MockTransportService.createNewService( |
| 309 | + settings, |
| 310 | + Version.CURRENT, |
| 311 | + threadPool, |
| 312 | + null)) { |
| 313 | + transportService.start(); |
| 314 | + transportService.acceptIncomingRequests(); |
| 315 | + final Settings.Builder builder = Settings.builder(); |
| 316 | + builder.putList("search.remote.cluster_1.seeds", c1N1Node.getAddress().toString()); |
| 317 | + builder.putList("search.remote.cluster_2.seeds", c2N1Node.getAddress().toString()); |
| 318 | + try (RemoteClusterService service = new RemoteClusterService(settings, transportService)) { |
| 319 | + assertFalse(service.isCrossClusterSearchEnabled()); |
| 320 | + service.initializeRemoteClusters(); |
| 321 | + assertFalse(service.isCrossClusterSearchEnabled()); |
| 322 | + |
| 323 | + final InetSocketAddress c1N1Address = c1N1Node.getAddress().address(); |
| 324 | + final InetSocketAddress c1N2Address = c1N2Node.getAddress().address(); |
| 325 | + final InetSocketAddress c2N1Address = c2N1Node.getAddress().address(); |
| 326 | + final InetSocketAddress c2N2Address = c2N2Node.getAddress().address(); |
| 327 | + |
| 328 | + final CountDownLatch firstLatch = new CountDownLatch(1); |
| 329 | + service.updateRemoteCluster( |
| 330 | + "cluster_1", |
| 331 | + Arrays.asList(c1N1Address, c1N2Address), |
| 332 | + connectionListener(firstLatch)); |
| 333 | + firstLatch.await(); |
| 334 | + |
| 335 | + final CountDownLatch secondLatch = new CountDownLatch(1); |
| 336 | + service.updateRemoteCluster( |
| 337 | + "cluster_2", |
| 338 | + Arrays.asList(c2N1Address, c2N2Address), |
| 339 | + connectionListener(secondLatch)); |
| 340 | + secondLatch.await(); |
| 341 | + |
| 342 | + assertTrue(service.isCrossClusterSearchEnabled()); |
| 343 | + assertTrue(service.isRemoteClusterRegistered("cluster_1")); |
| 344 | + assertFalse(service.isRemoteNodeConnected("cluster_1", c1N1Node)); |
| 345 | + assertTrue(service.isRemoteNodeConnected("cluster_1", c1N2Node)); |
| 346 | + assertTrue(service.isRemoteClusterRegistered("cluster_2")); |
| 347 | + assertFalse(service.isRemoteNodeConnected("cluster_2", c2N1Node)); |
| 348 | + assertTrue(service.isRemoteNodeConnected("cluster_2", c2N2Node)); |
| 349 | + } |
| 350 | + } |
| 351 | + } |
| 352 | + } |
| 353 | + |
282 | 354 | private ActionListener<Void> connectionListener(final CountDownLatch latch) {
|
283 | 355 | return ActionListener.wrap(x -> latch.countDown(), x -> fail());
|
284 | 356 | }
|
@@ -630,4 +702,115 @@ public void testRemoteClusterSkipIfDisconnectedSetting() {
|
630 | 702 | }
|
631 | 703 | }
|
632 | 704 | }
|
| 705 | + |
| 706 | + public void testGetNodePredicateNodeRoles() { |
| 707 | + TransportAddress address = new TransportAddress(TransportAddress.META_ADDRESS, 0); |
| 708 | + Predicate<DiscoveryNode> nodePredicate = RemoteClusterService.getNodePredicate(Settings.EMPTY); |
| 709 | + { |
| 710 | + DiscoveryNode all = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 711 | + new HashSet<>(EnumSet.allOf(DiscoveryNode.Role.class)), Version.CURRENT); |
| 712 | + assertTrue(nodePredicate.test(all)); |
| 713 | + } |
| 714 | + { |
| 715 | + DiscoveryNode dataMaster = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 716 | + new HashSet<>(EnumSet.of(DiscoveryNode.Role.DATA, DiscoveryNode.Role.MASTER)), Version.CURRENT); |
| 717 | + assertTrue(nodePredicate.test(dataMaster)); |
| 718 | + } |
| 719 | + { |
| 720 | + DiscoveryNode dedicatedMaster = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 721 | + new HashSet<>(EnumSet.of(DiscoveryNode.Role.MASTER)), Version.CURRENT); |
| 722 | + assertFalse(nodePredicate.test(dedicatedMaster)); |
| 723 | + } |
| 724 | + { |
| 725 | + DiscoveryNode dedicatedIngest = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 726 | + new HashSet<>(EnumSet.of(DiscoveryNode.Role.INGEST)), Version.CURRENT); |
| 727 | + assertTrue(nodePredicate.test(dedicatedIngest)); |
| 728 | + } |
| 729 | + { |
| 730 | + DiscoveryNode masterIngest = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 731 | + new HashSet<>(EnumSet.of(DiscoveryNode.Role.INGEST, DiscoveryNode.Role.MASTER)), Version.CURRENT); |
| 732 | + assertTrue(nodePredicate.test(masterIngest)); |
| 733 | + } |
| 734 | + { |
| 735 | + DiscoveryNode dedicatedData = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 736 | + new HashSet<>(EnumSet.of(DiscoveryNode.Role.DATA)), Version.CURRENT); |
| 737 | + assertTrue(nodePredicate.test(dedicatedData)); |
| 738 | + } |
| 739 | + { |
| 740 | + DiscoveryNode ingestData = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 741 | + new HashSet<>(EnumSet.of(DiscoveryNode.Role.DATA, DiscoveryNode.Role.INGEST)), Version.CURRENT); |
| 742 | + assertTrue(nodePredicate.test(ingestData)); |
| 743 | + } |
| 744 | + { |
| 745 | + DiscoveryNode coordOnly = new DiscoveryNode("id", address, Collections.emptyMap(), |
| 746 | + new HashSet<>(EnumSet.noneOf(DiscoveryNode.Role.class)), Version.CURRENT); |
| 747 | + assertTrue(nodePredicate.test(coordOnly)); |
| 748 | + } |
| 749 | + } |
| 750 | + |
| 751 | + public void testGetNodePredicateNodeVersion() { |
| 752 | + TransportAddress address = new TransportAddress(TransportAddress.META_ADDRESS, 0); |
| 753 | + Set<DiscoveryNode.Role> roles = new HashSet<>(EnumSet.allOf(DiscoveryNode.Role.class)); |
| 754 | + Predicate<DiscoveryNode> nodePredicate = RemoteClusterService.getNodePredicate(Settings.EMPTY); |
| 755 | + Version version = VersionUtils.randomVersion(random()); |
| 756 | + DiscoveryNode node = new DiscoveryNode("id", address, Collections.emptyMap(), roles, version); |
| 757 | + assertThat(nodePredicate.test(node), equalTo(Version.CURRENT.isCompatible(version))); |
| 758 | + } |
| 759 | + |
| 760 | + public void testGetNodePredicateNodeAttrs() { |
| 761 | + TransportAddress address = new TransportAddress(TransportAddress.META_ADDRESS, 0); |
| 762 | + Set<DiscoveryNode.Role> roles = new HashSet<>(EnumSet.allOf(DiscoveryNode.Role.class)); |
| 763 | + Settings settings = Settings.builder().put("search.remote.node.attr", "gateway").build(); |
| 764 | + Predicate<DiscoveryNode> nodePredicate = RemoteClusterService.getNodePredicate(settings); |
| 765 | + { |
| 766 | + DiscoveryNode nonGatewayNode = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "false"), |
| 767 | + roles, Version.CURRENT); |
| 768 | + assertFalse(nodePredicate.test(nonGatewayNode)); |
| 769 | + assertTrue(RemoteClusterService.getNodePredicate(Settings.EMPTY).test(nonGatewayNode)); |
| 770 | + } |
| 771 | + { |
| 772 | + DiscoveryNode gatewayNode = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "true"), |
| 773 | + roles, Version.CURRENT); |
| 774 | + assertTrue(nodePredicate.test(gatewayNode)); |
| 775 | + assertTrue(RemoteClusterService.getNodePredicate(Settings.EMPTY).test(gatewayNode)); |
| 776 | + } |
| 777 | + { |
| 778 | + DiscoveryNode noAttrNode = new DiscoveryNode("id", address, Collections.emptyMap(), roles, Version.CURRENT); |
| 779 | + assertFalse(nodePredicate.test(noAttrNode)); |
| 780 | + assertTrue(RemoteClusterService.getNodePredicate(Settings.EMPTY).test(noAttrNode)); |
| 781 | + } |
| 782 | + } |
| 783 | + |
| 784 | + public void testGetNodePredicatesCombination() { |
| 785 | + TransportAddress address = new TransportAddress(TransportAddress.META_ADDRESS, 0); |
| 786 | + Settings settings = Settings.builder().put("search.remote.node.attr", "gateway").build(); |
| 787 | + Predicate<DiscoveryNode> nodePredicate = RemoteClusterService.getNodePredicate(settings); |
| 788 | + Set<DiscoveryNode.Role> allRoles = new HashSet<>(EnumSet.allOf(DiscoveryNode.Role.class)); |
| 789 | + Set<DiscoveryNode.Role> dedicatedMasterRoles = new HashSet<>(EnumSet.of(DiscoveryNode.Role.MASTER)); |
| 790 | + { |
| 791 | + DiscoveryNode node = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "true"), |
| 792 | + dedicatedMasterRoles, Version.CURRENT); |
| 793 | + assertFalse(nodePredicate.test(node)); |
| 794 | + } |
| 795 | + { |
| 796 | + DiscoveryNode node = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "false"), |
| 797 | + dedicatedMasterRoles, Version.CURRENT); |
| 798 | + assertFalse(nodePredicate.test(node)); |
| 799 | + } |
| 800 | + { |
| 801 | + DiscoveryNode node = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "false"), |
| 802 | + dedicatedMasterRoles, Version.CURRENT); |
| 803 | + assertFalse(nodePredicate.test(node)); |
| 804 | + } |
| 805 | + { |
| 806 | + DiscoveryNode node = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "true"), |
| 807 | + allRoles, Version.CURRENT); |
| 808 | + assertTrue(nodePredicate.test(node)); |
| 809 | + } |
| 810 | + { |
| 811 | + DiscoveryNode node = new DiscoveryNode("id", address, Collections.singletonMap("gateway", "true"), |
| 812 | + allRoles, Version.V_5_3_0); |
| 813 | + assertFalse(nodePredicate.test(node)); |
| 814 | + } |
| 815 | + } |
633 | 816 | }
|
0 commit comments