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 2023-07-18 22:09:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-sushy (Old)
 and      /work/SRC/openSUSE:Factory/.python-sushy.new.3193 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-sushy"

Tue Jul 18 22:09:09 2023 rev:13 rq:1099311 version:4.5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-sushy/python-sushy.changes        
2023-03-07 16:50:14.049552939 +0100
+++ /work/SRC/openSUSE:Factory/.python-sushy.new.3193/python-sushy.changes      
2023-07-18 22:09:40.699510239 +0200
@@ -1,0 +2,12 @@
+Tue Jul 18 16:42:38 UTC 2023 - cloud-de...@suse.de
+
+- update to version 4.5.0
+  - Retry on ilo state error
+  - Update master for stable/2023.1
+  - Update pep8 dep hacking to latest: v6
+  - Exclude all files starting with . from flake8 tests
+  - Add TransferProtocolType for any general error that mentions it
+  - Handle TransferMethod in vmedia insertion
+  - Handle non-default language for registries
+
+-------------------------------------------------------------------

Old:
----
  sushy-4.4.2.tar.gz

New:
----
  sushy-4.5.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-sushy.spec ++++++
--- /var/tmp/diff_new_pack.AF4ORK/_old  2023-07-18 22:09:41.375514018 +0200
+++ /var/tmp/diff_new_pack.AF4ORK/_new  2023-07-18 22:09:41.379514040 +0200
@@ -17,13 +17,13 @@
 
 
 Name:           python-sushy
-Version:        4.4.2
+Version:        4.5.0
 Release:        0
 Summary:        Python library to communicate with Redfish based systems
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://docs.openstack.org/sushy
-Source0:        
https://files.pythonhosted.org/packages/source/s/sushy/sushy-4.4.2.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/s/sushy/sushy-4.5.0.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python3-oslotest
 BuildRequires:  python3-pbr >= 2.0.0
@@ -62,7 +62,7 @@
 This package contains the documentation.
 
 %prep
-%autosetup -p1 -n sushy-4.4.2
+%autosetup -p1 -n sushy-4.5.0
 %py_req_cleanup
 
 %build

++++++ sushy-4.4.2.tar.gz -> sushy-4.5.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/AUTHORS new/sushy-4.5.0/AUTHORS
--- old/sushy-4.4.2/AUTHORS     2023-02-10 17:07:59.000000000 +0100
+++ new/sushy-4.5.0/AUTHORS     2023-05-11 11:12:15.000000000 +0200
@@ -10,6 +10,7 @@
 Bob Fournier <bfour...@redhat.com>
 Christopher Dearborn <christopher.dearb...@dell.com>
 Debayan Ray <debayan....@gmail.com>
+Derek Higgins <der...@redhat.com>
 Dmitry Tantsur <divius.ins...@gmail.com>
 Dmitry Tantsur <dtant...@protonmail.com>
 Doug Hellmann <d...@doughellmann.com>
@@ -23,6 +24,7 @@
 Jacob Anders <jand...@redhat.com>
 James E. Blair <jebl...@redhat.com>
 Javier Pena <jp...@redhat.com>
+Jay Faulkner <j...@jvf.cc>
 John L. Villalovos <john.l.villalo...@intel.com>
 Julia Kreger <juliaashleykre...@gmail.com>
 Kafilat Adeleke <adelekekafilataden...@gmail.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/ChangeLog new/sushy-4.5.0/ChangeLog
--- old/sushy-4.4.2/ChangeLog   2023-02-10 17:07:59.000000000 +0100
+++ new/sushy-4.5.0/ChangeLog   2023-05-11 11:12:15.000000000 +0200
@@ -1,6 +1,17 @@
 CHANGES
 =======
 
+4.5.0
+-----
+
+* Retry on ilo state error
+* Update pep8 dep hacking to latest: v6
+* Handle TransferMethod in vmedia insertion
+* Add TransferProtocolType for any general error that mentions it
+* Exclude all files starting with . from flake8 tests
+* Update master for stable/2023.1
+* Handle non-default language for registries
+
 4.4.2
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/PKG-INFO new/sushy-4.5.0/PKG-INFO
--- old/sushy-4.4.2/PKG-INFO    2023-02-10 17:08:00.087798600 +0100
+++ new/sushy-4.5.0/PKG-INFO    2023-05-11 11:12:15.658070300 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: sushy
-Version: 4.4.2
+Version: 4.5.0
 Summary: Sushy is a small Python library to communicate with Redfish based 
systems
 Home-page: https://docs.openstack.org/sushy/latest/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/releasenotes/notes/handle_transfer_method-a51d5a17e381ebee.yaml 
new/sushy-4.5.0/releasenotes/notes/handle_transfer_method-a51d5a17e381ebee.yaml
--- 
old/sushy-4.4.2/releasenotes/notes/handle_transfer_method-a51d5a17e381ebee.yaml 
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/releasenotes/notes/handle_transfer_method-a51d5a17e381ebee.yaml 
    2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,4 @@
+---
+fixes:
+  - |
+    Add TransferMethod for any general error that mentions it.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/releasenotes/notes/more-transferprotocoltype-739ce8bdedbcb51c.yaml
 
new/sushy-4.5.0/releasenotes/notes/more-transferprotocoltype-739ce8bdedbcb51c.yaml
--- 
old/sushy-4.4.2/releasenotes/notes/more-transferprotocoltype-739ce8bdedbcb51c.yaml
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/releasenotes/notes/more-transferprotocoltype-739ce8bdedbcb51c.yaml
  2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,4 @@
+---
+fixes:
+  - |
+    Add TransferProtocolType for any general error that mentions it
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/releasenotes/notes/non-default-language-registries-f73bdecc98ba2cc8.yaml
 
new/sushy-4.5.0/releasenotes/notes/non-default-language-registries-f73bdecc98ba2cc8.yaml
--- 
old/sushy-4.4.2/releasenotes/notes/non-default-language-registries-f73bdecc98ba2cc8.yaml
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/releasenotes/notes/non-default-language-registries-f73bdecc98ba2cc8.yaml
    2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,7 @@
+---
+fixes:
+  - |
+    In some cases registries might not be available because the
+    our check for the registry language did not account for a
+    possible country suffix. The logic was improved to take it
+    into account.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/releasenotes/notes/retry-ilo-not-ready-error-0b4dce882282eaac.yaml
 
new/sushy-4.5.0/releasenotes/notes/retry-ilo-not-ready-error-0b4dce882282eaac.yaml
--- 
old/sushy-4.4.2/releasenotes/notes/retry-ilo-not-ready-error-0b4dce882282eaac.yaml
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/releasenotes/notes/retry-ilo-not-ready-error-0b4dce882282eaac.yaml
  2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,10 @@
+---
+fixes:
+  - |
+    An issue was encountered on some HPE iLO supported machines where the
+    Baseboard Management Controller would respond with a HTTP 400 error
+    and an error message indicating the requested operation was invalid
+    for the then system state. For example, attempting to change the power
+    state via the BMC shortly after previously changing the power state.
+    We now attempt to retry within the permitted number of retries when
+    this error is encountered.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/releasenotes/source/2023.1.rst 
new/sushy-4.5.0/releasenotes/source/2023.1.rst
--- old/sushy-4.4.2/releasenotes/source/2023.1.rst      1970-01-01 
01:00:00.000000000 +0100
+++ new/sushy-4.5.0/releasenotes/source/2023.1.rst      2023-05-11 
11:11:46.000000000 +0200
@@ -0,0 +1,6 @@
+===========================
+2023.1 Series Release Notes
+===========================
+
+.. release-notes::
+   :branch: stable/2023.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/releasenotes/source/index.rst 
new/sushy-4.5.0/releasenotes/source/index.rst
--- old/sushy-4.4.2/releasenotes/source/index.rst       2023-02-10 
17:07:32.000000000 +0100
+++ new/sushy-4.5.0/releasenotes/source/index.rst       2023-05-11 
11:11:46.000000000 +0200
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   2023.1
    zed
    yoga
    xena
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy/connector.py 
new/sushy-4.5.0/sushy/connector.py
--- old/sushy-4.4.2/sushy/connector.py  2023-02-10 17:07:32.000000000 +0100
+++ new/sushy-4.5.0/sushy/connector.py  2023-05-11 11:11:46.000000000 +0200
@@ -94,12 +94,17 @@
 
     def check_retry_on_exception(self, exception_msg):
         """Checks whether retry on exception is required."""
-        if ('SYS518' in str(exception_msg)):
+        retry = False
+        exc_str = str(exception_msg)
+        if 'SYS518' in exc_str:
             LOG.debug('iDRAC is not yet ready after previous operation. '
-                      'Error: %(err)s', {'err': str(exception_msg)})
-            return True
-        else:
-            return False
+                      'Error: %(err)s', {'err': exc_str})
+            retry = True
+        elif 'iLO.2.15.InvalidOperationForSystemState' in exc_str:
+            LOG.debug('iLO is not ready after previous operation. '
+                      'Error: %(error)s', {'err': exc_str})
+            retry = True
+        return retry
 
     def _op(self, method, path='', data=None, headers=None, blocking=False,
             timeout=60, server_side_retries_left=None,
@@ -226,7 +231,7 @@
                 or self.check_retry_on_exception(e.message))
                     and server_side_retries_left > 0):
                 LOG.warning('Got server side error %s in response to a '
-                            'GET request, retrying after %d seconds. Retries '
+                            'request, retrying after %d seconds. Retries '
                             'left %d.',
                             e, self._server_side_retries_delay,
                             server_side_retries_left)
@@ -239,7 +244,25 @@
                     **extra_session_req_kwargs)
             else:
                 raise
