You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by kl...@apache.org on 2017/09/27 13:06:42 UTC

mesos git commit: Added 'mesos agent list' command to CLI.

Repository: mesos
Updated Branches:
  refs/heads/master 7b0852f79 -> 127070329


Added 'mesos agent list' command to CLI.

This command displays the agents in a cluster by
reaching the slaves endpoint of a master.

Review: https://reviews.apache.org/r/62065/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/12707032
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/12707032
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/12707032

Branch: refs/heads/master
Commit: 1270703291a132d8d959d71bf99e4dfe4cf4292e
Parents: 7b0852f
Author: Armand Grillet <ag...@mesosphere.io>
Authored: Wed Sep 27 15:02:04 2017 +0200
Committer: Kevin Klues <kl...@gmail.com>
Committed: Wed Sep 27 15:06:35 2017 +0200

----------------------------------------------------------------------
 src/python/cli_new/bin/settings.py              |  1 +
 .../cli_new/lib/cli/plugins/agent/__init__.py   | 22 ++++++
 .../cli_new/lib/cli/plugins/agent/main.py       | 82 ++++++++++++++++++++
 src/python/cli_new/lib/cli/tests/__init__.py    |  2 +
 src/python/cli_new/lib/cli/tests/agent.py       | 78 +++++++++++++++++++
 src/python/cli_new/tests/main.py                |  1 +
 6 files changed, 186 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/12707032/src/python/cli_new/bin/settings.py
----------------------------------------------------------------------
diff --git a/src/python/cli_new/bin/settings.py b/src/python/cli_new/bin/settings.py
index 7e37408..f501fef 100644
--- a/src/python/cli_new/bin/settings.py
+++ b/src/python/cli_new/bin/settings.py
@@ -38,6 +38,7 @@ PROJECT_DIR = os.path.join(os.path.dirname(__file__), os.pardir)
 
 # The builtin plugins.
 PLUGINS = [
+    os.path.join(PROJECT_DIR, "lib", "mesos", "plugins", "agent"),
     os.path.join(PROJECT_DIR, "lib", "mesos", "plugins", "config"),
     os.path.join(PROJECT_DIR, "lib", "mesos", "plugins", "task")
 ]

http://git-wip-us.apache.org/repos/asf/mesos/blob/12707032/src/python/cli_new/lib/cli/plugins/agent/__init__.py
----------------------------------------------------------------------
diff --git a/src/python/cli_new/lib/cli/plugins/agent/__init__.py b/src/python/cli_new/lib/cli/plugins/agent/__init__.py
new file mode 100644
index 0000000..dc5cabf
--- /dev/null
+++ b/src/python/cli_new/lib/cli/plugins/agent/__init__.py
@@ -0,0 +1,22 @@
+# 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.
+
+"""
+Agent module.
+"""
+
+# pylint: disable=wildcard-import
+from .main import *

http://git-wip-us.apache.org/repos/asf/mesos/blob/12707032/src/python/cli_new/lib/cli/plugins/agent/main.py
----------------------------------------------------------------------
diff --git a/src/python/cli_new/lib/cli/plugins/agent/main.py b/src/python/cli_new/lib/cli/plugins/agent/main.py
new file mode 100644
index 0000000..59280ec
--- /dev/null
+++ b/src/python/cli_new/lib/cli/plugins/agent/main.py
@@ -0,0 +1,82 @@
+# 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.
+
+"""
+The agent plugin.
+"""
+
+import cli.http as http
+
+from cli.exceptions import CLIException
+from cli.plugins import PluginBase
+from cli.util import Table
+
+
+PLUGIN_NAME = "agent"
+PLUGIN_CLASS = "Agent"
+
+VERSION = "Mesos CLI Agent Plugin"
+
+SHORT_HELP = "Interacts with the Mesos agents"
+
+
+class Agent(PluginBase):
+    """
+    The agent plugin.
+    """
+
+    COMMANDS = {
+        "list": {
+            "arguments": [],
+            "flags": {},
+            "short_help": "List the Mesos agents.",
+            "long_help": "List information about the Mesos agents."
+        }
+    }
+
+    def list(self, argv):
+        """
+        List the agents in a cluster by checking the /slaves endpoint.
+        """
+        # pylint: disable=unused-argument
+        try:
+            master = self.config.master()
+        except Exception as exception:
+            raise CLIException("Unable to get leading master address: {error}"
+                               .format(error=exception))
+
+        try:
+            agents = http.get_json(master, "slaves")["slaves"]
+        except Exception as exception:
+            raise CLIException("Could not open '/slaves'"
+                               " endpoint at '{addr}': {error}"
+                               .format(addr=master, error=exception))
+
+        if len(agents) == 0:
+            print "The cluster does not have any agents."
+            return
+
+        try:
+            table = Table(["Agent ID", "Hostname", "Active"])
+            for agent in agents:
+                table.add_row([agent["id"],
+                               agent["hostname"],
+                               str(agent["active"])])
+        except Exception as exception:
+            raise CLIException("Unable to build table of agents: {error}"
+                               .format(error=exception))
+
+        print str(table)

