From b8bb1fbc9136ede4620166239ee955c5ec7c4789 Mon Sep 17 00:00:00 2001 From: haseeb <184114777+haseebsyed12@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:47:27 +0530 Subject: [PATCH] PUC-783: creating VLAN in Nautobot when segment is created in neutron --- .../neutron_understack/nautobot.py | 45 ++++ .../neutron_understack_mech.py | 60 ++++- .../neutron_understack/tests/conftest.py | 22 ++ .../neutron_understack/tests/test_nautobot.py | 59 +++++ .../tests/test_neutron_understack_mech.py | 49 ++++ .../neutron_understack/utils.py | 9 + python/neutron-understack/poetry.lock | 221 +++++++++++++++--- python/neutron-understack/pyproject.toml | 1 + 8 files changed, 436 insertions(+), 30 deletions(-) create mode 100644 python/neutron-understack/neutron_understack/tests/test_nautobot.py diff --git a/python/neutron-understack/neutron_understack/nautobot.py b/python/neutron-understack/neutron_understack/nautobot.py index d43ce27d8..a85a934ae 100644 --- a/python/neutron-understack/neutron_understack/nautobot.py +++ b/python/neutron-understack/neutron_understack/nautobot.py @@ -1,8 +1,10 @@ import inspect +from dataclasses import dataclass from pprint import pformat from urllib.parse import urljoin from uuid import UUID +import pynautobot import requests from neutron_lib import exceptions as exc from oslo_log import log @@ -26,6 +28,27 @@ class NautobotCustomFieldNotFoundError(exc.NeutronException): message = "Custom field with name %(cf_name)s not found for %(obj)s" +@dataclass +class VlanPayload: + id: str + network_id: str + vid: int + vlan_group_name: str + status: str = "Active" + + def to_dict(self) -> dict: + return { + "id": self.id, + "vid": self.vid, + "name": self.id, + "vlan_group": self.vlan_group_name, + "status": self.status, + "relationships": { + "ucvni_vlans": {"source": {"objects": [{"id": self.network_id}]}} + }, + } + + def _truncated(message: str | bytes, maxlen=200) -> str: input = str(message) if len(input) <= maxlen: @@ -41,6 +64,10 @@ def __init__(self, nb_url: str, nb_token: str): self.base_url = nb_url self.session = requests.Session() self.session.headers.update({"Authorization": f"Token {nb_token}"}) + self.api = pynautobot.api( + url=nb_url, + token=nb_token, + ) def make_api_request( self, @@ -257,3 +284,21 @@ def check_vlan_availability(self, interface_id: str | UUID, vlan_tag: int) -> bo response = self.make_api_request("GET", url, params=params) or {} return response.get("available", False) + + def delete_vlan(self, vlan_id: str): + return self.api.ipam.vlans.delete([vlan_id]) + + def create_vlan_and_associate_vlan_to_ucvni(self, vlan: VlanPayload): + try: + result = self.api.ipam.vlans.create(vlan.to_dict()) + except pynautobot.core.query.RequestError as error: + LOG.error("Nautobot error: %(error)s", {"error": error}) + raise NautobotRequestError( + code=error.req.status_code, + url=error.base, + method="POST", + payload=error.request_body, + body=vlan.to_dict(), + ) from error + else: + return result diff --git a/python/neutron-understack/neutron_understack/neutron_understack_mech.py b/python/neutron-understack/neutron_understack/neutron_understack_mech.py index ff9d44fcf..99b612029 100644 --- a/python/neutron-understack/neutron_understack/neutron_understack_mech.py +++ b/python/neutron-understack/neutron_understack/neutron_understack_mech.py @@ -4,6 +4,10 @@ import neutron_lib.api.definitions.portbindings as portbindings from neutron.plugins.ml2.driver_context import PortContext from neutron_lib import constants as p_const +from neutron_lib.api.definitions import segment as segment_def +from neutron_lib.callbacks import events +from neutron_lib.callbacks import registry +from neutron_lib.callbacks import resources from neutron_lib.plugins.ml2 import api from neutron_lib.plugins.ml2.api import MechanismDriver from neutron_lib.plugins.ml2.api import NetworkContext @@ -12,13 +16,13 @@ from neutron_understack import config from neutron_understack import utils from neutron_understack.nautobot import Nautobot +from neutron_understack.nautobot import VlanPayload from neutron_understack.trunk import UnderStackTrunkDriver from neutron_understack.undersync import Undersync from neutron_understack.vlan_manager import VlanManager LOG = logging.getLogger(__name__) - config.register_ml2_type_understack_opts(cfg.CONF) config.register_ml2_understack_opts(cfg.CONF) @@ -37,6 +41,21 @@ def initialize(self): self.undersync = Undersync(conf.undersync_token, conf.undersync_url) self.trunk_driver = UnderStackTrunkDriver.create(self) self.vlan_manager = VlanManager(self.nb, conf) + self.subscribe() + + def subscribe(self): + registry.subscribe( + self._create_segment, + resources.SEGMENT, + events.PRECOMMIT_CREATE, + cancellable=True, + ) + registry.subscribe( + self._delete_segment, + resources.SEGMENT, + events.BEFORE_DELETE, + cancellable=True, + ) def create_network_precommit(self, context: NetworkContext): if cfg.CONF.ml2_understack.enforce_unique_vlans_in_fabric: @@ -107,6 +126,11 @@ def delete_network_postcommit(self, context): dry_run=cfg.CONF.ml2_understack.undersync_dry_run, ) elif provider_type == p_const.TYPE_VXLAN: + network_segments = utils.valid_network_segments(context.network_segments) + vlans_to_delete = [segment.get("id") for segment in network_segments] + self.nb.delete_vlans( + vlan_ids=vlans_to_delete, + ) self.nb.ucvni_delete(network_id) else: return @@ -432,3 +456,37 @@ def _create_nautobot_namespace( "shared_nautobot_namespace": shared_namespace, }, ) + + def _create_segment(self, resource, event, trigger, payload): + self._create_vlan(payload.latest_state) + + def _delete_segment(self, resource, event, trigger, payload): + self._delete_vlan(payload.latest_state) + + def _create_vlan(self, segment): + if not utils.is_valid_vlan_network_segment(segment): + return + + vlan_payload = VlanPayload( + id=segment.get("id"), + vid=segment.get(segment_def.SEGMENTATION_ID), + vlan_group_name=segment.get(segment_def.PHYSICAL_NETWORK), + network_id=segment.get("network_id"), + ) + + LOG.info( + "creating vlan in nautobot for segment %(segment)s", + {"segment": segment}, + ) + self.nb.create_vlan_and_associate_vlan_to_ucvni(vlan_payload) + + def _delete_vlan(self, segment): + if not utils.is_valid_vlan_network_segment(segment): + return + LOG.info( + "deleting vlan in nautobot for segment %(segment)s", + {"segment": segment}, + ) + self.nb.delete_vlan( + vlan_id=segment.get("id"), + ) diff --git a/python/neutron-understack/neutron_understack/tests/conftest.py b/python/neutron-understack/neutron_understack/tests/conftest.py index 5a9a7ec3c..4ee7a3237 100644 --- a/python/neutron-understack/neutron_understack/tests/conftest.py +++ b/python/neutron-understack/neutron_understack/tests/conftest.py @@ -8,6 +8,7 @@ from neutron.db.models_v2 import Network from neutron.db.models_v2 import Port as PortModel from neutron.db.models_v2 import Subnet +from neutron.objects.network import NetworkSegment as SegmentObj from neutron.objects.ports import Port as PortObject from neutron.objects.trunk import SubPort from neutron.objects.trunk import Trunk @@ -53,6 +54,11 @@ def vlan_num() -> int: return random.randint(1, 4094) +@pytest.fixture +def network_segment_id() -> uuid.UUID: + return uuid.uuid4() + + @pytest.fixture def patch_extend_subnet(mocker) -> None: """Ml2 Plugin extend subnet patch. @@ -89,6 +95,22 @@ def network_segment() -> NetworkSegment: return NetworkSegment(network_type="vxlan") +@pytest.fixture +def vlan_network_segment(request, network_segment_id, network_id) -> SegmentObj: + req = getattr(request, "param", {}) + return SegmentObj( + id=network_segment_id, + network_type="vlan", + network_id=network_id, + physical_network=req.get("physical_network"), + revision_number=1, + segment_index=1, + is_dynamic=False, + name="puc-abc", + segmentation_id=req.get("segmentation_id", 1800), + ) + + @pytest.fixture def network_context(ml2_plugin, network_dict, network_segment) -> NetworkContext: return NetworkContext( diff --git a/python/neutron-understack/neutron_understack/tests/test_nautobot.py b/python/neutron-understack/neutron_understack/tests/test_nautobot.py new file mode 100644 index 000000000..ea7295250 --- /dev/null +++ b/python/neutron-understack/neutron_understack/tests/test_nautobot.py @@ -0,0 +1,59 @@ +from unittest.mock import MagicMock +from unittest.mock import patch + +import pytest + +from neutron_understack.nautobot import Nautobot +from neutron_understack.nautobot import VlanPayload + + +@pytest.fixture +def mock_pynautobot_api(): + with patch("neutron_understack.nautobot.pynautobot.api") as mock_api: + mock_ipam = MagicMock() + mock_ipam.vlans.delete = MagicMock() + mock_ipam.vlans.create = MagicMock() + + mock_api.return_value.ipam = mock_ipam + + yield mock_api, mock_ipam + + +@pytest.fixture +def nautobot(mock_pynautobot_api): + return Nautobot(nb_url="http://fake-nautobot", nb_token="fake-token") # noqa: S106 + + +def test_delete_vlan(nautobot, mock_pynautobot_api): + _, mock_ipam = mock_pynautobot_api + vlan_id = "123" + + nautobot.delete_vlan(vlan_id) + + mock_ipam.vlans.delete.assert_called_once_with([vlan_id]) + + +def test_create_vlan_and_associate_vlan_to_ucvni(nautobot, mock_pynautobot_api): + _, mock_ipam = mock_pynautobot_api + + payload = VlanPayload( + id="vlan-123", + vid=101, + vlan_group_name="test-group", + network_id="net-456", + ) + + expected_payload_dict = { + "id": "vlan-123", + "vid": 101, + "vlan_group": {"name": "test-group"}, + "name": "test-network", + "status": {"name": "Active"}, + "relationships": {"ucvni_vlans": {"source": {"objects": [{"id": "net-456"}]}}}, + } + + payload.to_dict = lambda: expected_payload_dict + + nautobot.create_vlan_and_associate_vlan_to_ucvni(payload) + + mock_ipam.vlans.create.assert_called_once_with(expected_payload_dict) diff --git a/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py b/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py index aa3d034ec..0f09b7740 100644 --- a/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py +++ b/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py @@ -4,6 +4,7 @@ from neutron_lib.api.definitions import portbindings from neutron_understack import utils +from neutron_understack.nautobot import VlanPayload class TestUpdateNautobot: @@ -134,3 +135,51 @@ def test_delete_public(self, understack_driver, subnet_context): understack_driver.delete_subnet_postcommit(subnet_context) understack_driver.nb.subnet_delete.assert_called_once() + + +class TestNetworkSegmentEventCallbacks: + @pytest.mark.parametrize( + "vlan_network_segment", [{"physical_network": "f20-2-network"}], indirect=True + ) + def test__create_vlan_valid_segment( + self, mocker, vlan_network_segment, understack_driver + ): + mocker.patch( + "neutron_understack.utils.is_valid_vlan_network_segment", return_value=True + ) + + mock_create = mocker.patch.object( + understack_driver.nb, "create_vlan_and_associate_vlan_to_ucvni" + ) + + understack_driver._create_vlan(vlan_network_segment) + + mock_create.assert_called_once() + vlan_payload: VlanPayload = mock_create.call_args[0][0] + + assert vlan_payload.vid == 1800 + assert vlan_payload.vlan_group_name == "f20-2-network" + + def test__create_vlan_invalid_segment( + self, mocker, vlan_network_segment, understack_driver + ): + mocker.patch( + "neutron_understack.utils.is_valid_vlan_network_segment", return_value=False + ) + mock_create = mocker.patch.object( + understack_driver.nb, "create_vlan_and_associate_vlan_to_ucvni" + ) + + understack_driver._create_vlan(vlan_network_segment) + + mock_create.assert_not_called() + + @pytest.mark.parametrize( + "vlan_network_segment", + [{"physical_network": "f20-2-network", "segmentation_id": 100}], + indirect=True, + ) + def test__delete_vlan(self, mocker, vlan_network_segment, understack_driver): + mock_delete = mocker.patch.object(understack_driver.nb, "delete_vlan") + understack_driver._delete_vlan(vlan_network_segment) + mock_delete.assert_called_once_with(vlan_id=vlan_network_segment.get("id")) diff --git a/python/neutron-understack/neutron_understack/utils.py b/python/neutron-understack/neutron_understack/utils.py index a07217254..6d8eb020d 100644 --- a/python/neutron-understack/neutron_understack/utils.py +++ b/python/neutron-understack/neutron_understack/utils.py @@ -3,7 +3,9 @@ from neutron.objects import ports as port_obj from neutron.plugins.ml2.driver_context import portbindings +from neutron_lib import constants from neutron_lib import context as n_context +from neutron_lib.api.definitions import segment as segment_def def fetch_port_object(port_id: str) -> port_obj.Port: @@ -48,3 +50,10 @@ def parent_port_is_bound(port: port_obj.Port) -> bool: def fetch_subport_network_id(subport_id: str) -> str: neutron_port = fetch_port_object(subport_id) return neutron_port.network_id + + +def is_valid_vlan_network_segment(network_segment: dict): + return ( + network_segment.get(segment_def.NETWORK_TYPE) == constants.TYPE_VLAN + and network_segment.get(segment_def.PHYSICAL_NETWORK) is not None + ) diff --git a/python/neutron-understack/poetry.lock b/python/neutron-understack/poetry.lock index a432a7ae7..7e57c4e49 100644 --- a/python/neutron-understack/poetry.lock +++ b/python/neutron-understack/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "alembic" @@ -6,6 +6,7 @@ version = "1.14.0" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "alembic-1.14.0-py3-none-any.whl", hash = "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25"}, {file = "alembic-1.14.0.tar.gz", hash = "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b"}, @@ -17,7 +18,7 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["backports.zoneinfo"] +tz = ["backports.zoneinfo ; python_version < \"3.9\""] [[package]] name = "amqp" @@ -25,6 +26,7 @@ version = "5.3.1" description = "Low-level AMQP client for Python (fork of amqplib)." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2"}, {file = "amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432"}, @@ -39,18 +41,19 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "autopage" @@ -58,6 +61,7 @@ version = "0.5.2" description = "A library to provide automatic paging for console output" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "autopage-0.5.2-py3-none-any.whl", hash = "sha256:f5eae54dd20ccc8b1ff611263fc87bc46608a9cde749bbcfc93339713a429c55"}, {file = "autopage-0.5.2.tar.gz", hash = "sha256:826996d74c5aa9f4b6916195547312ac6384bac3810b8517063f293248257b72"}, @@ -69,6 +73,7 @@ version = "4.2.1" description = "Modern password hashing for your software and your servers" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "bcrypt-4.2.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:1340411a0894b7d3ef562fb233e4b6ed58add185228650942bdc885362f32c17"}, {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ee315739bc8387aa36ff127afc99120ee452924e0df517a8f3e4c0187a0f5f"}, @@ -107,6 +112,7 @@ version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, @@ -118,6 +124,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -129,6 +136,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -208,6 +216,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -309,6 +318,7 @@ version = "4.8.0" description = "Command Line Interface Formulation Framework" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "cliff-4.8.0-py3-none-any.whl", hash = "sha256:31d761e73920f3260a40f52ba629d7beef6a631b9ad2d039dd4b9fc738760de4"}, {file = "cliff-4.8.0.tar.gz", hash = "sha256:23eff502e603cf0aa841eaea6662a42cd3064169162b3e596b20226400e34dfd"}, @@ -327,6 +337,7 @@ version = "2.5.8" description = "cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cmd2-2.5.8-py3-none-any.whl", hash = "sha256:aeb6eb6cd6d783bb7d92d37aa920bcfa7379690ba9ab1188576562f73a13471c"}, {file = "cmd2-2.5.8.tar.gz", hash = "sha256:ddf29beaa7c9d4e9806eefad528a59c372ca97b4c0d83e019fef0e37c44f4497"}, @@ -351,6 +362,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["test"] +markers = "sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -362,6 +375,7 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["test"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -431,7 +445,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cryptography" @@ -439,6 +453,7 @@ version = "44.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main"] files = [ {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, @@ -446,7 +461,6 @@ files = [ {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, @@ -457,7 +471,6 @@ files = [ {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, @@ -475,10 +488,10 @@ files = [ cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] @@ -490,6 +503,7 @@ version = "3.0.0" description = "A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "debtcollector-3.0.0-py3-none-any.whl", hash = "sha256:46f9dacbe8ce49c47ebf2bf2ec878d50c9443dfae97cc7b8054be684e54c3e91"}, {file = "debtcollector-3.0.0.tar.gz", hash = "sha256:2a8917d25b0e1f1d0d365d3c1c6ecfc7a522b1e9716e8a1a4a915126f7ccea6f"}, @@ -504,6 +518,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -515,6 +530,7 @@ version = "2.7.0" description = "DNS toolkit" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, @@ -535,6 +551,7 @@ version = "1.3.3" description = "A caching front-end based on the Dogpile lock." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "dogpile.cache-1.3.3-py3-none-any.whl", hash = "sha256:5e211c4902ebdf88c678d268e22454b41e68071632daa9402d8ee24e825ed8ca"}, {file = "dogpile.cache-1.3.3.tar.gz", hash = "sha256:f84b8ed0b0fb297d151055447fa8dcaf7bae566d4dbdefecdcc1f37662ab588b"}, @@ -546,7 +563,7 @@ stevedore = ">=3.0.0" typing_extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] -pifpaf = ["pifpaf (>=2.5.0)", "setuptools"] +pifpaf = ["pifpaf (>=2.5.0)", "setuptools ; python_version >= \"3.12\""] [[package]] name = "eventlet" @@ -554,6 +571,7 @@ version = "0.38.2" description = "Highly concurrent networking library" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "eventlet-0.38.2-py3-none-any.whl", hash = "sha256:4a2e3cbc53917c8f39074ccf689501168563d3a4df59e9cddd5e9d3b7f85c599"}, {file = "eventlet-0.38.2.tar.gz", hash = "sha256:6a46823af1dca7d29cf04c0d680365805435473c3acbffc176765c7f8787edac"}, @@ -572,6 +590,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["test"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -586,6 +606,7 @@ version = "0.19" description = "A python package that provides useful locks" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "fasteners-0.19-py3-none-any.whl", hash = "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237"}, {file = "fasteners-0.19.tar.gz", hash = "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"}, @@ -597,6 +618,7 @@ version = "4.2.2" description = "Fixtures, reusable state for writing clean tests and more." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fixtures-4.2.2-py3-none-any.whl", hash = "sha256:5cf7668cb1c0152c2cddeae32e898e83b93d07be78e481a2e786db87354fd0f0"}, {file = "fixtures-4.2.2.tar.gz", hash = "sha256:af9368737fad6fd501638ca99c78000c3f3fb03fa40a60f9e9d39aa64f342bc1"}, @@ -616,6 +638,7 @@ version = "3.0.0" description = "Useful additions to futures, from the future." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "futurist-3.0.0-py3-none-any.whl", hash = "sha256:645565803423c907557d59f82b2e7f33d87fd483316414466d059a0fa5aa5fc9"}, {file = "futurist-3.0.0.tar.gz", hash = "sha256:6422011792414c39228e114bec5494303aaf06dcd335e4f8dd4f907f78a41f79"}, @@ -627,6 +650,8 @@ version = "8.2.13" description = "The standard Python readline extension statically linked against the GNU readline library." optional = false python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Darwin\"" files = [ {file = "gnureadline-8.2.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0ca03501ce0939d7ecf9d075860d6f6ceb2f49f30331b4e96e4678ce03687bab"}, {file = "gnureadline-8.2.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c28e33bfc56d4204693f213abeab927f65c505ce91f668a039720bc7c46b0353"}, @@ -666,6 +691,7 @@ version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, @@ -752,6 +778,7 @@ version = "0.22.0" description = "A comprehensive HTTP client library." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] files = [ {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, @@ -766,6 +793,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -780,6 +808,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["test"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -791,6 +820,7 @@ version = "2.1.0" description = "Simple module to parse ISO 8601 dates" optional = false python-versions = ">=3.7,<4.0" +groups = ["main"] files = [ {file = "iso8601-2.1.0-py3-none-any.whl", hash = "sha256:aac4145c4dcb66ad8b648a02830f5e2ff6c24af20f4f482689be402db2429242"}, {file = "iso8601-2.1.0.tar.gz", hash = "sha256:6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df"}, @@ -802,6 +832,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -819,6 +850,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -830,6 +862,7 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["main"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -844,6 +877,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -855,6 +889,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -876,6 +911,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -890,6 +926,7 @@ version = "5.9.1" description = "Authentication Library for OpenStack Identity" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "keystoneauth1-5.9.1-py3-none-any.whl", hash = "sha256:71b98835aec72a01f71c5b919c3193dac95342555e89aa35c86d3d86c4ff5f73"}, {file = "keystoneauth1-5.9.1.tar.gz", hash = "sha256:fb0c66d842d5b964752264fff20b3b4ab73610d66d9b8d20d0dcf796ba09dc43"}, @@ -916,6 +953,7 @@ version = "10.8.0" description = "Middleware for OpenStack Identity" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "keystonemiddleware-10.8.0-py3-none-any.whl", hash = "sha256:a82b0c51b5eb8807f5d896c796c77ed1677129b2e8c81961ef0e98a9a1c7c2b8"}, {file = "keystonemiddleware-10.8.0.tar.gz", hash = "sha256:a15e55c72dad608466f7a9ad10c58b118216b0c397d402517ad26f3d4e11b0a4"}, @@ -947,6 +985,7 @@ version = "5.4.2" description = "Messaging library for Python." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "kombu-5.4.2-py3-none-any.whl", hash = "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763"}, {file = "kombu-5.4.2.tar.gz", hash = "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf"}, @@ -962,7 +1001,7 @@ azureservicebus = ["azure-servicebus (>=7.10.0)"] azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] confluentkafka = ["confluent-kafka (>=2.2.0)"] consul = ["python-consul2 (==0.1.5)"] -librabbitmq = ["librabbitmq (>=2.0.0)"] +librabbitmq = ["librabbitmq (>=2.0.0) ; python_version < \"3.11\""] mongodb = ["pymongo (>=4.1.1)"] msgpack = ["msgpack (==1.1.0)"] pyro = ["pyro4 (==4.82)"] @@ -970,7 +1009,7 @@ qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] slmq = ["softlayer-messaging (>=1.0.3)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] -sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5) ; sys_platform != \"win32\" and platform_python_implementation == \"CPython\"", "urllib3 (>=1.26.16)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=2.8.0)"] @@ -980,6 +1019,8 @@ version = "2.6.1" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = false python-versions = "<4.0,>=3.10" +groups = ["main"] +markers = "python_version >= \"3.13\"" files = [ {file = "legacy_cgi-2.6.1-py3-none-any.whl", hash = "sha256:8eacc1522d9f76451337a4b5a0abf494158d39250754b0d1bc19a14c6512af9b"}, {file = "legacy_cgi-2.6.1.tar.gz", hash = "sha256:f2ada99c747c3d72a473a6aaff6259a61f226b06fe9f3106e495ab83fd8f7a42"}, @@ -991,6 +1032,7 @@ version = "0.3.5" description = "Logging utilities" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "logutils-0.3.5.tar.gz", hash = "sha256:bc058a25d5c209461f134e1f03cab637d66a7a5ccc12e593db56fbb279899a82"}, ] @@ -1001,6 +1043,7 @@ version = "5.3.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, @@ -1155,6 +1198,7 @@ version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -1174,6 +1218,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -1244,6 +1289,7 @@ version = "1.1.0" description = "MessagePack serializer" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, @@ -1317,6 +1363,7 @@ version = "0.6.16" description = "Python library for NETCONF clients" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +groups = ["main"] files = [ {file = "ncclient-0.6.16.tar.gz", hash = "sha256:a16a351d8c234e3bbf3495577b63c96ae4adfcdf67f2d84194313473ea65b805"}, ] @@ -1333,6 +1380,7 @@ version = "1.3.0" description = "A network address manipulation library for Python" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, @@ -1347,6 +1395,7 @@ version = "25.1.0" description = "OpenStack Networking" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "neutron-25.1.0-py3-none-any.whl", hash = "sha256:151f083bc355f133a44ed5d29e703a629847ddec1dcadd415b23edf1fcbf1211"}, {file = "neutron-25.1.0.tar.gz", hash = "sha256:74ea8b2e2493aa395d8a8294cd8e0781b08a372c835f56eeda1ba806cdbdef31"}, @@ -1413,6 +1462,7 @@ version = "3.18.2" description = "Neutron shared routines and utilities" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "neutron_lib-3.18.2-py3-none-any.whl", hash = "sha256:5f5a6ef61f2bedf735d5a6d22f3987e3415a3f5a06acdc52830c4f7037c75476"}, {file = "neutron_lib-3.18.2.tar.gz", hash = "sha256:faa9d54c164b32d8ac773f3031abb050836cda9a6483479762726a8490bd2fb0"}, @@ -1450,6 +1500,7 @@ version = "4.2.0" description = "An SDK for building applications to work with OpenStack" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "openstacksdk-4.2.0-py3-none-any.whl", hash = "sha256:238be0fa5d9899872b00787ab38e84f92fd6dc87525fde0965dadcdc12196dc6"}, {file = "openstacksdk-4.2.0.tar.gz", hash = "sha256:5cb9450dcce8054a2caf89d8be9e55057ddfa219a954e781032241eb29280445"}, @@ -1476,6 +1527,7 @@ version = "2.1.0" description = "OpenStack Client Configuation Library" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "os-client-config-2.1.0.tar.gz", hash = "sha256:abc38a351f8c006d34f7ee5f3f648de5e3ecf6455cc5d76cfd889d291cdf3f4e"}, {file = "os_client_config-2.1.0-py3-none-any.whl", hash = "sha256:27bdc338f8a872814dc77ff3427844b4ea483cf95796571273aaf50dd1faf770"}, @@ -1490,6 +1542,7 @@ version = "2.11.2" description = "A component-based software defined networking framework for OpenStack." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "os-ken-2.11.2.tar.gz", hash = "sha256:cc6076fbcdce5426cd04494e1e05626784825e5fdec4ba75795ae80de1242320"}, {file = "os_ken-2.11.2-py3-none-any.whl", hash = "sha256:efbc2273ba0c9f728599c1d78c189b62cd3f9c65e5acca1675f0ebcc42ea4bef"}, @@ -1513,6 +1566,7 @@ version = "1.1.0" description = "Resource Classes for OpenStack" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "os-resource-classes-1.1.0.tar.gz", hash = "sha256:e0bcbb8961a9fe33b7213734c51c001812890e2be62101c9279c88b72f75f9eb"}, {file = "os_resource_classes-1.1.0-py3-none-any.whl", hash = "sha256:0f51374bb26dbd1103417ac8866810052f32b65fc9cee451557c353b105d8086"}, @@ -1527,6 +1581,7 @@ version = "1.7.0" description = "Python library for consuming OpenStack sevice-types-authority data" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "os-service-types-1.7.0.tar.gz", hash = "sha256:31800299a82239363995b91f1ebf9106ac7758542a1e4ef6dc737a5932878c6c"}, {file = "os_service_types-1.7.0-py2.py3-none-any.whl", hash = "sha256:0505c72205690910077fb72b88f2a1f07533c8d39f2fe75b29583481764965d6"}, @@ -1541,6 +1596,7 @@ version = "3.2.0" description = "A library containing standardized trait strings" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "os-traits-3.2.0.tar.gz", hash = "sha256:355af7728c4dcfc5ace0dd835445fde2bf76f2993b0c6cb1cbb4bf7389830015"}, {file = "os_traits-3.2.0-py3-none-any.whl", hash = "sha256:278823bdf74db10ccf1db6b37a4d7da31a47955f3f11f5358426b83dac1a9d17"}, @@ -1555,6 +1611,7 @@ version = "4.0.0" description = "A library for plugging and unplugging virtual interfaces in OpenStack." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "os_vif-4.0.0-py3-none-any.whl", hash = "sha256:f124d86fc6856b2a2b579082b70e2d07555fba99cc032957b343b10044512a20"}, {file = "os_vif-4.0.0.tar.gz", hash = "sha256:085dd9098d112821a2f32222b1cd1c8e6f1be818a58b0f76fa09779b1f463039"}, @@ -1581,6 +1638,7 @@ version = "3.2.0" description = "OpenStackClient Library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "osc-lib-3.2.0.tar.gz", hash = "sha256:5f706be145daf0e58068e3763ec56bde2f43ed229a738628e4c0fb1defb4ed9e"}, {file = "osc_lib-3.2.0-py3-none-any.whl", hash = "sha256:01c063f289c193a5e1867e5f557058ddd4222e6a56cefdc24ed5ed0a8a0951bd"}, @@ -1602,6 +1660,7 @@ version = "3.9.0" description = "Cache storage for OpenStack projects." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.cache-3.9.0-py3-none-any.whl", hash = "sha256:1d5abbd17da6c73597c4959fcdadc346b2ef90d4a975acba9a9716b2288bbfe7"}, {file = "oslo.cache-3.9.0.tar.gz", hash = "sha256:c2fb2e7d64cc16622ba165288b0f7b27f78af0294cf33e883c7cdcec515d408b"}, @@ -1626,6 +1685,7 @@ version = "6.2.0" description = "Oslo Concurrency library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.concurrency-6.2.0-py3-none-any.whl", hash = "sha256:fd16f5701d84d767f3d78dcf7f088654fd075f691f1983f224b0db78952dff97"}, {file = "oslo.concurrency-6.2.0.tar.gz", hash = "sha256:ab9d79935119e2bcb0edeb7f8587236af7844244ab87153720b8ca8437d1be02"}, @@ -1648,6 +1708,7 @@ version = "9.7.0" description = "Oslo Configuration API" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.config-9.7.0-py3-none-any.whl", hash = "sha256:fd30815468527406d78fee35ce2a265c84e8b5b8cd6ef15b619ac8a62a27bcda"}, {file = "oslo.config-9.7.0.tar.gz", hash = "sha256:b371ebf3f9a63e92b81d5c72b84d2f96f40553532699c68e1c5cd8ca9eca088b"}, @@ -1672,6 +1733,7 @@ version = "5.7.0" description = "Oslo Context library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.context-5.7.0-py3-none-any.whl", hash = "sha256:c4a01bff7fde263f666227f5989061f6135e373e65bd30bdb3ecebcc1029da34"}, {file = "oslo.context-5.7.0.tar.gz", hash = "sha256:398c460b9cf7cb397ede7962223e4b88078fb2fbc53665a47a34e1b28890f4ce"}, @@ -1687,6 +1749,7 @@ version = "17.1.0" description = "Oslo Database library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.db-17.1.0-py3-none-any.whl", hash = "sha256:6c416dd86e2aa6c444380b46091167d3c83d01a437c726342e8bb9e7357bd8c4"}, {file = "oslo.db-17.1.0.tar.gz", hash = "sha256:89c44467fa98f324535adaa884e35176e741de4a2025cbdf3bacd014574da07f"}, @@ -1714,6 +1777,7 @@ version = "6.5.0" description = "Oslo i18n library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.i18n-6.5.0-py3-none-any.whl", hash = "sha256:41e54addeb215bd70c5c76bcdd93f93dc563d11c51117531025f2d02a9d8f80d"}, {file = "oslo.i18n-6.5.0.tar.gz", hash = "sha256:9393bcae92eadc5f771132d1c6ab239b19896ff6d885e3afc21a9faa4de924d3"}, @@ -1728,6 +1792,7 @@ version = "6.2.0" description = "oslo.log library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.log-6.2.0-py3-none-any.whl", hash = "sha256:116cb325941242cafd2f0d7797685428c041f2c2580806052b16bd2a71dc38e8"}, {file = "oslo.log-6.2.0.tar.gz", hash = "sha256:2b151d9c3f2b2ecc12c06d0fb7dbf2e9047afdaec3644827fa1e10b354369563"}, @@ -1753,6 +1818,7 @@ version = "15.0.0" description = "Oslo Messaging API" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.messaging-15.0.0-py3-none-any.whl", hash = "sha256:644e3dce7699cb8999641791e62b88c7a2abdaec2be453cd56b5ac99a8d2b671"}, {file = "oslo.messaging-15.0.0.tar.gz", hash = "sha256:76035bbd516dad801c460ffadea774386daeafaf53aec3dcf648233229f2d271"}, @@ -1786,6 +1852,7 @@ version = "0.10.0" description = "Oslo Metrics API" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.metrics-0.10.0-py3-none-any.whl", hash = "sha256:c587b5d79a608adcb1afbb9beee0b904d98bbefa60f28a372f3730791d736328"}, {file = "oslo.metrics-0.10.0.tar.gz", hash = "sha256:5a8610820ce7be68f5b854f596a5c444cfdefb486b848106e70e3a4358eda091"}, @@ -1804,6 +1871,7 @@ version = "6.3.0" description = "Oslo Middleware library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.middleware-6.3.0-py3-none-any.whl", hash = "sha256:a2e0f1bc22dfe5358f8ec735c659d4f57b4ed646ad5c37505f295510aeb873df"}, {file = "oslo.middleware-6.3.0.tar.gz", hash = "sha256:675923a83871547222cba1c2e3c2cfc33205dbbe6e255ca474486dfbb3c22377"}, @@ -1828,6 +1896,7 @@ version = "4.5.0" description = "Oslo Policy library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.policy-4.5.0-py3-none-any.whl", hash = "sha256:d78bd90bd829f1a7896521d539eca30bfb634154a3754f0f744e7b6b6bec9c4b"}, {file = "oslo.policy-4.5.0.tar.gz", hash = "sha256:5ade6981f18a33c391274a2f000e1cb7b112287b3d84a794125f465062333c6a"}, @@ -1849,6 +1918,7 @@ version = "3.5.0" description = "OpenStack library for privilege separation" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.privsep-3.5.0-py3-none-any.whl", hash = "sha256:62cfcf6b2f1cb62dcaae1a4d606c1a4bc268225da6c39860a0b3c6870028be69"}, {file = "oslo.privsep-3.5.0.tar.gz", hash = "sha256:b42e48b3ff60b8ea4aacc4dea446155352efe6c18cb8a5e6518f35364b017e57"}, @@ -1870,6 +1940,7 @@ version = "3.5.0" description = "oslo.reports library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.reports-3.5.0-py3-none-any.whl", hash = "sha256:5d072b8db228b06cb0267a0569ea3964bbe08579637ffe49527a5ac2fcbd15c2"}, {file = "oslo.reports-3.5.0.tar.gz", hash = "sha256:ca9888b6be2d7dd5f57faa01b15b028822743d6328a04e75cfa9b327b26fa666"}, @@ -1894,6 +1965,7 @@ version = "7.4.0" description = "Oslo Rootwrap" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.rootwrap-7.4.0-py3-none-any.whl", hash = "sha256:0ef3f4e6dfd81909ebfb6495ce120a6555590f22c715b1fabe2c9e322e3dd594"}, {file = "oslo.rootwrap-7.4.0.tar.gz", hash = "sha256:4450fe799ca4a1c5d9e1d68875da891d0e4f8f14f08aa260ad43104b33a2bfd8"}, @@ -1905,6 +1977,7 @@ version = "5.6.0" description = "Oslo Serialization library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.serialization-5.6.0-py3-none-any.whl", hash = "sha256:a30c30009db5ea8da5da31a4ac6d75256dcb719f48abc3132c36196eb5bb3821"}, {file = "oslo.serialization-5.6.0.tar.gz", hash = "sha256:4c7d4e12da853cc4f04b9123041134e886e8c9ff57ab57c1962d3ad4a87b7f7c"}, @@ -1922,6 +1995,7 @@ version = "3.6.0" description = "oslo.service library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.service-3.6.0-py3-none-any.whl", hash = "sha256:3a60eba55950c9fb16e804bf9d48073f626c1f7a0b1a0b32ac821d1a958af751"}, {file = "oslo.service-3.6.0.tar.gz", hash = "sha256:32487367bb1c51c0654618021c3754a6a081151a2800d96eccfce4912356a63a"}, @@ -1948,6 +2022,7 @@ version = "2.4.0" description = "Common code for writing OpenStack upgrade checks" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "oslo.upgradecheck-2.4.0-py3-none-any.whl", hash = "sha256:8689efb3b2d3f4df1c1b233de6f6cea8f89d22c611f9f083d9b59f88aa051173"}, {file = "oslo.upgradecheck-2.4.0.tar.gz", hash = "sha256:ab79191e74b2ae86c3b8a8f49ab49fc0e4989ecde4ad4ef4d4d5e24e956b7993"}, @@ -1966,6 +2041,7 @@ version = "8.0.0" description = "Oslo Utility library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.utils-8.0.0-py3-none-any.whl", hash = "sha256:a1a124aa6718e3c2d833c0b53543c90d41df72550eb5ac80f8175d78a9556cb3"}, {file = "oslo.utils-8.0.0.tar.gz", hash = "sha256:906fcf1c86f671f224c1925b2a8d375a0539143fb6158b13e202a79dd8e6c694"}, @@ -1988,6 +2064,7 @@ version = "3.5.0" description = "Oslo Versioned Objects library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "oslo.versionedobjects-3.5.0-py3-none-any.whl", hash = "sha256:d1b6ebbbf419709a243d5fdb7a85e11d0aedd6e348f1665a8f9242dcc3cc385e"}, {file = "oslo.versionedobjects-3.5.0.tar.gz", hash = "sha256:42e4ac61c8c3131d862e3283f2b3fd98a6cc04320a34214b34a1d1a4128a01b0"}, @@ -2012,6 +2089,7 @@ version = "4.2.0" description = "OpenStack Profiler Library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "osprofiler-4.2.0-py3-none-any.whl", hash = "sha256:870bac80dc00bce17be7344dc2cc4c843eab6adcca28beff61c1b0d9d1d1ab5b"}, {file = "osprofiler-4.2.0.tar.gz", hash = "sha256:6dd1c4be2645a8f24121055da5bb461688dcafc7e6b4d4babc0ef1ba66902781"}, @@ -2043,6 +2121,7 @@ version = "3.4.1" description = "Open vSwitch library" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "ovs-3.4.1.tar.gz", hash = "sha256:6c176b1bd09cf0ba88f35e6e6b973a4dfca9da4d36fdb02663f03349a4daddbe"}, ] @@ -2061,6 +2140,7 @@ version = "2.9.0" description = "A library for creating OVSDB applications" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "ovsdbapp-2.9.0-py3-none-any.whl", hash = "sha256:f0d7425f1d4726942c29b9723c09e47ccb228a41a9551c5520e967c4d4c29fa9"}, {file = "ovsdbapp-2.9.0.tar.gz", hash = "sha256:8045c56c015efae926bb9b9e8f22c2435c48ea17820956a8b87940818aa8607f"}, @@ -2074,13 +2154,14 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "packaging" -version = "24.2" +version = "23.2" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" +groups = ["main", "test"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -2089,6 +2170,7 @@ version = "3.5.0" description = "SSH2 protocol library" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "paramiko-3.5.0-py3-none-any.whl", hash = "sha256:1fedf06b085359051cd7d0d270cebe19e755a8a921cc2ddbfa647fb0cd7d68f9"}, {file = "paramiko-3.5.0.tar.gz", hash = "sha256:ad11e540da4f55cedda52931f1a3f812a8238a7af7f62a60de538cd80bb28124"}, @@ -2100,8 +2182,8 @@ cryptography = ">=3.3" pynacl = ">=1.5" [package.extras] -all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +all = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8) ; platform_system == \"Windows\""] +gssapi = ["gssapi (>=1.4.1) ; platform_system != \"Windows\"", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8) ; platform_system == \"Windows\""] invoke = ["invoke (>=2.0)"] [[package]] @@ -2110,6 +2192,7 @@ version = "3.10.1" description = "Tools for using a Web Server Gateway Interface stack" optional = false python-versions = ">=3" +groups = ["main"] files = [ {file = "Paste-3.10.1-py3-none-any.whl", hash = "sha256:995e9994b6a94a2bdd8bd9654fb70ca3946ffab75442468bacf31b4d06481c3d"}, {file = "paste-3.10.1.tar.gz", hash = "sha256:1c3d12065a5e8a7a18c0c7be1653a97cf38cc3e9a5a0c8334a9dd992d3a05e4a"}, @@ -2128,6 +2211,7 @@ version = "3.1.0" description = "Load, configure, and compose WSGI applications and servers" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "PasteDeploy-3.1.0-py3-none-any.whl", hash = "sha256:76388ad53a661448d436df28c798063108f70e994ddc749540d733cdbd1b38cf"}, {file = "PasteDeploy-3.1.0.tar.gz", hash = "sha256:9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95"}, @@ -2144,6 +2228,7 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" +groups = ["main"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2155,6 +2240,7 @@ version = "1.5.1" description = "A WSGI object-dispatching web framework, designed to be lean and fast, with few dependencies." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pecan-1.5.1-py3-none-any.whl", hash = "sha256:042c385edcba30a5e885ad2171af35418cda5e2af9b236386f4c72ba80a377f3"}, {file = "pecan-1.5.1.tar.gz", hash = "sha256:6063272d5f860773fbb4b4b2ae1b09da8c954062ef871150c06cfdb2391d9355"}, @@ -2172,6 +2258,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2188,6 +2275,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["test"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2203,6 +2291,7 @@ version = "3.12.0" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "prettytable-3.12.0-py3-none-any.whl", hash = "sha256:77ca0ad1c435b6e363d7e8623d7cc4fcf2cf15513bf77a1c1b2e814930ac57cc"}, {file = "prettytable-3.12.0.tar.gz", hash = "sha256:f04b3e1ba35747ac86e96ec33e3bb9748ce08e254dc2a1c6253945901beec804"}, @@ -2220,6 +2309,7 @@ version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, @@ -2234,6 +2324,7 @@ version = "6.1.1" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] files = [ {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, @@ -2264,6 +2355,7 @@ version = "4.0.0" description = "CADF Library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pycadf-4.0.0-py3-none-any.whl", hash = "sha256:0ddc61f8cffeca51436f070dc498ae780052cde85ae4c7d4b644f0a060e56e6f"}, {file = "pycadf-4.0.0.tar.gz", hash = "sha256:28cfcb7a4f600c656729d5c0f45d0e1a4b2fec27132e1b0300a95069e11eff79"}, @@ -2281,6 +2373,7 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -2292,6 +2385,7 @@ version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, @@ -2309,6 +2403,7 @@ version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, @@ -2329,12 +2424,30 @@ cffi = ">=1.4.1" docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +[[package]] +name = "pynautobot" +version = "2.6.1" +description = "Nautobot API client library" +optional = false +python-versions = "<4.0,>=3.9" +groups = ["main"] +files = [ + {file = "pynautobot-2.6.1-py3-none-any.whl", hash = "sha256:50255265e69473be99fa4e0706e7ee5311af9f2d95d9cee7f0361b7270899d99"}, + {file = "pynautobot-2.6.1.tar.gz", hash = "sha256:f8d04c47f211e7346f8a66a11d5e9943dd5cb6455da6e1c7cd802d2865f48d33"}, +] + +[package.dependencies] +packaging = ">=23.2,<24.0" +requests = ">=2.30.0,<3.0.0" +urllib3 = ">=2.2.3,<3.0.0" + [[package]] name = "pyopenssl" version = "24.3.0" description = "Python wrapper module around the OpenSSL library" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a"}, {file = "pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36"}, @@ -2353,6 +2466,7 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -2367,6 +2481,7 @@ version = "1.9.0" description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pyperclip-1.9.0.tar.gz", hash = "sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310"}, ] @@ -2377,6 +2492,8 @@ version = "3.5.4" description = "A python implementation of GNU readline." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "platform_system == \"Windows\"" files = [ {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, @@ -2391,6 +2508,8 @@ version = "0.8.1" description = "Python Netlink library" optional = false python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\"" files = [ {file = "pyroute2-0.8.1-py3-none-any.whl", hash = "sha256:f339be8acffc46cd87bca19217b559ea5838810b4b08836301a52cb2cb4c054b"}, {file = "pyroute2-0.8.1.tar.gz", hash = "sha256:b91f4a1f7abb9824637b1fe67e6e4a0a071d98d4a1a1b47ef792304ff3adad11"}, @@ -2405,6 +2524,7 @@ version = "8.3.5" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["test"] files = [ {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, @@ -2427,6 +2547,7 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" +groups = ["test"] files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -2445,6 +2566,7 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" +groups = ["test"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -2462,6 +2584,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -2476,6 +2599,7 @@ version = "6.1.0" description = "OpenStack DNS-as-a-Service - Client" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-designateclient-6.1.0.tar.gz", hash = "sha256:1adc2a074b30d842cf9787f53310c37949195bf4e34da3984e5635b7b8a4689c"}, {file = "python_designateclient-6.1.0-py3-none-any.whl", hash = "sha256:664cf5d1c73acfa4bf5f17da993df392aac9324743652a455ea5da2493fc303c"}, @@ -2499,6 +2623,7 @@ version = "5.5.0" description = "Client Library for OpenStack Identity" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-keystoneclient-5.5.0.tar.gz", hash = "sha256:c2f5934f95576936c98e45bf599ad48bcb0ac451593e5f8344ebf52cb0f411f5"}, {file = "python_keystoneclient-5.5.0-py3-none-any.whl", hash = "sha256:52fe7eb35c7345387c2488eb0b95f28a1d73edcad1ac3d8d80cf8ce6a7c9a8ee"}, @@ -2522,6 +2647,7 @@ version = "11.3.1" description = "CLI and Client Library for OpenStack Networking" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-neutronclient-11.3.1.tar.gz", hash = "sha256:53cd9923f43a3b0772a40e3561f74655adc8038f90261ab3de05b6211d12edcb"}, {file = "python_neutronclient-11.3.1-py3-none-any.whl", hash = "sha256:cb0c1ac61887d4c641221c96880d4393235fad771bc5cbe18cb01a4a8281bb3f"}, @@ -2550,6 +2676,7 @@ version = "18.7.0" description = "Client library for OpenStack Compute API" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-novaclient-18.7.0.tar.gz", hash = "sha256:94cad0f0f4c161ced52a5ecd85d134fd673b997da7194a031c0ca69344340b0d"}, {file = "python_novaclient-18.7.0-py3-none-any.whl", hash = "sha256:4e9f1ff681a635168c7635b1facce369d9117b60400ea03a5b58487880670553"}, @@ -2571,6 +2698,7 @@ version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -2582,6 +2710,8 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -2609,6 +2739,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -2671,6 +2802,7 @@ version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, @@ -2686,6 +2818,7 @@ version = "0.7" description = "A tiny LRU cache implementation and decorator" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "repoze.lru-0.7-py3-none-any.whl", hash = "sha256:f77bf0e1096ea445beadd35f3479c5cff2aa1efe604a133e67150bc8630a62ea"}, {file = "repoze.lru-0.7.tar.gz", hash = "sha256:0429a75e19380e4ed50c0694e26ac8819b4ea7851ee1fc7583c8572db80aff77"}, @@ -2701,6 +2834,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -2722,6 +2856,7 @@ version = "1.4.0" description = "Import exceptions from potentially bundled packages in requests." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "requestsexceptions-1.4.0-py2.py3-none-any.whl", hash = "sha256:3083d872b6e07dc5c323563ef37671d992214ad9a32b0ca4a3d7f5500bf38ce3"}, {file = "requestsexceptions-1.4.0.tar.gz", hash = "sha256:b095cbc77618f066d459a02b137b020c37da9f46d9b057704019c9f77dba3065"}, @@ -2733,6 +2868,7 @@ version = "2.0.0" description = "Validating URI References per RFC 3986" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, @@ -2747,6 +2883,7 @@ version = "2.5.1" description = "Routing Recognition and Generation Tools" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Routes-2.5.1-py2.py3-none-any.whl", hash = "sha256:fab5a042a3a87778eb271d053ca2723cadf43c95b471532a191a48539cb606ea"}, {file = "Routes-2.5.1.tar.gz", hash = "sha256:b6346459a15f0cbab01a45a90c3d25caf980d4733d628b4cc1952b865125d053"}, @@ -2766,6 +2903,7 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -2878,6 +3016,7 @@ version = "1.3.4" description = "A Python module to customize the process title" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "setproctitle-1.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0f6661a69c68349172ba7b4d5dd65fec2b0917abc99002425ad78c3e58cf7595"}, {file = "setproctitle-1.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:754bac5e470adac7f7ec2239c485cd0b75f8197ca8a5b86ffb20eb3a3676cc42"}, @@ -2975,19 +3114,20 @@ version = "75.7.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183"}, {file = "setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "six" @@ -2995,6 +3135,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3006,6 +3147,7 @@ version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, @@ -3017,6 +3159,7 @@ version = "2.0.36" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, @@ -3112,6 +3255,7 @@ version = "4.0.1" description = "A simple statsd client." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "statsd-4.0.1-py2.py3-none-any.whl", hash = "sha256:c2676519927f7afade3723aca9ca8ea986ef5b059556a980a867721ca69df093"}, {file = "statsd-4.0.1.tar.gz", hash = "sha256:99763da81bfea8daf6b3d22d11aaccb01a8d0f52ea521daab37e758a4ca7d128"}, @@ -3123,6 +3267,7 @@ version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, @@ -3137,6 +3282,7 @@ version = "9.0.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, @@ -3152,6 +3298,7 @@ version = "2.0.1" description = "Testresources, a pyunit extension for managing expensive test resources" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "testresources-2.0.1-py2.py3-none-any.whl", hash = "sha256:67a361c3a2412231963b91ab04192209aa91a1aa052f0ab87245dbea889d1282"}, {file = "testresources-2.0.1.tar.gz", hash = "sha256:ee9d1982154a1e212d4e4bac6b610800bfb558e4fb853572a827bc14a96e4417"}, @@ -3169,6 +3316,7 @@ version = "0.5.0" description = "Testscenarios, a pyunit extension for dependency injection" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "testscenarios-0.5.0-py2.py3-none-any.whl", hash = "sha256:480263fa5d6e618125bdf092aab129a3aeed5996b1e668428f12cc56d6d01d28"}, {file = "testscenarios-0.5.0.tar.gz", hash = "sha256:c257cb6b90ea7e6f8fef3158121d430543412c9a87df30b5dde6ec8b9b57a2b6"}, @@ -3184,6 +3332,7 @@ version = "2.7.2" description = "Extensions to the Python standard library unit testing framework" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "testtools-2.7.2-py3-none-any.whl", hash = "sha256:11712e29cebbe92187c3ad47ace5c32f91e1bb7a9f1ac5e8684c2b01eaa6fd2d"}, {file = "testtools-2.7.2.tar.gz", hash = "sha256:5be5bbc1f0fa0f8b60aca6ceec07845d41d0c475cf445bfadb4d2c45ec397ea3"}, @@ -3203,6 +3352,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["test"] +markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -3244,6 +3395,7 @@ version = "6.3.0" description = "Coordination library for distributed systems." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "tooz-6.3.0-py3-none-any.whl", hash = "sha256:fe798812a4a7fdd1f725da71a1f7b92e2c4ea4a1cc75328449af718a919f1121"}, {file = "tooz-6.3.0.tar.gz", hash = "sha256:95303f5d6fb96d64c4ab4b80368e8c9198044784b4ff090301da4355add259c9"}, @@ -3278,6 +3430,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -3289,6 +3442,7 @@ version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, @@ -3300,13 +3454,14 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -3317,6 +3472,7 @@ version = "5.1.0" description = "Python promises." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, @@ -3328,6 +3484,7 @@ version = "0.15.2" description = "Python data validation library" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "voluptuous-0.15.2-py3-none-any.whl", hash = "sha256:016348bc7788a9af9520b1764ebd4de0df41fe2138ebe9e06fa036bf86a65566"}, {file = "voluptuous-0.15.2.tar.gz", hash = "sha256:6ffcab32c4d3230b4d2af3a577c87e1908a714a11f6f95570456b1849b0279aa"}, @@ -3339,6 +3496,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -3350,6 +3508,7 @@ version = "1.8.9" description = "WSGI request and response object" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "WebOb-1.8.9-py2.py3-none-any.whl", hash = "sha256:45e34c58ed0c7e2ecd238ffd34432487ff13d9ad459ddfd77895e67abba7c1f9"}, {file = "webob-1.8.9.tar.gz", hash = "sha256:ad6078e2edb6766d1334ec3dee072ac6a7f95b1e32ce10def8ff7f0f02d56589"}, @@ -3368,6 +3527,8 @@ version = "1.1.0" description = "Native inet_pton and inet_ntop implementation for Python on Windows (with ctypes)." optional = false python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and platform_system == \"Windows\"" files = [ {file = "win_inet_pton-1.1.0-py2.py3-none-any.whl", hash = "sha256:eaf0193cbe7152ac313598a0da7313fb479f769343c0c16c5308f64887dc885b"}, {file = "win_inet_pton-1.1.0.tar.gz", hash = "sha256:dd03d942c0d3e2b1cf8bab511844546dfa5f74cb61b241699fa379ad707dea4f"}, @@ -3379,6 +3540,7 @@ version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, @@ -3453,6 +3615,7 @@ version = "1.6.10" description = "Yet Another Python Profiler" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "yappi-1.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f03127742746ec4cf7e422b08212daf094505ab7f5d725d7b273ed3c475c3d9"}, {file = "yappi-1.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bbafb779c3f90edd09fd34733859226785618adee3179d5949dbba2e90f550a"}, @@ -3517,6 +3680,6 @@ files = [ test = ["gevent (>=20.6.2)"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.10" -content-hash = "bc12e088b2130122001b6d5748b1dacfad49bfc6800be2cf84451fbf2c0c55ae" +content-hash = "c6b5160c89e23b0007d851bd0af58201e959c1284f4cfeb0930b4e26ff1b47bc" diff --git a/python/neutron-understack/pyproject.toml b/python/neutron-understack/pyproject.toml index afda0ab02..89dbcb422 100644 --- a/python/neutron-understack/pyproject.toml +++ b/python/neutron-understack/pyproject.toml @@ -29,6 +29,7 @@ python = "^3.10" requests = "^2" neutron-lib = "^3" neutron = "^25" +pynautobot = "^2.6.1" [tool.poetry.group.test.dependencies] pytest = "^8.3.2"