Skip to content

Commit 1a7284f

Browse files
committed
Support to set server state
When a server is unexpected state, OSC don't support reset the server to active or error state, that's supported by novaclient, and it's an important command for operators, the patch implement this function. Change-Id: I3e7800feb192832b0719ef9a353945beb6bfd509 Implements: blueprint server-reset-state
1 parent 7247707 commit 1a7284f

4 files changed

Lines changed: 81 additions & 0 deletions

File tree

doc/source/command-objects/server.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,7 @@ Set server properties
559559
--property <key=value>
560560
[--property <key=value>] ...
561561
--root-password
562+
--state <state>
562563
<server>
563564
564565
.. option:: --name <new-name>
@@ -574,6 +575,10 @@ Set server properties
574575
Property to add/change for this server
575576
(repeat option to set multiple properties)
576577
578+
.. option:: --state <state>
579+
580+
New server state (valid value: active, error)
581+
577582
.. describe:: <server>
578583
579584
Server (name or ID)

openstackclient/compute/v2/server.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,12 @@ def get_parser(self, prog_name):
13701370
help=_('Property to add/change for this server '
13711371
'(repeat option to set multiple properties)'),
13721372
)
1373+
parser.add_argument(
1374+
'--state',
1375+
metavar='<state>',
1376+
choices=['active', 'error'],
1377+
help=_('New server state (valid value: active, error)'),
1378+
)
13731379
return parser
13741380

13751381
def take_action(self, parsed_args):
@@ -1389,6 +1395,9 @@ def take_action(self, parsed_args):
13891395
parsed_args.property,
13901396
)
13911397

1398+
if parsed_args.state:
1399+
server.reset_state(state=parsed_args.state)
1400+
13921401
if parsed_args.root_password:
13931402
p1 = getpass.getpass(_('New password: '))
13941403
p2 = getpass.getpass(_('Retype new password: '))

openstackclient/tests/compute/v2/test_server.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,67 @@ def test_server_resume_multi_servers(self):
12131213
self.run_method_with_servers('resume', 3)
12141214

12151215

1216+
class TestServerSet(TestServer):
1217+
1218+
def setUp(self):
1219+
super(TestServerSet, self).setUp()
1220+
1221+
self.methods = {
1222+
'update': None,
1223+
'reset_state': None,
1224+
'change_password': None,
1225+
}
1226+
1227+
self.fake_servers = self.setup_servers_mock(2)
1228+
1229+
# Get the command object to test
1230+
self.cmd = server.SetServer(self.app, None)
1231+
1232+
def test_server_set_no_option(self):
1233+
arglist = [
1234+
'foo_vm'
1235+
]
1236+
verifylist = [
1237+
('server', 'foo_vm')
1238+
]
1239+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1240+
result = self.cmd.take_action(parsed_args)
1241+
self.assertNotCalled(self.fake_servers[0].update)
1242+
self.assertNotCalled(self.fake_servers[0].reset_state)
1243+
self.assertNotCalled(self.fake_servers[0].change_password)
1244+
self.assertNotCalled(self.servers_mock.set_meta)
1245+
self.assertIsNone(result)
1246+
1247+
def test_server_set_with_state(self):
1248+
for index, state in enumerate(['active', 'error']):
1249+
arglist = [
1250+
'--state', state,
1251+
'foo_vm',
1252+
]
1253+
verifylist = [
1254+
('state', state),
1255+
('server', 'foo_vm'),
1256+
]
1257+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1258+
result = self.cmd.take_action(parsed_args)
1259+
self.fake_servers[index].reset_state.assert_called_once_with(
1260+
state=state)
1261+
self.assertIsNone(result)
1262+
1263+
def test_server_set_with_invalid_state(self):
1264+
arglist = [
1265+
'--state', 'foo_state',
1266+
'foo_vm',
1267+
]
1268+
verifylist = [
1269+
('state', 'foo_state'),
1270+
('server', 'foo_vm'),
1271+
]
1272+
self.assertRaises(utils.ParserException,
1273+
self.check_parser,
1274+
self.cmd, arglist, verifylist)
1275+
1276+
12161277
class TestServerShelve(TestServer):
12171278

12181279
def setUp(self):
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``--state`` option to ``server set`` command to set the server to
5+
active or error state.
6+
[Blueprint `server-reset-state <https://blueprints.launchpad.net/python-openstackclient/+spec/server-reset-state>`_]

0 commit comments

Comments
 (0)