Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-sushy for openSUSE:Factory checked in at 2026-08-09 21:34:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-sushy (Old) and /work/SRC/openSUSE:Factory/.python-sushy.new.16738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sushy" Sun Aug 9 21:34:54 2026 rev:24 rq:1369788 version:5.12.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-sushy/python-sushy.changes 2026-05-20 15:26:29.090993998 +0200 +++ /work/SRC/openSUSE:Factory/.python-sushy.new.16738/python-sushy.changes 2026-08-09 21:37:15.078148215 +0200 @@ -1,0 +2,10 @@ +Wed Aug 5 14:46:07 UTC 2026 - Dirk Müller <[email protected]> + +- update to 5.12.0: + * Remove Python 3.10 support + * Add openstack-python3-next-jobs + * Allow explicit virtual media transfer protocols + * HTTP instead of ping to detect iDRAC reboot state + * filter out drives reporting null size on inspect + +------------------------------------------------------------------- Old: ---- sushy-5.11.0.tar.gz New: ---- sushy-5.12.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-sushy.spec ++++++ --- /var/tmp/diff_new_pack.13CBWH/_old 2026-08-09 21:37:15.554164424 +0200 +++ /var/tmp/diff_new_pack.13CBWH/_new 2026-08-09 21:37:15.558164561 +0200 @@ -17,7 +17,7 @@ Name: python-sushy -Version: 5.11.0 +Version: 5.12.0 Release: 0 Summary: Python library to communicate with Redfish based systems License: Apache-2.0 ++++++ sushy-5.11.0.tar.gz -> sushy-5.12.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/AUTHORS new/sushy-5.12.0/AUTHORS --- old/sushy-5.11.0/AUTHORS 2026-05-05 14:02:17.000000000 +0200 +++ new/sushy-5.12.0/AUTHORS 2026-08-03 14:37:45.000000000 +0200 @@ -8,6 +8,7 @@ Anshul Jain <[email protected]> Arne Wiebalck <[email protected]> Arundhati Surpur <[email protected]> +Bertrand Lanson <[email protected]> Bill Dodd <[email protected]> Bob Fournier <[email protected]> Christopher Dearborn <[email protected]> @@ -57,6 +58,7 @@ Riccardo Pittau <[email protected]> Richard G. Pioso <[email protected]> Richard Pioso <[email protected]> +Rico Lin <[email protected]> Ruby Loo <[email protected]> Samuel Kunkel <[email protected]> Sayali Kutwal <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/ChangeLog new/sushy-5.12.0/ChangeLog --- old/sushy-5.11.0/ChangeLog 2026-05-05 14:02:17.000000000 +0200 +++ new/sushy-5.12.0/ChangeLog 2026-08-03 14:37:45.000000000 +0200 @@ -1,6 +1,19 @@ CHANGES ======= +5.12.0 +------ + +* Remove Python 3.10 support +* Add openstack-python3-next-jobs +* Allow explicit virtual media transfer protocols + +5.11.1 +------ + +* HTTP instead of ping to detect iDRAC reboot state +* filter out drives reporting null size on inspect + 5.11.0 ------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/PKG-INFO new/sushy-5.12.0/PKG-INFO --- old/sushy-5.11.0/PKG-INFO 2026-05-05 14:02:17.764028300 +0200 +++ new/sushy-5.12.0/PKG-INFO 2026-08-03 14:37:45.465364700 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: sushy -Version: 5.11.0 +Version: 5.12.0 Summary: Sushy is a small Python library to communicate with Redfish based systems Home-page: https://docs.openstack.org/sushy/latest/ Author: OpenStack @@ -14,10 +14,11 @@ Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 -Requires-Python: >=3.10 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.11 License-File: LICENSE Requires-Dist: pbr>=6.0.0 Requires-Dist: requests>=2.14.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/pyproject.toml new/sushy-5.12.0/pyproject.toml --- old/sushy-5.11.0/pyproject.toml 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/pyproject.toml 2026-08-03 14:36:58.000000000 +0200 @@ -7,7 +7,7 @@ [tool.ruff] line-length = 79 -target-version = "py37" +target-version = "py311" [tool.ruff.lint] select = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/releasenotes/notes/add-virtual-media-transfer-protocol-6dd43b8464953e18.yaml new/sushy-5.12.0/releasenotes/notes/add-virtual-media-transfer-protocol-6dd43b8464953e18.yaml --- old/sushy-5.11.0/releasenotes/notes/add-virtual-media-transfer-protocol-6dd43b8464953e18.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/sushy-5.12.0/releasenotes/notes/add-virtual-media-transfer-protocol-6dd43b8464953e18.yaml 2026-08-03 14:36:58.000000000 +0200 @@ -0,0 +1,8 @@ +--- +features: + - | + Adds an optional ``transfer_protocol`` argument to + ``VirtualMedia.insert_media``. When supplied, Sushy includes the + corresponding ``TransferProtocolType`` in the initial Redfish + ``InsertMedia`` request instead of relying on an error response before + adding it. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/releasenotes/notes/idrac-reset-http-reachability-0998606718098c21.yaml new/sushy-5.12.0/releasenotes/notes/idrac-reset-http-reachability-0998606718098c21.yaml --- old/sushy-5.11.0/releasenotes/notes/idrac-reset-http-reachability-0998606718098c21.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/sushy-5.12.0/releasenotes/notes/idrac-reset-http-reachability-0998606718098c21.yaml 2026-08-03 14:36:58.000000000 +0200 @@ -0,0 +1,11 @@ +--- +fixes: + - | + The Dell OEM manager extension no longer shells out to the external + ``ping`` binary when waiting for the iDRAC to reboot during + ``reset_idrac``. Reachability is now determined over HTTP(S) using the + existing Redfish connection. This removes the dependency on a ``ping`` + executable being present (e.g. in container images) and on ICMP traffic + being permitted, and avoids an uncaught ``FileNotFoundError`` when the + binary is missing. See `bug 2151783 + <https://bugs.launchpad.net/sushy/+bug/2151783>`__ for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/releasenotes/notes/redfish-inspect-error-e7c0e4da33c02392.yaml new/sushy-5.12.0/releasenotes/notes/redfish-inspect-error-e7c0e4da33c02392.yaml --- old/sushy-5.11.0/releasenotes/notes/redfish-inspect-error-e7c0e4da33c02392.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/sushy-5.12.0/releasenotes/notes/redfish-inspect-error-e7c0e4da33c02392.yaml 2026-08-03 14:36:58.000000000 +0200 @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fixes a ``TypeError`` raised by ``Storage.drives_sizes_bytes`` when one + or more drives report a null ``CapacityBytes`` in the Redfish API response + (e.g. empty drive bays). The property now filters out drives with no + reported capacity before sorting, consistent with the existing behaviour + of ``SimpleStorageCollection.disks_sizes_bytes``. + See `LP#2150858 <https://bugs.launchpad.net/sushy/+bug/2150858>`_. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/releasenotes/notes/remove-py310-d8d686ad11a67432.yaml new/sushy-5.12.0/releasenotes/notes/remove-py310-d8d686ad11a67432.yaml --- old/sushy-5.11.0/releasenotes/notes/remove-py310-d8d686ad11a67432.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/sushy-5.12.0/releasenotes/notes/remove-py310-d8d686ad11a67432.yaml 2026-08-03 14:36:58.000000000 +0200 @@ -0,0 +1,5 @@ +--- +upgrade: + - | + Support for Python 3.10 has been removed. Now Python 3.11 is the minimum + version supported. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/setup.cfg new/sushy-5.12.0/setup.cfg --- old/sushy-5.11.0/setup.cfg 2026-05-05 14:02:17.765028500 +0200 +++ new/sushy-5.12.0/setup.cfg 2026-08-03 14:37:45.466364600 +0200 @@ -6,7 +6,7 @@ author = OpenStack author_email = [email protected] home_page = https://docs.openstack.org/sushy/latest/ -python_requires = >=3.10 +python_requires = >=3.11 classifier = Environment :: OpenStack Intended Audience :: Information Technology @@ -17,9 +17,10 @@ Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3 - Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 + Programming Language :: Python :: 3.14 [files] packages = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/oem/dell/resources/manager/manager.py new/sushy-5.12.0/sushy/oem/dell/resources/manager/manager.py --- old/sushy-5.11.0/sushy/oem/dell/resources/manager/manager.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/oem/dell/resources/manager/manager.py 2026-08-03 14:36:58.000000000 +0200 @@ -14,7 +14,6 @@ import json import logging -import subprocess import time from urllib.parse import urlparse @@ -127,6 +126,10 @@ _IDRAC_IS_READY_RETRIES = 96 _IDRAC_IS_READY_RETRY_DELAY_SEC = 10 + # Short per-probe HTTP timeout so reachability checks fail fast during the + # iDRAC reboot window instead of blocking on the default request timeout. + _IDRAC_REACHABLE_PROBE_TIMEOUT_SEC = 10 + @property def import_system_configuration_uri(self): return self._actions.import_system_configuration.target_uri @@ -567,76 +570,80 @@ self.redfish_version, self.registries) - def _wait_for_idrac_state(self, host, alive=True, ping_count=3, + def _wait_for_idrac_state(self, host, alive=True, required_count=3, retries=24): - """Wait for iDRAC to become pingable or not pingable. + """Wait for iDRAC to become reachable or not reachable. - :param host: Hostname or IP of the iDRAC interface. - :param alive: True for pingable state and False for not pingable - state. - :param ping_count: Number of consecutive ping results, per + Reachability is determined over HTTP(S) via the existing Redfish + connection, not ICMP -- no external ``ping`` binary is required. + + :param host: Hostname or IP of the iDRAC interface, for logging. + :param alive: True for the reachable state and False for the not + reachable state. + :param required_count: Number of consecutive matching results, per 'alive', for success. - :param retries: Number of ping retries. - :returns: True on reaching specified host ping state; otherwise, - False. + :param retries: Number of retries. + :returns: True on reaching specified host reachability state; + otherwise, False. """ if alive: - ping_type = "pingable" + state = "reachable" else: - ping_type = "not pingable" - LOG.debug("Waiting for iDRAC %(host)s to become %(ping_type)s", - {'host': host, 'ping_type': ping_type}) + state = "not reachable" + LOG.debug("Waiting for iDRAC %(host)s to become %(state)s", + {'host': host, 'state': state}) response_count = 0 while retries > 0: - response = self._ping_host(host) + response = self._is_reachable() retries -= 1 if response == alive: response_count += 1 - LOG.debug("iDRAC %(host)s is %(ping_type)s, " + LOG.debug("iDRAC %(host)s is %(state)s, " "count=%(response_count)s", - {'host': host, 'ping_type': ping_type, + {'host': host, 'state': state, 'response_count': response_count}) - if response_count == ping_count: + if response_count == required_count: LOG.debug("Reached specified %(alive)s count for iDRAC " "%(host)s", {'alive': alive, 'host': host}) return True else: response_count = 0 if alive: - LOG.debug("iDRAC %(host)s is still not pingable", + LOG.debug("iDRAC %(host)s is still not reachable", {'host': host}) else: - LOG.debug("iDRAC %(host)s is still pingable", + LOG.debug("iDRAC %(host)s is still reachable", {'host': host}) time.sleep(10) return False - def _wait_for_idrac(self, host, post_pingable_wait_time): - """Wait for iDRAC to transition from unpingable to pingable. + def _wait_for_idrac(self, host, post_reachable_wait_time): + """Wait for iDRAC to transition from not reachable to reachable. :param host: Hostname or IP of the iDRAC interface. - :param post_pingable_wait_time: Amount of time in seconds to - wait after the host becomes pingable. + :param post_reachable_wait_time: Amount of time in seconds to + wait after the host becomes reachable. :raises: ExtensionError on failure to perform requested operation. """ state_reached = self._wait_for_idrac_state( - host, alive=False, ping_count=2, retries=24) + host, alive=False, required_count=2, retries=24) if not state_reached: error_msg = ("Timed out waiting iDRAC %(host)s to become not " - "pingable", {'host': host}) + "reachable", {'host': host}) LOG.error(error_msg) raise sushy.exceptions.ExtensionError(error=error_msg) - LOG.debug("iDRAC %(host)s has become not pingable", {'host': host}) + LOG.debug("iDRAC %(host)s has become not reachable", {'host': host}) state_reached = self._wait_for_idrac_state(host, alive=True, - ping_count=3, retries=24) + required_count=3, + retries=24) if not state_reached: - error_msg = ("Timed out waiting iDRAC %(host)s to become pingable", - {'host': host}) + error_msg = ("Timed out waiting iDRAC %(host)s to become " + "reachable", {'host': host}) LOG.error(error_msg) raise sushy.exceptions.ExtensionError(error=error_msg) - LOG.debug("iDRAC %(host)s has become pingable", {'host': host}) - time.sleep(post_pingable_wait_time) + LOG.debug("iDRAC %(host)s has become reachable", {'host': host}) + time.sleep(post_reachable_wait_time) def _wait_until_idrac_is_ready(self, host, retries, retry_delay): """Wait until the iDRAC is in a ready state. @@ -666,14 +673,28 @@ LOG.error(error_msg) raise sushy.exceptions.ExtensionError(error=error_msg) - def _ping_host(self, host): - """Ping the hostname or IP of a host. + def _is_reachable(self): + """Check whether the iDRAC HTTP(S) endpoint is reachable. + + Probes the Redfish service root over the existing connection. Any HTTP + response (even an error status) means the iDRAC is up; a connection + failure (refused/reset/timeout/SSL, as during a reboot) means it is + not yet reachable. - :param host: Hostname or IP. - :returns: True if host is alive; otherwise, False. + :returns: True if the iDRAC answered, otherwise False. """ - response = subprocess.call(["ping", "-c", "1", host]) # noqa:S603,S607 - return response == 0 + try: + self._conn.get( + path='/redfish/v1/', + timeout=self._IDRAC_REACHABLE_PROBE_TIMEOUT_SEC) + except sushy.exceptions.ConnectionError as exc: + LOG.debug("iDRAC is not reachable over HTTP: %(err)s", + {'err': exc}) + return False + except sushy.exceptions.HTTPError: + # An error status still proves the iDRAC is up and serving. + return True + return True def get_extension(*args, **kwargs): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/resources/manager/constants.py new/sushy-5.12.0/sushy/resources/manager/constants.py --- old/sushy-5.11.0/sushy/resources/manager/constants.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/resources/manager/constants.py 2026-08-03 14:36:58.000000000 +0200 @@ -148,6 +148,39 @@ """A DVD-ROM format image.""" +# Values come from the Redfish VirtualMedia json-schema. +# https://redfish.dmtf.org/schemas/VirtualMedia.v1_6_5.json#/definitions/TransferProtocolType +class VirtualMediaTransferProtocolType(enum.Enum): + """Transfer Protocol Type constants.""" + + CIFS = 'CIFS' + """Common Internet File System (CIFS).""" + + FTP = 'FTP' + """File Transfer Protocol (FTP).""" + + HTTP = 'HTTP' + """Hypertext Transfer Protocol (HTTP).""" + + HTTPS = 'HTTPS' + """Hypertext Transfer Protocol Secure (HTTPS).""" + + NFS = 'NFS' + """Network File System (NFS).""" + + OEM = 'OEM' + """A manufacturer-defined protocol.""" + + SCP = 'SCP' + """Secure Copy Protocol (SCP).""" + + SFTP = 'SFTP' + """Secure File Transfer Protocol (SFTP).""" + + TFTP = 'TFTP' + """Trivial File Transfer Protocol (TFTP).""" + + # Backward compatibility VIRTUAL_MEDIA_CD = VirtualMediaType.CD VIRTUAL_MEDIA_DVD = VirtualMediaType.DVD diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/resources/manager/virtual_media.py new/sushy-5.12.0/sushy/resources/manager/virtual_media.py --- old/sushy-5.11.0/sushy/resources/manager/virtual_media.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/resources/manager/virtual_media.py 2026-08-03 14:36:58.000000000 +0200 @@ -189,7 +189,8 @@ return False def insert_media(self, image, inserted=True, write_protected=True, - username=None, password=None, transfer_method=None): + username=None, password=None, transfer_method=None, + transfer_protocol=None): """Attach remote media to virtual media :param image: a URI providing the location of the selected image @@ -200,6 +201,8 @@ :param password: Password for the image URI. :param transfer_method: Transfer method (stream or upload) to use for the image. + :param transfer_protocol: Transfer protocol used to retrieve the + image. When supplied, it is included in the initial request. """ target_uri, use_patch = self._get_insert_media_uri() # NOTE(janders) Inserted and WriteProtected attributes are optional @@ -226,6 +229,18 @@ parameter='transfer_method', value=transfer_method, valid_values=', '.join(map(str, mgr_cons.TransferMethod))) + if transfer_protocol is not None: + try: + payload['TransferProtocolType'] = ( + mgr_cons.VirtualMediaTransferProtocolType( + transfer_protocol).value) + except ValueError: + raise exceptions.InvalidParameterValueError( + parameter='transfer_protocol', + value=transfer_protocol, + valid_values=', '.join( + protocol.value for protocol in + mgr_cons.VirtualMediaTransferProtocolType)) if use_patch: payload['Inserted'] = inserted diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/resources/system/storage/storage.py new/sushy-5.12.0/sushy/resources/system/storage/storage.py --- old/sushy-5.11.0/sushy/resources/system/storage/storage.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/resources/system/storage/storage.py 2026-08-03 14:36:58.000000000 +0200 @@ -112,7 +112,8 @@ Returns the list of cached values until it (or its parent resource) is refreshed. """ - return sorted(drv.capacity_bytes for drv in self.drives) + return sorted(drv.capacity_bytes for drv in self.drives + if drv.capacity_bytes is not None) @property def drives_max_size_bytes(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/tests/oem/dell/unit/resources/manager/test_manager.py new/sushy-5.12.0/sushy/tests/oem/dell/unit/resources/manager/test_manager.py --- old/sushy-5.11.0/sushy/tests/oem/dell/unit/resources/manager/test_manager.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/tests/oem/dell/unit/resources/manager/test_manager.py 2026-08-03 14:36:58.000000000 +0200 @@ -606,9 +606,9 @@ oem_manager._wait_for_idrac_state.return_value = True oem_manager._wait_for_idrac('1.2.3.4', 30) oem_manager._wait_for_idrac_state.assert_called_with( - '1.2.3.4', alive=True, ping_count=3, retries=24) + '1.2.3.4', alive=True, required_count=3, retries=24) oem_manager._wait_for_idrac_state.assert_any_call( - '1.2.3.4', alive=False, ping_count=2, retries=24) + '1.2.3.4', alive=False, required_count=2, retries=24) self.assertEqual(2, oem_manager._wait_for_idrac_state.call_count) @mock.patch('time.sleep', autospec=True) @@ -630,39 +630,52 @@ oem_manager._wait_for_idrac, '1.2.3.4', 30) @mock.patch('time.sleep', autospec=True) - def test__wait_for_idrac_state_with_pingable(self, mock_time_sleep): + def test__wait_for_idrac_state_with_reachable(self, mock_time_sleep): oem_manager = self.manager.get_oem_extension('Dell') - oem_manager._ping_host = mock.Mock() - oem_manager._ping_host.return_value = True + oem_manager._is_reachable = mock.Mock() + oem_manager._is_reachable.return_value = True response = oem_manager._wait_for_idrac_state('1.2.3.4') self.assertEqual(True, response) - self.assertEqual(3, oem_manager._ping_host.call_count) + self.assertEqual(3, oem_manager._is_reachable.call_count) @mock.patch('time.sleep', autospec=True) - def test__wait_for_idrac_state_without_pingable(self, mock_time_sleep): + def test__wait_for_idrac_state_without_reachable(self, mock_time_sleep): oem_manager = self.manager.get_oem_extension('Dell') - oem_manager._ping_host = mock.Mock() - oem_manager._ping_host.return_value = False + oem_manager._is_reachable = mock.Mock() + oem_manager._is_reachable.return_value = False response = oem_manager._wait_for_idrac_state('1.2.3.4') self.assertEqual(False, response) - self.assertEqual(24, oem_manager._ping_host.call_count) + self.assertEqual(24, oem_manager._is_reachable.call_count) - @mock.patch('subprocess.call', autospec=True) - def test__ping_host_alive(self, mock_call): + def test__is_reachable_when_idrac_responds(self): oem_manager = self.manager.get_oem_extension('Dell') - mock_call.return_value = 0 + oem_manager._conn.get = mock.Mock() - result = oem_manager._ping_host('1.2.3.4') + result = oem_manager._is_reachable() self.assertTrue(result) - mock_call.assert_called_with(["ping", "-c", "1", '1.2.3.4']) + oem_manager._conn.get.assert_called_once_with( + path='/redfish/v1/', timeout=mock.ANY) - @mock.patch('subprocess.call', autospec=True) - def test__ping_host_not_alive(self, mock_call): + def test__is_reachable_on_http_error(self): oem_manager = self.manager.get_oem_extension('Dell') - mock_call.return_value = 1 + response = mock.Mock() + response.status_code = 500 + response.json.return_value = {} + oem_manager._conn.get = mock.Mock( + side_effect=sushy.exceptions.ServerSideError( + 'GET', '/redfish/v1/', response)) - result = oem_manager._ping_host('1.2.3.4') + result = oem_manager._is_reachable() + + self.assertTrue(result) + + def test__is_reachable_on_connection_error(self): + oem_manager = self.manager.get_oem_extension('Dell') + oem_manager._conn.get = mock.Mock( + side_effect=sushy.exceptions.ConnectionError( + url='/redfish/v1/', error='boom')) + + result = oem_manager._is_reachable() self.assertFalse(result) - mock_call.assert_called_with(["ping", "-c", "1", '1.2.3.4']) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/tests/unit/resources/certificateservice/test_certificate.py new/sushy-5.12.0/sushy/tests/unit/resources/certificateservice/test_certificate.py --- old/sushy-5.11.0/sushy/tests/unit/resources/certificateservice/test_certificate.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/tests/unit/resources/certificateservice/test_certificate.py 2026-08-03 14:36:58.000000000 +0200 @@ -50,10 +50,10 @@ sushy.KeyUsage.SERVER_AUTHENTICATION], self.cert.key_usage) self.assertEqual(datetime.datetime(2018, 9, 7, 13, 22, 5, - tzinfo=datetime.timezone.utc), + tzinfo=datetime.UTC), self.cert.valid_not_before) self.assertEqual(datetime.datetime(2019, 9, 7, 13, 22, 5, - tzinfo=datetime.timezone.utc), + tzinfo=datetime.UTC), self.cert.valid_not_after) self.assertTrue(self.cert.serial_number) self.assertTrue(self.cert.fingerprint) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy/tests/unit/resources/manager/test_virtual_media.py new/sushy-5.12.0/sushy/tests/unit/resources/manager/test_virtual_media.py --- old/sushy-5.11.0/sushy/tests/unit/resources/manager/test_virtual_media.py 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/sushy/tests/unit/resources/manager/test_virtual_media.py 2026-08-03 14:36:58.000000000 +0200 @@ -175,6 +175,27 @@ "https://www.dmtf.org/freeImages/Sardine.img", True, False, transfer_method='quickly!') + def test_insert_media_transfer_protocol(self): + self.assertFalse(self.sys_virtual_media._is_stale) + self.sys_virtual_media.insert_media( + "https://www.dmtf.org/freeImages/Sardine.img", True, False, + transfer_protocol=( + mgr_cons.VirtualMediaTransferProtocolType.HTTPS)) + self.sys_virtual_media._conn.post.assert_called_once_with( + ("/redfish/v1/Managers/BMC/VirtualMedia/Floppy1/Actions" + "/VirtualMedia.InsertMedia"), + data={"Image": "https://www.dmtf.org/freeImages/Sardine.img", + "WriteProtected": False, + "TransferProtocolType": "HTTPS"} + ) + self.assertTrue(self.sys_virtual_media._is_stale) + + def test_insert_media_transfer_protocol_wrong_input(self): + self.assertRaises(exceptions.InvalidParameterValueError, + self.sys_virtual_media.insert_media, + "https://www.dmtf.org/freeImages/Sardine.img", + True, False, transfer_protocol='IPoIB') + def test_insert_media_fallback(self): self.conn.get.return_value.headers = {'Allow': 'GET,HEAD,PATCH'} self.sys_virtual_media._actions.insert_media = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy.egg-info/PKG-INFO new/sushy-5.12.0/sushy.egg-info/PKG-INFO --- old/sushy-5.11.0/sushy.egg-info/PKG-INFO 2026-05-05 14:02:17.000000000 +0200 +++ new/sushy-5.12.0/sushy.egg-info/PKG-INFO 2026-08-03 14:37:45.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: sushy -Version: 5.11.0 +Version: 5.12.0 Summary: Sushy is a small Python library to communicate with Redfish based systems Home-page: https://docs.openstack.org/sushy/latest/ Author: OpenStack @@ -14,10 +14,11 @@ Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 -Requires-Python: >=3.10 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.11 License-File: LICENSE Requires-Dist: pbr>=6.0.0 Requires-Dist: requests>=2.14.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy.egg-info/SOURCES.txt new/sushy-5.12.0/sushy.egg-info/SOURCES.txt --- old/sushy-5.11.0/sushy.egg-info/SOURCES.txt 2026-05-05 14:02:17.000000000 +0200 +++ new/sushy-5.12.0/sushy.egg-info/SOURCES.txt 2026-08-03 14:37:45.000000000 +0200 @@ -68,6 +68,7 @@ releasenotes/notes/add-thermal-resource-5c965a3c940f9028.yaml releasenotes/notes/add-tls-configuration-8a94bb1bbeb79e6a.yaml releasenotes/notes/add-virtual-media-support-f522fbec4420341c.yaml +releasenotes/notes/add-virtual-media-transfer-protocol-6dd43b8464953e18.yaml releasenotes/notes/add_composition_service-84750d8d1d96474a.yaml releasenotes/notes/add_ethernet_interface-df308f814f0e4bce.yaml releasenotes/notes/add_keyword_argument_for_connector-cea5dc4e6c01b548.yaml @@ -130,6 +131,7 @@ releasenotes/notes/handle-missing-collection-members-8ccbd4588790eabe.yaml releasenotes/notes/handle_transfer_method-a51d5a17e381ebee.yaml releasenotes/notes/health_literals_change-0e3fc0c439b765e3.yaml +releasenotes/notes/idrac-reset-http-reachability-0998606718098c21.yaml releasenotes/notes/idrac10-settings-resource-c18e754c661a7056.yaml releasenotes/notes/ignore-empty-string-etags-ee44617d7b0f72ce.yaml releasenotes/notes/increase-server-retries-5f11edde8ee0b461.yaml @@ -148,10 +150,12 @@ releasenotes/notes/raise-error-on-async-task-failure-b67c7bc189a4d6ca.yaml releasenotes/notes/re-raise-1fe9f912691e893e.yaml releasenotes/notes/reauthentication-session-fallback-failure-fixes-4f0dcfdad1afd2d7.yaml +releasenotes/notes/redfish-inspect-error-e7c0e4da33c02392.yaml releasenotes/notes/redfish-response-log-294f3f10b770e356.yaml releasenotes/notes/refactor-taskmonitor-update-volume-ba99380188395852.yaml releasenotes/notes/releasenote-d7138d1e1d414632.yaml releasenotes/notes/remove-deprecated-task-monitors-58c505d43e1fa6a7.yaml +releasenotes/notes/remove-py310-d8d686ad11a67432.yaml releasenotes/notes/remove-py38-6eebcd268c6f8e37.yaml releasenotes/notes/remove-py39-9d9717edf25353f8.yaml releasenotes/notes/retry-if-transferprototype-missing-9cae57f3ecf470a9.yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/sushy.egg-info/pbr.json new/sushy-5.12.0/sushy.egg-info/pbr.json --- old/sushy-5.11.0/sushy.egg-info/pbr.json 2026-05-05 14:02:17.000000000 +0200 +++ new/sushy-5.12.0/sushy.egg-info/pbr.json 2026-08-03 14:37:45.000000000 +0200 @@ -1 +1 @@ -{"git_version": "1909826", "is_release": true} \ No newline at end of file +{"git_version": "ebc9454", "is_release": true} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sushy-5.11.0/zuul.d/project.yaml new/sushy-5.12.0/zuul.d/project.yaml --- old/sushy-5.11.0/zuul.d/project.yaml 2026-05-05 14:01:27.000000000 +0200 +++ new/sushy-5.12.0/zuul.d/project.yaml 2026-08-03 14:36:58.000000000 +0200 @@ -3,6 +3,7 @@ - check-requirements - openstack-cover-jobs - openstack-python3-jobs + - openstack-python3-next-jobs - publish-openstack-docs-pti - release-notes-jobs-python3 check:
