Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-redfish for openSUSE:Factory checked in at 2024-01-03 12:23:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-redfish (Old) and /work/SRC/openSUSE:Factory/.python-redfish.new.28375 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-redfish" Wed Jan 3 12:23:58 2024 rev:13 rq:1135608 version:3.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-redfish/python-redfish.changes 2022-12-08 16:52:26.683870105 +0100 +++ /work/SRC/openSUSE:Factory/.python-redfish.new.28375/python-redfish.changes 2024-01-03 12:23:59.069277303 +0100 @@ -1,0 +2,14 @@ +Fri Dec 29 09:16:30 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 3.2.1: + * Added 'timeout' and 'max_retry' parameters to all REST + methods + * Added exception to the method when a response contains a + message indicating a password change is required + * Adding missing newline to M-SEARCH requests + * Fixed the inspection of the USN response header from M-SEARCH + requests to allow for a multi-digit minor version + * Improved usage of the ServerDownOrUnreachableError exception + to not lose the original message + +------------------------------------------------------------------- Old: ---- redfish-3.1.8.tar.gz New: ---- redfish-3.2.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-redfish.spec ++++++ --- /var/tmp/diff_new_pack.QgInhz/_old 2024-01-03 12:24:00.813341026 +0100 +++ /var/tmp/diff_new_pack.QgInhz/_new 2024-01-03 12:24:00.829341611 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-redfish # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # Copyright (c) 2020-2021, Martin Hauke <mar...@gmx.de> # # All modifications and additions to the file contributed by third parties @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-redfish -Version: 3.1.8 +Version: 3.2.1 Release: 0 Summary: Redfish Python Library License: BSD-3-Clause ++++++ redfish-3.1.8.tar.gz -> redfish-3.2.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/.github/workflows/main.yml new/python-redfish-library-3.2.1/.github/workflows/main.yml --- old/python-redfish-library-3.1.8/.github/workflows/main.yml 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/.github/workflows/main.yml 2023-08-04 21:42:35.000000000 +0200 @@ -77,7 +77,7 @@ git config user.email "<>" git add CHANGELOG.md setup.py src/redfish/__init__.py git commit -s -m "${{github.event.inputs.version}} versioning" - git push origin master + git push origin main - name: Make the release env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/CHANGELOG.md new/python-redfish-library-3.2.1/CHANGELOG.md --- old/python-redfish-library-3.1.8/CHANGELOG.md 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/CHANGELOG.md 2023-08-04 21:42:35.000000000 +0200 @@ -1,5 +1,16 @@ # Change Log +## [3.2.1] - 2023-08-04 +- Added 'timeout' and 'max_retry' parameters to all REST methods +- Added exception to the method when a response contains a message indicating a password change is required + +## [3.2.0] - 2023-07-27 +- Adding missing newline to M-SEARCH requests +- Fixed the inspection of the USN response header from M-SEARCH requests to allow for a multi-digit minor version + +## [3.1.9] - 2023-01-13 +- Improved usage of the ServerDownOrUnreachableError exception to not lose the original message + ## [3.1.8] - 2022-12-02 - Added request headers to debug log output - Added redacting of 'Password' properties from request bodies from debug logs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/README.rst new/python-redfish-library-3.2.1/README.rst --- old/python-redfish-library-3.1.8/README.rst 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/README.rst 2023-08-04 21:42:35.000000000 +0200 @@ -6,7 +6,7 @@ .. image:: https://img.shields.io/github/release/DMTF/python-redfish-library.svg?maxAge=2592000 :target: https://github.com/DMTF/python-redfish-library/releases .. image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg - :target: https://raw.githubusercontent.com/DMTF/python-redfish-library/master/LICENSE + :target: https://raw.githubusercontent.com/DMTF/python-redfish-library/main/LICENSE .. image:: https://img.shields.io/pypi/pyversions/redfish.svg?maxAge=2592000 :target: https://pypi.python.org/pypi/redfish @@ -74,7 +74,7 @@ * ``max_retry``: The number of retries to perform an operation before giving up. The default value is ``10``. * ``proxies``: A dictionary containing protocol to proxy URL mappings. The default value is ``None``. See `Using proxies`_. -To crete a Redfish object, call the ``redfish_client`` method: +To create a Redfish object, call the ``redfish_client`` method: .. code-block:: python @@ -97,34 +97,84 @@ ~~~~~~~~~~~~~~~~~~~~~~~ A simple GET operation can be performed to obtain the data present in any valid path. -An example of GET operation on the path "/redfish/v1/systems/1" is shown below: +An example of GET operation on the path "/redfish/v1/Systems/1" is shown below: .. code-block:: python - response = REDFISH_OBJ.get("/redfish/v1/systems/1", None) + response = REDFISH_OBJ.get("/redfish/v1/Systems/1") Perform a POST operation ~~~~~~~~~~~~~~~~~~~~~~~~ A POST operation can be performed to create a resource or perform an action. -An example of a POST operation on the path "/redfish/v1/systems/1/Actions/ComputerSystem.Reset" is shown below: +An example of a POST operation on the path "/redfish/v1/Systems/1/Actions/ComputerSystem.Reset" is shown below: .. code-block:: python body = {"ResetType": "GracefulShutdown"} - response = REDFISH_OBJ.post("/redfish/v1/systems/1/Actions/ComputerSystem.Reset", body=body) + response = REDFISH_OBJ.post("/redfish/v1/Systems/1/Actions/ComputerSystem.Reset", body=body) + +Notes about HTTP methods and arguments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The previous sections showed example GET and POST requests. The following is a list of the different methods supported: + +* ``get``: Performs an HTTP GET operation to retrieve a resource from a URI. +* ``head``: Performs an HTTP HEAD operation to retrieve response headers from a URI, but no body. +* ``post``: Performs an HTTP POST operation to perform an action or create a new resource. +* ``put``: Performs an HTTP PUT operation to replace an existing resource. +* ``patch``: Performs an HTTP PATCH operation to update an existing resource. +* ``delete``: Performs an HTTP DELETE operation to remove a resource. + +Each of the previous methods allows for the following arguments: + +* ``path``: **Required**. String. The URI in which to invoke the operation. + + - Example: ``"/redfish/v1/Systems/1"`` + +* ``args``: Dictionary. Query parameters to supply with the request. + + - The key-value pairs in the dictionary are the query parameter name and the query parameter value to supply. + - Example: ``{"$select": "Reading,Status"}`` + +* ``body``: Dictionary, List, Bytes, or String. The request body to provide with the request. + + - Not supported for ``get``, ``head``, or ``delete`` methods. + - The data type supplied will dictate the encoding. + - A dictionary is the most common usage, which results in a JSON body. + - Example: ``{"ResetType": "GracefulShutdown"}`` + - A list is used to supply multipart forms, which is useful for multipart HTTP push updates. + - Bytes is used to supply an octet stream. + - A string is used to supply an unstructed body, which may be used in some OEM cases. + +* ``headers``: Dictionary. Additional HTTP headers to supply with the request. + + - The key-value pairs in the dictionary are the HTTP header name and the HTTP header value to supply. + - Example: ``{"If-Match": etag_value}`` + +* ``timeout``: Number. The number of seconds to wait for a response before closing the connection for this request. + + - Overrides the timeout value specified when the Redfish object is created for this request. + - This can be useful when a particular URI is known to take a long time to respond, such as with firmware updates. + - The default value is ``None``, which indicates the object-defined timeout is used. + +* ``max_retry``: Number. The number of retries to perform an operation before giving up for this request. + + - Overrides the max retry value specified when the Redfish object is created for this request. + - This can be useful when a particular URI is known to take multiple retries. + - The default value is ``None``, which indicates the object-defined max retry count is used. Working with tasks ~~~~~~~~~~~~~~~~~~ -A POST and PATCH operations may result in a task, describing an operation with a duration greater than the span of a single request. +POST, PATCH, PUT, and DELETE operations may result in a task, describing an operation with a duration greater than the span of a single request. The action message object that ``is_processing`` will return a task that can be accessed reviewed when polled with monitor. An example of a POST operation with a possible task is shown below. .. code-block:: python body = {"ResetType": "GracefulShutdown"} - response = REDFISH_OBJ.post("/redfish/v1/systems/1/Actions/ComputerSystem.Reset", body=body) + response = REDFISH_OBJ.post("/redfish/v1/Systems/1/Actions/ComputerSystem.Reset", body=body) if(response.is_processing): task = response.monitor(context) @@ -206,4 +256,4 @@ Copyright Notice: Copyright 2016-2022 DMTF. All rights reserved. -License: BSD 3-Clause License. For full text see link: `https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md <https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md>`_ +License: BSD 3-Clause License. For full text see link: `https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md <https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md>`_ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/examples/context_manager.py new/python-redfish-library-3.2.1/examples/context_manager.py --- old/python-redfish-library-3.1.8/examples/context_manager.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/examples/context_manager.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md import sys import redfish diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/examples/discover.py new/python-redfish-library-3.2.1/examples/discover.py --- old/python-redfish-library-3.1.8/examples/discover.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/examples/discover.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md import redfish diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/examples/multipart_push.py new/python-redfish-library-3.2.1/examples/multipart_push.py --- old/python-redfish-library-3.1.8/examples/multipart_push.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/examples/multipart_push.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md import sys import json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/examples/quickstart.py new/python-redfish-library-3.2.1/examples/quickstart.py --- old/python-redfish-library-3.1.8/examples/quickstart.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/examples/quickstart.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md import sys import redfish diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/examples/quickstart_rmc.py new/python-redfish-library-3.2.1/examples/quickstart_rmc.py --- old/python-redfish-library-3.1.8/examples/quickstart_rmc.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/examples/quickstart_rmc.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md import os import sys diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/setup.py new/python-redfish-library-3.2.1/setup.py --- old/python-redfish-library-3.1.8/setup.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/setup.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md from setuptools import setup, find_packages from codecs import open @@ -12,7 +12,7 @@ long_description = f.read() setup(name='redfish', - version='3.1.8', + version='3.2.1', description='Redfish Python Library', long_description=long_description, long_description_content_type='text/x-rst', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/__init__.py new/python-redfish-library-3.2.1/src/redfish/__init__.py --- old/python-redfish-library-3.1.8/src/redfish/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,16 +1,17 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md """ Redfish restful library """ -__all__ = ['rest', 'ris', 'discovery'] -__version__ = "3.1.8" +__all__ = ['rest', 'ris', 'discovery', 'messages'] +__version__ = "3.2.1" from redfish.rest.v1 import redfish_client from redfish.rest.v1 import AuthMethod from redfish.discovery.discovery import discover_ssdp +from redfish.messages import * import logging def redfish_logger(file_name, log_format, log_level=logging.ERROR): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/discovery/__init__.py new/python-redfish-library-3.2.1/src/redfish/discovery/__init__.py --- old/python-redfish-library-3.1.8/src/redfish/discovery/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/discovery/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,4 +1,4 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/discovery/discovery.py new/python-redfish-library-3.2.1/src/redfish/discovery/discovery.py --- old/python-redfish-library-3.1.8/src/redfish/discovery/discovery.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/discovery/discovery.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """Discovers Redfish services""" @@ -82,7 +82,7 @@ "Host: {}:{}\r\n" 'Man: "ssdp:discover"\r\n' "ST: urn:dmtf-org:service:redfish-rest:1\r\n" - "MX: {}\r\n" + "MX: {}\r\n\r\n" ).format(mcast_ip, port, response_time) socket.setdefaulttimeout(response_time + 2) @@ -99,7 +99,7 @@ # On the same socket, wait for responses discovered_services = {} pattern = re.compile( - "^uuid:([a-f0-9\-]*)::urn:dmtf-org:service:redfish-rest:1(:\d)?$") # noqa + "^uuid:([a-f0-9\-]*)::urn:dmtf-org:service:redfish-rest:1(:\d+)?$") # noqa while True: try: response = http.client.HTTPResponse(FakeSocket(sock.recv(1024))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/messages/__init__.py new/python-redfish-library-3.2.1/src/redfish/messages/__init__.py --- old/python-redfish-library-3.1.8/src/redfish/messages/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/messages/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -0,0 +1,5 @@ +# Copyright Notice: +# Copyright 2016-2021 DMTF. All rights reserved. +# License: BSD 3-Clause License. For full text see link: +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md +from .messages import * \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/messages/messages.py new/python-redfish-library-3.2.1/src/redfish/messages/messages.py --- old/python-redfish-library-3.1.8/src/redfish/messages/messages.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/messages/messages.py 2023-08-04 21:42:35.000000000 +0200 @@ -0,0 +1,148 @@ +#! /usr/bin/python +# Copyright Notice: +# Copyright 2019-2020 DMTF. All rights reserved. +# License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/Redfish-Tacklebox/blob/main/LICENSE.md + +""" +Messages Module + +File : messages.py + +Brief : This file contains the definitions and functionalities for interacting + with Messages for a given Redfish service +""" +import re + +class RedfishOperationFailedError( Exception ): + """ + Raised when an operation has failed (HTTP Status >= 400) + """ + pass + +class RedfishPasswordChangeRequiredError( Exception ): + """ + Raised when password change required + """ + def __str__(self): + return "\n{}\nURL: {}\n".format( str(self.args[0]), str(self.args[1]) ) + +def get_messages_detail( response ): + """ + Builds messages detail dict in the payload + + Args: + response: The response to parser + + Returns: + The dict containing messages_detail + messages_detail["status"]: http status code + messages_detail["successful"]: response successful (http status code < 400) + messages_detail["code"]: redfish message response code field + messages_detail["@Message.ExtendedInfo"]: redfish message response code field + """ + + messages_detail = {} + messages_detail["status"] = response.status + messages_detail["text"] = response.text + messages_detail["successful"] = False + messages_detail["@Message.ExtendedInfo"] = [] + + if response.status >= 400: + messages_detail["successful"] = False + else: + messages_detail["successful"] = True + + try: + message_body = response.dict + messages_detail["body"] = response.dict + + if not "@Message.ExtendedInfo" in message_body: + message_body = response.dict["error"] + check_message_field = True + if "@Message.ExtendedInfo" in message_body: + messages_detail["@Message.ExtendedInfo"] = message_body["@Message.ExtendedInfo"] + for index in range(len(messages_detail["@Message.ExtendedInfo"])): + messages_item = messages_detail["@Message.ExtendedInfo"][index] + if not "MessageId" in messages_item: + messages_item["MessageId"] = "" + if not "Message" in messages_item: + messages_item["Message"] = "" + messages_detail["@Message.ExtendedInfo"][index] = messages_item + check_message_field = False + + if check_message_field is True: + messages_detail["@Message.ExtendedInfo"] = [] + messages_item = {} + if "code" in message_body: + messages_item["MessageId"] = message_body["code"] + else: + messages_item["MessageId"] = "" + if "message" in message_body: + messages_item["Message"] = message_body["message"] + else: + messages_item["Message"] = "" + messages_detail["@Message.ExtendedInfo"].insert(0, messages_item) + except: + messages_detail["@Message.ExtendedInfo"] = [] + messages_detail["body"] = {} + + return messages_detail + +def search_message(response, message_registry_group, message_registry_id): + """ + search message in the payload + + Args: + response: The response to parser + message_registry_group: target message_registry_group + message_registry_id: target message_registry_id + Returns: + The dict containing target message detail + """ + if isinstance(response, dict) and "@Message.ExtendedInfo" in response: + messages_detail = response + else: + messages_detail = get_messages_detail(response) + + message_registry_id_search = "^" + message_registry_group + "\.[0-9]+\.[0-9]+\." + message_registry_id +"$" + + for messages_item in messages_detail["@Message.ExtendedInfo"]: + if "MessageId" in messages_item: + resault = re.search(message_registry_id_search, messages_item["MessageId"]) + if resault: + return messages_item + return None + +def get_error_messages( response ): + """ + Builds a string based on the error messages in the payload + + Args: + response: The response to print + + Returns: + The string containing error messages + """ + + # Pull out the error payload and the messages + + out_string = "" + try: + if isinstance(response, dict) and "@Message.ExtendedInfo" in response: + messages_detail = response + else: + messages_detail = get_messages_detail(response) + + if "@Message.ExtendedInfo" in messages_detail: + for message in messages_detail["@Message.ExtendedInfo"]: + if "Message" in message: + out_string = out_string + "\n" + message["Message"] + else: + out_string = out_string + "\n" + message["MessageId"] + out_string = out_string + "\n" + except: + # No response body + out_string = "" + + return out_string + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/rest/__init__.py new/python-redfish-library-3.2.1/src/redfish/rest/__init__.py --- old/python-redfish-library-3.1.8/src/redfish/rest/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/rest/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,6 +1,6 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md """ Utilities to simplify interaction with Redfish data """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/rest/v1.py new/python-redfish-library-3.2.1/src/redfish/rest/v1.py --- old/python-redfish-library-3.1.8/src/redfish/rest/v1.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/rest/v1.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """Helper module for working with REST technology.""" @@ -18,6 +18,7 @@ import re import requests import requests_unixsocket +from redfish.messages import * from collections import (OrderedDict) @@ -52,7 +53,9 @@ class ServerDownOrUnreachableError(Exception): """Raised when server is unreachable.""" - pass + def __init__(self,message,*,response=None): + super().__init__(message) + self.response = response class DecompressResponseError(Exception): """Raised when decompressing response failed.""" @@ -590,7 +593,7 @@ if resp.status != 200: raise ServerDownOrUnreachableError("Server not reachable, " \ - "return code: %d" % resp.status) + "return code: %d" % resp.status,response=resp) content = resp.text @@ -605,106 +608,130 @@ self.root = RisObject.parse(root_data) self.root_resp = resp - def get(self, path, args=None, headers=None): + def get(self, path, args=None, headers=None, timeout=None, max_retry=None): """Perform a GET request - :param path: the URL path. - :type path: str. - :param args: the arguments to get. - :type args: dict. - :param headers: dict of headers to be appended. - :type headers: dict. + :param path: The URI to access + :type path: str + :param args: The query parameters to provide with the request + :type args: dict, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a rest request with method 'Get' """ try: return self._rest_request(path, method='GET', args=args, - headers=headers) + headers=headers, timeout=timeout, max_retry=max_retry) except ValueError: str = "Service responded with invalid JSON at URI {}".format(path) LOGGER.error(str) raise JsonDecodingError(str) from None - def head(self, path, args=None, headers=None): + def head(self, path, args=None, headers=None, timeout=None, max_retry=None): """Perform a HEAD request - :param path: the URL path. - :type path: str. - :param args: the arguments to get. - :type args: dict. - :param headers: dict of headers to be appended. - :type headers: dict. + :param path: The URI to access + :type path: str + :param args: The query parameters to provide with the request + :type args: dict, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a rest request with method 'Head' """ return self._rest_request(path, method='HEAD', args=args, - headers=headers) + headers=headers, timeout=timeout, max_retry=max_retry) - def post(self, path, args=None, body=None, headers=None): + def post(self, path, args=None, body=None, headers=None, timeout=None, max_retry=None): """Perform a POST request - :param path: the URL path. - :type path: str. - :param args: the arguments to post. - :type args: dict. - :param body: the body to the sent. - :type body: str. - :param headers: dict of headers to be appended. - :type headers: dict. + :param path: The URI to access + :type path: str + :param args: The query parameters to provide with the request + :type args: dict, optional + :param body: The request body to provide; use a dict for a JSON body, list for multipart forms, bytes for an octet stream, or str for an unstructured request + :type body: dict or list or bytes or str, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a rest request with method 'Post' """ return self._rest_request(path, method='POST', args=args, body=body, - headers=headers) + headers=headers, timeout=timeout, max_retry=max_retry) - def put(self, path, args=None, body=None, headers=None): + def put(self, path, args=None, body=None, headers=None, timeout=None, max_retry=None): """Perform a PUT request - :param path: the URL path. - :type path: str. - :param args: the arguments to put. - :type args: dict. - :param body: the body to the sent. - :type body: str. - :param headers: dict of headers to be appended. - :type headers: dict. + :param path: The URI to access + :type path: str + :param args: The query parameters to provide with the request + :type args: dict, optional + :param body: The request body to provide; use a dict for a JSON body, list for multipart forms, bytes for an octet stream, or str for an unstructured request + :type body: dict or list or bytes or str, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a rest request with method 'Put' """ return self._rest_request(path, method='PUT', args=args, body=body, - headers=headers) + headers=headers, timeout=timeout, max_retry=max_retry) - def patch(self, path, args=None, body=None, headers=None): - """Perform a PUT request + def patch(self, path, args=None, body=None, headers=None, timeout=None, max_retry=None): + """Perform a PATCH request - :param path: the URL path. - :type path: str. - :param args: the arguments to patch. - :type args: dict. - :param body: the body to the sent. - :type body: str. - :param headers: dict of headers to be appended. - :type headers: dict. + :param path: The URI to access + :type path: str + :param args: The query parameters to provide with the request + :type args: dict, optional + :param body: The request body to provide; use a dict for a JSON body, list for multipart forms, bytes for an octet stream, or str for an unstructured request + :type body: dict or list or bytes or str, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a rest request with method 'Patch' """ return self._rest_request(path, method='PATCH', args=args, body=body, - headers=headers) + headers=headers, timeout=timeout, max_retry=max_retry) - def delete(self, path, args=None, headers=None): + def delete(self, path, args=None, headers=None, timeout=None, max_retry=None): """Perform a DELETE request - :param path: the URL path. - :type path: str. - :param args: the arguments to delete. - :type args: dict. - :param headers: dict of headers to be appended. - :type headers: dict. + :param path: The URI to access + :type path: str + :param args: The query parameters to provide with the request + :type args: dict, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a rest request with method 'Delete' """ return self._rest_request(path, method='DELETE', args=args, - headers=headers) + headers=headers, timeout=timeout, max_retry=max_retry) def _get_req_headers(self, headers=None): """Get the request headers @@ -728,24 +755,34 @@ return headers def _rest_request(self, path, method='GET', args=None, body=None, - headers=None, allow_redirects=True): + headers=None, allow_redirects=True, timeout=None, max_retry=None): """Rest request main function - :param path: path within tree + :param path: The URI to access :type path: str - :param method: method to be implemented - :type method: str - :param args: the arguments for method - :type args: dict - :param body: body payload for the rest call - :type body: dict - :param headers: provide additional headers - :type headers: dict - :param allow_redirects: controls whether redirects are followed - :type allow_redirects: bool + :param method: The HTTP method to invoke on the URI; GET if not provided + :type method: str, optional + :param args: The query parameters to provide with the request + :type args: dict, optional + :param body: The request body to provide; use a dict for a JSON body, list for multipart forms, bytes for an octet stream, or str for an unstructured request + :type body: dict or list or bytes or str, optional + :param headers: Additional HTTP headers to provide in the request + :type headers: dict, optional + :param allow_redirects: Controls whether redirects are followed + :type allow_redirects: bool, optional + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int, optional + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int, optional :returns: returns a RestResponse object """ + if timeout is None: + timeout = self._timeout + + if max_retry is None: + max_retry = self._max_retry + headers = self._get_req_headers(headers) reqpath = path.replace('//', '/') @@ -784,7 +821,7 @@ body = urlencode(body) if method == 'PUT': - resp = self._rest_request(path=path) + resp = self._rest_request(path=path, timeout=timeout, max_retry=max_retry) try: if resp.getheader('content-encoding') == 'gzip': @@ -834,7 +871,7 @@ attempts = 0 restresp = None cause_exception = None - while attempts <= self._max_retry: + while attempts <= max_retry: if LOGGER.isEnabledFor(logging.DEBUG): headerstr = '' if headers is not None: @@ -871,7 +908,7 @@ if self.cafile: verify = self.cafile resp = self._session.request(method.upper(), "{}{}".format(self.__base_url, reqpath), data=body, - headers=headers, timeout=self._timeout, allow_redirects=allow_redirects, + headers=headers, timeout=timeout, allow_redirects=allow_redirects, verify=verify, proxies=self._proxies, params=query_str) if sys.version_info < (3, 3): @@ -959,6 +996,10 @@ self.__session_key = resp.session_key self.__session_location = resp.session_location + message_item = search_message(resp, "Base", "PasswordChangeRequired") + if not message_item is None: + raise RedfishPasswordChangeRequiredError("Password Change Required\n", message_item["MessageArgs"][0]) + if not self.__session_key and resp.status not in [200, 201, 202, 204]: if resp.status == 401: # Invalid credentials supplied @@ -1044,7 +1085,7 @@ self.login_url = '/redfish/v1/SessionService/Sessions' def _rest_request(self, path='', method="GET", args=None, body=None, - headers=None, allow_redirects=True): + headers=None, allow_redirects=True, timeout=None, max_retry=None): """Rest request for HTTP client :param path: path within tree @@ -1059,13 +1100,17 @@ :type headers: dict :param allow_redirects: controls whether redirects are followed :type allow_redirects: bool + :param timeout: Timeout in seconds for the initial connection for this specific request + :type timeout: int + :param max_retry: Number of times a request will retry after a timeout for this specific request + :type max_retry: int :returns: returns a rest request """ return super(HttpClient, self)._rest_request(path=path, method=method, args=args, body=body, headers=headers, - allow_redirects=allow_redirects) + allow_redirects=allow_redirects, timeout=timeout, max_retry=max_retry) def _get_req_headers(self, headers=None, providerheader=None): """Get the request headers for HTTP client diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/ris/__init__.py new/python-redfish-library-3.2.1/src/redfish/ris/__init__.py --- old/python-redfish-library-3.1.8/src/redfish/ris/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/ris/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/ris/config.py new/python-redfish-library-3.2.1/src/redfish/ris/config.py --- old/python-redfish-library-3.1.8/src/redfish/ris/config.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/ris/config.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """Module for working with global configuration options.""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/ris/ris.py new/python-redfish-library-3.2.1/src/redfish/ris/ris.py --- old/python-redfish-library-3.1.8/src/redfish/ris/ris.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/ris/ris.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """RIS implementation""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/ris/rmc.py new/python-redfish-library-3.2.1/src/redfish/ris/rmc.py --- old/python-redfish-library-3.1.8/src/redfish/ris/rmc.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/ris/rmc.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """RMC implementation """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/ris/rmc_helper.py new/python-redfish-library-3.2.1/src/redfish/ris/rmc_helper.py --- old/python-redfish-library-3.1.8/src/redfish/ris/rmc_helper.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/ris/rmc_helper.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """RMC helper implementation""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/src/redfish/ris/sharedtypes.py new/python-redfish-library-3.2.1/src/redfish/ris/sharedtypes.py --- old/python-redfish-library-3.1.8/src/redfish/ris/sharedtypes.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/src/redfish/ris/sharedtypes.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- coding: utf-8 -*- """ Shared types used in this module """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/__init__.py new/python-redfish-library-3.2.1/tests/__init__.py --- old/python-redfish-library-3.1.8/tests/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,4 +1,4 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md \ No newline at end of file +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/discovery/__init__.py new/python-redfish-library-3.2.1/tests/discovery/__init__.py --- old/python-redfish-library-3.1.8/tests/discovery/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/discovery/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,4 +1,4 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md \ No newline at end of file +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/discovery/test_discovery.py new/python-redfish-library-3.2.1/tests/discovery/test_discovery.py --- old/python-redfish-library-3.1.8/tests/discovery/test_discovery.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/discovery/test_discovery.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- encoding: utf-8 -*- import unittest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/rest/__init__.py new/python-redfish-library-3.2.1/tests/rest/__init__.py --- old/python-redfish-library-3.1.8/tests/rest/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/rest/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,4 +1,4 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md \ No newline at end of file +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/rest/test_v1.py new/python-redfish-library-3.2.1/tests/rest/test_v1.py --- old/python-redfish-library-3.1.8/tests/rest/test_v1.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/rest/test_v1.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- encoding: utf-8 -*- import unittest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/ris/__init__.py new/python-redfish-library-3.2.1/tests/ris/__init__.py --- old/python-redfish-library-3.1.8/tests/ris/__init__.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/ris/__init__.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,4 +1,4 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md \ No newline at end of file +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/ris/test_config.py new/python-redfish-library-3.2.1/tests/ris/test_config.py --- old/python-redfish-library-3.1.8/tests/ris/test_config.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/ris/test_config.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- encoding: utf-8 -*- import tempfile diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/ris/test_ris.py new/python-redfish-library-3.2.1/tests/ris/test_ris.py --- old/python-redfish-library-3.1.8/tests/ris/test_ris.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/ris/test_ris.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md # -*- encoding: utf-8 -*- import unittest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-redfish-library-3.1.8/tests/ris/test_rmc_helper.py new/python-redfish-library-3.2.1/tests/ris/test_rmc_helper.py --- old/python-redfish-library-3.1.8/tests/ris/test_rmc_helper.py 2022-12-02 21:21:09.000000000 +0100 +++ new/python-redfish-library-3.2.1/tests/ris/test_rmc_helper.py 2023-08-04 21:42:35.000000000 +0200 @@ -1,7 +1,7 @@ # Copyright Notice: # Copyright 2016-2021 DMTF. All rights reserved. # License: BSD 3-Clause License. For full text see link: -# https://github.com/DMTF/python-redfish-library/blob/master/LICENSE.md +# https://github.com/DMTF/python-redfish-library/blob/main/LICENSE.md import unittest try: