IGNITE-5586 Toggle cluster active state.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5283e19f Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5283e19f Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5283e19f Branch: refs/heads/ignite-5578 Commit: 5283e19fe21c5b898965ade70cc86e9c64254388 Parents: c5adf46 Author: vsisko <[email protected]> Authored: Thu Aug 17 14:55:08 2017 +0700 Committer: Alexey Kuznetsov <[email protected]> Committed: Thu Aug 17 14:55:08 2017 +0700 ---------------------------------------------------------------------- .../commands/top/VisorTopologyCommand.scala | 111 ++++++++++++------- .../ignite/visor/VisorRuntimeBaseSpec.scala | 9 +- .../top/VisorActivationCommandSpec.scala | 67 +++++++++++ .../testsuites/VisorConsoleSelfTestSuite.scala | 3 +- 4 files changed, 146 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/5283e19f/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/top/VisorTopologyCommand.scala ---------------------------------------------------------------------- diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/top/VisorTopologyCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/top/VisorTopologyCommand.scala index 63b6d2b..b75afc6 100644 --- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/top/VisorTopologyCommand.scala +++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/top/VisorTopologyCommand.scala @@ -48,6 +48,8 @@ import scala.util.control.Breaks._ * ====Specification==== * {{{ * top "{-c1=e1<num> -c2=e2<num> ... -ck=ek<num>} {-h=<host1> ... -h=<hostk>} {-a}" + * top -activate + * top -deactivate * }}} * * ====Arguments==== @@ -87,6 +89,10 @@ import scala.util.control.Breaks._ * -a * This defines whether to show a separate table of nodes * with detail per-node information. + * -activate + * Activate cluster. + * -deactivate + * Deactivate cluster. * }}} * * ====Examples==== @@ -99,6 +105,10 @@ import scala.util.control.Breaks._ * Prints topology for provided hosts. * top * Prints full topology. + * top -activate + * Activate cluster. + * top -deactivate + * Deactivate cluster. * }}} */ class VisorTopologyCommand extends VisorConsoleCommand { @@ -140,47 +150,53 @@ class VisorTopologyCommand extends VisorConsoleCommand { else { val argLst = parseArgs(args) - val hosts = argLst.filter(_._1 == "h").map((a: Arg) => - try - InetAddress.getByName(a._2).getHostAddress + if (hasArgFlag("activate", argLst)) + ignite.active(true) + else if (hasArgFlag("deactivate", argLst)) + ignite.active(false) + else { + val hosts = argLst.filter(_._1 == "h").map((a: Arg) => + try + InetAddress.getByName(a._2).getHostAddress + catch { + case e: UnknownHostException => scold("Unknown host: " + a._2).^^ + + "" // Never happens. + } + ).filter(!_.isEmpty).toSet + + val all = hasArgFlag("a", argLst) + + var f: NodeFilter = (ClusterNode) => true + + try { + argLst foreach (arg => { + val (n, v) = arg + + n match { + case "cc" if v != null => f = make(v, f, _.metrics.getTotalCpus) + case "cl" if v != null => f = make(v, f, (n: ClusterNode) => + (n.metrics.getCurrentCpuLoad * 100).toLong) + case "aj" if v != null => f = make(v, f, _.metrics.getCurrentActiveJobs) + case "cj" if v != null => f = make(v, f, _.metrics.getCurrentCancelledJobs) + case "tc" if v != null => f = make(v, f, _.metrics.getCurrentThreadCount) + case "ut" if v != null => f = make(v, f, _.metrics.getUpTime) + case "je" if v != null => f = make(v, f, _.metrics.getCurrentJobExecuteTime) + case "jw" if v != null => f = make(v, f, _.metrics.getCurrentJobWaitTime) + case "wj" if v != null => f = make(v, f, _.metrics.getCurrentWaitingJobs) + case "rj" if v != null => f = make(v, f, _.metrics.getCurrentRejectedJobs) + case "hu" if v != null => f = make(v, f, _.metrics.getHeapMemoryUsed) + case "hm" if v != null => f = make(v, f, _.metrics.getHeapMemoryMaximum) + case _ => () + } + }) + + show(n => f(n), hosts, all) + } catch { - case e: UnknownHostException => scold("Unknown host: " + a._2).^^ - - "" // Never happens. + case e: NumberFormatException => scold(e) + case e: IgniteException => scold(e) } - ).filter(!_.isEmpty).toSet - - val all = hasArgFlag("a", argLst) - - var f: NodeFilter = (ClusterNode) => true - - try { - argLst foreach (arg => { - val (n, v) = arg - - n match { - case "cc" if v != null => f = make(v, f, _.metrics.getTotalCpus) - case "cl" if v != null => f = make(v, f, (n: ClusterNode) => - (n.metrics.getCurrentCpuLoad * 100).toLong) - case "aj" if v != null => f = make(v, f, _.metrics.getCurrentActiveJobs) - case "cj" if v != null => f = make(v, f, _.metrics.getCurrentCancelledJobs) - case "tc" if v != null => f = make(v, f, _.metrics.getCurrentThreadCount) - case "ut" if v != null => f = make(v, f, _.metrics.getUpTime) - case "je" if v != null => f = make(v, f, _.metrics.getCurrentJobExecuteTime) - case "jw" if v != null => f = make(v, f, _.metrics.getCurrentJobWaitTime) - case "wj" if v != null => f = make(v, f, _.metrics.getCurrentWaitingJobs) - case "rj" if v != null => f = make(v, f, _.metrics.getCurrentRejectedJobs) - case "hu" if v != null => f = make(v, f, _.metrics.getHeapMemoryUsed) - case "hm" if v != null => f = make(v, f, _.metrics.getHeapMemoryMaximum) - case _ => () - } - }) - - show(n => f(n), hosts, all) - } - catch { - case e: NumberFormatException => scold(e) - case e: IgniteException => scold(e) } } } @@ -322,6 +338,7 @@ class VisorTopologyCommand extends VisorConsoleCommand { val sumT = VisorTextTable() + sumT += ("Active", ignite.active) sumT += ("Total hosts", U.neighborhood(nodes).size) sumT += ("Total nodes", m.getTotalNodes) sumT += ("Total CPUs", m.getTotalCpus) @@ -348,7 +365,9 @@ object VisorTopologyCommand { name = "top", shortInfo = "Prints current topology.", spec = List( - "top {-c1=e1<num> -c2=e2<num> ... -ck=ek<num>} {-h=<host1> ... -h=<hostk>} {-a}" + "top {-c1=e1<num> -c2=e2<num> ... -ck=ek<num>} {-h=<host1> ... -h=<hostk>} {-a}", + "top -activate", + "top -deactivate" ), args = List( "-ck=ek<num>" -> List( @@ -388,6 +407,12 @@ object VisorTopologyCommand { "-a" -> List( "This defines whether to show a separate table of nodes", "with detail per-node information." + ), + "-activate" -> List( + "Activate cluster." + ), + "-deactivate" -> List( + "Deactivate cluster." ) ), examples = List( @@ -398,7 +423,11 @@ object VisorTopologyCommand { "top -h=10.34.2.122 -h=10.65.3.11" -> "Prints topology for provided hosts.", "top" -> - "Prints full topology." + "Prints full topology.", + "top -activate" -> + "Activate cluster.", + "top -deactivate" -> + "Deactivate cluster." ), emptyArgs = cmd.top, withArgs = cmd.top http://git-wip-us.apache.org/repos/asf/ignite/blob/5283e19f/modules/visor-console/src/test/scala/org/apache/ignite/visor/VisorRuntimeBaseSpec.scala ---------------------------------------------------------------------- diff --git a/modules/visor-console/src/test/scala/org/apache/ignite/visor/VisorRuntimeBaseSpec.scala b/modules/visor-console/src/test/scala/org/apache/ignite/visor/VisorRuntimeBaseSpec.scala index 38db760..f5d6e56 100644 --- a/modules/visor-console/src/test/scala/org/apache/ignite/visor/VisorRuntimeBaseSpec.scala +++ b/modules/visor-console/src/test/scala/org/apache/ignite/visor/VisorRuntimeBaseSpec.scala @@ -20,8 +20,8 @@ package org.apache.ignite.visor import org.apache.ignite.Ignition import org.apache.ignite.configuration.IgniteConfiguration import org.apache.ignite.visor.commands.open.VisorOpenCommand._ - import org.scalatest._ +import VisorRuntimeBaseSpec._ /** * Base abstract class for unit tests requiring Visor runtime. @@ -45,7 +45,7 @@ abstract class VisorRuntimeBaseSpec(private[this] val num: Int) extends FunSpec } protected def openVisor() { - visor.open(config("visor-demo-node"), "n/a") + visor.open(config(VISOR_INSTANCE_NAME), "n/a") } protected def closeVisorQuiet() { @@ -75,3 +75,8 @@ abstract class VisorRuntimeBaseSpec(private[this] val num: Int) extends FunSpec closeVisorQuiet() } } + +/** Singleton companion object. */ +object VisorRuntimeBaseSpec { + val VISOR_INSTANCE_NAME = "visor-demo-node" +} http://git-wip-us.apache.org/repos/asf/ignite/blob/5283e19f/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/top/VisorActivationCommandSpec.scala ---------------------------------------------------------------------- diff --git a/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/top/VisorActivationCommandSpec.scala b/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/top/VisorActivationCommandSpec.scala new file mode 100644 index 0000000..fb2a7f4 --- /dev/null +++ b/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/top/VisorActivationCommandSpec.scala @@ -0,0 +1,67 @@ +/* + * 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.visor.commands.top + +import org.apache.ignite.Ignition +import org.apache.ignite.configuration.{IgniteConfiguration, MemoryConfiguration, PersistentStoreConfiguration} +import org.apache.ignite.visor.commands.top.VisorTopologyCommand._ +import org.apache.ignite.visor.{VisorRuntimeBaseSpec, visor} +import VisorRuntimeBaseSpec._ + +/** + * Unit test for cluster activation commands. + */ +class VisorActivationCommandSpec extends VisorRuntimeBaseSpec(2) { + override protected def config(name: String): IgniteConfiguration = { + val cfg = super.config(name) + + val memCfg = new MemoryConfiguration + memCfg.setDefaultMemoryPolicySize(10 * 1024 * 1024) + + cfg.setMemoryConfiguration(memCfg) + cfg.setPersistentStoreConfiguration(new PersistentStoreConfiguration) + + cfg + } + + describe("A 'top' visor command for cluster activation") { + it("should activate cluster") { + assert(!Ignition.ignite(VISOR_INSTANCE_NAME).active()) + + visor.top() + + visor.top("-activate") + + visor.top() + + assert(Ignition.ignite(VISOR_INSTANCE_NAME).active()) + } + + it("should deactivate cluster") { + assert(Ignition.ignite(VISOR_INSTANCE_NAME).active()) + + visor.top() + + visor.top("-deactivate") + + visor.top() + + assert(!Ignition.ignite(VISOR_INSTANCE_NAME).active()) + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/5283e19f/modules/visor-console/src/test/scala/org/apache/ignite/visor/testsuites/VisorConsoleSelfTestSuite.scala ---------------------------------------------------------------------- diff --git a/modules/visor-console/src/test/scala/org/apache/ignite/visor/testsuites/VisorConsoleSelfTestSuite.scala b/modules/visor-console/src/test/scala/org/apache/ignite/visor/testsuites/VisorConsoleSelfTestSuite.scala index f23a7c9..5fbc8a0 100644 --- a/modules/visor-console/src/test/scala/org/apache/ignite/visor/testsuites/VisorConsoleSelfTestSuite.scala +++ b/modules/visor-console/src/test/scala/org/apache/ignite/visor/testsuites/VisorConsoleSelfTestSuite.scala @@ -39,7 +39,7 @@ import org.apache.ignite.visor.commands.open.VisorOpenCommandSpec import org.apache.ignite.visor.commands.ping.VisorPingCommandSpec import org.apache.ignite.visor.commands.start.VisorStartCommandSpec import org.apache.ignite.visor.commands.tasks.VisorTasksCommandSpec -import org.apache.ignite.visor.commands.top.VisorTopologyCommandSpec +import org.apache.ignite.visor.commands.top.{VisorActivationCommandSpec, VisorTopologyCommandSpec} import org.junit.runner.RunWith import org.scalatest.Suites import org.scalatest.junit.JUnitRunner @@ -69,6 +69,7 @@ class VisorConsoleSelfTestSuite extends Suites ( new VisorStartCommandSpec, new VisorTasksCommandSpec, new VisorTopologyCommandSpec, + new VisorActivationCommandSpec, new VisorArgListSpec ) { // Mimic GridTestUtils.getNextMulticastGroup behavior because it can't be imported here
