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
This commit is contained in:
parent
1f63034441
commit
4024bdb393
@ -3091,6 +3091,28 @@ class RebuildServer(command.ShowOne):
|
||||
'(supported by --os-compute-api-version 2.90 or above)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--reimage-boot-volume',
|
||||
action='store_true',
|
||||
dest='reimage_boot_volume',
|
||||
default=None,
|
||||
help=_(
|
||||
'Rebuild a volume-backed server. This will wipe the root '
|
||||
'volume data and overwrite it with the provided image. '
|
||||
'Defaults to False. '
|
||||
'(supported by --os-compute-api-version 2.93 or above)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--no-reimage-boot-volume',
|
||||
action='store_false',
|
||||
dest='reimage_boot_volume',
|
||||
default=None,
|
||||
help=_(
|
||||
'Do not rebuild a volume-backed server. '
|
||||
'(supported by --os-compute-api-version 2.93 or above)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--wait',
|
||||
action='store_true',
|
||||
@ -3226,6 +3248,41 @@ class RebuildServer(command.ShowOne):
|
||||
|
||||
kwargs['hostname'] = parsed_args.hostname
|
||||
|
||||
v2_93 = api_versions.APIVersion('2.93')
|
||||
if parsed_args.reimage_boot_volume:
|
||||
if compute_client.api_version < v2_93:
|
||||
msg = _(
|
||||
'--os-compute-api-version 2.93 or greater is required to '
|
||||
'support the --reimage-boot-volume option'
|
||||
)
|
||||
raise exceptions.CommandError(msg)
|
||||
else:
|
||||
# force user to explicitly request reimaging of volume-backed
|
||||
# server
|
||||
if not server.image:
|
||||
if compute_client.api_version >= v2_93:
|
||||
msg = (
|
||||
'--reimage-boot-volume is required to rebuild a '
|
||||
'volume-backed server'
|
||||
)
|
||||
raise exceptions.CommandError(msg)
|
||||
else: # microversion < 2.93
|
||||
# attempts to rebuild a volume-backed server before API
|
||||
# microversion 2.93 will fail in all cases except one: if
|
||||
# the user attempts the rebuild with the exact same image
|
||||
# that the server was initially built with. We can't check
|
||||
# for this since we don't have the original image ID to
|
||||
# hand, so we simply warn the user.
|
||||
# TODO(stephenfin): Make this a failure in a future
|
||||
# version
|
||||
self.log.warning(
|
||||
'Attempting to rebuild a volume-backed server using '
|
||||
'--os-compute-api-version 2.92 or earlier, which '
|
||||
'will only succeed if the image is identical to the '
|
||||
'one initially used. This will be an error in a '
|
||||
'future release.'
|
||||
)
|
||||
|
||||
try:
|
||||
server = server.rebuild(image, parsed_args.password, **kwargs)
|
||||
finally:
|
||||
|
@ -6294,6 +6294,103 @@ class TestServerRebuild(TestServer):
|
||||
parsed_args)
|
||||
|
||||
|
||||
class TestServerRebuildVolumeBacked(TestServer):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
self.new_image = image_fakes.create_one_image()
|
||||
self.find_image_mock.return_value = self.new_image
|
||||
|
||||
attrs = {
|
||||
'image': '',
|
||||
'networks': {},
|
||||
'adminPass': 'passw0rd',
|
||||
}
|
||||
new_server = compute_fakes.FakeServer.create_one_server(attrs=attrs)
|
||||
|
||||
# Fake the server to be rebuilt. The IDs of them should be the same.
|
||||
attrs['id'] = new_server.id
|
||||
methods = {
|
||||
'rebuild': new_server,
|
||||
}
|
||||
self.server = compute_fakes.FakeServer.create_one_server(
|
||||
attrs=attrs,
|
||||
methods=methods
|
||||
)
|
||||
|
||||
# Return value for utils.find_resource for server.
|
||||
self.servers_mock.get.return_value = self.server
|
||||
|
||||
self.cmd = server.RebuildServer(self.app, None)
|
||||
|
||||
def test_rebuild_with_reimage_boot_volume(self):
|
||||
self.app.client_manager.compute.api_version = \
|
||||
api_versions.APIVersion('2.93')
|
||||
|
||||
arglist = [
|
||||
self.server.id,
|
||||
'--reimage-boot-volume',
|
||||
'--image', self.new_image.id
|
||||
]
|
||||
verifylist = [
|
||||
('server', self.server.id),
|
||||
('reimage_boot_volume', True),
|
||||
('image', self.new_image.id)
|
||||
]
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
|
||||
self.cmd.take_action(parsed_args)
|
||||
|
||||
self.servers_mock.get.assert_called_with(self.server.id)
|
||||
self.server.rebuild.assert_called_with(
|
||||
self.new_image, None)
|
||||
|
||||
def test_rebuild_with_no_reimage_boot_volume(self):
|
||||
self.app.client_manager.compute.api_version = \
|
||||
api_versions.APIVersion('2.93')
|
||||
|
||||
arglist = [
|
||||
self.server.id,
|
||||
'--no-reimage-boot-volume',
|
||||
'--image', self.new_image.id
|
||||
]
|
||||
verifylist = [
|
||||
('server', self.server.id),
|
||||
('reimage_boot_volume', False),
|
||||
('image', self.new_image.id)
|
||||
]
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
|
||||
exc = self.assertRaises(
|
||||
exceptions.CommandError,
|
||||
self.cmd.take_action,
|
||||
parsed_args)
|
||||
self.assertIn('--reimage-boot-volume is required', str(exc))
|
||||
|
||||
def test_rebuild_with_reimage_boot_volume_pre_v293(self):
|
||||
self.app.client_manager.compute.api_version = \
|
||||
api_versions.APIVersion('2.92')
|
||||
|
||||
arglist = [
|
||||
self.server.id,
|
||||
'--reimage-boot-volume',
|
||||
'--image', self.new_image.id
|
||||
]
|
||||
verifylist = [
|
||||
('server', self.server.id),
|
||||
('reimage_boot_volume', True)
|
||||
]
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
|
||||
exc = self.assertRaises(
|
||||
exceptions.CommandError,
|
||||
self.cmd.take_action,
|
||||
parsed_args)
|
||||
self.assertIn(
|
||||
'--os-compute-api-version 2.93 or greater is required', str(exc))
|
||||
|
||||
|
||||
class TestEvacuateServer(TestServer):
|
||||
|
||||
def setUp(self):
|
||||
|
@ -0,0 +1,8 @@
|
||||
---
|
||||
features:
|
||||
- |
|
||||
The ``server rebuild`` commands now accept two optional
|
||||
``--reimage-boot-volume`` and ``--no-reimage-boot-volume``option.
|
||||
Passing these parameter will allow/disallow a user to rebuild a volume
|
||||
backed server.
|
||||
This is available from Compute microversion ``2.93`` and onwards.
|
Loading…
Reference in New Issue
Block a user