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"),
 

Reply via email to