-
+        except exceptions.BadRequestError as e:
+            if (method.lower() != 'get'
+                    and self.check_retry_on_exception(e.message)
+                    and server_side_retries_left > 0):
+                LOG.warning('Server has indicated a BadRequest for %s but '
+                            'the response payload is a known retriable '
+                            'condition and we will retry in %d seconds. '
+                            'Retries left  %d.',
+                            e, self._server_side_retries_delay,
+                            server_side_retries_left)
+                time.sleep(self._server_side_retries_delay)
+                server_side_retries_left -= 1
+                return self._op(
+                    method, path, data=data, headers=headers,
+                    blocking=blocking, timeout=timeout,
+                    server_side_retries_left=server_side_retries_left,
+                    **extra_session_req_kwargs)
+            else:
+                raise
         if blocking and response.status_code == 202:
             if not response.headers.get('Location'):
                 m = ('HTTP response for %(method)s request to %(url)s '
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy/resources/base.py 
new/sushy-4.5.0/sushy/resources/base.py
--- old/sushy-4.4.2/sushy/resources/base.py     2023-02-10 17:07:32.000000000 
+0100
+++ new/sushy-4.5.0/sushy/resources/base.py     2023-05-11 11:11:46.000000000 
+0200
@@ -594,7 +594,12 @@
         for key, registry in registries.items():
             if (registry
                     and self._attribute_registry in (key, registry.identity)):
-                if language != registry.language:
+                # NOTE(iurygregory): some registries may have "en-US"
+                # as their language, in this case we can check if the
+                # registry language starts with the requested language.
+                registry_language = registry.language.lower().split('-', 1)[0]
+                if (language != registry.language
+                        and language.lower() != registry_language):
                     LOG.debug('Found %(descr)s but its language %(reg_lang)s '
                               'does not match the requested %(lang)s',
                               {'descr': description,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy/resources/manager/virtual_media.py 
new/sushy-4.5.0/sushy/resources/manager/virtual_media.py
--- old/sushy-4.4.2/sushy/resources/manager/virtual_media.py    2023-02-10 
17:07:32.000000000 +0100
+++ new/sushy-4.5.0/sushy/resources/manager/virtual_media.py    2023-05-11 
11:11:46.000000000 +0200
@@ -111,12 +111,26 @@
 
         Try to determine if it happened due to missing TransferProtocolType.
         """
+        if (error.code.endswith('GeneralError')
+           and 'TransferProtocolType' in error.detail):
+            return True
+
         return (
             (error.code.endswith(".ActionParameterMissing")
              or error.code.endswith(".PropertyMissing"))
             and "#/TransferProtocolType" in error.related_properties
         )
 
+    def is_transfer_method_required(self, error=None):
+        """Check the response code and body and in case of failure
+
+        Try to determine if it happened due to missing TransferMethod
+        """
+        if (error.code.endswith('GeneralError')
+                and 'TransferMethod' in error.detail):
+            return True
+        return False
+
     def insert_media(self, image, inserted=True, write_protected=True,
                      username=None, password=None, transfer_method=None):
         """Attach remote media to virtual media
@@ -182,7 +196,18 @@
                         payload['TransferProtocolType'] = "HTTPS"
                     elif payload['Image'].startswith('http://'):
                         payload['TransferProtocolType'] = "HTTP"
-                    self._conn.post(target_uri, data=payload)
+
+                    # NOTE (iurygregory) we try to handle the case where a
+                    # a TransferMethod is also required in the payload.
+                    try:
+                        self._conn.post(target_uri, data=payload)
+                    except exceptions.HTTPError as error2:
+                        if self.is_transfer_method_required(error2):
+                            payload['TransferMethod'] = "Stream"
+                            self._conn.post(target_uri, data=payload)
+                        else:
+                            raise
+
                 else:
                     raise
         self.invalidate()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/resources/registry/message_registry_file.py 
new/sushy-4.5.0/sushy/resources/registry/message_registry_file.py
--- old/sushy-4.4.2/sushy/resources/registry/message_registry_file.py   
2023-02-10 17:07:32.000000000 +0100
+++ new/sushy-4.5.0/sushy/resources/registry/message_registry_file.py   
2023-05-11 11:11:46.000000000 +0200
@@ -119,8 +119,14 @@
         # NOTE (etingof): as per RFC5646, languages are case-insensitive
         language = language.lower()
 
+        # NOTE(iurygregory): some registries may have "en-US" as their
+        # language, in this case we can check if the registry language
+        # starts with the requested language.
         locations = [
-            l for l in self.location if l.language.lower() == language]
+            l for l in self.location
+            if l.language.lower().split('-', 1)[0] == language
+            or l.language == language
+        ]
 
         locations += [
             l for l in self.location if l.language.lower() == 'default']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/json_samples/bios_attribute_registry_file_zthardware.json
 
new/sushy-4.5.0/sushy/tests/unit/json_samples/bios_attribute_registry_file_zthardware.json
--- 
old/sushy-4.4.2/sushy/tests/unit/json_samples/bios_attribute_registry_file_zthardware.json
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/sushy/tests/unit/json_samples/bios_attribute_registry_file_zthardware.json
  2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,19 @@
+{
+  "@odata.context": 
"/redfish/v1/$metadata#MessageRegistryFile.MessageRegistryFile",
+  "@odata.etag": "\"1642688165\"",
+  "@odata.id": "/redfish/v1/Registries/BiosAttributeRegistryProt0.208.208.0",
+  "@odata.type": "#MessageRegistryFile.v1_1_3.MessageRegistryFile",
+  "Description": "Registry for BiosAttributeRegistryProt0.208.208.0",
+  "Id": "BiosAttributeRegistryProt0.208.208.0",
+  "Languages": [
+    "en-US"
+  ],
+  "Location": [
+    {
+      "Language": "en-US",
+      "Uri": "/redfish/v1/Registries/BiosAttributeRegistryProt0.208.208.0.json"
+    }
+  ],
+  "Name": "BiosAttributeRegistryProt0.208.208.0 Registry",
+  "Registry": "BiosAttributeRegistryProt0.208.208.0"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/json_samples/bios_attribute_registry_zthardware.json
 
new/sushy-4.5.0/sushy/tests/unit/json_samples/bios_attribute_registry_zthardware.json
--- 
old/sushy-4.4.2/sushy/tests/unit/json_samples/bios_attribute_registry_zthardware.json
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/sushy/tests/unit/json_samples/bios_attribute_registry_zthardware.json
       2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,75 @@
+{
+  "RegistryVersion": "208.208.0",
+  "OwningEntity": "AMI",
+  "Name": "Prot0 BIOS Attribute Registry",
+  "@odata.context": 
"/redfish/v1/$metadata#AttributeRegistry.AttributeRegistry",
+  "RegistryEntries": {
+    "Dependencies": [
+      {
+        "Type": "Map",
+        "DependencyFor": "ACPI004",
+        "Dependency": {
+          "MapToValue": "true",
+          "MapToProperty": "Hidden",
+          "MapFrom": [
+            {
+              "MapFromValue": true,
+              "MapFromProperty": "CurrentValue",
+              "MapFromAttribute": "ACPI004",
+              "MapFromCondition": "EQU"
+            }
+          ],
+          "MapToAttribute": "ACPI002"
+        }
+      }
+    ],
+    "Attributes": [
+      {
+        "DefaultValue": "Enable",
+        "UefiNamespaceId": "x-UEFI-AMI",
+        "DisplayName": "TPM SUPPORT",
+        "HelpText": "Enables or Disables BIOS support for security device. 
O.S. will not show Security Device. TCG EFI protocol and INT1A interface will 
not be available.",
+        "AttributeName": "TCG003",
+        "Value": [
+          {
+            "ValueName": "Disable",
+            "ValueDisplayName": "Disable"
+          },
+          {
+            "ValueName": "Enable",
+            "ValueDisplayName": "Enable"
+          }
+        ],
+        "ReadOnly": false,
+        "ResetRequired": true,
+        "Type": "Enumeration"
+      },
+      {
+        "DefaultValue": "Disabled",
+        "UefiNamespaceId": "x-UEFI-AMI",
+        "DisplayName": "  Disable Block Sid",
+        "HelpText": "  Override to allow SID authentication in TCG Storage 
device",
+        "AttributeName": "TCG023",
+        "Value": [
+          {
+            "ValueName": "Enabled",
+            "ValueDisplayName": "Enabled"
+          },
+          {
+            "ValueName": "Disabled",
+            "ValueDisplayName": "Disabled"
+          }
+        ],
+        "ReadOnly": false,
+        "ResetRequired": true,
+        "Type": "Enumeration"
+      }
+    ]
+  },
+  "@odata.type": "#AttributeRegistry.v1_3_1.AttributeRegistry",
+  "@odata.id": 
"/redfish/v1/Registries/BiosAttributeRegistryProt0.208.208.0.json",
+  "Language": "en-US",
+  "@odata.etag": "\"1627746301\"",
+  "Id": "BiosAttributeRegistryProt0.208.208.0",
+  "Description": "This registry defines a representation of BIOS Attribute 
instances"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/json_samples/bios_zt.json 
new/sushy-4.5.0/sushy/tests/unit/json_samples/bios_zt.json
--- old/sushy-4.4.2/sushy/tests/unit/json_samples/bios_zt.json  1970-01-01 
01:00:00.000000000 +0100
+++ new/sushy-4.5.0/sushy/tests/unit/json_samples/bios_zt.json  2023-05-11 
11:11:46.000000000 +0200
@@ -0,0 +1,400 @@
+{
+  "@odata.context": "/redfish/v1/$metadata#Bios.Bios",
+  "@odata.etag": "\"1676250921\"",
+  "@odata.id": "/redfish/v1/Systems/Self/Bios",
+  "@odata.type": "#Bios.v1_1_0.Bios",
+  "Actions": {
+    "#Bios.ChangePassword": {
+      "@Redfish.ActionInfo": 
"/redfish/v1/Systems/Self/Bios/ChangePasswordActionInfo",
+      "target": "/redfish/v1/Systems/Self/Bios/Actions/Bios.ChangePassword"
+    },
+    "#Bios.ResetBios": {
+      "@Redfish.ActionInfo": 
"/redfish/v1/Systems/Self/Bios/ResetBiosActionInfo",
+      "target": "/redfish/v1/Systems/Self/Bios/Actions/Bios.ResetBios"
+    },
+    "#ZtVga.ChangeState": {
+      "@Redfish.ActionInfo": 
"/redfish/v1/Systems/Self/Bios/ChangeStateActionInfo",
+      "target": "/redfish/v1/Systems/Self/Bios/Actions/ZtVga.ChangeState"
+    }
+  },
+  "AttributeRegistry": "BiosAttributeRegistryProt0.208.208.0",
+  "Attributes": {
+    "ACPI002": false,
+    "ACPI004": false,
+    "CRCS005": "Disable",
+    "CSM000": "Force BIOS",
+    "CSM001": "Immediate",
+    "CSM002": "Upon Request",
+    "CSM005": "Disabled",
+    "CSM006": "UEFI only",
+    "CSM007": "UEFI",
+    "CSM008": "UEFI",
+    "CSM009": "UEFI",
+    "CSM010": "UEFI",
+    "CSM011": "Adjust",
+    "GSIO020": false,
+    "GSIO201": false,
+    "GSIO202": true,
+    "GSIO607": "IO=2F8h; IRQ=3,4,5,6,7,9,10,11,12;",
+    "GSIO608": "IO=3F8h; IRQ=3,4,5,6,7,9,10,11,12;",
+    "IIOS001": "Yes",
+    "IIOS002": "No",
+    "IIOS1FE": "Enable",
+    "IPMI000": "Enabled",
+    "IPMI001": "No",
+    "IPMI002": "Do Nothing",
+    "IPMI003": "Error code",
+    "IPMI100": "Enabled",
+    "IPMI101": 20,
+    "IPMI102": "Reset",
+    "IPMI103": "Disabled",
+    "IPMI104": 10,
+    "IPMI105": "Reset",
+    "IPMI200": "Yes, On every reset",
+    "IPMI201": "Clear Log",
+    "IPMI400": "Disabled",
+    "IPMI500": "Unspecified",
+    "IPMI501": "...",
+    "IPMI502": "...",
+    "IPMI503": "0.0.0.0",
+    "IPMI504": "00-00-00-00-00-00",
+    "IPMI505": "Unspecified",
+    "IPMI506": "...",
+    "IPMI507": "...",
+    "IPMI508": "0.0.0.0",
+    "IPMI509": "00-00-00-00-00-00",
+    "IPMI510": "Enabled",
+    "IPMI511": "Unspecified",
+    "IPMI512": ":::::::",
+    "IPMI513": 0,
+    "IPMI514": ":::::::",
+    "IPMI515": "Enabled",
+    "IPMI516": "Unspecified",
+    "IPMI517": ":::::::",
+    "IPMI518": 0,
+    "IPMI519": ":::::::",
+    "IPMI520": 0,
+    "IPMI521": ":::::::",
+    "IPMI522": "Unspecified",
+    "IPMI523": 0,
+    "IPMI524": ":::::::",
+    "IPMI525": "Unspecified",
+    "IPMI600": "Enabled",
+    "IPMI601": "Enabled",
+    "IPMI800": "",
+    "IPMI801": "",
+    "IPMI802": "Disable",
+    "IPMI803": 0,
+    "IPMI804": "No Access",
+    "IPMI805": "",
+    "IPMI807": "",
+    "IPMI809": "",
+    "IPMI810": "Disable",
+    "IPMI811": 0,
+    "IPMI812": "No Access",
+    "IPMI900": "Unspecified",
+    "IRCS001": "Auto",
+    "KTIS001": "Auto",
+    "KTIS002": 0,
+    "KTIS003": 0,
+    "KTIS004": "Auto",
+    "KTIS005": "Auto",
+    "KTIS006": "Auto",
+    "KTIS007": "Enable",
+    "MDFX001": "PMem Management Driver",
+    "MDFX002": "Enabled",
+    "MDFX003": "Enabled",
+    "MDFX004": "Disable",
+    "MDFX005": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX006": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX007": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX008": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX009": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX00A": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX00B": "VOL:100% PMEM:0% AD-WB:0%",
+    "MDFX00C": "VOL:100% PMEM:0% AD-WB:0%",
+    "MEMS001": "POR",
+    "MEMS002": "Soft PPR",
+    "MEMS003": "Disable",
+    "MEMS004": "Auto",
+    "MEMS005": "Auto",
+    "MEMS006": "Auto",
+    "MEMS007": "2LM",
+    "MEMS008": "4KB Target, 256B Channel (4KB across CPU sockets, 256B across 
MCs within socket, 256B across channels within MCs)",
+    "MEMS00B": "2-way Interleave",
+    "MEMS00C": "Disabled",
+    "MEMS00D": "Disabled",
+    "MEMS00E": 100,
+    "MEMS00F": "Disabled",
+    "MEMS010": "Enable at End of POST",
+    "MESS001": "Disable",
+    "MESS002": 32768,
+    "NVLCK002": "Enable",
+    "NWSK000": "Enabled",
+    "NWSK001": "Enabled",
+    "NWSK002": "Disabled",
+    "NWSK004": 120,
+    "NWSK005": 1,
+    "NWSK006": "Disabled",
+    "NWSK007": "Disabled",
+    "OROM001": true,
+    "OROM002": true,
+    "OROM990": true,
+    "OROM991": true,
+    "OROM992": true,
+    "OROM993": true,
+    "OROM994": true,
+    "OROM995": true,
+    "OROM996": true,
+    "OROM998": true,
+    "OROM999": true,
+    "PCHS001": "Enable",
+    "PCHS002": "AHCI",
+    "PCHS005": "Enable",
+    "PCHS006": "AHCI",
+    "PCHS009": "Disable",
+    "PCHS00A": "Enable",
+    "PCHS00B": "Enable",
+    "PCHS00C": "Enable",
+    "PCHS00D": "Enable",
+    "PCHS00E": "Enable",
+    "PCHS00F": "Enable",
+    "PCHS010": "Enable",
+    "PCHS011": "Enable",
+    "PCHS012": "Enable",
+    "PCHS013": "Enable",
+    "PCHS014": "Enable",
+    "PCHS015": "Enable",
+    "PCHS016": "Enable",
+    "PCHS017": "Enable",
+    "PCHS018": "Enable",
+    "PCHS019": "Enable",
+    "PCHS01A": "Enable",
+    "PCHS01B": "Enable",
+    "PCHS01C": "Enable",
+    "PCHS01D": "Enable",
+    "PCHS01E": "Enable",
+    "PCHS01F": "Enable",
+    "PCHS020": "Enable",
+    "PCHS021": "Enable",
+    "PCIS001": "32 PCI Bus Clocks",
+    "PCIS002": "64 PCI Bus Clocks",
+    "PCIS003": "Disabled",
+    "PCIS004": "Disabled",
+    "PCIS005": "Disabled",
+    "PCIS006": "Enabled",
+    "PCIS007": "Enabled",
+    "PCIS008": "Enabled",
+    "PCIS009": "Disabled",
+    "PCIS010": "Enabled",
+    "PCIS011": "Auto",
+    "PCIS012": "Auto",
+    "PCIS013": "Disabled",
+    "PCIS014": "Disabled",
+    "PCIS015": "5",
+    "PCIS016": 1000,
+    "PCIS017": "Keep Link ON",
+    "PCIS018": "Disabled",
+    "PCIS020": "Disabled",
+    "PCIS021": "Disabled",
+    "PCIS022": "Disabled",
+    "PCIS023": "Disabled",
+    "PCIS024": "Disabled",
+    "PCIS025": "Disabled",
+    "PCIS026": "Disabled",
+    "PCIS027": "Auto",
+    "PCIS028": "Disabled",
+    "PCIS029": "Disabled",
+    "PCIS030": "Enabled",
+    "PCIS031": "Enabled",
+    "PCIS032": "Disabled",
+    "PCIS033": "Disabled",
+    "PMS001": "Enable",
+    "PMS002": "Enable",
+    "PMS003": "Native Mode with No Legacy Support",
+    "PMS005": "Enable",
+    "PMS006": "Disable",
+    "PMS007": "C0/C1 state",
+    "PMS008": "BIOS Controls EPB",
+    "PMS009": "OS controls EPB",
+    "PMS00A": "Performance",
+    "PMS00B": "Enable",
+    "PMS00C": 0,
+    "PMS00D": 1,
+    "PMS00E": "Enable",
+    "PMS00F": 0,
+    "PMS010": 1,
+    "PMS011": "Level 2",
+    "PMS012": "Disable",
+    "PMS013": "I/O sensitive",
+    "PMS014": "Disable",
+    "PMS015": 17,
+    "PMS016": "HW_ALL",
+    "PMS017": "Max Performance",
+    "PMS018": "Enable",
+    "PMS019": "512 Heavy",
+    "PMS01A": "Disable",
+    "PMS01B": "Disable",
+    "PMS01C": "Disable",
+    "PMS01D": "Disable",
+    "PMS01E": "Disable",
+    "PMS01F": "ACPI C2",
+    "PMS020": "Disable",
+    "PMS021": "Disable",
+    "PMS022": "Disable",
+    "PMS023": "0 us",
+    "PRSS001": 0,
+    "PRSS002": 0,
+    "PRSS003": 0,
+    "PRSS004": 0,
+    "PRSS011": "Enable",
+    "PRSS013": "Disable",
+    "PRSS014": "Enable",
+    "PRSS015": "Enable",
+    "PRSS016": "Enable",
+    "PRSS017": "Enable",
+    "PRSS018": "Enable",
+    "PRSS019": "Enable",
+    "PRSS01A": "Enable",
+    "PRSS01B": "Normal",
+    "PRSS01C": "Enable",
+    "PRSS01D": "Enable",
+    "REDF000": "Enabled",
+    "REDF001": "Basic Authentication",
+    "REDF002": "169.254.0.17",
+    "REDF003": "255.255.0.0",
+    "REDF004": 443,
+    "RFWCS030": "Disabled",
+    "SECB001": "Disabled",
+    "SECB002": "Custom",
+    "SECB008": "Enabled",
+    "SELS001": "Enable",
+    "SELS002": "Enable",
+    "SELS003": "Disable",
+    "SELS004": "Disable",
+    "SELS005": "Disable",
+    "SELS006": "EMCA gen 2 CSMI",
+    "SELS007": "EMCA gen 2 - MSMI",
+    "SELS008": "Enable",
+    "SELS009": "Enable",
+    "SELS00A": "Enable",
+    "SELS00C": "Enable",
+    "SELS00D": "Enable",
+    "SELS00E": "Enable",
+    "SELS00F": "Enable",
+    "SELS010": "Enable",
+    "SELS011": "Enable",
+    "SELS012": "Enable",
+    "SELS013": "Enable",
+    "SELS014": "Enable",
+    "SELS015": "Enable",
+    "SELS016": 1,
+    "SELS017": "Enable",
+    "SELS018": "Enable",
+    "SELS019": "Enable",
+    "SELS01A": "Enable",
+    "SETUP001": "",
+    "SETUP002": "",
+    "SETUP003": 1,
+    "SETUP004": "On",
+    "SETUP005": false,
+    "SETUP006": "Red Hat Enterprise Linux,0x000B,true;UEFI: AMI Virtual CDROM0 
1.00,0x000A,true;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0001,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0002,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0003,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0004,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0005,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0006,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0007,false;UEFI: PXE IPv4 Intel(R) Ethernet Network Adapter 
E810-XXV-4,0x0008,false;UEFI: Built-in EFI Shell,0x0009,false;",
+    "TCG001": "Enabled",
+    "TCG002": "Enabled",
+    "TCG003": "Enable",
+    "TCG004": "Enable",
+    "TCG006": "None",
+    "TCG007": "None",
+    "TCG010": "TCG_2",
+    "TCG011": "Enabled",
+    "TCG012": "Enabled",
+    "TCG013": "Enabled",
+    "TCG014": "TIS",
+    "TCG016": "Auto",
+    "TCG017": "Enabled",
+    "TCG018": "Enabled",
+    "TCG019": "Disabled",
+    "TCG020": "Disabled",
+    "TCG021": "Disabled",
+    "TCG022": "1.3",
+    "TCG023": "Disabled",
+    "TER001": false,
+    "TER002": true,
+    "TER0020": "115200",
+    "TER0021": "115200",
+    "TER0022": "115200",
+    "TER010": false,
+    "TER011": "VT-UTF8",
+    "TER012": "VT100",
+    "TER013": "VT100",
+    "TER030": "8",
+    "TER031": "8",
+    "TER03F": "None",
+    "TER040": "None",
+    "TER04E": "1",
+    "TER04F": "1",
+    "TER05C": "None",
+    "TER05D": "None",
+    "TER05E": "None",
+    "TER06B": "COM1",
+    "TER06D": false,
+    "TER06c": false,
+    "TER07A": "80x24",
+    "TER07B": true,
+    "TER07C": true,
+    "TER089": false,
+    "TER08A": false,
+    "TER098": "VT100",
+    "TER099": "VT100",
+    "TER0A7": "Always Enable",
+    "TER0A8": "COM1",
+    "USB000": "Enabled",
+    "USB001": "Enabled",
+    "USB002": "Enabled",
+    "USB003": "Enabled",
+    "USB004": "Disabled",
+    "USB009": "20 sec",
+    "USB00A": "20 sec",
+    "USB00B": "Auto",
+    "USB00C": 5,
+    "USB00D": "Enabled",
+    "USB00E": "HiSpeed",
+    "USB00F": "Enabled",
+    "USB011": "Auto",
+    "USB012": "Auto",
+    "USB013": "Auto",
+    "USB014": "Auto",
+    "USB015": "Auto",
+    "USB016": "Auto",
+    "USB017": "Auto",
+    "USB018": "Auto",
+    "USB019": "Auto",
+    "USB01A": "Auto",
+    "USB01B": "Auto",
+    "USB01C": "Auto",
+    "USB01D": "Auto",
+    "USB01E": "Auto",
+    "USB01F": "Auto",
+    "USB020": "Auto",
+    "USB021": "Auto",
+    "USB022": "Auto",
+    "USB023": "Auto",
+    "USB024": "Auto",
+    "USB025": "Auto",
+    "USB026": "Auto",
+    "USB027": "Auto",
+    "USB028": "Auto",
+    "USB029": "Auto",
+    "USB02A": "Auto",
+    "USB02B": "Auto",
+    "USB02C": "Auto",
+    "USB02D": "Auto",
+    "USB02E": "Auto",
+    "USB02F": "Auto",
+    "USB030": "Auto"
+  },
+  "Description": "Current BIOS Settings",
+  "Id": "Bios",
+  "Name": "Current BIOS Settings",
+  "VgaState": "Enable"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/json_samples/transfer_method_required_error.json
 
new/sushy-4.5.0/sushy/tests/unit/json_samples/transfer_method_required_error.json
--- 
old/sushy-4.4.2/sushy/tests/unit/json_samples/transfer_method_required_error.json
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/sushy/tests/unit/json_samples/transfer_method_required_error.json
   2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,16 @@
+{
+  "error": {
+    "code": "Base.1.4.0.GeneralError",
+    "message": "See ExtendedInfo for more information.",
+    "@Message.ExtendedInfo": [
+      {
+        "@odata.type": "Message.v1_0_6.Message",
+        "MessageId": "Base.1.4.0.GeneralError",
+        "Message": "'TransferMethod' property which is mandatory to complete 
the action is missing in the request body.",
+        "MessageArgs": [],
+        "Severity": "Critical"
+      }
+    ]
+  }
+}
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/json_samples/transfer_proto_required_error2.json
 
new/sushy-4.5.0/sushy/tests/unit/json_samples/transfer_proto_required_error2.json
--- 
old/sushy-4.4.2/sushy/tests/unit/json_samples/transfer_proto_required_error2.json
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/sushy-4.5.0/sushy/tests/unit/json_samples/transfer_proto_required_error2.json
   2023-05-11 11:11:46.000000000 +0200
@@ -0,0 +1,16 @@
+{
+  "error": {
+    "code": "Base.1.4.0.GeneralError",
+    "message": "See ExtendedInfo for more information.",
+    "@Message.ExtendedInfo": [
+      {
+        "@odata.type": "Message.v1_0_6.Message",
+        "MessageId": "Base.1.4.0.GeneralError",
+        "Message": "'TransferProtocolType' property which is mandatory to 
complete the action is missing in the request body.",
+        "MessageArgs": [],
+        "Severity": "Critical"
+      }
+    ]
+  }
+}
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/resources/manager/test_virtual_media.py 
new/sushy-4.5.0/sushy/tests/unit/resources/manager/test_virtual_media.py
--- old/sushy-4.4.2/sushy/tests/unit/resources/manager/test_virtual_media.py    
2023-02-10 17:07:32.000000000 +0100
+++ new/sushy-4.5.0/sushy/tests/unit/resources/manager/test_virtual_media.py    
2023-05-11 11:11:46.000000000 +0200
@@ -186,7 +186,7 @@
         retval = self.sys_virtual_media.is_transfer_protocol_required(error)
         self.assertTrue(retval)
 
-    def test_is_transfer_protocol_required_alt_code(self):
+    def test_is_transfer_protocol_required_alt(self):
         with open('sushy/tests/unit/json_samples/'
                   'transfer_proto_required_error.json') as f:
             response_obj = json.load(f)
@@ -197,6 +197,26 @@
         retval = self.sys_virtual_media.is_transfer_protocol_required(error)
         self.assertTrue(retval)
 
+    def test_is_transfer_protocol_required_alt2(self):
+        with open('sushy/tests/unit/json_samples/'
+                  'transfer_proto_required_error2.json') as f:
+            response_obj = json.load(f)
+        response = mock.Mock(spec=['json', 'status_code'])
+        response.json.return_value = response_obj
+        error = exceptions.HTTPError('GET', 'VirtualMedia', response)
+        retval = self.sys_virtual_media.is_transfer_protocol_required(error)
+        self.assertTrue(retval)
+
+    def test_is_transfer_method_required(self):
+        with open('sushy/tests/unit/json_samples/'
+                  'transfer_method_required_error.json') as f:
+            response_obj = json.load(f)
+        response = mock.Mock(spec=['json', 'status_code'])
+        response.json.return_value = response_obj
+        error = exceptions.HTTPError('POST', 'VirtualMedia', response)
+        retval = self.sys_virtual_media.is_transfer_method_required(error)
+        self.assertTrue(retval)
+
     def test_eject_media_none(self):
         self.sys_virtual_media._actions.eject_media = None
         self.assertRaisesRegex(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/resources/registry/test_attribute_registry.py 
new/sushy-4.5.0/sushy/tests/unit/resources/registry/test_attribute_registry.py
--- 
old/sushy-4.4.2/sushy/tests/unit/resources/registry/test_attribute_registry.py  
    2023-02-10 17:07:32.000000000 +0100
+++ 
new/sushy-4.5.0/sushy/tests/unit/resources/registry/test_attribute_registry.py  
    2023-05-11 11:11:46.000000000 +0200
@@ -67,3 +67,41 @@
                           {'ValueDisplayName': 'Disabled',
                            'ValueName': 'Disabled'}],
                          attributes.allowable_values)
+
+    def test__parse_attributes_zt(self):
+        self.conn = mock.Mock()
+        with open('sushy/tests/unit/json_samples/'
+                  'bios_attribute_registry_zthardware.json') as f:
+            self.json_doc = json.load(f)
+
+        self.conn.get.return_value.json.return_value = self.json_doc
+        self.registry = attribute_registry.AttributeRegistry(
+            self.conn,
+            '/redfish/v1/Registries/'
+            'BiosAttributeRegistryProt0.208.208.0.json',
+            redfish_version='1.0.2')
+
+        self.registry._parse_attributes(self.json_doc)
+        self.assertEqual('BiosAttributeRegistryProt0.208.208.0',
+                         self.registry.identity)
+        self.assertEqual('Prot0 BIOS Attribute Registry', self.registry.name)
+        self.assertEqual('en-US', self.registry.language)
+        self.assertEqual('This registry defines a representation of '
+                         'BIOS Attribute instances',
+                         self.registry.description)
+        self.assertEqual('208.208.0', self.registry.registry_version)
+        self.assertEqual('AMI', self.registry.owning_entity)
+
+        attributes = self.registry.registry_entries.attributes[0]
+        self.assertEqual('TCG003', attributes.name)
+        self.assertEqual('TPM SUPPORT', attributes.display_name)
+        self.assertEqual('Enable', attributes.default_value)
+        self.assertIsNone(attributes.immutable)
+        self.assertEqual(False, attributes.read_only)
+        self.assertEqual('Enumeration', attributes.attribute_type)
+        self.assertEqual(True, attributes.reset_required)
+        self.assertEqual([{'ValueDisplayName': 'Disable',
+                           'ValueName': 'Disable'},
+                          {'ValueDisplayName': 'Enable',
+                           'ValueName': 'Enable'}],
+                         attributes.allowable_values)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/sushy-4.4.2/sushy/tests/unit/resources/system/test_bios.py 
new/sushy-4.5.0/sushy/tests/unit/resources/system/test_bios.py
--- old/sushy-4.4.2/sushy/tests/unit/resources/system/test_bios.py      
2023-02-10 17:07:32.000000000 +0100
+++ new/sushy-4.5.0/sushy/tests/unit/resources/system/test_bios.py      
2023-05-11 11:11:46.000000000 +0200
@@ -341,3 +341,89 @@
         self.sys_bios._attribute_registry = "Unknown"
         registry = self.sys_bios.get_attribute_registry()
         self.assertIsNone(registry)
+
+
+class BiosZTTestCase(base.TestCase):
+
+    def setUp(self):
+        super(BiosZTTestCase, self).setUp()
+        self.conn = mock.Mock()
+        with open('sushy/tests/unit/json_samples/bios_zt.json') as f:
+            self.bios_json = json.load(f)
+        # NOTE(iurygregory): ZT Hardware doesn't have Settings for Bios.
+
+        self.conn.get.return_value.json.side_effect = [self.bios_json]
+
+        registries = {}
+        conn = mock.Mock()
+        # Note(iurygregory): re-use message registry for now.
+        with open('sushy/tests/unit/json_samples/message_registry.json') as f:
+            conn.get.return_value.json.return_value = json.load(f)
+            msg_reg = message_registry.MessageRegistry(
+                conn, '/redfish/v1/Registries/Test',
+                redfish_version='1.0.2')
+
+            registries['Test.1.0'] = msg_reg
+
+        with open('sushy/tests/unit/json_samples/'
+                  'bios_attribute_registry_zthardware.json') as f:
+            conn.get.return_value.json.return_value = json.load(f)
+            self.bios_reg = attribute_registry.AttributeRegistry(
+                conn,
+                '/redfish/v1/Registries/BiosAttributeRegistryProt0.208.208.0',
+                redfish_version='1.3.1')
+
+            registries['BiosAttributeRegistryProt0.208.208.0'] = self.bios_reg
+
+        self.sys_bios = bios.Bios(
+            self.conn, '/redfish/v1/Systems/Self/Bios',
+            registries=registries,
+            redfish_version='1.0.2')
+
+    def test__parse_attributes(self):
+        self.sys_bios._parse_attributes(self.bios_json)
+        self.assertEqual('1.0.2', self.sys_bios.redfish_version)
+        self.assertEqual('Bios', self.sys_bios.identity)
+        self.assertEqual('Current BIOS Settings',
+                         self.sys_bios.name)
+        self.assertEqual(self.sys_bios.description,
+                         'Current BIOS Settings')
+        self.assertEqual('BiosAttributeRegistryProt0.208.208.0',
+                         self.sys_bios._attribute_registry)
+
+    def test_get_attribute_registry_no_lang(self):
+
+        registry = self.sys_bios.get_attribute_registry(language='zh')
+        self.assertIsNone(registry)
+
+    def test_get_attribute_registry(self):
+
+        registry = self.sys_bios.get_attribute_registry(language="en")
+        registry2 = self.sys_bios.get_attribute_registry(language="en-US")
+
+        self.assertEqual(registry.name, 'Prot0 BIOS Attribute Registry')
+        self.assertEqual(registry.description, 'This registry defines a '
+                         'representation of BIOS Attribute instances')
+        self.assertEqual(registry.language, 'en-US')
+        self.assertEqual(registry.registry_entries.attributes[0].name,
+                         'TCG003')
+        self.assertEqual(registry.registry_entries.attributes[0].display_name,
+                         'TPM SUPPORT')
+        self.assertEqual(registry.registry_entries.attributes[0].read_only,
+                         False)
+        self.assertEqual(registry.registry_entries.attributes[0].
+                         attribute_type, 'Enumeration')
+
+        self.assertEqual(registry.name, registry2.name)
+        self.assertEqual(registry.description, registry2.description)
+        self.assertEqual(registry.language, registry2.language)
+        self.assertEqual(registry.registry_entries.attributes[0].name,
+                         registry2.registry_entries.attributes[0].name)
+        self.assertEqual(registry.registry_entries.attributes[0].display_name,
+                         registry2.registry_entries.attributes[0].display_name)
+        self.assertEqual(registry.registry_entries.attributes[0].read_only,
+                         registry2.registry_entries.attributes[0].read_only)
+        self.assertEqual(registry.registry_entries.attributes[0].
+                         attribute_type,
+                         registry2.registry_entries.attributes[0].
+                         attribute_type)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy/tests/unit/test_connector.py 
new/sushy-4.5.0/sushy/tests/unit/test_connector.py
--- old/sushy-4.4.2/sushy/tests/unit/test_connector.py  2023-02-10 
17:07:32.000000000 +0100
+++ new/sushy-4.5.0/sushy/tests/unit/test_connector.py  2023-05-11 
11:11:46.000000000 +0200
@@ -445,6 +445,43 @@
         self.assertEqual(0, mock_sleep.call_count)
         self.assertEqual(1, self.request.call_count)
 
+    @mock.patch('time.sleep', autospec=True)
+    def test_op_retry_on_server_400_ilo_not_ready(self, mock_sleep):
+        response_info = {"error": {"@Message.ExtendedInfo": [
+            {'MessageId': 'iLO.2.15.InvalidOperationForSystemState'}]}}
+        mock_error = mock.Mock()
+        mock_error.status_code = 400
+        mock_error.json.return_value = response_info
+        self.request.return_value.status_code = (
+            http_client.INTERNAL_SERVER_ERROR)
+        self.request.return_value.json.side_effect =\
+            exceptions.ServerSideError(
+                method='DELETE', url='http://foo.bar', response=mock_error)
+
+        self.assertRaises(exceptions.ServerSideError, self.conn._op, 'DELETE',
+                          'http://foo.bar')
+        self.assertEqual(10, mock_sleep.call_count)
+        self.assertEqual(11, self.request.call_count)
+
+    @mock.patch('time.sleep', autospec=True)
+    def test_op_retry_on_server_400_ilo_not_ready_other_error(self,
+                                                              mock_sleep):
+        response_info = {"error": {"@Message.ExtendedInfo": [
+            {'MessageId': 'iLO.Invalid'}]}}
+        mock_error = mock.Mock()
+        mock_error.status_code = 400
+        mock_error.json.return_value = response_info
+        self.request.return_value.status_code = (
+            http_client.INTERNAL_SERVER_ERROR)
+        self.request.return_value.json.side_effect =\
+            exceptions.ServerSideError(
+                method='DELETE', url='http://foo.bar', response=mock_error)
+
+        self.assertRaises(exceptions.ServerSideError, self.conn._op, 'DELETE',
+                          'http://foo.bar')
+        self.assertEqual(0, mock_sleep.call_count)
+        self.assertEqual(1, self.request.call_count)
+
     def test_access_error(self):
         self.conn._auth = None
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy.egg-info/PKG-INFO 
new/sushy-4.5.0/sushy.egg-info/PKG-INFO
--- old/sushy-4.4.2/sushy.egg-info/PKG-INFO     2023-02-10 17:07:59.000000000 
+0100
+++ new/sushy-4.5.0/sushy.egg-info/PKG-INFO     2023-05-11 11:12:15.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: sushy
-Version: 4.4.2
+Version: 4.5.0
 Summary: Sushy is a small Python library to communicate with Redfish based 
systems
 Home-page: https://docs.openstack.org/sushy/latest/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy.egg-info/SOURCES.txt 
new/sushy-4.5.0/sushy.egg-info/SOURCES.txt
--- old/sushy-4.4.2/sushy.egg-info/SOURCES.txt  2023-02-10 17:07:59.000000000 
+0100
+++ new/sushy-4.5.0/sushy.egg-info/SOURCES.txt  2023-05-11 11:12:15.000000000 
+0200
@@ -105,6 +105,7 @@
 
releasenotes/notes/fixes-ilo5-redfish-firmware-update-issue-273862b2a11e3536.yaml
 releasenotes/notes/get-retry-9ca311caf8a0b7bb.yaml
 releasenotes/notes/handle-basic-auth-access-errors-393b368b31f5cad2.yaml
+releasenotes/notes/handle_transfer_method-a51d5a17e381ebee.yaml
 releasenotes/notes/health_literals_change-0e3fc0c439b765e3.yaml
 releasenotes/notes/increase-server-retries-5f11edde8ee0b461.yaml
 releasenotes/notes/indicator-led-mappings-e7b34da03f6abb06.yaml
@@ -114,7 +115,9 @@
 releasenotes/notes/message-parsing-resilience-534da532515a15da.yaml
 releasenotes/notes/message-registry-logging-39624ae114c02e15.yaml
 releasenotes/notes/monitor_firmware_update-664b0c6c1a0307cf.yaml
+releasenotes/notes/more-transferprotocoltype-739ce8bdedbcb51c.yaml
 releasenotes/notes/no-passwords-295207ac891d27ab.yaml
+releasenotes/notes/non-default-language-registries-f73bdecc98ba2cc8.yaml
 releasenotes/notes/property-missing-7602c421ec177e9a.yaml
 releasenotes/notes/raise-error-on-async-task-failure-b67c7bc189a4d6ca.yaml
 
releasenotes/notes/reauthentication-session-fallback-failure-fixes-4f0dcfdad1afd2d7.yaml
@@ -123,6 +126,7 @@
 releasenotes/notes/releasenote-d7138d1e1d414632.yaml
 releasenotes/notes/remove-deprecated-task-monitors-58c505d43e1fa6a7.yaml
 releasenotes/notes/retry-if-transferprototype-missing-9cae57f3ecf470a9.yaml
+releasenotes/notes/retry-ilo-not-ready-error-0b4dce882282eaac.yaml
 releasenotes/notes/secure-boot-76c5b80371ea85d1.yaml
 releasenotes/notes/secure-boot-database-7fae673722d7cf4f.yaml
 releasenotes/notes/sessions.yml
@@ -138,6 +142,7 @@
 releasenotes/notes/vmedia-certificate-06c367c6ef33d139.yaml
 releasenotes/notes/vmedia-credentials-14b7705c3c94cc07.yaml
 
releasenotes/notes/workaround-sushy-requests-verify-handling-6879c273b651246f.yaml
+releasenotes/source/2023.1.rst
 releasenotes/source/conf.py
 releasenotes/source/index.rst
 releasenotes/source/pike.rst
@@ -263,7 +268,10 @@
 sushy/tests/unit/json_samples/bios.json
 sushy/tests/unit/json_samples/bios_attribute_registry.json
 sushy/tests/unit/json_samples/bios_attribute_registry_file.json
+sushy/tests/unit/json_samples/bios_attribute_registry_file_zthardware.json
+sushy/tests/unit/json_samples/bios_attribute_registry_zthardware.json
 sushy/tests/unit/json_samples/bios_settings.json
+sushy/tests/unit/json_samples/bios_zt.json
 sushy/tests/unit/json_samples/certificate.json
 sushy/tests/unit/json_samples/certificate_collection.json
 sushy/tests/unit/json_samples/certificate_locations.json
@@ -341,7 +349,9 @@
 sushy/tests/unit/json_samples/task_monitor.json
 sushy/tests/unit/json_samples/taskservice.json
 sushy/tests/unit/json_samples/thermal.json
+sushy/tests/unit/json_samples/transfer_method_required_error.json
 sushy/tests/unit/json_samples/transfer_proto_required_error.json
+sushy/tests/unit/json_samples/transfer_proto_required_error2.json
 sushy/tests/unit/json_samples/updateservice.json
 sushy/tests/unit/json_samples/updateservice_no_inv.json
 sushy/tests/unit/json_samples/virtual_media.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/sushy.egg-info/pbr.json 
new/sushy-4.5.0/sushy.egg-info/pbr.json
--- old/sushy-4.4.2/sushy.egg-info/pbr.json     2023-02-10 17:07:59.000000000 
+0100
+++ new/sushy-4.5.0/sushy.egg-info/pbr.json     2023-05-11 11:12:15.000000000 
+0200
@@ -1 +1 @@
-{"git_version": "98c8999", "is_release": true}
\ No newline at end of file
+{"git_version": "f03d77e", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/sushy-4.4.2/tox.ini new/sushy-4.5.0/tox.ini
--- old/sushy-4.4.2/tox.ini     2023-02-10 17:07:32.000000000 +0100
+++ new/sushy-4.5.0/tox.ini     2023-05-11 11:11:46.000000000 +0200
@@ -17,7 +17,7 @@
 
 [testenv:pep8]
 deps=
-    hacking>=4.1.0,<5.0.0 # Apache-2.0
+    hacking~=6.0.0 # Apache-2.0
     flake8-import-order>=0.17.1 # LGPLv3
     pycodestyle>=2.0.0,<3.0.0 # MIT
 commands = flake8 {posargs}
@@ -83,7 +83,7 @@
 # [H904] Delay string interpolations at logging calls.
 enable-extensions=H106,H203,H204,H205,H210,H904
 builtins = _
-exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
+exclude=.*,dist,doc,*lib/python*,*egg,build
 import-order-style = pep8
 application-import-names = sushy
 filename = *.py

Reply via email to