Current Series Release Notes

2.2.0-9

New Features

  • The OpenStack Nova driver now supports network boot (PXE) via rescue mode as an alternative to the libvirt:pxe-first metadata approach. This feature enables network boot functionality on vanilla Nova deployments without requiring custom patches [1] to support the libvirt:pxe-first metadata flag.

    When enabled, setting the boot device to Pxe configures the instance to boot from the network on the next power cycle using Nova’s rescue mode with an iPXE image. Setting the boot device to Hdd boots the instance normally. The driver automatically selects the appropriate BIOS or UEFI iPXE image based on the instance boot mode.

    Enable this feature by setting SUSHY_EMULATOR_OS_RESCUE_PXE_BOOT to True and configuring the iPXE rescue images in Glance. See the documentation for complete configuration details.

  • The OpenStack Nova driver now supports virtual media (CD/DVD) boot via rescue mode as an alternative to the volume-based approach. This feature enables virtual media functionality on older OpenStack clouds and works around OVMF firmware issues that can occur with volume-backed virtual media.

    When enabled, inserting virtual media uploads the ISO image to Glance asynchronously. Setting the boot device to Cd configures the instance to boot from the ISO on the next power cycle using Nova’s rescue mode. The driver handles the complete lifecycle: image upload, rescue with ISO, power operations, and cleanup on eject.

    This approach is particularly useful for:

    • Older OpenStack clouds lacking microversion 2.93 (volume multiattach)

    • Environments where OVMF firmware has issues with volume-backed media

    • Image-backed instances where volume attachment is not desired

    • Deployments requiring simpler infrastructure (no Cinder volumes)

    Enable this feature by setting SUSHY_EMULATOR_OS_VMEDIA_USE_RESCUE to True. The feature works with image-backed Nova instances and automatically handles asynchronous image upload and rescue state transitions. See the documentation for complete configuration details and workflow examples.

    This complements the existing volume-based virtual media (for Zed+ clouds) and rescue-based PXE boot features, providing a unified rescue-mode approach for both network and CD boot scenarios.

Upgrade Notes

  • Following the fix to detect and set the actual disk format for virtual media images, some OpenStack clouds may not support the detected format. For example, clouds that restrict Glance disk formats to only raw and qcow2 will reject iso format images. If you encounter format validation errors, set the SUSHY_EMULATOR_OS_VMEDIA_DISK_FORMAT_OVERRIDE configuration parameter to raw to override the auto-detection and force a format that your cloud accepts.

  • Virtual media state tracking has been refactored to use PersistentDict instead of Nova server metadata. This affects existing volume-based virtual media users.

    Important: Virtual media state (inserted images, boot mode, and image URLs) is now stored in the local state file configured by SUSHY_EMULATOR_STATE_DIR. If you require virtual media state to survive sushy-tools service restarts, you must configure a persistent state directory. Without this configuration, virtual media state will be lost on service restart, requiring media to be re-inserted.

    Previously, virtual media state was stored in Nova server metadata, which persisted across service restarts automatically. The new approach uses local state management for better consistency with other stateful features like rescue-based PXE boot.

Bug Fixes

  • Fixes OpenStack Nova driver boot mode and secure boot detection to correctly read image properties from OpenStack SDK Image objects. The driver was incorrectly using getattr() to access hw_firmware_type and os_secure_boot properties, but the SDK stores these custom properties in the image.properties dict. This caused get_boot_mode() to always return None instead of the correct boot mode (UEFI or Legacy), and get_secure_boot() to always return False even when secure boot was required.

  • Fixes OpenStack Nova driver to correctly detect and set disk format when uploading virtual media images to Glance. Previously, all images were hardcoded as ‘raw’ format, causing uploads to fail when Glance’s require_image_format_match is enabled (the default). The driver now inspects file content using magic bytes to detect ISO, QCOW2, and raw formats when local files are available, or infers the format from the filename extension for URL-based imports. This ensures uploaded images pass Glance’s format validation.

  • Fixes OpenStack Nova driver to verify power state after rescue operations. Previously, the driver only checked if the power state was stable (not changing), but did not verify it matched the expected state. This caused false success reports when rescue operations failed to power on instances, leading to 120-second timeouts in clients like Ironic. The driver now waits for the correct power state and raises detailed errors with fault information and full instance data when verification fails, enabling faster failure detection and easier debugging.

2.2.0

Upgrade Notes

  • Support for Python 3.9 has been removed. Now Python 3.10 is the minimum version supported.

Bug Fixes

  • System sub-resources (BIOS, Processors, and SimpleStorage) are now conditionally exposed based on driver support. Only the libvirt driver implements these features, so they will only appear in the System resource response when using the libvirt backend. This prevents exposing non- functional endpoints for drivers that don’t support these capabilities. When these fields are absent, Redfish clients like Ironic will receive a MissingAttributeError and handle it gracefully.

  • Fixes OpenStack Nova driver to properly handle instance task_state conflicts and race conditions during power state operations. The driver now waits for instances to be ready before attempting power actions or rebuilds, preventing ConflictExceptions when instances are busy with tasks like powering-off, rebuilding, or spawning. When the instance is busy, the driver now returns HTTP 503 with SYS518 error code to allow clients to retry.

2.1.0

New Features

  • Adds PATCH support for the Redfish Manager resource’s DateTime and DateTimeLocalOffset fields in the dynamic emulator. Implements get_datetime and set_datetime methods in the fake driver and adds test support for mocking datetime values. Disables cache reset to persist updates across requests.

Bug Fixes

  • The nova emulator driver makes fewer API calls when retrieving the server list. This significantly improves the API response times when using the emulator in a project with many instances and ports per instance.

  • The HTTP status code for NotSupportedError has been fixed. The generic 500 Internal Server Error status code was previously used, it will now use the 501 Not Implemented status code.

2.0.0

New Features

  • The openstack driver for virtual media now supports Glance file upload. As an alternative to using image import via the web-download method, it is now possible to configure the emulator to download the image to a temp file which is then uploaded to Glance.

    Set the SUSHY_EMULATOR_OS_VMEDIA_IMAGE_FILE_UPLOAD option to True to enable Glance file upload.

Upgrade Notes

  • Support for Python 3.8 has been removed. Now the minimum python version supported is 3.9 .

1.3.0

New Features

  • Support for domains utilizing firmware auto-selection has been added to the libvirt driver.

  • Adds support for BIOS update emulation by introducing UpdateService. No actual updates are performed (all the code is doing is incrementing BIOS version value in libvirt xml) however this functionality may be used for automated testing of firmware update features in Ironic. Note BMC firmware update emulation is not supported at this time.

  • The openstack driver now supports insert and eject of virtual media. On insert a new empty volume is created and attached to the server and the server is rebuilt with the that image. On eject it is assumed that the attached volume has been rewritten with bootable image data. The volume is detached and uploaded as an image, then the server is rebuilt with that image.

    Both insert and delete results in the root disk being wiped and replaced with the contents of an image, so this should not be used in any scenario where the root disk data needs to be retained.

Bug Fixes

  • Replaces hardcoded BIOS version string with updatable field backed by a custom section in libvirt metadata (similar to prior art on BIOS settings). This can be used for BIOS version information as well as storing firmware version information of other components. NOTE: this enhancement is meant to facilitate testing BIOS/firmware upgrade codepaths and NOT performing actual BIOS/firmware upgrades.

  • Resolves the issue where UpdateService.SimpleUpdate action cannot complete successfully due to connections from UpdateService to System being redirected by libvirt system driver alias handling code.

1.1.0

New Features

  • Adds support to handle HttpBootUri being posted to the node, which maps to the virtual media functionality, because there is not a direct analog setting when interacting with libvirt.

  • Adds basic functionality for HttpBootUri to be passed through to the libvirt driver, enabling boot operations utilizing supplied media. This does not influence the default URL to boot from due to a lack of capability in libvirt, but instead treats it similar to virtual media. In this case, an override boot target of UefiHttp is also re-mapped to Cd to facilitate testing.

  • Adds new ironic driver to provide a limited emulated redfish API to ironic nodes. This would be needed in cases where a redfish compatible endpoint is needed but but don’t have direct access to the BMC (you only have access via Ironic) or the BMC doesn’t support redfish.

  • Add a configuration options SUSHY_EMULATOR_FEATURE_SET to define which resources should be available. See the documentation for more details.

  • Exposes the VirtualMedia resource directly on Systems, not just Managers.

1.0.0

New Features

  • It is now possible to enable and disable UEFI Secure Boot mode via Redfish requests for the libvirt driver. This is possible by configuring domains to use a secure boot capable firmware loader, and setting configuration values SUSHY_EMULATOR_SECURE_BOOT_ENABLED_NVRAM and SUSHY_EMULATOR_SECURE_BOOT_DISABLED_NVRAM to nvram template paths which enable or disable secure boot.

    The fake driver supports getting and setting secure boot, the nova driver only supports getting.

Bug Fixes

  • Fixes libvirtError: operation forbidden when setting boot mode

0.21.1

Security Issues

  • Secure information in the Libvirt domain XML document is now preserved. For more information, please see story 2010382.

Bug Fixes

  • Fixes an issue where secure fields were accidentally lost in the Libvirt domain XML document.

0.20.0

Upgrade Notes

  • Sushy-tools does not support Python 3.6 and 3.7 anymore, please use version 3.8 or higher.

0.19.0

New Features

  • Adds basic support for custom TLS certificates with virtual media.

  • Adds a fake system driver (activated using the --fake argument) that does not have an actual backend and works by storing all values in the cache.

    It is currently functional enough for the Ironic’s ramdisk deploy (and undeploy) to finish successfully.

Bug Fixes

  • Allow non-string types to be configured for BIOS settings.

0.18.2

Bug Fixes

  • Fixes configuring the emulator via environment parameters when main is not invoked (e.g. when using WSGI).

0.18.1

Bug Fixes

  • Fixes authentication when the configuration is provided via the --config option (as opposed to the environment).

0.18.0

New Features

  • Supports HTTP basic authentication of Redfish endpoints. Set the new SUSHY_EMULATOR_AUTH_FILE variable to the path of an htpasswd file.

  • Supports reading and changing VerifyCertificate in VirtualMedia resources.

  • The emulator now supports providing UserName and Password for virtual media.

Upgrade Notes

  • The default value of SUSHY_EMULATOR_VMEDIA_VERIFY_SSL has been changed to False to match the actual bare metal hardware.

Bug Fixes

  • Fixes a bug in the handler for Bios/BiosRegistry - it should not include identity in order to match the url returned from bios_attribute_registry_file.json and be consistent with actual vendor responses.

  • Returns the correct status code (404) when a URL is not found.

  • Fixes handling HTTP errors on downloading virtual media files. Error codes are no longer silently ignored.

0.17.0

New Features

  • Adds support for returning message and attribute (particularly BIOS attribute) registries. Also adds two additional BIOS settings - ‘SecureBootStatus’ and ‘SerialNumber’. ‘SecureBootStatus’ has ‘ReadOnly’ set to true and ‘SecureBootStatus’ has ‘IsSystemUniqueProperty’ in the registry.

0.14.0

New Features

  • Adds basic support for Redfish Processor schema.

Bug Fixes

  • Fixes incorrect device name and bus when attaching a virtual floppy.

0.13.0

New Features

  • Adds an option –debug to enable debug mode when running sushy-emulator.

0.12.1

Bug Fixes

  • Adds the Volumes navigation property to the Storage emulator template.

  • No longer tries to use IDE controllers on q35 machines.

0.11.0

New Features

  • Adds basic support for virtual media devices on non-IDE buses, such as SATA and SCSI, as IDE devices are not supported on Q35 libvirt domains.

0.10.0

Known Issues

  • Reads hardware state from libvirt domain XML

    Now reads boot device/mode/image from domain XML on filesystem rather then the running VM, thus avoiding the need for a reboot after setting something. The client should now power cycle the instance if the changes are required in the running VM. note: not simply a soft reboot.

0.8.0

Upgrade Notes

  • Python 2.7 support has been dropped. Last release of sushy-tools to support Python 2.7 is OpenStack Train. The minimum version of Python now supported by sushy-tools is Python 3.6.

