Files
oslo.service/oslo_service/fixture.py
Daniel Bengtsson 861e8d6677 Migrate Eventlet components to the new backend system
This commit migrates Eventlet-specific components to the newly
introduced
backend system, isolating their implementation within the
`oslo_service.backend.eventlet` module. The following changes have been
made:

- Eventlet Components:
  - Moved Eventlet-specific implementations of `service`, `loopingcall`,
  and `threadgroup` into `oslo_service/backend/eventlet/`.
  - Introduced an `EventletBackend` class with
  `get_service_components()` to expose these implementations
  dynamically.

- Core Refactors:
  - Updated `service.py`, `loopingcall.py`, and `threadgroup.py` to
  retrieve Eventlet components via the backend system (`get_backend()`).

- Backward Compatibility:
  - Ensured no changes to public APIs in `service.py`, `loopingcall.py`,
  and `threadgroup.py`.

- Tests: Existing tests for Eventlet components remain applicable as the
logic in the core files has not been modified.
- Documentation: This change completes the migration of
Eventlet-specific logic and prepares the codebase for alternative
backend implementations in the future.

Change-Id: Ieba0109491c37f260163fe2eb1ed2e03ecc6b15d
2025-01-30 11:12:20 +01:00

65 lines
2.1 KiB
Python

# 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 fixtures
from debtcollector import removals
removals.removed_module(
__name__,
replacement=None,
removal_version="2026.2",
message=(
"The 'oslo_service.fixture' module is deprecated and will be removed"
" in version 2026.2."
)
)
class SleepFixture(fixtures.Fixture):
"""A fixture for mocking the ``wait()`` within :doc:`loopingcall` events.
This exists so test cases can exercise code that uses :doc:`loopingcall`
without actually incurring wall clock time for sleeping.
The mock for the ``wait()`` is accessible via the fixture's ``mock_wait``
attribute.
.. note:: It is not recommended to assert specific arguments (i.e. timeout
values) to the mock, as this relies on the internals of
:doc:`loopingcall` not changing.
.. todo:: Figure out a way to make an enforceable contract allowing
verification of timeout values.
Example usage::
from oslo.service import fixture
...
class MyTest(...):
def setUp(self):
...
self.sleepfx = self.useFixture(fixture.SleepFixture())
...
def test_this(self):
...
thing_that_hits_a_loopingcall()
...
self.assertEqual(5, self.sleepfx.mock_wait.call_count)
...
"""
def _setUp(self):
# Provide access to the mock so that calls to it can be asserted
self.mock_wait = self.useFixture(fixtures.MockPatch(
'oslo_utils.eventletutils.EventletEvent.wait')).mock