Skip to content

Commit 5830007

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Fix server resize"
2 parents bc6495c + ea2ac77 commit 5830007

4 files changed

Lines changed: 169 additions & 7 deletions

File tree

‎openstackclient/compute/v2/server.py‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -938,27 +938,32 @@ def take_action(self, parsed_args):
938938

939939

940940
class ResizeServer(command.Command):
941-
"""Convert server to a new flavor"""
941+
"""Scale server to a new flavor"""
942942

943943
log = logging.getLogger(__name__ + '.ResizeServer')
944944

945945
def get_parser(self, prog_name):
946946
parser = super(ResizeServer, self).get_parser(prog_name)
947947
phase_group = parser.add_mutually_exclusive_group()
948+
parser.add_argument(
949+
'server',
950+
metavar='<server>',
951+
help='Server (name or ID)',
952+
)
948953
phase_group.add_argument(
949954
'--flavor',
950955
metavar='<flavor>',
951-
help='Resize server to this flavor',
956+
help='Resize server to specified flavor',
952957
)
953958
phase_group.add_argument(
954959
'--verify',
955960
action="store_true",
956-
help='Verify previous server resize',
961+
help='Verify server resize is complete',
957962
)
958963
phase_group.add_argument(
959964
'--revert',
960965
action="store_true",
961-
help='Restore server before resize',
966+
help='Restore server state before resize',
962967
)
963968
parser.add_argument(
964969
'--wait',
@@ -980,7 +985,7 @@ def take_action(self, parsed_args):
980985
compute_client.flavors,
981986
parsed_args.flavor,
982987
)
983-
server.resize(flavor)
988+
compute_client.servers.resize(server, flavor)
984989
if parsed_args.wait:
985990
if utils.wait_for_status(
986991
compute_client.servers.get,
@@ -993,9 +998,9 @@ def take_action(self, parsed_args):
993998
sys.stdout.write('\nError resizing server')
994999
raise SystemExit
9951000
elif parsed_args.verify:
996-
server.confirm_resize()
1001+
compute_client.servers.confirm_resize(server)
9971002
elif parsed_args.revert:
998-
server.revert_resize()
1003+
compute_client.servers.revert_resize(server)
9991004

10001005

10011006
class ResumeServer(command.Command):

‎openstackclient/tests/compute/v2/fakes.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@
4747
'links': extension_links,
4848
}
4949

50+
flavor_id = 'm1.large'
51+
flavor_name = 'Large'
52+
flavor_ram = 8192
53+
flavor_vcpus = 4
54+
55+
FLAVOR = {
56+
'id': flavor_id,
57+
'name': flavor_name,
58+
'ram': flavor_ram,
59+
'vcpus': flavor_vcpus,
60+
}
61+
5062

5163
class FakeComputev2Client(object):
5264
def __init__(self, **kwargs):
@@ -56,6 +68,8 @@ def __init__(self, **kwargs):
5668
self.servers.resource_class = fakes.FakeResource(None, {})
5769
self.extensions = mock.Mock()
5870
self.extensions.resource_class = fakes.FakeResource(None, {})
71+
self.flavors = mock.Mock()
72+
self.flavors.resource_class = fakes.FakeResource(None, {})
5973
self.auth_token = kwargs['token']
6074
self.management_url = kwargs['endpoint']
6175

‎openstackclient/tests/compute/v2/test_server.py‎

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def setUp(self):
3030
self.servers_mock = self.app.client_manager.compute.servers
3131
self.servers_mock.reset_mock()
3232

