From a100cf0902e7793f3b748290deda24856af8a83a Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Thu, 17 Jan 2019 20:22:25 +0300 Subject: [PATCH 1/6] Added validateNode method with discoData argument. validateNode with ClusterNode only is deprecated. --- .../ignite/internal/GridPluginComponent.java | 19 ++++++++++++++++--- .../apache/ignite/plugin/PluginProvider.java | 17 +++++++++++++++++ .../IgniteStandByClusterTest.java | 4 ++++ .../PageMemoryTrackerPluginProvider.java | 4 ++++ .../tcp/TestReconnectPluginProvider.java | 4 ++++ 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java b/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java index 3864e9f73a621..bc7b51a8517f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal; +import java.io.Serializable; +import java.util.Map; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.lang.IgniteFuture; @@ -81,7 +83,7 @@ public PluginProvider plugin() { /** {@inheritDoc} */ @Nullable @Override public DiscoveryDataExchangeType discoveryDataType() { - return null; + return DiscoveryDataExchangeType.PLUGIN; } /** {@inheritDoc} */ @@ -117,8 +119,19 @@ public PluginProvider plugin() { } /** {@inheritDoc} */ - @Nullable @Override public IgniteNodeValidationResult validateNode(ClusterNode node, JoiningNodeDiscoveryData discoData) { - return null; + @Nullable @Override public IgniteNodeValidationResult validateNode(ClusterNode node, + JoiningNodeDiscoveryData discoData) { + try { + Map map = (Map)discoData.joiningNodeData(); + + if (map != null) + plugin.validateNewNode(node, map.get(plugin.name())); + + return null; + } + catch (PluginValidationException e) { + return new IgniteNodeValidationResult(e.nodeId(), e.getMessage(), e.remoteMessage()); + } } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java index 7f95d34855a60..702a6590441fa 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java @@ -21,6 +21,7 @@ import java.util.ServiceLoader; import java.util.UUID; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteCluster; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.IgniteConfiguration; import org.jetbrains.annotations.Nullable; @@ -141,6 +142,22 @@ public interface PluginProvider { * * @param node Joining node. * @throws PluginValidationException If cluster-wide plugin validation failed. + * + * @deprecated Use {@link #validateNewNode(ClusterNode, Serializable)} instead. */ + @Deprecated public void validateNewNode(ClusterNode node) throws PluginValidationException; + + /** + * Validates that new node can join grid topology, this method is called on coordinator + * node before new node joins topology. + * + * @param node Joining node. + * @param data Discovery data object or {@code null} if nothing was + * sent for this component. + * @throws PluginValidationException If cluster-wide plugin validation failed. + */ + public default void validateNewNode(ClusterNode node, Serializable data) { + // No-Op + } } \ No newline at end of file diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java index 9a793d4bbfad1..b86dae30e85b1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java @@ -493,6 +493,10 @@ public static class StanByClusterTestProvider implements PluginProvider, IgniteP } + @Override public void validateNewNode(ClusterNode node, Serializable serializable) { + + } + /** {@inheritDoc} */ @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { return null; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java index 3bd9f4ac1def8..4707a1d6d3bcb 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java @@ -168,6 +168,10 @@ else if (IgnitePageStoreManager.class.equals(cls)) // No-op } + @Override public void validateNewNode(ClusterNode node, Serializable serializable) { + // No-op + } + /** {@inheritDoc} */ @Override public void onActivate(GridKernalContext kctx) { if (plugin != null) { diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java index ccbf24340e631..63fe5f0ea38e5 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java @@ -98,6 +98,10 @@ public class TestReconnectPluginProvider implements PluginProvider { // No-op } + @Override public void validateNewNode(ClusterNode node, Serializable serializable) { + // No-op + } + /** {@inheritDoc} */ @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { if (enabled && GridSecurityProcessor.class.equals(cls)) From 8aef0e4766fe719ef5858cb58d344c2b4e626ace Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Mon, 21 Jan 2019 20:02:10 +0300 Subject: [PATCH 2/6] Added tests. --- .../ignite/internal/GridPluginComponent.java | 11 +- .../apache/ignite/plugin/PluginProvider.java | 2 +- .../org.apache.ignite.plugin.PluginProvider | 1 + .../plugin/PluginNodeValidationTest.java | 220 ++++++++++++++++++ .../testsuites/IgniteBasicTestSuite.java | 2 + .../testsuites/IgnitePluginApiTestSuite.java | 29 +++ 6 files changed, 256 insertions(+), 9 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java b/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java index bc7b51a8517f6..f8e4d2f6a1f0c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java @@ -108,14 +108,7 @@ public PluginProvider plugin() { /** {@inheritDoc} */ @Nullable @Override public IgniteNodeValidationResult validateNode(ClusterNode node) { - try { - plugin.validateNewNode(node); - - return null; - } - catch (PluginValidationException e) { - return new IgniteNodeValidationResult(e.nodeId(), e.getMessage(), e.remoteMessage()); - } + return null; } /** {@inheritDoc} */ @@ -126,6 +119,8 @@ public PluginProvider plugin() { if (map != null) plugin.validateNewNode(node, map.get(plugin.name())); + else + plugin.validateNewNode(node, null); return null; } diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java index 702a6590441fa..6aeb619ff5c8e 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java @@ -158,6 +158,6 @@ public interface PluginProvider { * @throws PluginValidationException If cluster-wide plugin validation failed. */ public default void validateNewNode(ClusterNode node, Serializable data) { - // No-Op + validateNewNode(node); } } \ No newline at end of file diff --git a/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider b/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider index e9e9d41ec7f27..01c098e964fc9 100644 --- a/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider +++ b/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider @@ -2,3 +2,4 @@ org.apache.ignite.spi.discovery.tcp.TestReconnectPluginProvider org.apache.ignite.internal.processors.cache.persistence.standbycluster.IgniteStandByClusterTest$StanByClusterTestProvider org.apache.ignite.internal.processors.cache.persistence.wal.memtracker.PageMemoryTrackerPluginProvider org.apache.ignite.internal.processors.configuration.distributed.TestDistibutedConfigurationPlugin +org.apache.ignite.plugin.PluginNodeValidationTest$NodeValidationPluginProvider \ No newline at end of file diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java b/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java new file mode 100644 index 0000000000000..7d0deacc55574 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java @@ -0,0 +1,220 @@ +/* + * 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.plugin; + +import java.io.Serializable; +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.util.typedef.X; +import org.apache.ignite.spi.IgniteSpiException; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.jetbrains.annotations.Nullable; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class PluginNodeValidationTest extends GridCommonAbstractTest { + + private volatile String token; + public static volatile boolean enabled; + + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + cfg.setDataStorageConfiguration(new DataStorageConfiguration() + .setDefaultDataRegionConfiguration(new DataRegionConfiguration() + .setMaxSize(100L * 1024 * 1024) + .setPersistenceEnabled(true))); + + cfg.setConsistentId(igniteInstanceName); + + cfg.setPluginConfigurations(new NodeValidationPluginConfiguration(token)); + + return cfg; + } + + @Test + public void testValidationException() throws Exception { + token = "123456"; + + startGrid(0); + + token = "abcdef"; + + try { + startGrid(1); + } catch (Exception ex) { + assertTrue("Wrong exception type for validation error", X.hasCause(ex, IgniteSpiException.class)); + + return; + } + + fail("Exception is expected due validation error in plugin"); + } + + @Test + public void testSuccessfulValidation() throws Exception { + token = "123456"; + + startGrid(0); + startGrid(1); + } + + public static class NodeValidationPluginProvider implements PluginProvider, IgnitePlugin { + + private NodeValidationPluginConfiguration pluginConfiguration; + + @Override public String name() { + return "NodeValidationPluginProvider"; + } + + @Override public String version() { + return "1.0"; + } + + @Override public String copyright() { + return ""; + } + + @Override public IgnitePlugin plugin() { + return this; + } + + @Override + public void initExtensions(PluginContext ctx, ExtensionRegistry registry) throws IgniteCheckedException { + if(!enabled) return; + + IgniteConfiguration igniteCfg = ctx.igniteConfiguration(); + + if (igniteCfg.getPluginConfigurations() != null) { + for (PluginConfiguration pluginCfg : igniteCfg.getPluginConfigurations()) { + if (pluginCfg instanceof NodeValidationPluginConfiguration) { + pluginConfiguration = (NodeValidationPluginConfiguration)pluginCfg; + + break; + } + } + } + } + + @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { + return null; + } + + @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) { + return null; + } + + @Override public void start(PluginContext ctx) throws IgniteCheckedException { + //no-op + } + + @Override public void stop(boolean cancel) throws IgniteCheckedException { + //no-op + } + + @Override public void onIgniteStart() throws IgniteCheckedException { + //no-op + } + + @Override public void onIgniteStop(boolean cancel) { + //no-op + } + + @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) { + if(!enabled) return null; + + MyDiscoData data = new MyDiscoData(pluginConfiguration.getToken()); + + return data; + } + + @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) { + if(!enabled) return; + } + + @Override public void validateNewNode(ClusterNode node) throws PluginValidationException { + // no-op + } + + @Override public void validateNewNode(ClusterNode node, Serializable serializable) { + if(!enabled) return; + + MyDiscoData newNodeDiscoData = serializable instanceof MyDiscoData ? (MyDiscoData)serializable : null; + + if (newNodeDiscoData == null || !newNodeDiscoData.getToken().equals(pluginConfiguration.getToken())) { + String msg = newNodeDiscoData == null ? "no token provided" : "bad token provided: " + newNodeDiscoData.getToken(); + + throw new PluginValidationException(msg, msg, node.id()); + } + } + } + + public static class NodeValidationPluginConfiguration implements PluginConfiguration { + private final String token; + + public NodeValidationPluginConfiguration(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + } + + private static class MyDiscoData implements Serializable { + String token; + + public MyDiscoData(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + + @Override public String toString() { + return "MyDiscoData{" + + "token='" + token + '\'' + + '}'; + } + } + + @After + public void after() throws Exception { + stopAllGrids(); + } + + @BeforeClass + public static void enablePlugin() { + enabled = true; + } + + @AfterClass + public static void disablePlugin() { + enabled = false; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java index b55f140b02d27..05c211a866f92 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java @@ -208,6 +208,8 @@ ListeningTestLoggerTest.class, CacheLocalGetSerializationTest.class, + + IgnitePluginApiTestSuite.class, }) public class IgniteBasicTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java new file mode 100644 index 0000000000000..aab33e550b3f0 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java @@ -0,0 +1,29 @@ +/* + * 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.testsuites; + +import org.apache.ignite.plugin.PluginNodeValidationTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + PluginNodeValidationTest.class, +}) +public class IgnitePluginApiTestSuite { +} From 26d9daa93d6afb00fb241185d4c01b56ff43ffb4 Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Wed, 23 Jan 2019 18:20:19 +0300 Subject: [PATCH 3/6] Fixed platform tests. --- .../org.apache.ignite.plugin.PluginProvider | 2 +- .../NodeValidationPluginConfiguration.java | 15 +++ .../plugin/NodeValidationPluginProvider.java | 117 ++++++++++++++++ .../plugin/PluginNodeValidationTest.java | 125 +----------------- 4 files changed, 135 insertions(+), 124 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java create mode 100644 modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java diff --git a/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider b/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider index 01c098e964fc9..5805dfd95409a 100644 --- a/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider +++ b/modules/core/src/test/java/META-INF/services/org.apache.ignite.plugin.PluginProvider @@ -2,4 +2,4 @@ org.apache.ignite.spi.discovery.tcp.TestReconnectPluginProvider org.apache.ignite.internal.processors.cache.persistence.standbycluster.IgniteStandByClusterTest$StanByClusterTestProvider org.apache.ignite.internal.processors.cache.persistence.wal.memtracker.PageMemoryTrackerPluginProvider org.apache.ignite.internal.processors.configuration.distributed.TestDistibutedConfigurationPlugin -org.apache.ignite.plugin.PluginNodeValidationTest$NodeValidationPluginProvider \ No newline at end of file +org.apache.ignite.plugin.NodeValidationPluginProvider \ No newline at end of file diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java new file mode 100644 index 0000000000000..ff8942729f2a8 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java @@ -0,0 +1,15 @@ +package org.apache.ignite.plugin; + +import java.io.Serializable; + +public class NodeValidationPluginConfiguration implements PluginConfiguration { + private final String token; + + public NodeValidationPluginConfiguration(String token) { + this.token = token; + } + + public String getToken() { + return token; + } +} \ No newline at end of file diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java new file mode 100644 index 0000000000000..6fa7f2abb7d19 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java @@ -0,0 +1,117 @@ +package org.apache.ignite.plugin; + +import java.io.Serializable; +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.jetbrains.annotations.Nullable; + +public class NodeValidationPluginProvider implements PluginProvider, IgnitePlugin { + + private NodeValidationPluginConfiguration pluginConfiguration; + public static volatile boolean enabled; + + @Override public String name() { + return "NodeValidationPluginProvider"; + } + + @Override public String version() { + return "1.0"; + } + + @Override public String copyright() { + return ""; + } + + @Override public IgnitePlugin plugin() { + return this; + } + + @Override + public void initExtensions(PluginContext ctx, ExtensionRegistry registry) throws IgniteCheckedException { + if(!enabled) return; + + IgniteConfiguration igniteCfg = ctx.igniteConfiguration(); + + if (igniteCfg.getPluginConfigurations() != null) { + for (PluginConfiguration pluginCfg : igniteCfg.getPluginConfigurations()) { + if (pluginCfg instanceof NodeValidationPluginConfiguration) { + pluginConfiguration = (NodeValidationPluginConfiguration)pluginCfg; + + break; + } + } + } + } + + @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { + return null; + } + + @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) { + return null; + } + + @Override public void start(PluginContext ctx) throws IgniteCheckedException { + //no-op + } + + @Override public void stop(boolean cancel) throws IgniteCheckedException { + //no-op + } + + @Override public void onIgniteStart() throws IgniteCheckedException { + //no-op + } + + @Override public void onIgniteStop(boolean cancel) { + //no-op + } + + @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) { + if(!enabled) return null; + + MyDiscoData data = new MyDiscoData(pluginConfiguration.getToken()); + + return data; + } + + @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) { + if(!enabled) return; + } + + @Override public void validateNewNode(ClusterNode node) throws PluginValidationException { + // no-op + } + + @Override public void validateNewNode(ClusterNode node, Serializable serializable) { + if(!enabled) return; + + MyDiscoData newNodeDiscoData = serializable instanceof MyDiscoData ? (MyDiscoData)serializable : null; + + if (newNodeDiscoData == null || !newNodeDiscoData.getToken().equals(pluginConfiguration.getToken())) { + String msg = newNodeDiscoData == null ? "no token provided" : "bad token provided: " + newNodeDiscoData.getToken(); + + throw new PluginValidationException(msg, msg, node.id()); + } + } + + private static class MyDiscoData implements Serializable { + String token; + + public MyDiscoData(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + + @Override public String toString() { + return "MyDiscoData{" + + "token='" + token + '\'' + + '}'; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java b/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java index 7d0deacc55574..628994bb21b94 100644 --- a/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java @@ -39,7 +39,6 @@ public class PluginNodeValidationTest extends GridCommonAbstractTest { private volatile String token; - public static volatile boolean enabled; @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); @@ -83,126 +82,6 @@ public void testSuccessfulValidation() throws Exception { startGrid(1); } - public static class NodeValidationPluginProvider implements PluginProvider, IgnitePlugin { - - private NodeValidationPluginConfiguration pluginConfiguration; - - @Override public String name() { - return "NodeValidationPluginProvider"; - } - - @Override public String version() { - return "1.0"; - } - - @Override public String copyright() { - return ""; - } - - @Override public IgnitePlugin plugin() { - return this; - } - - @Override - public void initExtensions(PluginContext ctx, ExtensionRegistry registry) throws IgniteCheckedException { - if(!enabled) return; - - IgniteConfiguration igniteCfg = ctx.igniteConfiguration(); - - if (igniteCfg.getPluginConfigurations() != null) { - for (PluginConfiguration pluginCfg : igniteCfg.getPluginConfigurations()) { - if (pluginCfg instanceof NodeValidationPluginConfiguration) { - pluginConfiguration = (NodeValidationPluginConfiguration)pluginCfg; - - break; - } - } - } - } - - @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { - return null; - } - - @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) { - return null; - } - - @Override public void start(PluginContext ctx) throws IgniteCheckedException { - //no-op - } - - @Override public void stop(boolean cancel) throws IgniteCheckedException { - //no-op - } - - @Override public void onIgniteStart() throws IgniteCheckedException { - //no-op - } - - @Override public void onIgniteStop(boolean cancel) { - //no-op - } - - @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) { - if(!enabled) return null; - - MyDiscoData data = new MyDiscoData(pluginConfiguration.getToken()); - - return data; - } - - @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) { - if(!enabled) return; - } - - @Override public void validateNewNode(ClusterNode node) throws PluginValidationException { - // no-op - } - - @Override public void validateNewNode(ClusterNode node, Serializable serializable) { - if(!enabled) return; - - MyDiscoData newNodeDiscoData = serializable instanceof MyDiscoData ? (MyDiscoData)serializable : null; - - if (newNodeDiscoData == null || !newNodeDiscoData.getToken().equals(pluginConfiguration.getToken())) { - String msg = newNodeDiscoData == null ? "no token provided" : "bad token provided: " + newNodeDiscoData.getToken(); - - throw new PluginValidationException(msg, msg, node.id()); - } - } - } - - public static class NodeValidationPluginConfiguration implements PluginConfiguration { - private final String token; - - public NodeValidationPluginConfiguration(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - } - - private static class MyDiscoData implements Serializable { - String token; - - public MyDiscoData(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - @Override public String toString() { - return "MyDiscoData{" + - "token='" + token + '\'' + - '}'; - } - } - @After public void after() throws Exception { stopAllGrids(); @@ -210,11 +89,11 @@ public void after() throws Exception { @BeforeClass public static void enablePlugin() { - enabled = true; + NodeValidationPluginProvider.enabled = true; } @AfterClass public static void disablePlugin() { - enabled = false; + NodeValidationPluginProvider.enabled = false; } } From 4b4d09c9ba43c3fbcf4b793055fb77e107270225 Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Thu, 24 Jan 2019 15:41:21 +0300 Subject: [PATCH 4/6] CC fixed. --- .../IgniteStandByClusterTest.java | 1 + .../PageMemoryTrackerPluginProvider.java | 1 + .../NodeValidationPluginConfiguration.java | 15 --- .../plugin/NodeValidationPluginProvider.java | 91 +++++++++++++++++-- .../plugin/PluginNodeValidationTest.java | 23 +++-- 5 files changed, 99 insertions(+), 32 deletions(-) delete mode 100644 modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java index b86dae30e85b1..c96d250ffd5a6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java @@ -493,6 +493,7 @@ public static class StanByClusterTestProvider implements PluginProvider, IgniteP } + /** {@inheritDoc} */ @Override public void validateNewNode(ClusterNode node, Serializable serializable) { } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java index 4707a1d6d3bcb..1c4a0990be690 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java @@ -168,6 +168,7 @@ else if (IgnitePageStoreManager.class.equals(cls)) // No-op } + /** {@inheritDoc} */ @Override public void validateNewNode(ClusterNode node, Serializable serializable) { // No-op } diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java deleted file mode 100644 index ff8942729f2a8..0000000000000 --- a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginConfiguration.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.apache.ignite.plugin; - -import java.io.Serializable; - -public class NodeValidationPluginConfiguration implements PluginConfiguration { - private final String token; - - public NodeValidationPluginConfiguration(String token) { - this.token = token; - } - - public String getToken() { - return token; - } -} \ No newline at end of file diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java index 6fa7f2abb7d19..76c8fdcafae3e 100644 --- a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java +++ b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java @@ -1,3 +1,20 @@ +/* + * 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.plugin; import java.io.Serializable; @@ -7,30 +24,50 @@ import org.apache.ignite.configuration.IgniteConfiguration; import org.jetbrains.annotations.Nullable; +/** + * Validates node on join, it requires nodes to provide token that matches configured on primary node. + */ public class NodeValidationPluginProvider implements PluginProvider, IgnitePlugin { + /** */ private NodeValidationPluginConfiguration pluginConfiguration; - public static volatile boolean enabled; + /** */ + private static volatile boolean enabled; + + /** */ + public static boolean isEnabled() { + return enabled; + } + /** */ + public static void setEnabled(boolean enabled) { + NodeValidationPluginProvider.enabled = enabled; + } + + /** {@inheritDoc} */ @Override public String name() { return "NodeValidationPluginProvider"; } + /** {@inheritDoc} */ @Override public String version() { return "1.0"; } + /** {@inheritDoc} */ @Override public String copyright() { return ""; } + /** {@inheritDoc} */ @Override public IgnitePlugin plugin() { return this; } - @Override - public void initExtensions(PluginContext ctx, ExtensionRegistry registry) throws IgniteCheckedException { - if(!enabled) return; + /** {@inheritDoc} */ + @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) { + if (!enabled) + return; IgniteConfiguration igniteCfg = ctx.igniteConfiguration(); @@ -45,48 +82,61 @@ public void initExtensions(PluginContext ctx, ExtensionRegistry registry) throws } } + /** {@inheritDoc} */ @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { return null; } + /** {@inheritDoc} */ @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) { return null; } + /** {@inheritDoc} */ @Override public void start(PluginContext ctx) throws IgniteCheckedException { //no-op } + /** {@inheritDoc} */ @Override public void stop(boolean cancel) throws IgniteCheckedException { //no-op } + /** {@inheritDoc} */ @Override public void onIgniteStart() throws IgniteCheckedException { //no-op } + /** {@inheritDoc} */ @Override public void onIgniteStop(boolean cancel) { //no-op } + /** {@inheritDoc} */ @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) { - if(!enabled) return null; + if (!enabled) + return null; MyDiscoData data = new MyDiscoData(pluginConfiguration.getToken()); return data; } + /** {@inheritDoc} */ @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) { - if(!enabled) return; + if (!enabled) + return; } + /** {@inheritDoc} */ @Override public void validateNewNode(ClusterNode node) throws PluginValidationException { // no-op } + /** {@inheritDoc} */ @Override public void validateNewNode(ClusterNode node, Serializable serializable) { - if(!enabled) return; + if (!enabled) + return; MyDiscoData newNodeDiscoData = serializable instanceof MyDiscoData ? (MyDiscoData)serializable : null; @@ -97,21 +147,46 @@ public void initExtensions(PluginContext ctx, ExtensionRegistry registry) throws } } + /** + * + */ private static class MyDiscoData implements Serializable { + /** */ String token; - public MyDiscoData(String token) { + /** */ + MyDiscoData(String token) { this.token = token; } + /** */ public String getToken() { return token; } + /** */ @Override public String toString() { return "MyDiscoData{" + "token='" + token + '\'' + '}'; } } + + /** + * + */ + public static class NodeValidationPluginConfiguration implements PluginConfiguration { + /** */ + private final String token; + + /** */ + NodeValidationPluginConfiguration(String token) { + this.token = token; + } + + /** */ + public String getToken() { + return token; + } + } } diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java b/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java index 628994bb21b94..8ae55fcd0e46e 100644 --- a/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/plugin/PluginNodeValidationTest.java @@ -17,17 +17,12 @@ package org.apache.ignite.plugin; -import java.io.Serializable; -import java.util.UUID; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.spi.IgniteSpiException; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.jetbrains.annotations.Nullable; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -35,11 +30,16 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +/** + * Test node validation on join by plugin. + */ @RunWith(JUnit4.class) public class PluginNodeValidationTest extends GridCommonAbstractTest { + /** */ private volatile String token; + /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); @@ -50,11 +50,12 @@ public class PluginNodeValidationTest extends GridCommonAbstractTest { cfg.setConsistentId(igniteInstanceName); - cfg.setPluginConfigurations(new NodeValidationPluginConfiguration(token)); + cfg.setPluginConfigurations(new NodeValidationPluginProvider.NodeValidationPluginConfiguration(token)); return cfg; } + /** Tests that node join fails due failure in node validation. */ @Test public void testValidationException() throws Exception { token = "123456"; @@ -74,6 +75,7 @@ public void testValidationException() throws Exception { fail("Exception is expected due validation error in plugin"); } + /** Tests that node joins on successful node validation by plugin. */ @Test public void testSuccessfulValidation() throws Exception { token = "123456"; @@ -82,18 +84,21 @@ public void testSuccessfulValidation() throws Exception { startGrid(1); } + /** Stop all nodes after each test. */ @After - public void after() throws Exception { + public void after() { stopAllGrids(); } + /** Enables plugin before test start. */ @BeforeClass public static void enablePlugin() { - NodeValidationPluginProvider.enabled = true; + NodeValidationPluginProvider.setEnabled(true); } + /** Disable plugin after test end. */ @AfterClass public static void disablePlugin() { - NodeValidationPluginProvider.enabled = false; + NodeValidationPluginProvider.setEnabled(false); } } From 786404cee591737b7b031d1b0722922773e9d475 Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Thu, 24 Jan 2019 15:45:01 +0300 Subject: [PATCH 5/6] Test added directly to basic suite and suite for plugin api is removed. --- .../testsuites/IgniteBasicTestSuite.java | 3 +- .../testsuites/IgnitePluginApiTestSuite.java | 29 ------------------- 2 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java index 05c211a866f92..f145ae424d5ed 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java @@ -83,6 +83,7 @@ import org.apache.ignite.messaging.GridMessagingSelfTest; import org.apache.ignite.messaging.IgniteMessagingSendAsyncTest; import org.apache.ignite.messaging.IgniteMessagingWithClientTest; +import org.apache.ignite.plugin.PluginNodeValidationTest; import org.apache.ignite.plugin.security.SecurityPermissionSetBuilderTest; import org.apache.ignite.spi.GridSpiLocalHostInjectionTest; import org.apache.ignite.startup.properties.NotStringSystemPropertyTest; @@ -209,7 +210,7 @@ CacheLocalGetSerializationTest.class, - IgnitePluginApiTestSuite.class, + PluginNodeValidationTest.class, }) public class IgniteBasicTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java deleted file mode 100644 index aab33e550b3f0..0000000000000 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePluginApiTestSuite.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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.testsuites; - -import org.apache.ignite.plugin.PluginNodeValidationTest; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ - PluginNodeValidationTest.class, -}) -public class IgnitePluginApiTestSuite { -} From 83ca82ed17bcc5672d7d3b7c89046ddf4d995965 Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Thu, 24 Jan 2019 15:52:16 +0300 Subject: [PATCH 6/6] Removed changes in existent plugins, no changes is required, because new method has default implementation. --- .../standbycluster/IgniteStandByClusterTest.java | 5 ----- .../wal/memtracker/PageMemoryTrackerPluginProvider.java | 5 ----- .../spi/discovery/tcp/TestReconnectPluginProvider.java | 6 +----- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java index c96d250ffd5a6..9a793d4bbfad1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java @@ -493,11 +493,6 @@ public static class StanByClusterTestProvider implements PluginProvider, IgniteP } - /** {@inheritDoc} */ - @Override public void validateNewNode(ClusterNode node, Serializable serializable) { - - } - /** {@inheritDoc} */ @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { return null; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java index 1c4a0990be690..3bd9f4ac1def8 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java @@ -168,11 +168,6 @@ else if (IgnitePageStoreManager.class.equals(cls)) // No-op } - /** {@inheritDoc} */ - @Override public void validateNewNode(ClusterNode node, Serializable serializable) { - // No-op - } - /** {@inheritDoc} */ @Override public void onActivate(GridKernalContext kctx) { if (plugin != null) { diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java index 63fe5f0ea38e5..2074ec963bd78 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestReconnectPluginProvider.java @@ -97,11 +97,7 @@ public class TestReconnectPluginProvider implements PluginProvider { @Override public void validateNewNode(ClusterNode node) throws PluginValidationException { // No-op } - - @Override public void validateNewNode(ClusterNode node, Serializable serializable) { - // No-op - } - + /** {@inheritDoc} */ @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { if (enabled && GridSecurityProcessor.class.equals(cls))