Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-oslo.vmware for 
openSUSE:Factory checked in at 2026-03-10 17:48:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.vmware (Old)
 and      /work/SRC/openSUSE:Factory/.python-oslo.vmware.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-oslo.vmware"

Tue Mar 10 17:48:00 2026 rev:29 rq:1337829 version:4.9.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-oslo.vmware/python-oslo.vmware.changes    
2025-11-10 19:18:03.110135016 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-oslo.vmware.new.8177/python-oslo.vmware.changes
  2026-03-10 17:48:18.567154505 +0100
@@ -1,0 +2,18 @@
+Mon Mar  9 15:26:34 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 4.9.0:
+  * Remove eventlet timeout from image\_transfer
+  * Remove unused PCRE packages
+  * Delay string interpolations at logging calls
+  * Remove reference to tag framework
+  * [test]Mock time.sleep instead of greenthread.sleep
+  * Use oslo.service loopingcall
+  * reno: Update master for unmaintained/2024.1
+  * Bump pyupgrade target to 3.10+
+  * Migrate bandit options to pyproject.toml
+  * pre-commit: Bump dependencies
+  * Migrate setup configuration to pyproject.toml
+  * Drop Python 3.9 support
+  * Update master for stable/2025.2
+
+-------------------------------------------------------------------

Old:
----
  oslo_vmware-4.7.0.tar.gz

New:
----
  oslo_vmware-4.9.0.tar.gz

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

Other differences:
------------------
++++++ python-oslo.vmware.spec ++++++
--- /var/tmp/diff_new_pack.IAZXYV/_old  2026-03-10 17:48:19.395188686 +0100
+++ /var/tmp/diff_new_pack.IAZXYV/_new  2026-03-10 17:48:19.399188851 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-oslo.vmware
 #
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           python-oslo.vmware
-Version:        4.7.0
+Version:        4.9.0
 Release:        0
 Summary:        Oslo VMware library for OpenStack projects
 License:        Apache-2.0
@@ -33,6 +33,7 @@
 BuildRequires:  %{python_module oslo.concurrency >= 3.26.0}
 BuildRequires:  %{python_module oslo.context >= 2.19.2}
 BuildRequires:  %{python_module oslo.i18n >= 3.15.3}
+BuildRequires:  %{python_module oslo.service >= 4.3.0}
 BuildRequires:  %{python_module oslo.utils >= 3.33.0}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module python-subunit}
@@ -50,6 +51,7 @@
 Requires:       python-oslo.concurrency >= 3.26.0
 Requires:       python-oslo.context >= 2.19.2
 Requires:       python-oslo.i18n >= 3.15.3
+Requires:       python-oslo.service >= 4.3.0
 Requires:       python-oslo.utils >= 3.33.0
 Requires:       python-requests >= 2.14.2
 Requires:       python-suds-community >= 0.6

++++++ oslo_vmware-4.7.0.tar.gz -> oslo_vmware-4.9.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/.pre-commit-config.yaml 
new/oslo_vmware-4.9.0/.pre-commit-config.yaml
--- old/oslo_vmware-4.7.0/.pre-commit-config.yaml       2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/.pre-commit-config.yaml       2026-02-17 
17:06:06.000000000 +0100
@@ -1,20 +1,14 @@
 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v5.0.0
+    rev: v6.0.0
     hooks:
       - id: trailing-whitespace
-      # Replaces or checks mixed line ending
       - id: mixed-line-ending
         args: ['--fix', 'lf']
         exclude: '.*\.(svg)$'
-      # Forbid files which have a UTF-8 byte-order marker
-      - id: check-byte-order-marker
-      # Checks that non-binary executables have a proper shebang
+      - id: fix-byte-order-marker
       - id: check-executables-have-shebangs
-      # Check for files that contain merge conflict strings.
       - id: check-merge-conflict
-      # Check for debugger imports and py37+ breakpoint()
-      # calls in python source
       - id: debug-statements
       - id: check-yaml
         files: .*\.(yaml|yml)$
@@ -24,12 +18,12 @@
       - id: hacking
         additional_dependencies: []
   - repo: https://github.com/PyCQA/bandit
-    rev: 1.7.10
+    rev: 1.8.6
     hooks:
       - id: bandit
-        args: ['-x', 'tests']
+        args: ['-c', 'pyproject.toml']
   - repo: https://github.com/asottile/pyupgrade
-    rev: v3.18.0
+    rev: v3.20.0
     hooks:
       - id: pyupgrade
-        args: [--py3-only]
+        args: [--py310-plus]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/AUTHORS 
new/oslo_vmware-4.9.0/AUTHORS
--- old/oslo_vmware-4.7.0/AUTHORS       2025-07-25 12:55:02.000000000 +0200
+++ new/oslo_vmware-4.9.0/AUTHORS       2026-02-17 17:07:10.000000000 +0100
@@ -5,6 +5,7 @@
 Andreas Jaeger <[email protected]>
 Arnaud Legendre <[email protected]>
 Arnaud Legendre <[email protected]>
+Balazs Gibizer <[email protected]>
 Cao Xuan Hoang <[email protected]>
 Cedric Brandily <[email protected]>
 ChangBo Guo(gcb) <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/ChangeLog 
new/oslo_vmware-4.9.0/ChangeLog
--- old/oslo_vmware-4.7.0/ChangeLog     2025-07-25 12:55:02.000000000 +0200
+++ new/oslo_vmware-4.9.0/ChangeLog     2026-02-17 17:07:10.000000000 +0100
@@ -1,6 +1,27 @@
 CHANGES
 =======
 