http://git-wip-us.apache.org/repos/asf/mesos/blob/12707032/src/python/cli_new/lib/cli/tests/__init__.py
----------------------------------------------------------------------
diff --git a/src/python/cli_new/lib/cli/tests/__init__.py b/src/python/cli_new/lib/cli/tests/__init__.py
index 85ab073..b7c825f 100644
--- a/src/python/cli_new/lib/cli/tests/__init__.py
+++ b/src/python/cli_new/lib/cli/tests/__init__.py
@@ -20,5 +20,7 @@ Mesos CLI unit tests module.
 
 # pylint: disable=W0401
 from .base import *
+
+from .agent import *
 from .task import *
 from .tests import *

http://git-wip-us.apache.org/repos/asf/mesos/blob/12707032/src/python/cli_new/lib/cli/tests/agent.py
----------------------------------------------------------------------
diff --git a/src/python/cli_new/lib/cli/tests/agent.py b/src/python/cli_new/lib/cli/tests/agent.py
new file mode 100644
index 0000000..6e5e565
--- /dev/null
+++ b/src/python/cli_new/lib/cli/tests/agent.py
@@ -0,0 +1,78 @@
+# 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.
+
+"""
+Agent plugin tests.
+"""
+
+import cli.http as http
+
+from cli import config
+
+from cli.plugins.agent.main import Agent as AgentPlugin
+
+from cli.tests import capture_output
+from cli.tests import CLITestCase
+from cli.tests import Agent
+from cli.tests import Master
+
+from cli.util import Table
+
+
+class TestAgentPlugin(CLITestCase):
+    """
+    Test class for the agent plugin.
+    """
+    def test_list(self):
+        """
+        Basic test for the agent `list()` sub-command.
+        """
+        # Launch a master and agent.
+        master = Master()
+        master.launch()
+
+        agent = Agent()
+        agent.launch()
+
+        # Open the master's `/slaves` endpoint and read the
+        # agents' information ourselves.
+        agents = http.get_json(master.addr, 'slaves')["slaves"]
+
+        self.assertEqual(type(agents), list)
+        self.assertEqual(len(agents), 1)
+
+        # Invoke the agent plugin `list()` command
+        # and parse its output as a table.
+        test_config = config.Config(None)
+        plugin = AgentPlugin(None, test_config)
+        output = capture_output(plugin.list, {})
+        table = Table.parse(output)
+
+        # Verify there are two rows in the table
+        # and that they are formatted as expected,
+        # with the proper agent info in them.
+        self.assertEqual(table.dimensions()[0], 2)
+        self.assertEqual(table.dimensions()[1], 3)
+        self.assertEqual("Agent ID", table[0][0])
+        self.assertEqual("Hostname", table[0][1])
+        self.assertEqual("Active", table[0][2])
+        self.assertEqual(agents[0]["id"], table[1][0])
+        self.assertEqual(agents[0]["hostname"], table[1][1])
+        self.assertEqual(str(agents[0]["active"]), table[1][2])
+
+        # Kill the agent and master.
+        agent.kill()
+        master.kill()

http://git-wip-us.apache.org/repos/asf/mesos/blob/12707032/src/python/cli_new/tests/main.py
----------------------------------------------------------------------
diff --git a/src/python/cli_new/tests/main.py b/src/python/cli_new/tests/main.py
index 82840c6..acf2e08 100644
--- a/src/python/cli_new/tests/main.py
+++ b/src/python/cli_new/tests/main.py
@@ -27,6 +27,7 @@ from cli.tests import CLITestCase
 
 # pylint: disable=unused-import
 # We import the tests that we want to run.
+from cli.tests import TestAgentPlugin
 from cli.tests import TestInfrastructure
 from cli.tests import TestTaskPlugin