This is an automated email from the ASF dual-hosted git repository. ilyak pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new 974fb5a IGNITE-13138 Add tests for cluster state change via REST commands - Fixes #7918. 974fb5a is described below commit 974fb5a28541f732b751b043998b0c17f5288bbb Author: Sergey Antonov <antonovserge...@gmail.com> AuthorDate: Mon Jun 15 19:41:53 2020 +0300 IGNITE-13138 Add tests for cluster state change via REST commands - Fixes #7918. Signed-off-by: Ilya Kasnacheev <ilya.kasnach...@gmail.com> --- .../rest/AbstractRestProcessorSelfTest.java | 8 + .../rest/JettyRestProcessorAbstractSelfTest.java | 169 ++++++++++++++++----- .../internal/processors/rest/GridRestCommand.java | 4 +- 3 files changed, 140 insertions(+), 41 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/AbstractRestProcessorSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/AbstractRestProcessorSelfTest.java index d765718..42e3899 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/AbstractRestProcessorSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/AbstractRestProcessorSelfTest.java @@ -37,6 +37,8 @@ public abstract class AbstractRestProcessorSelfTest extends GridCommonAbstractTe /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + cleanPersistenceDir(); startGrids(gridCount()); @@ -44,6 +46,8 @@ public abstract class AbstractRestProcessorSelfTest extends GridCommonAbstractTe /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { + super.beforeTest(); + assert grid(0).cluster().nodes().size() == gridCount(); } @@ -52,6 +56,8 @@ public abstract class AbstractRestProcessorSelfTest extends GridCommonAbstractTe jcache().clear(); assertEquals(0, jcache().localSize()); + + super.afterTest(); } /** {@inheritDoc} */ @@ -59,6 +65,8 @@ public abstract class AbstractRestProcessorSelfTest extends GridCommonAbstractTe stopAllGrids(); cleanPersistenceDir(); + + super.afterTestsStopped(); } /** {@inheritDoc} */ diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index 2443eba..1c897f0 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -54,6 +54,7 @@ import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.cache.query.SqlQuery; import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; @@ -157,12 +158,18 @@ import static org.apache.ignite.cache.CacheMode.REPLICATED; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_ASYNC; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; import static org.apache.ignite.cluster.ClusterState.ACTIVE; +import static org.apache.ignite.cluster.ClusterState.ACTIVE_READ_ONLY; import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.configuration.WALMode.NONE; import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR; import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_PARTITIONED; import static org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_REPLICATED; +import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_ACTIVATE; +import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_ACTIVE; +import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_DEACTIVATE; +import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_INACTIVE; +import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_SET_STATE; import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_FAILED; import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_SUCCESS; @@ -193,6 +200,10 @@ public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProces /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + grid(0).cluster().state(ACTIVE); + grid(0).cache(DEFAULT_CACHE_NAME).removeAll(); if (memoryMetricsEnabled) { @@ -202,6 +213,13 @@ public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProces } } + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + grid(0).cluster().state(ACTIVE); + + super.afterTest(); + } + /** * @param content Content to check. * @param err Error message. @@ -397,7 +415,8 @@ public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProces assertEquals(simple.getSalary(), val.get("salary").doubleValue()); assertEquals(simple.getFirstName(), val.get("firstName").textValue()); assertEquals(simple.getLastName(), val.get("lastName").textValue()); - } finally { + } + finally { grid(0).cache(cacheName).remove(300); } } @@ -486,7 +505,8 @@ public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProces assertEquals(newTypeUpdate.timestamp, Timestamp.valueOf(res.get(2).textValue())); assertEquals(newTypeUpdate.igniteUuid, IgniteUuid.fromString(res.get(3).textValue())); assertTrue(Arrays.equals(newTypeUpdate.longs, JSON_MAPPER.treeToValue(res.get(4), long[].class))); - } finally { + } + finally { grid(0).destroyCache(ccfg.getName()); } } @@ -1244,32 +1264,69 @@ public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProces } /** + * Performs all possible cluster state transitions via REST commands. + * * @throws Exception If failed. */ @Test - public void testDeactivateActivate() throws Exception { - assertClusterState(true); + public void testClusterStateChange() throws Exception { + try { + changeClusterState(CLUSTER_SET_STATE, ACTIVE, ACTIVE_READ_ONLY, false, true); - changeClusterState(GridRestCommand.CLUSTER_SET_STATE, "state", INACTIVE.name()); + changeClusterState(CLUSTER_SET_STATE, ACTIVE_READ_ONLY, INACTIVE, false, false); + changeClusterState(CLUSTER_SET_STATE, ACTIVE_READ_ONLY, INACTIVE, true, true); - changeClusterState(GridRestCommand.CLUSTER_SET_STATE, "state", INACTIVE.name(), "force", "true"); + changeClusterState(CLUSTER_SET_STATE, INACTIVE, ACTIVE, false, true); - changeClusterState(GridRestCommand.CLUSTER_SET_STATE, "state", ACTIVE.name()); + changeClusterState(CLUSTER_SET_STATE, ACTIVE, ACTIVE, false, true); - changeClusterState(GridRestCommand.CLUSTER_DEACTIVATE); + changeClusterState(CLUSTER_SET_STATE, ACTIVE, INACTIVE, false, false); + changeClusterState(CLUSTER_SET_STATE, ACTIVE, INACTIVE, true, true); - changeClusterState(GridRestCommand.CLUSTER_DEACTIVATE, "force", "true"); + changeClusterState(CLUSTER_SET_STATE, INACTIVE, INACTIVE, false, true); + changeClusterState(CLUSTER_SET_STATE, INACTIVE, INACTIVE, true, true); - changeClusterState(GridRestCommand.CLUSTER_ACTIVATE); + changeClusterState(CLUSTER_SET_STATE, INACTIVE, ACTIVE_READ_ONLY, false, true); - // same for deprecated. - changeClusterState(GridRestCommand.CLUSTER_INACTIVE); + changeClusterState(CLUSTER_SET_STATE, ACTIVE_READ_ONLY, ACTIVE_READ_ONLY, false, true); - changeClusterState(GridRestCommand.CLUSTER_INACTIVE, "force", "true"); + changeClusterState(CLUSTER_SET_STATE, ACTIVE_READ_ONLY, ACTIVE, false, true); - changeClusterState(GridRestCommand.CLUSTER_ACTIVE); + changeClusterStateByDepricatedCommands(CLUSTER_ACTIVATE, CLUSTER_DEACTIVATE); + changeClusterStateByDepricatedCommands(CLUSTER_ACTIVE, CLUSTER_INACTIVE); + } + finally { + grid(0).cluster().state(ACTIVE); - initCache(); + initCache(); + } + } + + /** + * Performs all cluster state change transitions by depricated commands. + * + * @param activateCmd Cluster activate command. + * @param deactivateCmd Cluster deactive command. + * @throws Exception If failed. + */ + private void changeClusterStateByDepricatedCommands( + GridRestCommand activateCmd, + GridRestCommand deactivateCmd + ) throws Exception { + assertTrue(activateCmd.name(), activateCmd == CLUSTER_ACTIVE || activateCmd == CLUSTER_ACTIVATE); + assertTrue(deactivateCmd.name(), deactivateCmd == CLUSTER_INACTIVE || deactivateCmd == CLUSTER_DEACTIVATE); + + grid(0).cluster().state(ACTIVE); + + changeClusterState(deactivateCmd, ACTIVE, INACTIVE, false, false); + changeClusterState(deactivateCmd, ACTIVE, INACTIVE, true, true); + + changeClusterState(activateCmd, INACTIVE, ACTIVE, false, true); + + grid(0).cluster().state(ACTIVE_READ_ONLY); + + changeClusterState(deactivateCmd, ACTIVE_READ_ONLY, INACTIVE, false, false); + changeClusterState(deactivateCmd, ACTIVE_READ_ONLY, INACTIVE, true, true); } /** @@ -3991,56 +4048,90 @@ public abstract class JettyRestProcessorAbstractSelfTest extends JettyRestProces } /** + * Test if current cluster state equals expected. Checks both REST commands: {@link GridRestCommand#CLUSTER_STATE} + * and {@link GridRestCommand#CLUSTER_CURRENT_STATE}. + * + * @param expState Expected state. + * @throws Exception If failed. + */ + private void checkState(ClusterState expState) throws Exception { + assertClusterState(expState); + assertClusterState(ClusterState.active(expState)); + } + + /** + * Test if current cluster state equals expected. + * + * @param expState Expected state. + * @throws Exception If failed. + */ + private void assertClusterState(ClusterState expState) throws Exception { + String ret = content(null, GridRestCommand.CLUSTER_STATE); + + info("Cluster state: " + ret); + JsonNode res = validateJsonResponse(ret); + + assertEquals(ret, expState.toString(), res.asText()); + assertEquals(ret, expState, grid(0).cluster().state()); + } + + /** * Test if current cluster state equals expected. * * @param exp Expected state. * @throws Exception If failed. */ private void assertClusterState(boolean exp) throws Exception { - String ret = content("cmd", GridRestCommand.CLUSTER_CURRENT_STATE); + String ret = content(null, GridRestCommand.CLUSTER_CURRENT_STATE); info("Cluster state: " + ret); JsonNode res = validateJsonResponse(ret); - assertEquals(exp, res.asBoolean()); - assertEquals(exp, grid(0).cluster().active()); + assertEquals(ret, exp, res.asBoolean()); + assertEquals(ret, exp, grid(0).cluster().active()); } /** - * Change cluster state and test new state. + * Checks that cluster has state {@code curState}, tries to change state to {@code newState} by {@code cmd} command + * and checks state after change. * - * @param cmd Command. - * @param params Arguments for {@code cmd}. + * @param cmd State change command. + * @param curState Expected cluster state before change. + * @param newState New cluster state after change. + * @param force Add force flag to the command parameters. + * @param success Excepted result of cluster state change. * @throws Exception If failed. */ - private void changeClusterState(GridRestCommand cmd, String... params) throws Exception { - String ret = content(null, cmd, params); - - boolean force = false; + private void changeClusterState( + GridRestCommand cmd, + ClusterState curState, + ClusterState newState, + boolean force, + boolean success + ) throws Exception { + checkState(curState); - boolean deactivate = cmd == GridRestCommand.CLUSTER_INACTIVE || cmd == GridRestCommand.CLUSTER_DEACTIVATE; + Map<String, String> params = new LinkedHashMap<>(); - for (int i = 0; i < params.length; ++i) { - String p = params[i]; + params.put("cmd", cmd.key()); - if ("force".equals(p) && params[i + 1].equals("true")) - force = true; + if (force) + params.put("force", "true"); - if (cmd == GridRestCommand.CLUSTER_SET_STATE && p.equals("state")) - deactivate = params[i + 1].equals(INACTIVE.name()); - } + if (cmd == CLUSTER_SET_STATE) + params.put("state", newState.name()); - boolean errorExpected = !force && deactivate; + String ret = content(params); - JsonNode res = validateJsonResponse(ret, errorExpected); + JsonNode res = validateJsonResponse(ret, !success); assertFalse(res.isNull()); - if (errorExpected) - assertTrue(res.asText().contains(DATA_LOST_ON_DEACTIVATION_WARNING)); - else + if (success) assertTrue(res.asText().startsWith(cmd.key())); + else + assertTrue(res.asText().contains(DATA_LOST_ON_DEACTIVATION_WARNING)); - assertClusterState(!deactivate || !force); + checkState(success ? newState : curState); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java index a927380..e5c8c40 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java @@ -160,11 +160,11 @@ public enum GridRestCommand { /** Close query. */ CLOSE_SQL_QUERY("qrycls"), - /** @deprecated Use {@link #CLUSTER_ACTIVATE} instead. */ + /** @deprecated Use {@link #CLUSTER_SET_STATE} with {@link ClusterState#ACTIVE} instead. */ @Deprecated CLUSTER_ACTIVE("active"), - /** @deprecated Use {@link #CLUSTER_DEACTIVATE} instead. */ + /** @deprecated Use {@link #CLUSTER_SET_STATE} with {@link ClusterState#INACTIVE} instead. */ @Deprecated CLUSTER_INACTIVE("inactive"),