+4.9.0
+-----
+
+* Remove eventlet timeout from image\_transfer
+
+4.8.0
+-----
+
+* Remove unused PCRE packages
+* Delay string interpolations at logging calls
+* Remove reference to tag framework
+* [test]Mock time.sleep instead of greenthread.sleep
+* Use oslo.service loopingcall
+* reno: Update master for unmaintained/2024.1
+* Bump pyupgrade target to 3.10+
+* Migrate bandit options to pyproject.toml
+* pre-commit: Bump dependencies
+* Migrate setup configuration to pyproject.toml
+* Drop Python 3.9 support
+* Update master for stable/2025.2
+
 4.7.0
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/PKG-INFO 
new/oslo_vmware-4.9.0/PKG-INFO
--- old/oslo_vmware-4.7.0/PKG-INFO      2025-07-25 12:55:02.166318400 +0200
+++ new/oslo_vmware-4.9.0/PKG-INFO      2026-02-17 17:07:10.461320600 +0100
@@ -1,10 +1,11 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: oslo.vmware
-Version: 4.7.0
+Version: 4.9.0
 Summary: Oslo VMware library
-Home-page: https://docs.openstack.org/oslo.vmware/latest/
-Author: OpenStack
-Author-email: [email protected]
+Author-email: OpenStack <[email protected]>
+License: Apache-2.0
+Project-URL: Homepage, https://docs.openstack.org/oslo.vmware
+Project-URL: Repository, https://opendev.org/openstack/oslo.vmware
 Classifier: Environment :: OpenStack
 Classifier: Intended Audience :: Information Technology
 Classifier: Intended Audience :: System Administrators
@@ -12,13 +13,12 @@
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Requires-Python: >=3.9
+Classifier: Programming Language :: Python :: 3.13
+Requires-Python: >=3.10
+Description-Content-Type: text/x-rst
 License-File: LICENSE
 Requires-Dist: pbr!=2.1.0,>=2.0.0
 Requires-Dist: oslo.i18n>=3.15.3
@@ -30,20 +30,18 @@
 Requires-Dist: urllib3>=1.21.1
 Requires-Dist: oslo.concurrency>=3.26.0
 Requires-Dist: oslo.context>=2.19.2
+Requires-Dist: oslo.service>=4.3.0
+Dynamic: license-file
+Dynamic: requires-dist
 
-========================
-Team and repository tags
-========================
+=================================================
+oslo.vmware --- VMware support code for OpenStack
+=================================================
 
 .. image:: https://governance.openstack.org/tc/badges/oslo.vmware.svg
-    :target: https://governance.openstack.org/tc/reference/tags/index.html
 
 .. Change things from this point on
 
-=================================================
-oslo.vmware --- VMware support code for OpenStack
-=================================================
-
 .. image:: https://img.shields.io/pypi/v/oslo.vmware.svg
     :target: https://pypi.org/project/oslo.vmware/
     :alt: Latest Version
@@ -60,4 +58,3 @@
 * Source: https://opendev.org/openstack/oslo.vmware
 * Bugs: https://bugs.launchpad.net/oslo.vmware
 * Release notes: https://docs.openstack.org/releasenotes/oslo.vmware/
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/README.rst 
new/oslo_vmware-4.9.0/README.rst
--- old/oslo_vmware-4.7.0/README.rst    2025-07-25 12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/README.rst    2026-02-17 17:06:06.000000000 +0100
@@ -1,16 +1,11 @@
-========================
-Team and repository tags
-========================
+=================================================
+oslo.vmware --- VMware support code for OpenStack
+=================================================
 
 .. image:: https://governance.openstack.org/tc/badges/oslo.vmware.svg
-    :target: https://governance.openstack.org/tc/reference/tags/index.html
 
 .. Change things from this point on
 
-=================================================
-oslo.vmware --- VMware support code for OpenStack
-=================================================
-
 .. image:: https://img.shields.io/pypi/v/oslo.vmware.svg
     :target: https://pypi.org/project/oslo.vmware/
     :alt: Latest Version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/bindep.txt 
new/oslo_vmware-4.9.0/bindep.txt
--- old/oslo_vmware-4.7.0/bindep.txt    2025-07-25 12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/bindep.txt    2026-02-17 17:06:06.000000000 +0100
@@ -8,5 +8,3 @@
 libxslt-devel [platform:rpm test]
 python3-dev [platform:dpkg test]
 python3-devel [platform:rpm test]
-libpcre3-dev [platform:dpkg test]
-pcre-devel [platform:rpm test]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo.vmware.egg-info/PKG-INFO 
new/oslo_vmware-4.9.0/oslo.vmware.egg-info/PKG-INFO
--- old/oslo_vmware-4.7.0/oslo.vmware.egg-info/PKG-INFO 2025-07-25 
12:55:02.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo.vmware.egg-info/PKG-INFO 2026-02-17 
17:07:10.000000000 +0100
@@ -1,10 +1,11 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: oslo.vmware
-Version: 4.7.0
+Version: 4.9.0
 Summary: Oslo VMware library
-Home-page: https://docs.openstack.org/oslo.vmware/latest/
-Author: OpenStack
-Author-email: [email protected]
+Author-email: OpenStack <[email protected]>
+License: Apache-2.0
+Project-URL: Homepage, https://docs.openstack.org/oslo.vmware
+Project-URL: Repository, https://opendev.org/openstack/oslo.vmware
 Classifier: Environment :: OpenStack
 Classifier: Intended Audience :: Information Technology
 Classifier: Intended Audience :: System Administrators
@@ -12,13 +13,12 @@
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Requires-Python: >=3.9
+Classifier: Programming Language :: Python :: 3.13
+Requires-Python: >=3.10
+Description-Content-Type: text/x-rst
 License-File: LICENSE
 Requires-Dist: pbr!=2.1.0,>=2.0.0
 Requires-Dist: oslo.i18n>=3.15.3
@@ -30,20 +30,18 @@
 Requires-Dist: urllib3>=1.21.1
 Requires-Dist: oslo.concurrency>=3.26.0
 Requires-Dist: oslo.context>=2.19.2
