Skip to content

Commit 4024bdb

Browse files
rajatherestephenfin
authored andcommitted
compute: Add support for microversion 2.93
Add '--reimage-boot-volume' and '--no-reimage-boot-volume parameters' to the rebuild command to allow rebuilding of volume backed instances. Change-Id: I4a6e30b2cf12f32202a2d9ef1ced347e1dd139f3
1 parent 1f63034 commit 4024bdb

3 files changed

Lines changed: 162 additions & 0 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3091,6 +3091,28 @@ def get_parser(self, prog_name):
30913091
'(supported by --os-compute-api-version 2.90 or above)'
30923092
),
30933093
)
3094+
parser.add_argument(
3095+
'--reimage-boot-volume',
3096+
action='store_true',
3097+
dest='reimage_boot_volume',
3098+
default=None,
3099+
help=_(
3100+
'Rebuild a volume-backed server. This will wipe the root '
3101+
'volume data and overwrite it with the provided image. '
3102+
'Defaults to False. '
3103+
'(supported by --os-compute-api-version 2.93 or above)'
3104+
),
3105+
)
3106+
parser.add_argument(
3107+
'--no-reimage-boot-volume',
3108+
action='store_false',
3109+
dest='reimage_boot_volume',
3110+
default=None,
3111+
help=_(
3112+
'Do not rebuild a volume-backed server. '
3113+
'(supported by --os-compute-api-version 2.93 or above)'
3114+
),
3115+
)
30943116
parser.add_argument(
30953117
'--wait',
30963118
action='store_true',
@@ -3226,6 +3248,41 @@ def _show_progress(progress):
32263248

32273249
kwargs['hostname'] = parsed_args.hostname
32283250

3251+
v2_93 = api_versions.APIVersion('2.93')
3252+
if parsed_args.reimage_boot_volume:
3253+
if compute_client.api_version < v2_93:
3254+
msg = _(
3255+
'--os-compute-api-version 2.93 or greater is required to '
3256+
'support the --reimage-boot-volume option'
3257+
)
3258+
raise exceptions.CommandError(msg)
3259+
else:
3260+
# force user to explicitly request reimaging of volume-backed
3261+
# server
3262+
if not server.image:
3263+
if compute_client.api_version >= v2_93:
3264+
msg = (
3265+
'--reimage-boot-volume is required to rebuild a '
3266+
'volume-backed server'
3267+
)
3268+
raise exceptions.CommandError(msg)
3269+
else: # microversion < 2.93
3270+
# attempts to rebuild a volume-backed server before API
3271+
# microversion 2.93 will fail in all cases except one: if
3272+
# the user attempts the rebuild with the exact same image
3273+
# that the server was initially built with. We can't check
3274+
# for this since we don't have the original image ID to
3275+
# hand, so we simply warn the user.
3276+
# TODO(stephenfin): Make this a failure in a future
3277+
# version
3278+
self.log.warning(
3279+
'Attempting to rebuild a volume-backed server using '
3280+
'--os-compute-api-version 2.92 or earlier, which '
3281+
'will only succeed if the image is identical to the '
3282+
'one initially used. This will be an error in a '
3283+
'future release.'
3284+
)
3285+
32293286
try:
32303287
server = server.rebuild(image, parsed_args.password, **kwargs)
32313288
finally:

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

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6294,6 +6294,103 @@ def test_rebuild_with_hostname_pre_v290(self):
62946294
parsed_args)
62956295

62966296

6297+
class TestServerRebuildVolumeBacked(TestServer):
6298+
6299+
def setUp(self):
6300+
super().setUp()
6301+
6302+
self.new_image = image_fakes.create_one_image()
6303+
self.find_image_mock.return_value = self.new_image
6304+
6305+
attrs = {
6306+
'image': '',
6307+
'networks': {},
6308+
'adminPass': 'passw0rd',
6309+
}
6310+
new_server = compute_fakes.FakeServer.create_one_server(attrs=attrs)
6311+
6312+
# Fake the server to be rebuilt. The IDs of them should be the same.
6313+
attrs['id'] = new_server.id
6314+
methods = {
6315+
'rebuild': new_server,
6316+
}
6317+
self.server = compute_fakes.FakeServer.create_one_server(
6318+
attrs=attrs,
6319+
methods=methods
6320+
)
6321+
6322+
# Return value for utils.find_resource for server.
6323+
self.servers_mock.get.return_value = self.server
6324+
6325+
self.cmd = server.RebuildServer(self.app, None)
6326+
6327+
def test_rebuild_with_reimage_boot_volume(self):
6328+
self.app.client_manager.compute.api_version = \
6329+
api_versions.APIVersion('2.93')
6330+
6331+
arglist = [
6332+
self.server.id,
6333+
'--reimage-boot-volume',
6334+
'--image', self.new_image.id
6335+
]
6336+
verifylist = [
6337+
('server', self.server.id),
6338+
('reimage_boot_volume', True),
6339+
('image', self.new_image.id)
6340+
]
6341+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6342+
6343+
self.cmd.take_action(parsed_args)
6344+
6345+
self.servers_mock.get.assert_called_with(self.server.id)
6346+
self.server.rebuild.assert_called_with(
6347+
self.new_image, None)
6348+
6349+
def test_rebuild_with_no_reimage_boot_volume(self):
6350+
self.app.client_manager.compute.api_version = \
6351+
api_versions.APIVersion('2.93')
6352+
6353+
arglist = [
6354+
self.server.id,
6355+
'--no-reimage-boot-volume',
6356+
'--image', self.new_image.id
6357+
]
6358+
verifylist = [
6359+
('server', self.server.id),
6360+
('reimage_boot_volume', False),
6361+
('image', self.new_image.id)
6362+
]
6363+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6364+
6365+
exc = self.assertRaises(
6366+
exceptions.CommandError,
6367+
self.cmd.take_action,
6368+
parsed_args)
6369+
self.assertIn('--reimage-boot-volume is required', str(exc))
6370+
6371+
def test_rebuild_with_reimage_boot_volume_pre_v293(self):
6372+
self.app.client_manager.compute.api_version = \
6373+
api_versions.APIVersion('2.92')
6374+
6375+
arglist = [
6376+
self.server.id,
6377+
'--reimage-boot-volume',
6378+
'--image', self.new_image.id
6379+
]
6380+
verifylist = [
6381+
('server', self.server.id),
6382+
('reimage_boot_volume', True)
6383+
]
6384+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6385+
6386+
exc = self.assertRaises(
6387+
exceptions.CommandError,
6388+
self.cmd.take_action,
6389+
parsed_args)
6390+
self.assertIn(
6391+
'--os-compute-api-version 2.93 or greater is required', str(exc))
6392+
6393+
62976394
class TestEvacuateServer(TestServer):
62986395

62996396
def setUp(self):
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
features:
3+
- |
4+
The ``server rebuild`` commands now accept two optional
5+
``--reimage-boot-volume`` and ``--no-reimage-boot-volume``option.
6+
Passing these parameter will allow/disallow a user to rebuild a volume
7+
backed server.
8+
This is available from Compute microversion ``2.93`` and onwards.

0 commit comments

Comments
 (0)