33+
# Get a shortcut to the FlavorManager Mock
34+
self.flavors_mock = self.app.client_manager.compute.flavors
35+
self.flavors_mock.reset_mock()
36+
3337
# Get a shortcut to the ImageManager Mock
3438
self.images_mock = self.app.client_manager.image.images
3539
self.images_mock.reset_mock()
@@ -148,3 +152,134 @@ def test_server_image_create_name(self):
148152
image_fakes.image_owner,
149153
)
150154
self.assertEqual(data, datalist)
155+
156+
157+
class TestServerResize(TestServer):
158+
159+
def setUp(self):
160+
super(TestServerResize, self).setUp()
161+
162+
# This is the return value for utils.find_resource()
163+
self.servers_get_return_value = fakes.FakeResource(
164+
None,
165+
copy.deepcopy(compute_fakes.SERVER),
166+
loaded=True,
167+
)
168+
self.servers_mock.get.return_value = self.servers_get_return_value
169+
170+
self.servers_mock.resize.return_value = None
171+
self.servers_mock.confirm_resize.return_value = None
172+
self.servers_mock.revert_resize.return_value = None
173+
174+
# This is the return value for utils.find_resource()
175+
self.flavors_get_return_value = fakes.FakeResource(
176+
None,
177+
copy.deepcopy(compute_fakes.FLAVOR),
178+
loaded=True,
179+
)
180+
self.flavors_mock.get.return_value = self.flavors_get_return_value
181+
182+
# Get the command object to test
183+
self.cmd = server.ResizeServer(self.app, None)
184+
185+
def test_server_resize_no_options(self):
186+
arglist = [
187+
compute_fakes.server_id,
188+
]
189+
verifylist = [
190+
('verify', False),
191+
('revert', False),
192+
('server', compute_fakes.server_id),
193+
]
194+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
195+
196+
# DisplayCommandBase.take_action() returns two tuples
197+
self.cmd.take_action(parsed_args)
198+
199+
self.servers_mock.get.assert_called_with(
200+
compute_fakes.server_id,
201+
)
202+
203+
self.assertNotCalled(self.servers_mock.resize)
204+
self.assertNotCalled(self.servers_mock.confirm_resize)
205+
self.assertNotCalled(self.servers_mock.revert_resize)
206+
207+
def test_server_resize(self):
208+
arglist = [
209+
'--flavor', compute_fakes.flavor_id,
210+
compute_fakes.server_id,
211+
]
212+
verifylist = [
213+
('flavor', compute_fakes.flavor_id),
214+
('verify', False),
215+
('revert', False),
216+
('server', compute_fakes.server_id),
217+
]
218+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
219+
220+
# DisplayCommandBase.take_action() returns two tuples
221+
self.cmd.take_action(parsed_args)
222+
223+
self.servers_mock.get.assert_called_with(
224+
compute_fakes.server_id,
225+
)
226+
self.flavors_mock.get.assert_called_with(
227+
compute_fakes.flavor_id,
228+
)
229+
230+
self.servers_mock.resize.assert_called_with(
231+
self.servers_get_return_value,
232+
self.flavors_get_return_value,
233+
)
234+
self.assertNotCalled(self.servers_mock.confirm_resize)
235+
self.assertNotCalled(self.servers_mock.revert_resize)
236+
237+
def test_server_resize_confirm(self):
238+
arglist = [
239+
'--verify',
240+
compute_fakes.server_id,
241+
]
242+
verifylist = [
243+
('verify', True),
244+
('revert', False),
245+
('server', compute_fakes.server_id),
246+
]
247+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
248+
249+
# DisplayCommandBase.take_action() returns two tuples
250+
self.cmd.take_action(parsed_args)
251+
252+
self.servers_mock.get.assert_called_with(
253+
compute_fakes.server_id,
254+
)
255+
256+
self.assertNotCalled(self.servers_mock.resize)
257+
self.servers_mock.confirm_resize.assert_called_with(
258+
self.servers_get_return_value,
259+
)
260+
self.assertNotCalled(self.servers_mock.revert_resize)
261+
262+
def test_server_resize_revert(self):
263+
arglist = [
264+
'--revert',
265+
compute_fakes.server_id,
266+
]
267+
verifylist = [
268+
('verify', False),
269+
('revert', True),
270+
('server', compute_fakes.server_id),
271+
]
272+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
273+
274+
# DisplayCommandBase.take_action() returns two tuples
275+
self.cmd.take_action(parsed_args)
276+
277+
self.servers_mock.get.assert_called_with(
278+
compute_fakes.server_id,
279+
)
280+
281+
self.assertNotCalled(self.servers_mock.resize)
282+
self.assertNotCalled(self.servers_mock.confirm_resize)
283+
self.servers_mock.revert_resize.assert_called_with(
284+
self.servers_get_return_value,
285+
)

‎openstackclient/tests/utils.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ def setUp(self):
3737
stderr = self.useFixture(fixtures.StringStream("stderr")).stream
3838
self.useFixture(fixtures.MonkeyPatch("sys.stderr", stderr))
3939

40+
def assertNotCalled(self, m, msg=None):
41+
"""Assert a function was not called"""
42+
43+
if m.called:
44+
if not msg:
45+
msg = 'method %s should not have been called' % m
46+
self.fail(msg)
47+
4048
# 2.6 doesn't have the assert dict equals so make sure that it exists
4149
if tuple(sys.version_info)[0:2] < (2, 7):
4250

0 commit comments

Comments
 (0)