+Requires-Dist: oslo.service>=4.3.0
+Dynamic: license-file
+Dynamic: requires-dist
 
-========================
-Team and repository tags
-========================
+=================================================
+oslo.vmware --- VMware support code for OpenStack
+=================================================
 
 .. image:: https://governance.openstack.org/tc/badges/oslo.vmware.svg
-    :target: https://governance.openstack.org/tc/reference/tags/index.html
 
 .. Change things from this point on
 
-=================================================
-oslo.vmware --- VMware support code for OpenStack
-=================================================
-
 .. image:: https://img.shields.io/pypi/v/oslo.vmware.svg
     :target: https://pypi.org/project/oslo.vmware/
     :alt: Latest Version
@@ -60,4 +58,3 @@
 * Source: https://opendev.org/openstack/oslo.vmware
 * Bugs: https://bugs.launchpad.net/oslo.vmware
 * Release notes: https://docs.openstack.org/releasenotes/oslo.vmware/
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo.vmware.egg-info/SOURCES.txt 
new/oslo_vmware-4.9.0/oslo.vmware.egg-info/SOURCES.txt
--- old/oslo_vmware-4.7.0/oslo.vmware.egg-info/SOURCES.txt      2025-07-25 
12:55:02.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo.vmware.egg-info/SOURCES.txt      2026-02-17 
17:07:10.000000000 +0100
@@ -47,8 +47,6 @@
 oslo_vmware/version.py
 oslo_vmware/vim.py
 oslo_vmware/vim_util.py
-oslo_vmware/common/__init__.py
-oslo_vmware/common/loopingcall.py
 oslo_vmware/hacking/__init__.py
 oslo_vmware/hacking/checks.py
 oslo_vmware/locale/en_GB/LC_MESSAGES/oslo_vmware.po
@@ -119,12 +117,14 @@
 
releasenotes/notes/bp-oslo-vmware-soap-library-switch-cookiejar-access-d7efcc23d0eaee98.yaml
 
releasenotes/notes/bp-oslo-vmware-soap-library-switch-helper-functions-21330be61cf7922a.yaml
 releasenotes/notes/drop-python27-support-4991a70046af4b03.yaml
+releasenotes/notes/remove-py39-51518455aaf46d7f.yaml
 releasenotes/notes/vmdk-transfer-validation-014d28cc9430e51b.yaml
 releasenotes/source/2023.1.rst
 releasenotes/source/2023.2.rst
 releasenotes/source/2024.1.rst
 releasenotes/source/2024.2.rst
 releasenotes/source/2025.1.rst
+releasenotes/source/2025.2.rst
 releasenotes/source/conf.py
 releasenotes/source/index.rst
 releasenotes/source/newton.rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo.vmware.egg-info/pbr.json 
