diff --git a/README.rst b/README.rst index 8d6bbde03..66bd6ae2a 100644 --- a/README.rst +++ b/README.rst @@ -166,6 +166,8 @@ You'll find complete documentation on the shell by running List rules for a security group. show Show details about the given server. ssh SSH into a server. + start Start a server. + stop Stop a server. suspend Suspend a server. unlock Unlock a server. unpause Unpause a server. diff --git a/novaclient/v1_1/servers.py b/novaclient/v1_1/servers.py index d81a2707b..e5dfa2c31 100644 --- a/novaclient/v1_1/servers.py +++ b/novaclient/v1_1/servers.py @@ -89,6 +89,18 @@ class Server(base.Resource): """ self.manager.remove_floating_ip(self, address) + def stop(self): + """ + Stop -- Stop the running server. + """ + self.manager.stop(self) + + def start(self): + """ + Start -- Start the paused server. + """ + self.manager.start(self) + def pause(self): """ Pause -- Pause the running server. @@ -329,6 +341,18 @@ class ServerManager(local_base.BootingManagerWithFind): return self._action('os-getVNCConsole', server, {'type': console_type})[1] + def stop(self, server): + """ + Stop the server. + """ + return self._action('os-stop', server, None) + + def start(self, server): + """ + Start the server. + """ + self._action('os-start', server, None) + def pause(self, server): """ Pause the server. diff --git a/novaclient/v1_1/shell.py b/novaclient/v1_1/shell.py index a62cf068f..c87cc4a50 100644 --- a/novaclient/v1_1/shell.py +++ b/novaclient/v1_1/shell.py @@ -637,6 +637,18 @@ def do_unpause(cs, args): _find_server(cs, args.server).unpause() +@utils.arg('server', metavar='', help='Name or ID of server.') +def do_stop(cs, args): + """Stop a server.""" + _find_server(cs, args.server).stop() + + +@utils.arg('server', metavar='', help='Name or ID of server.') +def do_start(cs, args): + """Start a server.""" + _find_server(cs, args.server).start() + + @utils.arg('server', metavar='', help='Name or ID of server.') def do_lock(cs, args): """Lock a server.""" diff --git a/tests/v1_1/fakes.py b/tests/v1_1/fakes.py index 2e9afbeb8..153cb0c84 100644 --- a/tests/v1_1/fakes.py +++ b/tests/v1_1/fakes.py @@ -305,6 +305,10 @@ class FakeHTTPClient(base_client.HTTPClient): assert body[action] is None elif action == 'migrate': assert body[action] is None + elif action == 'os-stop': + assert body[action] is None + elif action == 'os-start': + assert body[action] is None elif action == 'rescue': assert body[action] is None elif action == 'unrescue': diff --git a/tests/v1_1/test_servers.py b/tests/v1_1/test_servers.py index 6792c7bd1..639f59920 100644 --- a/tests/v1_1/test_servers.py +++ b/tests/v1_1/test_servers.py @@ -188,6 +188,20 @@ class ServersTest(utils.TestCase): s.remove_floating_ip(f) cs.assert_called('POST', '/servers/1234/action') + def test_stop(self): + s = cs.servers.get(1234) + s.stop() + cs.assert_called('POST', '/servers/1234/action') + cs.servers.stop(s) + cs.assert_called('POST', '/servers/1234/action') + + def test_start(self): + s = cs.servers.get(1234) + s.start() + cs.assert_called('POST', '/servers/1234/action') + cs.servers.start(s) + cs.assert_called('POST', '/servers/1234/action') + def test_rescue(self): s = cs.servers.get(1234) s.rescue()