Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e2a4aa0e1d | |||
| 761c467315 | |||
| 1cce0a44d5 | |||
| a8f4e806e7 | |||
| 5c7e36faf6 | |||
| 0fc4c1ba7c | |||
| d5c64e7aba | |||
| 2ef2958c44 | |||
| 38cd15b45e | |||
| a411fe8154 | |||
| 864acc23ab | |||
| c658cea6d5 |
@@ -2,3 +2,4 @@
|
||||
host=review.opendev.org
|
||||
port=29418
|
||||
project=openstack/nova.git
|
||||
defaultbranch=stable/2026.1
|
||||
|
||||
@@ -218,12 +218,17 @@ support the decided libvirt version.
|
||||
- 6.2.0
|
||||
- 8.2.2
|
||||
* - 2025.2 Flamingo
|
||||
- 31.0.0
|
||||
- 32.0.0
|
||||
- 8.0.0
|
||||
- 10.0.0
|
||||
- 6.2.0
|
||||
- 8.2.2
|
||||
* - 2026.1 Gazpacho
|
||||
- 33.0.0
|
||||
- 8.0.0
|
||||
- 10.0.0
|
||||
- 6.2.0
|
||||
- 8.2.2
|
||||
|
||||
|
||||
OS distribution versions
|
||||
------------------------
|
||||
|
||||
@@ -442,6 +442,7 @@ class ComputeAPI(object):
|
||||
'dalmatian': '6.3',
|
||||
'epoxy': '6.4',
|
||||
'flamingo': '6.4',
|
||||
'gazpacho': '6.5',
|
||||
}
|
||||
|
||||
@property
|
||||
|
||||
@@ -187,7 +187,15 @@ Related options:
|
||||
is set to ``True``.
|
||||
|
||||
"""),
|
||||
cfg.BoolOpt('direct_download',
|
||||
default=False,
|
||||
help="""
|
||||
Try to download image through the /v2/images/{image_id}/direct-download API
|
||||
route.
|
||||
|
||||
Image download will fallback to /v2/images/{image_id}/file route
|
||||
if direct download is either not implemented or fails
|
||||
"""),
|
||||
cfg.BoolOpt('debug',
|
||||
default=False,
|
||||
help='Enable or disable debug logging with glanceclient.')
|
||||
|
||||
@@ -372,7 +372,12 @@ class GlanceImageServiceV2(object):
|
||||
# to fetch the image and fill image_chunks
|
||||
try:
|
||||
image_chunks = self._client.call(
|
||||
context, 2, 'data', args=(image_id,))
|
||||
context,
|
||||
2,
|
||||
'data',
|
||||
args=(image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
except Exception:
|
||||
_reraise_translated_image_exception(image_id)
|
||||
|
||||
|
||||
@@ -294,6 +294,7 @@ SERVICE_VERSION_ALIASES = {
|
||||
'Dalmatian': 67,
|
||||
'Epoxy': 68,
|
||||
'Flamingo': 70,
|
||||
'Gazpacho': 72,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -570,7 +570,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
||||
self.assertFalse(show_mock.called)
|
||||
self.assertFalse(open_mock.called)
|
||||
client.call.assert_called_once_with(
|
||||
ctx, 2, 'data', args=(mock.sentinel.image_id,))
|
||||
ctx,
|
||||
2,
|
||||
'data',
|
||||
args=(mock.sentinel.image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
self.assertEqual(mock.sentinel.image_chunks, res)
|
||||
|
||||
@mock.patch('builtins.open')
|
||||
@@ -605,7 +610,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
||||
self.assertFalse(show_mock.called)
|
||||
self.assertFalse(open_mock.called)
|
||||
client.call.assert_called_once_with(
|
||||
ctx, 2, 'data', args=(mock.sentinel.image_id,))
|
||||
ctx,
|
||||
2,
|
||||
'data',
|
||||
args=(mock.sentinel.image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
self.assertIsNone(res)
|
||||
data.write.assert_has_calls(
|
||||
[
|
||||
@@ -632,7 +642,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
||||
|
||||
self.assertFalse(show_mock.called)
|
||||
client.call.assert_called_once_with(
|
||||
ctx, 2, 'data', args=(mock.sentinel.image_id,))
|
||||
ctx,
|
||||
2,
|
||||
'data',
|
||||
args=(mock.sentinel.image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
open_mock.assert_called_once_with(mock.sentinel.dst_path, 'wb')
|
||||
fsync_mock.assert_called_once_with(writer)
|
||||
self.assertIsNone(res)
|
||||
@@ -663,7 +678,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
||||
self.assertFalse(show_mock.called)
|
||||
self.assertFalse(open_mock.called)
|
||||
client.call.assert_called_once_with(
|
||||
ctx, 2, 'data', args=(mock.sentinel.image_id,))
|
||||
ctx,
|
||||
2,
|
||||
'data',
|
||||
args=(mock.sentinel.image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
self.assertIsNone(res)
|
||||
data.write.assert_has_calls(
|
||||
[
|
||||
@@ -828,7 +848,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
||||
mock.sentinel.dst_path,
|
||||
mock.sentinel.loc_meta)
|
||||
client.call.assert_called_once_with(
|
||||
ctx, 2, 'data', args=(mock.sentinel.image_id,))
|
||||
ctx,
|
||||
2,
|
||||
'data',
|
||||
args=(mock.sentinel.image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
fsync_mock.assert_called_once_with(writer)
|
||||
# NOTE(jaypipes): log messages call open() in part of the
|
||||
# download path, so here, we just check that the last open()
|
||||
@@ -878,7 +903,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
||||
include_locations=True)
|
||||
get_tran_mock.assert_called_once_with('funky')
|
||||
client.call.assert_called_once_with(
|
||||
ctx, 2, 'data', args=(mock.sentinel.image_id,))
|
||||
ctx,
|
||||
2,
|
||||
'data',
|
||||
args=(mock.sentinel.image_id,),
|
||||
kwargs={'direct_download': CONF.glance.direct_download},
|
||||
)
|
||||
fsync_mock.assert_called_once_with(writer)
|
||||
# NOTE(jaypipes): log messages call open() in part of the
|
||||
# download path, so here, we just check that the last open()
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
prelude: |
|
||||
The OpenStack 2026.1 Gazpacho (Nova 33.0.0) release includes many new features and
|
||||
bug fixes. Please be sure to read the upgrade section which describes the
|
||||
required actions to upgrade your cloud from 32.0.0 (2025.2) to 33.0.0
|
||||
(2026.1).
|
||||
As a reminder, OpenStack 2026.1 is a
|
||||
`Skip-Level-Upgrade Release <https://governance.openstack.org/tc/resolutions/20220210-release-cadence-adjustment.html>`_
|
||||
(starting from now, we name it a `SLURP release`) meaning that you can
|
||||
do rolling-upgrades from 2025.1 Epoxy directly by skipping to upgrade to
|
||||
2025.2 Flamingo release.
|
||||
|
||||
There are a few major changes worth mentioning. This is not an exhaustive
|
||||
list:
|
||||
|
||||
- The latest Compute API microversion supported for 2026.1 is
|
||||
`v2.103 <https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#maximum-in-2026-1-gazpacho>`_.
|
||||
|
||||
- Nova now supports parallel live migrations via a new
|
||||
``[libvirt] live_migration_parallel_connections`` config option,
|
||||
enabling multiple connections for memory transfer during live migration
|
||||
to improve speed.
|
||||
|
||||
- Nova now enables one IOThread per QEMU instance by default, offloading
|
||||
disk I/O processing from vCPU threads to improve performance. For
|
||||
real-time instances, the IOThread is pinned to the same cores as the
|
||||
emulator thread to avoid impacting dedicated vCPUs.
|
||||
|
||||
- Nova now supports live migration of instances with vTPM devices when
|
||||
using ``host`` secret security mode. A new ``hw:tpm_secret_security`` extra
|
||||
spec allows operators to select this mode, where the TPM secret is
|
||||
persisted in libvirt and transferred over RPC to the destination during
|
||||
migration. Instance owners can resize existing legacy vTPM instances to
|
||||
a flavor with ``hw:tpm_secret_security=host`` to opt in to live
|
||||
migration. Note that this resize must be performed by the instance owner
|
||||
due to Barbican secret ownership constraints, unless the admin has been
|
||||
granted appropriate ACLs in Barbican. The legacy ``user`` secret security
|
||||
mode does not yet support live migration but may do so in a future
|
||||
release once additional deployment and API changes are completed.
|
||||
|
||||
- Starting from microversion 2.101, the volume-attach API is now
|
||||
asynchronous, returning HTTP 202 instead of blocking until completion. This
|
||||
reduces API response time by offloading the operation to nova-conductor.
|
||||
|
||||
- Nova's libvirt driver now delegates UEFI firmware selection to libvirt
|
||||
instead of handling it internally. Libvirt's built-in auto-selection
|
||||
picks the best firmware file based on requested features (including Secure
|
||||
Boot and AMD SEV), and supports additional firmware types like ROM.
|
||||
|
||||
- Nova now has full OpenAPI schema coverage, with JSON Schema for request and
|
||||
response bodies across all API endpoints, enabling future auto-generation
|
||||
of OpenAPI specifications.
|
||||
|
||||
- Experimental feature: Nova services now supports graceful shutdown
|
||||
(part 1 of a larger effort). A second RPC server is introduced in
|
||||
compute service to handle in-progress operations during shutdown. The
|
||||
configurable timeouts controls how long the service waits for ongoing
|
||||
tasks to complete before fully stopping, preventing operations from
|
||||
being left in an unrecoverable state.
|
||||
|
||||
- Experimental feature: Nova services can run in native threading mode
|
||||
as an alternative to eventlet. Please try it in non-production environment
|
||||
and share your success or failure with us on the openstack-discuss mailing
|
||||
list or via the Nova bug tracker.
|
||||
+1
-1
@@ -23,7 +23,7 @@ jsonschema>=4.0.0 # MIT
|
||||
python-cinderclient>=4.0.1 # Apache-2.0
|
||||
keystoneauth1>=3.16.0 # Apache-2.0
|
||||
python-neutronclient>=7.1.0 # Apache-2.0
|
||||
python-glanceclient>=4.7.0 # Apache-2.0
|
||||
python-glanceclient @ git+https://git.ruan.fr/womax/python-glanceclient.git@gazpacho_temp_url
|
||||
requests>=2.25.1 # Apache-2.0
|
||||
stevedore>=1.20.0 # Apache-2.0
|
||||
websockify>=0.9.0 # LGPLv3
|
||||
|
||||
@@ -10,7 +10,7 @@ allowlist_externals =
|
||||
rm
|
||||
env
|
||||
make
|
||||
install_command = python -I -m pip install -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} {opts} {packages}
|
||||
install_command = python -I -m pip install -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2026.1} {opts} {packages}
|
||||
setenv =
|
||||
VIRTUAL_ENV={envdir}
|
||||
LANGUAGE=en_US
|
||||
|
||||
Reference in New Issue
Block a user