Bug Fixes

  • Fixes one of the allowed values for BootSourceOverrideMode element - Redfish specification requires UEFI boot mode to be indicated as UEFI, not Uefi as the dynamic Redfish emulator erroneously adopted.

  • Fixes occasional failure when setting boot image to libvirt domain in response to virtual media “Insert” operation.

  • Fixes potential failure on reading/setting boot device of libvirt domain. Prior to this fix, boot device has only been respected in the boot loader part of libvirt domain XML. However per-device boot configuration can also be used. If the latter way is in place in a libvirt domain, reading boot device would yield nothing, while setting it in the boot loader would fail. This fix respects both ways of configuring libvirt boot device preferring the per-device configuration when setting new boot device.

  • Brings libvirt domain down prior to any change. When Redfish emulator is running against libvirt virtualization backend, any changes being done to domain are not applied for as long as the domain is up. This leads to two nuisances:

    • REST API is not really REST-ful meaning that successfully applied change is not reflected in the document tree

    • Multiple changes done to live domain XML tree may override one another because N-1 change done to a domain is not visible to N’s change

    The fix is to bring running domain down briefly while the change is applied.

  • Fixes situation when changing boot image could invalidate current boot device selection. The fix is to note current libvirt boot device and restore it if the image being changed resides on the active boot device.

  • Fixes defaults to storage and drive resources. Prior to this fix, if storage and/or drive resource emulation is not set up via sushy emulator configuration, the clients trying to read either of these resources would hit hard HTTP 500 response.

0.7.0

New Features

  • Adds Chassis resource emulation to dynamic Redfish emulator. All emulated Computer Systems and Managers get linked up to the first of the configured Chassis (just one by default).

  • Adds Drive resource support to the dynamic Redfish emulator based on static user configuration.

  • Adds generic Indicator LED resource emulation based on static user configuration. Adds IndicatorLED property to Chassis and System resources.

  • Adds Managers resource emulation to dynamic Redfish emulator. Emulated Computer Systems link up automatically to the first of the configured Managers (just one by default).

  • Adds emulation support for Simple Storage resource to libvirt virtualization backend of the dynamic Redfish emulator. The emulation functionality assumes that the storage devices attached to a VM are configured as a libvirt Volume via a storage pool. Devices not configured as a Volume will not be considered for emulation purposes.

  • Adds Storage and Storage Controllers resource support to the dynamic Redfish emulator based on static user configuration.

  • Adds basic Thermal resource emulation under Chassis resource. The Thermal resource is not user-configurable, its contents is mostly static and depends on Jinja2 template. All references between resources are dynamically rendered though.

  • Adds Virtual Media resource.

    As of this release, user can configure a collection of virtual media devices including their types, names and other properties. By default, cdrom and floppy devices are configured.

    Each Manager automatically gets its own instance of the above mentioned virtual media device collection. HTTP/S-hosted images can be inserted into and ejected from virtual media devices.

    If libvirt virtualization backend is being used, once ISO image is inserted into the respective Manager, any System under that Manager can boot from that image by booting from its local cdrom over UEFI.

    The ISO images must be UEFI-bootable or hybrid.

  • Adds Volume resource emulation support.

    As of this release, a user can configure a collection of Volumes including the VolumeType and Capacity. The configured volumes will appear as libvirt volumes in the libvirt virtualization backend of the dynamic Redfish emulator (provided the libvirt pool specified for the volume exists).

    Volume creation via POST request is also supported.

    In case the Openstack backend is used, the NotSupportedError is raised.

Bug Fixes

  • Fixes Flask config file load as pointed by the SUSHY_EMULATOR_CONFIG environment variable when running under WSGI server. Before this fix, the above mentioned environment variable was ignored and user config file not loaded.

0.6.0

Bug Fixes

  • Fixes libvirt domains listing so that both active and inactive domains are rendered as available Systems resource. Before this fix, only inactive domains were listed.

  • Changed HTTP redirect code from 302 to 307 to ensure the original HTTP method is left intact. Otherwise some clients may change PUT/POST to GET on redirect and effectively fail to perform the change they intended.