Compare commits
12 Commits
24da439116
...
e2a4aa0e1d
| Author | SHA1 | Date | |
|---|---|---|---|
| e2a4aa0e1d | |||
| 761c467315 | |||
| 1cce0a44d5 | |||
| a8f4e806e7 | |||
| 5c7e36faf6 | |||
| 0fc4c1ba7c | |||
| d5c64e7aba | |||
| 2ef2958c44 | |||
| 38cd15b45e | |||
| a411fe8154 | |||
| 864acc23ab | |||
| c658cea6d5 |
@@ -2,3 +2,4 @@
|
|||||||
host=review.opendev.org
|
host=review.opendev.org
|
||||||
port=29418
|
port=29418
|
||||||
project=openstack/nova.git
|
project=openstack/nova.git
|
||||||
|
defaultbranch=stable/2026.1
|
||||||
|
|||||||
@@ -218,12 +218,17 @@ support the decided libvirt version.
|
|||||||
- 6.2.0
|
- 6.2.0
|
||||||
- 8.2.2
|
- 8.2.2
|
||||||
* - 2025.2 Flamingo
|
* - 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
|
- 8.0.0
|
||||||
- 10.0.0
|
- 10.0.0
|
||||||
- 6.2.0
|
- 6.2.0
|
||||||
- 8.2.2
|
- 8.2.2
|
||||||
|
|
||||||
|
|
||||||
OS distribution versions
|
OS distribution versions
|
||||||
------------------------
|
------------------------
|
||||||
|
|||||||
@@ -442,6 +442,7 @@ class ComputeAPI(object):
|
|||||||
'dalmatian': '6.3',
|
'dalmatian': '6.3',
|
||||||
'epoxy': '6.4',
|
'epoxy': '6.4',
|
||||||
'flamingo': '6.4',
|
'flamingo': '6.4',
|
||||||
|
'gazpacho': '6.5',
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -187,7 +187,15 @@ Related options:
|
|||||||
is set to ``True``.
|
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',
|
cfg.BoolOpt('debug',
|
||||||
default=False,
|
default=False,
|
||||||
help='Enable or disable debug logging with glanceclient.')
|
help='Enable or disable debug logging with glanceclient.')
|
||||||
|
|||||||
@@ -372,7 +372,12 @@ class GlanceImageServiceV2(object):
|
|||||||
# to fetch the image and fill image_chunks
|
# to fetch the image and fill image_chunks
|
||||||
try:
|
try:
|
||||||
image_chunks = self._client.call(
|
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:
|
except Exception:
|
||||||
_reraise_translated_image_exception(image_id)
|
_reraise_translated_image_exception(image_id)
|
||||||
|
|
||||||
|
|||||||
@@ -294,6 +294,7 @@ SERVICE_VERSION_ALIASES = {
|
|||||||
'Dalmatian': 67,
|
'Dalmatian': 67,
|
||||||
'Epoxy': 68,
|
'Epoxy': 68,
|
||||||
'Flamingo': 70,
|
'Flamingo': 70,
|
||||||
|
'Gazpacho': 72,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -570,7 +570,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
|||||||
self.assertFalse(show_mock.called)
|
self.assertFalse(show_mock.called)
|
||||||
self.assertFalse(open_mock.called)
|
self.assertFalse(open_mock.called)
|
||||||
client.call.assert_called_once_with(
|
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)
|
self.assertEqual(mock.sentinel.image_chunks, res)
|
||||||
|
|
||||||
@mock.patch('builtins.open')
|
@mock.patch('builtins.open')
|
||||||
@@ -605,7 +610,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
|||||||
self.assertFalse(show_mock.called)
|
self.assertFalse(show_mock.called)
|
||||||
self.assertFalse(open_mock.called)
|
self.assertFalse(open_mock.called)
|
||||||
client.call.assert_called_once_with(
|
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)
|
self.assertIsNone(res)
|
||||||
data.write.assert_has_calls(
|
data.write.assert_has_calls(
|
||||||
[
|
[
|
||||||
@@ -632,7 +642,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
|||||||
|
|
||||||
self.assertFalse(show_mock.called)
|
self.assertFalse(show_mock.called)
|
||||||
client.call.assert_called_once_with(
|
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')
|
open_mock.assert_called_once_with(mock.sentinel.dst_path, 'wb')
|
||||||
fsync_mock.assert_called_once_with(writer)
|
fsync_mock.assert_called_once_with(writer)
|
||||||
self.assertIsNone(res)
|
self.assertIsNone(res)
|
||||||
@@ -663,7 +678,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
|||||||
self.assertFalse(show_mock.called)
|
self.assertFalse(show_mock.called)
|
||||||
self.assertFalse(open_mock.called)
|
self.assertFalse(open_mock.called)
|
||||||
client.call.assert_called_once_with(
|
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)
|
self.assertIsNone(res)
|
||||||
data.write.assert_has_calls(
|
data.write.assert_has_calls(
|
||||||
[
|
[
|
||||||
@@ -828,7 +848,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
|||||||
mock.sentinel.dst_path,
|
mock.sentinel.dst_path,
|
||||||
mock.sentinel.loc_meta)
|
mock.sentinel.loc_meta)
|
||||||
client.call.assert_called_once_with(
|
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)
|
fsync_mock.assert_called_once_with(writer)
|
||||||
# NOTE(jaypipes): log messages call open() in part of the
|
# NOTE(jaypipes): log messages call open() in part of the
|
||||||
# download path, so here, we just check that the last open()
|
# download path, so here, we just check that the last open()
|
||||||
@@ -878,7 +903,12 @@ class TestDownloadNoDirectUri(test.NoDBTestCase):
|
|||||||
include_locations=True)
|
include_locations=True)
|
||||||
get_tran_mock.assert_called_once_with('funky')
|
get_tran_mock.assert_called_once_with('funky')
|
||||||
client.call.assert_called_once_with(
|
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)
|
fsync_mock.assert_called_once_with(writer)
|
||||||
# NOTE(jaypipes): log messages call open() in part of the
|
# NOTE(jaypipes): log messages call open() in part of the
|
||||||
# download path, so here, we just check that the last open()
|
# 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
|
python-cinderclient>=4.0.1 # Apache-2.0
|
||||||
keystoneauth1>=3.16.0 # Apache-2.0
|
keystoneauth1>=3.16.0 # Apache-2.0
|
||||||
python-neutronclient>=7.1.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
|
requests>=2.25.1 # Apache-2.0
|
||||||
stevedore>=1.20.0 # Apache-2.0
|
stevedore>=1.20.0 # Apache-2.0
|
||||||
websockify>=0.9.0 # LGPLv3
|
websockify>=0.9.0 # LGPLv3
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ allowlist_externals =
|
|||||||
rm
|
rm
|
||||||
env
|
env
|
||||||
make
|
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 =
|
setenv =
|
||||||
VIRTUAL_ENV={envdir}
|
VIRTUAL_ENV={envdir}
|
||||||
LANGUAGE=en_US
|
LANGUAGE=en_US
|
||||||
|
|||||||
Reference in New Issue
Block a user