new/oslo_vmware-4.9.0/oslo.vmware.egg-info/pbr.json
--- old/oslo_vmware-4.7.0/oslo.vmware.egg-info/pbr.json 2025-07-25 
12:55:02.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo.vmware.egg-info/pbr.json 2026-02-17 
17:07:10.000000000 +0100
@@ -1 +1 @@
-{"git_version": "308a9a6", "is_release": true}
\ No newline at end of file
+{"git_version": "8d9b0cb", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo.vmware.egg-info/requires.txt 
new/oslo_vmware-4.9.0/oslo.vmware.egg-info/requires.txt
--- old/oslo_vmware-4.7.0/oslo.vmware.egg-info/requires.txt     2025-07-25 
12:55:02.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo.vmware.egg-info/requires.txt     2026-02-17 
17:07:10.000000000 +0100
@@ -8,3 +8,4 @@
 urllib3>=1.21.1
 oslo.concurrency>=3.26.0
 oslo.context>=2.19.2
+oslo.service>=4.3.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/api.py 
new/oslo_vmware-4.9.0/oslo_vmware/api.py
--- old/oslo_vmware-4.7.0/oslo_vmware/api.py    2025-07-25 12:53:56.000000000 
+0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/api.py    2026-02-17 17:06:06.000000000 
+0100
@@ -25,11 +25,10 @@
 
 from oslo_concurrency import lockutils
 from oslo_context import context
+from oslo_service import loopingcall
 from oslo_utils import excutils
-from oslo_utils import reflection
 
 from oslo_vmware._i18n import _
-from oslo_vmware.common import loopingcall
 from oslo_vmware import exceptions
 from oslo_vmware import pbm
 from oslo_vmware import vim
@@ -45,85 +44,6 @@
         return session_id[-5:]
 
 
-# TODO(vbala) Move this class to excutils.py.
-class RetryDecorator:
-    """Decorator for retrying a function upon suggested exceptions.
-
-    The decorated function is retried for the given number of times, and the
-    sleep time between the retries is incremented until max sleep time is
-    reached. If the max retry count is set to -1, then the decorated function
-    is invoked indefinitely until an exception is thrown, and the caught
-    exception is not in the list of suggested exceptions.
-    """
-
-    def __init__(self, max_retry_count=-1, inc_sleep_time=10,
-                 max_sleep_time=60, exceptions=()):
-        """Configure the retry object using the input params.
-
-        :param max_retry_count: maximum number of times the given function must
-                                be retried when one of the input 'exceptions'
-                                is caught. When set to -1, it will be retried
-                                indefinitely until an exception is thrown
-                                and the caught exception is not in param
-                                exceptions.
-        :param inc_sleep_time: incremental time in seconds for sleep time
-                               between retries
-        :param max_sleep_time: max sleep time in seconds beyond which the sleep
-                               time will not be incremented using param
-                               inc_sleep_time. On reaching this threshold,
-                               max_sleep_time will be used as the sleep time.
-        :param exceptions: suggested exceptions for which the function must be
-                           retried
-        """
-        self._max_retry_count = max_retry_count
-        self._inc_sleep_time = inc_sleep_time
-        self._max_sleep_time = max_sleep_time
-        self._exceptions = exceptions
-        self._retry_count = 0
-        self._sleep_time = 0
-
-    def __call__(self, f):
-        func_name = reflection.get_callable_name(f)
-
-        def _func(*args, **kwargs):
-            result = None
-            try:
-                if self._retry_count:
-                    LOG.debug("Invoking %(func_name)s; retry count is "
-                              "%(retry_count)d.",
-                              {'func_name': func_name,
-                               'retry_count': self._retry_count})
-                result = f(*args, **kwargs)
-            except self._exceptions:
-                with excutils.save_and_reraise_exception() as ctxt:
-                    LOG.warning("Exception which is in the suggested list "
-                                "of exceptions occurred while invoking "
-                                "function: %s.",
-                                func_name,
-                                exc_info=True)
-                    if (self._max_retry_count != -1 and
-                            self._retry_count >= self._max_retry_count):
-                        LOG.error("Cannot retry upon suggested exception "
-                                  "since retry count (%(retry_count)d) "
-                                  "reached max retry count "
-                                  "(%(max_retry_count)d).",
-                                  {'retry_count': self._retry_count,
-                                   'max_retry_count': self._max_retry_count})
-                    else:
-                        ctxt.reraise = False
-                        self._retry_count += 1
-                        self._sleep_time += self._inc_sleep_time
-                        return self._sleep_time
-            raise loopingcall.LoopingCallDone(result)
-
-        def func(*args, **kwargs):
-            loop = loopingcall.DynamicLoopingCall(_func, *args, **kwargs)
-            evt = loop.start(periodic_interval_max=self._max_sleep_time)
-            return evt.wait()
-
-        return func
-
-
 class VMwareAPISession:
     """Setup a session with the server and handles all calls made to it.
 
@@ -226,7 +146,8 @@
                 self._pbm.set_soap_cookie(self._vim.get_http_cookie())
         return self._pbm
 
-    @RetryDecorator(exceptions=(exceptions.VimConnectionException,))
+    @loopingcall.RetryDecorator(
+        exceptions=(exceptions.VimConnectionException,))
     @lockutils.synchronized('oslo_vmware_api_lock')
     def _create_session(self):
         """Establish session with the server."""
@@ -292,9 +213,10 @@
                  VimSessionOverLoadException, VimConnectionException
         """
 
-        @RetryDecorator(max_retry_count=self._api_retry_count,
-                        exceptions=(exceptions.VimSessionOverLoadException,
-                                    exceptions.VimConnectionException))
+        @loopingcall.RetryDecorator(
+            max_retry_count=self._api_retry_count,
+            exceptions=(exceptions.VimSessionOverLoadException,
+                        exceptions.VimConnectionException))
         def _invoke_api(module, method, *args, **kwargs):
             try:
                 api_method = getattr(module, method)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/common/loopingcall.py 
new/oslo_vmware-4.9.0/oslo_vmware/common/loopingcall.py
--- old/oslo_vmware-4.7.0/oslo_vmware/common/loopingcall.py     2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/common/loopingcall.py     1970-01-01 
01:00:00.000000000 +0100
@@ -1,143 +0,0 @@
-# Copyright 2010 United States Government as represented by the
-# Administrator of the National Aeronautics and Space Administration.
-# Copyright 2011 Justin Santa Barbara
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import logging
-import sys
-
-from eventlet import event
-from eventlet import greenthread
-from oslo_utils import timeutils
-
-
-LOG = logging.getLogger(__name__)
-
-
-class LoopingCallDone(Exception):
-    """Exception to break out and stop a LoopingCall.
-
-    The poll-function passed to LoopingCall can raise this exception to
-    break out of the loop normally. This is somewhat analogous to
-    StopIteration.
-
-    An optional return-value can be included as the argument to the exception;
-    this return-value will be returned by LoopingCall.wait()
-
-    """
-
-    def __init__(self, retvalue=True):
-        """:param retvalue: Value that LoopingCall.wait() should return."""
-        self.retvalue = retvalue
-
-
-class LoopingCallBase:
-    def __init__(self, f=None, *args, **kw):
-        self.args = args
-        self.kw = kw
-        self.f = f
-        self._running = False
-        self.done = None
-
-    def stop(self):
-        self._running = False
-
-    def wait(self):
-        return self.done.wait()
-
-
-class FixedIntervalLoopingCall(LoopingCallBase):
-    """A fixed interval looping call."""
-
-    def start(self, interval, initial_delay=None):
-        self._running = True
-        done = event.Event()
-
-        def _inner():
-            if initial_delay:
-                greenthread.sleep(initial_delay)
-
-            try:
-                while self._running:
-                    start = timeutils.utcnow()
-                    self.f(*self.args, **self.kw)
-                    end = timeutils.utcnow()
-                    if not self._running:
-                        break
-                    delay = interval - timeutils.delta_seconds(start, end)
-                    if delay <= 0:
-                        LOG.warning('task run outlasted interval '
-                                    'by %s sec',
-                                    -delay)
-                    greenthread.sleep(delay if delay > 0 else 0)
-            except LoopingCallDone as e:
-                self.stop()
-                done.send(e.retvalue)
-            except Exception:
-                done.send_exception(*sys.exc_info())
-                return
-            else:
-                done.send(True)
-
-        self.done = done
-
-        greenthread.spawn_n(_inner)
-        return self.done
-
-
-# TODO(mikal): this class name is deprecated in Havana and should be removed
-# in the I release
-LoopingCall = FixedIntervalLoopingCall
-
-
-class DynamicLoopingCall(LoopingCallBase):
-    """A looping call which sleeps until the next known event.
-
-    The function called should return how long to sleep for before being
-    called again.
-    """
-
-    def start(self, initial_delay=None, periodic_interval_max=None):
-        self._running = True
-        done = event.Event()
-
-        def _inner():
-            if initial_delay:
-                greenthread.sleep(initial_delay)
-
-            try:
-                while self._running:
-                    idle = self.f(*self.args, **self.kw)
-                    if not self._running:
-                        break
-
-                    if periodic_interval_max is not None:
-                        idle = min(idle, periodic_interval_max)
-                    LOG.debug('Dynamic looping call sleeping for %.02f '
-                              'seconds', idle)
-                    greenthread.sleep(idle)
-            except LoopingCallDone as e:
-                self.stop()
-                done.send(e.retvalue)
-            except Exception:
-                done.send_exception(*sys.exc_info())
-                return
-            else:
-                done.send(True)
-
-        self.done = done
-
-        greenthread.spawn(_inner)
-        return self.done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/exceptions.py 
new/oslo_vmware-4.9.0/oslo_vmware/exceptions.py
--- old/oslo_vmware-4.7.0/oslo_vmware/exceptions.py     2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/exceptions.py     2026-02-17 
17:06:06.000000000 +0100
@@ -148,7 +148,7 @@
             descr += '\nFaults: ' + str(self.fault_list)
         if self.details:
             # details may contain non-ASCII values
-            details = '{%s}' % ', '.join(["'{}': '{}'".format(k, v) for k, v in
+            details = '{%s}' % ', '.join([f"'{k}': '{v}'" for k, v in
                                           self.details.items()])
             descr += '\nDetails: ' + details
         return descr
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/image_transfer.py 
new/oslo_vmware-4.9.0/oslo_vmware/image_transfer.py
--- old/oslo_vmware-4.7.0/oslo_vmware/image_transfer.py 2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/image_transfer.py 2026-02-17 
17:06:06.000000000 +0100
@@ -19,12 +19,11 @@
 
 import logging
 import tarfile
+import time
 
-from eventlet import timeout
-
+from oslo_service import loopingcall
 from oslo_utils import units
 from oslo_vmware._i18n import _
-from oslo_vmware.common import loopingcall
 from oslo_vmware import constants
 from oslo_vmware import exceptions
 from oslo_vmware import image_util
@@ -39,6 +38,18 @@
 CHUNK_SIZE = 64 * units.Ki  # default chunk size for image transfer
 
 
+class Timer:
+    class Timeout(Exception):
+        pass
+
+    def __init__(self, timeout_secs):
+        self._deadline = time.monotonic() + timeout_secs
+
+    def check_deadline(self):
+        if (self._deadline - time.monotonic()) <= 0:
+            raise self.Timeout()
+
+
 def _create_progress_updater(handle):
     if isinstance(handle, rw_handles.VmdkHandle):
         updater = loopingcall.FixedIntervalLoopingCall(handle.update_progress)
@@ -52,14 +63,15 @@
     read_updater = _create_progress_updater(read_handle)
     write_updater = _create_progress_updater(write_handle)
 
-    timer = timeout.Timeout(timeout_secs)
+    timer = Timer(timeout_secs)
     try:
         while True:
+            timer.check_deadline()
             data = read_handle.read(CHUNK_SIZE)
             if not data:
                 break
             write_handle.write(data)
-    except timeout.Timeout as excep:
+    except Timer.Timeout as excep:
         msg = (_('Timeout, read_handle: "%(src)s", write_handle: "%(dest)s"') %
                {'src': read_handle,
                 'dest': write_handle})
@@ -72,7 +84,6 @@
         LOG.exception(msg)
         raise exceptions.ImageTransferException(msg, excep)
     finally:
-        timer.cancel()
         if read_updater:
             read_updater.stop()
         if write_updater:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/image_util.py 
new/oslo_vmware-4.9.0/oslo_vmware/image_util.py
--- old/oslo_vmware-4.7.0/oslo_vmware/image_util.py     2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/image_util.py     2026-02-17 
17:06:06.000000000 +0100
@@ -19,10 +19,10 @@
 def _get_vmdk_name_from_ovf(root):
     ns_ovf = "{{{0}}}".format(root.nsmap["ovf"])
     disk = root.find("./{0}DiskSection/{0}Disk".format(ns_ovf))
-    file_id = disk.get("{}fileRef".format(ns_ovf))
+    file_id = disk.get(f"{ns_ovf}fileRef")
     f = root.find('./{0}References/{0}File[@{0}id="{1}"]'.format(ns_ovf,
                                                                  file_id))
-    return f.get("{}href".format(ns_ovf))
+    return f.get(f"{ns_ovf}href")
 
 
 def get_vmdk_name_from_ovf(ovf_handle):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/objects/datastore.py 
new/oslo_vmware-4.9.0/oslo_vmware/objects/datastore.py
--- old/oslo_vmware-4.7.0/oslo_vmware/objects/datastore.py      2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/objects/datastore.py      2026-02-17 
17:06:06.000000000 +0100
@@ -312,7 +312,7 @@
     def __str__(self):
         """Full datastore path to the file or directory."""
         if self._rel_path != '':
-            return "[{}] {}".format(self._datastore_name, self.rel_path)
+            return f"[{self._datastore_name}] {self.rel_path}"
         return "[%s]" % self._datastore_name
 
     @property
@@ -435,7 +435,7 @@
                 LOG.error(excep_msg)
                 raise ValueError(excep_msg)
             conn.putrequest(
-                method, '/folder/{}?{}'.format(self.path, self._query))
+                method, f'/folder/{self.path}?{self._query}')
             conn.putheader('User-Agent', constants.USER_AGENT)
             conn.putheader('Content-Length', content_length)
             conn.putheader('Cookie', cookie)
@@ -459,4 +459,4 @@
             'AcquireGenericServiceTicket',
             session.vim.service_content.sessionManager,
             spec=spec)
-        return '{}="{}"'.format(constants.CGI_COOKIE_KEY, ticket.id)
+        return f'{constants.CGI_COOKIE_KEY}="{ticket.id}"'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/pbm.py 
new/oslo_vmware-4.9.0/oslo_vmware/pbm.py
--- old/oslo_vmware-4.7.0/oslo_vmware/pbm.py    2025-07-25 12:53:56.000000000 
+0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/pbm.py    2026-02-17 17:06:06.000000000 
+0100
@@ -193,7 +193,7 @@
     ver = vc_version.split('.')
     major_minor = ver[0]
     if len(ver) >= 2:
-        major_minor = '{}.{}'.format(major_minor, ver[1])
+        major_minor = f'{major_minor}.{ver[1]}'
     curr_dir = os.path.abspath(os.path.dirname(__file__))
     pbm_service_wsdl = os.path.join(curr_dir, 'wsdl', major_minor,
                                     'pbmService.wsdl')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/rw_handles.py 
new/oslo_vmware-4.9.0/oslo_vmware/rw_handles.py
--- old/oslo_vmware-4.7.0/oslo_vmware/rw_handles.py     2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/rw_handles.py     2026-02-17 
17:06:06.000000000 +0100
@@ -243,7 +243,7 @@
         else:
             soap_url = self._get_soap_url(scheme, host_or_url, port)
             param_list = {'dcPath': data_center_name, 'dsName': datastore_name}
-            self._url = '{}/folder/{}'.format(soap_url, file_path)
+            self._url = f'{soap_url}/folder/{file_path}'
             self._url = self._url + '?' + urlparse.urlencode(param_list)
 
         self._conn = self._create_write_connection('PUT',
@@ -319,7 +319,7 @@
         else:
             soap_url = self._get_soap_url(scheme, host_or_url, port)
             param_list = {'dcPath': data_center_name, 'dsName': datastore_name}
-            self._url = '{}/folder/{}'.format(soap_url, file_path)
+            self._url = f'{soap_url}/folder/{file_path}'
             self._url = self._url + '?' + urlparse.urlencode(param_list)
 
         self._conn = self._create_read_connection(self._url,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_vmware-4.7.0/oslo_vmware/tests/objects/test_datastore.py 
new/oslo_vmware-4.9.0/oslo_vmware/tests/objects/test_datastore.py
--- old/oslo_vmware-4.7.0/oslo_vmware/tests/objects/test_datastore.py   
2025-07-25 12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/tests/objects/test_datastore.py   
2026-02-17 17:06:06.000000000 +0100
@@ -429,7 +429,7 @@
         params = {'dcPath': dc_path, 'dsName': ds_name}
         path = 'images/aa.vmdk'
         query = urlparse.urlencode(params)
-        url = 'https://13.37.73.31/folder/{}?{}'.format(path, query)
+        url = f'https://13.37.73.31/folder/{path}?{query}'
         ds_url = datastore.DatastoreURL.urlparse(url)
         self.assertEqual(path, ds_url.path)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/tests/test_api.py 
new/oslo_vmware-4.9.0/oslo_vmware/tests/test_api.py
--- old/oslo_vmware-4.7.0/oslo_vmware/tests/test_api.py 2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/tests/test_api.py 2026-02-17 
17:06:06.000000000 +0100
@@ -18,7 +18,6 @@
 from datetime import datetime
 from unittest import mock
 
-from eventlet import greenthread
 from oslo_context import context
 import suds
 
@@ -29,71 +28,6 @@
 from oslo_vmware import vim_util
 
 
-class RetryDecoratorTest(base.TestCase):
-    """Tests for retry decorator class."""
-
-    def test_retry(self):
-        result = "RESULT"
-
-        @api.RetryDecorator()
-        def func(*args, **kwargs):
-            return result
-
-        self.assertEqual(result, func())
-
-        def func2(*args, **kwargs):
-            return result
-
-        retry = api.RetryDecorator()
-        self.assertEqual(result, retry(func2)())
-        self.assertTrue(retry._retry_count == 0)
-
-    def test_retry_with_expected_exceptions(self):
-        result = "RESULT"
-        responses = [exceptions.VimSessionOverLoadException(None),
-                     exceptions.VimSessionOverLoadException(None),
-                     result]
-
-        def func(*args, **kwargs):
-            response = responses.pop(0)
-            if isinstance(response, Exception):
-                raise response
-            return response
-
-        sleep_time_incr = 0.01
-        retry_count = 2
-        retry = api.RetryDecorator(10, sleep_time_incr, 10,
-                                   (exceptions.VimSessionOverLoadException,))
-        self.assertEqual(result, retry(func)())
-        self.assertTrue(retry._retry_count == retry_count)
-        self.assertEqual(retry_count * sleep_time_incr, retry._sleep_time)
-
-    def test_retry_with_max_retries(self):
-        responses = [exceptions.VimSessionOverLoadException(None),
-                     exceptions.VimSessionOverLoadException(None),
-                     exceptions.VimSessionOverLoadException(None)]
-
-        def func(*args, **kwargs):
-            response = responses.pop(0)
-            if isinstance(response, Exception):
-                raise response
-            return response
-
-        retry = api.RetryDecorator(2, 0, 0,
-                                   (exceptions.VimSessionOverLoadException,))
-        self.assertRaises(exceptions.VimSessionOverLoadException, retry(func))
-        self.assertTrue(retry._retry_count == 2)
-
-    def test_retry_with_unexpected_exception(self):
-
-        def func(*args, **kwargs):
-            raise exceptions.VimException(None)
-
-        retry = api.RetryDecorator()
-        self.assertRaises(exceptions.VimException, retry(func))
-        self.assertTrue(retry._retry_count == 0)
-
-
 class VMwareAPISessionTest(base.TestCase):
     """Tests for VMwareAPISession."""
 
@@ -276,7 +210,7 @@
 
         module = mock.Mock()
         module.api = api
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             self.assertEqual(ret, api_session.invoke_api(module, 'api'))
         api_session._create_session.assert_called_once_with()
 
@@ -296,7 +230,7 @@
 
         module = mock.Mock()
         module.api = api
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             self.assertEqual(ret, api_session.invoke_api(module, 'api'))
         self.assertFalse(api_session._create_session.called)
 
@@ -369,7 +303,7 @@
 
         module = mock.Mock()
         module.api = api
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             ret = api_session.invoke_api(module, 'api')
         self.assertEqual(result, ret)
         vim_obj.SessionIsActive.assert_called_once_with(
@@ -410,7 +344,7 @@
 
         api_session.invoke_api = mock.Mock(side_effect=invoke_api_side_effect)
         task = mock.Mock()
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             ret = api_session.wait_for_task(task)
             self.assertEqual('success', ret.state)
             self.assertEqual(100, ret.progress)
@@ -441,7 +375,7 @@
 
         api_session.invoke_api = mock.Mock(side_effect=invoke_api_side_effect)
         task = mock.Mock()
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             ret = api_session.wait_for_task(task)
             self.assertEqual('success', ret.state)
             self.assertEqual(100, ret.progress)
@@ -469,7 +403,7 @@
 
         api_session.invoke_api = mock.Mock(side_effect=invoke_api_side_effect)
         task = mock.Mock()
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             self.assertRaises(exceptions.VimFaultException,
                               api_session.wait_for_task,
                               task)
@@ -488,7 +422,7 @@
         api_session.invoke_api = mock.Mock(
             side_effect=exceptions.VimException(None))
         task = mock.Mock()
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             self.assertRaises(exceptions.VimException,
                               api_session.wait_for_task,
                               task)
@@ -509,7 +443,7 @@
 
         api_session.invoke_api = mock.Mock(side_effect=invoke_api_side_effect)
         lease = mock.Mock()
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             api_session.wait_for_lease_ready(lease)
         api_session.invoke_api.assert_called_with(vim_util,
                                                   'get_object_property',
@@ -527,7 +461,7 @@
 
         api_session.invoke_api = mock.Mock(side_effect=invoke_api_side_effect)
         lease = mock.Mock()
-        with mock.patch.object(greenthread, 'sleep'):
+        with mock.patch('time.sleep'):
             self.assertRaises(exceptions.VimException,
                               api_session.wait_for_lease_ready,
                               lease)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/tests/test_hacking.py 
new/oslo_vmware-4.9.0/oslo_vmware/tests/test_hacking.py
--- old/oslo_vmware-4.7.0/oslo_vmware/tests/test_hacking.py     2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/tests/test_hacking.py     2026-02-17 
17:06:06.000000000 +0100
@@ -22,8 +22,8 @@
     def test_no_log_translations(self):
         for log, hint in itertools.product(checks._all_log_levels,
                                            checks._all_hints):
-            bad = 'LOG.{}({}("Bad"))'.format(log, hint)
+            bad = f'LOG.{log}({hint}("Bad"))'
             self.assertEqual(1, len(list(checks.no_translate_logs(bad, 'f'))))
             # Catch abuses when used with a variable and not a literal
-            bad = 'LOG.{}({}(msg))'.format(log, hint)
+            bad = f'LOG.{log}({hint}(msg))'
             self.assertEqual(1, len(list(checks.no_translate_logs(bad, 'f'))))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_vmware-4.7.0/oslo_vmware/tests/test_image_transfer.py 
new/oslo_vmware-4.9.0/oslo_vmware/tests/test_image_transfer.py
--- old/oslo_vmware-4.7.0/oslo_vmware/tests/test_image_transfer.py      
2025-07-25 12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/tests/test_image_transfer.py      
2026-02-17 17:06:06.000000000 +0100
@@ -30,7 +30,7 @@
         data = b'image-data-here'
         read_handle = io.BytesIO(data)
         write_handle = mock.Mock()
-        image_transfer._start_transfer(read_handle, write_handle, None)
+        image_transfer._start_transfer(read_handle, write_handle, 10)
         write_handle.write.assert_called_once_with(data)
 
     @mock.patch('oslo_vmware.rw_handles.FileWriteHandle')
@@ -313,7 +313,7 @@
 
     @mock.patch.object(image_transfer, '_start_transfer')
     @mock.patch('oslo_vmware.rw_handles.VmdkReadHandle')
-    @mock.patch('oslo_vmware.common.loopingcall.FixedIntervalLoopingCall')
+    @mock.patch('oslo_service.loopingcall.FixedIntervalLoopingCall')
     def test_copy_stream_optimized_disk(
             self, loopingcall, vmdk_read_handle, start_transfer):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/oslo_vmware/vim_util.py 
new/oslo_vmware-4.9.0/oslo_vmware/vim_util.py
--- old/oslo_vmware-4.7.0/oslo_vmware/vim_util.py       2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/oslo_vmware/vim_util.py       2026-02-17 
17:06:06.000000000 +0100
@@ -576,13 +576,13 @@
                 if len(propSet) >= 1 and not entity_name:
                     entity_name = propSet[0].val
                 elif len(propSet) >= 1:
-                    path = '{}/{}'.format(propSet[0].val, path)
+                    path = f'{propSet[0].val}/{path}'
     # NOTE(arnaud): slice to exclude the root folder from the result.
     if propSet is not None and len(propSet) > 0:
         path = path[len(propSet[0].val):]
     if entity_name is None:
         entity_name = ""
-    return '{}{}'.format(path, entity_name)
+    return f'{path}{entity_name}'
 
 
 def get_http_service_request_spec(client_factory, method, uri):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/pyproject.toml 
new/oslo_vmware-4.9.0/pyproject.toml
--- old/oslo_vmware-4.7.0/pyproject.toml        2025-07-25 12:53:56.000000000 
+0200
+++ new/oslo_vmware-4.9.0/pyproject.toml        2026-02-17 17:06:06.000000000 
+0100
@@ -1,3 +1,39 @@
 [build-system]
 requires = ["pbr>=6.1.1"]
 build-backend = "pbr.build"
+
+[project]
+name = "oslo.vmware"
+description = "Oslo VMware library"
+authors = [
+    {name = "OpenStack", email = "[email protected]"},
+]
+readme = {file = "README.rst", content-type = "text/x-rst"}
+license = {text = "Apache-2.0"}
+dynamic = ["version", "dependencies"]
+requires-python = ">=3.10"
+classifiers = [
+    "Environment :: OpenStack",
+    "Intended Audience :: Information Technology",
+    "Intended Audience :: System Administrators",
+    "License :: OSI Approved :: Apache Software License",
+    "Operating System :: POSIX :: Linux",
+    "Programming Language :: Python",
+    "Programming Language :: Python :: 3",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+    "Programming Language :: Python :: 3.12",
+    "Programming Language :: Python :: 3.13",
+]
+
+[project.urls]
+Homepage = "https://docs.openstack.org/oslo.vmware";
+Repository = "https://opendev.org/openstack/oslo.vmware";
+
+[tool.setuptools]
+packages = [
+    "oslo_vmware"
+]
+
+[tool.bandit]
+exclude_dirs = ["tests"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_vmware-4.7.0/releasenotes/notes/remove-py39-51518455aaf46d7f.yaml 
new/oslo_vmware-4.9.0/releasenotes/notes/remove-py39-51518455aaf46d7f.yaml
--- old/oslo_vmware-4.7.0/releasenotes/notes/remove-py39-51518455aaf46d7f.yaml  
1970-01-01 01:00:00.000000000 +0100
+++ new/oslo_vmware-4.9.0/releasenotes/notes/remove-py39-51518455aaf46d7f.yaml  
2026-02-17 17:06:06.000000000 +0100
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - |
+    Support for Python 3.9 has been removed. Now the minimum python version
+    supported is 3.10.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/releasenotes/source/2024.1.rst 
new/oslo_vmware-4.9.0/releasenotes/source/2024.1.rst
--- old/oslo_vmware-4.7.0/releasenotes/source/2024.1.rst        2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/releasenotes/source/2024.1.rst        2026-02-17 
17:06:06.000000000 +0100
@@ -3,4 +3,4 @@
 ===========================
 
 .. release-notes::
-   :branch: stable/2024.1
+   :branch: unmaintained/2024.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/releasenotes/source/2025.2.rst 
new/oslo_vmware-4.9.0/releasenotes/source/2025.2.rst
--- old/oslo_vmware-4.7.0/releasenotes/source/2025.2.rst        1970-01-01 
01:00:00.000000000 +0100
+++ new/oslo_vmware-4.9.0/releasenotes/source/2025.2.rst        2026-02-17 
17:06:06.000000000 +0100
@@ -0,0 +1,6 @@
+===========================
+2025.2 Series Release Notes
+===========================
+
+.. release-notes::
+   :branch: stable/2025.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/releasenotes/source/index.rst 
new/oslo_vmware-4.9.0/releasenotes/source/index.rst
--- old/oslo_vmware-4.7.0/releasenotes/source/index.rst 2025-07-25 
12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/releasenotes/source/index.rst 2026-02-17 
17:06:06.000000000 +0100
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   2025.2
    2025.1
    2024.2
    2024.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/requirements.txt 
new/oslo_vmware-4.9.0/requirements.txt
--- old/oslo_vmware-4.7.0/requirements.txt      2025-07-25 12:53:56.000000000 
+0200
+++ new/oslo_vmware-4.9.0/requirements.txt      2026-02-17 17:06:06.000000000 
+0100
@@ -14,3 +14,4 @@
 urllib3>=1.21.1 # MIT
 oslo.concurrency>=3.26.0 # Apache-2.0
 oslo.context>=2.19.2 # Apache-2.0
+oslo.service>=4.3.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/setup.cfg 
new/oslo_vmware-4.9.0/setup.cfg
--- old/oslo_vmware-4.7.0/setup.cfg     2025-07-25 12:55:02.166318400 +0200
+++ new/oslo_vmware-4.9.0/setup.cfg     2026-02-17 17:07:10.462320600 +0100
@@ -1,30 +1,5 @@
 [metadata]
 name = oslo.vmware
-summary = Oslo VMware library
-description_file = 
-       README.rst
-author = OpenStack
-author_email = [email protected]
-home_page = https://docs.openstack.org/oslo.vmware/latest/
-python_requires = >=3.9
-classifier = 
-       Environment :: OpenStack
-       Intended Audience :: Information Technology
-       Intended Audience :: System Administrators
-       License :: OSI Approved :: Apache Software License
-       Operating System :: POSIX :: Linux
-       Programming Language :: Python
-       Programming Language :: Python :: 3
-       Programming Language :: Python :: 3.9
-       Programming Language :: Python :: 3.10
-       Programming Language :: Python :: 3.11
-       Programming Language :: Python :: 3.12
-       Programming Language :: Python :: 3 :: Only
-       Programming Language :: Python :: Implementation :: CPython
-
-[files]
-packages = 
-       oslo_vmware
 
 [egg_info]
 tag_build = 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_vmware-4.7.0/tox.ini 
new/oslo_vmware-4.9.0/tox.ini
--- old/oslo_vmware-4.7.0/tox.ini       2025-07-25 12:53:56.000000000 +0200
+++ new/oslo_vmware-4.9.0/tox.ini       2026-02-17 17:06:06.000000000 +0100
@@ -38,6 +38,8 @@
 
 [flake8]
 show-source = True
+# H904: Delay string interpolations at logging calls
+enable-extensions = H904
 # H405: multi line docstring summary not separated with an empty line
 # W504 line break after binary operator
 ignore = H405,W504

Reply via email to