From 0e2a9f3f2539d0ce1af7deb625b1b2dd66cdfb31 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Tue, 7 Jan 2025 23:37:36 +0000 Subject: [PATCH 01/31] initial software version --- .../adapters/sync_network_data_adapters.py | 51 +++++++++- .../models/sync_network_data_models.py | 95 ++++++++++++++++++- 2 files changed, 144 insertions(+), 2 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 081b40bb..6cab2b81 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -6,7 +6,7 @@ from diffsync.enum import DiffSyncModelFlags from django.conf import settings from django.core.exceptions import ValidationError -from nautobot.dcim.models import Interface +from nautobot.dcim.models import Interface, SoftwareVersion from nautobot.ipam.models import VLAN, VRF, IPAddress from nautobot_ssot.contrib import NautobotAdapter from netaddr import EUI, mac_unix_expanded @@ -51,6 +51,8 @@ class SyncNetworkDataNautobotAdapter(FilteredNautobotAdapter): lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface cable = sync_network_data_models.SyncNetworkDataCable + software_version = sync_network_data_models.SyncNetworkDataSoftwareVersion + software_version_to_device = sync_network_data_models.SyncNetworkDataSoftwareVersionToDevice primary_ips = None @@ -288,6 +290,24 @@ def load_cables(self): except diffsync.exceptions.ObjectAlreadyExists: continue + def load_software_versions(self): + """ + Load Software Versions into the Diffsync store. + """ + # THIS IS THE ONE FROM THE NAUTOBOT + for software_version in SoftwareVersion.objects.all(): + network_software_version = self.software_version( + adapter=self, + version=software_version.version, + platform=software_version.platform, + status__name=software_version.status.name, + ) + try: + network_software_version.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_software_version) + except diffsync.exceptions.ObjectAlreadyExists: + continue + def load(self): """Generic implementation of the load function.""" if not hasattr(self, "top_level") or not self.top_level: @@ -317,6 +337,8 @@ def load(self): elif model_name == "cable": if self.job.sync_cables: self.load_cables() + elif model_name == "software_version": + self.load_software_versions() else: diffsync_model = self._get_diffsync_class(model_name) self._load_objects(diffsync_model) @@ -392,6 +414,8 @@ def __init__(self, *args, job, sync=None, **kwargs): lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface cable = sync_network_data_models.SyncNetworkDataCable + software_version = sync_network_data_models.SyncNetworkDataSoftwareVersion + software_version_to_device = sync_network_data_models.SyncNetworkDataSoftwareVersionToDevice top_level = [ "ip_address", @@ -404,6 +428,8 @@ def __init__(self, *args, job, sync=None, **kwargs): "lag_to_interface", "vrf_to_interface", "cable", + "software_version", + "software_version_to_device", ] def _handle_failed_devices(self, device_data): @@ -873,6 +899,27 @@ def load_cables(self): # pylint: disable=inconsistent-return-statements model_type="cable", ) + def load_software_versions(self): + # THIS IS THE ONE FROM THE DEVICE? + """Load software versions into the Diffsync store.""" + for ( # pylint: disable=too-many-nested-blocks + hostname, + device_data, + ) in self.job.command_getter_result.items(): + if self.job.debug: + self.job.logger.debug(f"Loading Software Versions from {hostname}") + if device_data["software_version"]: + try: + network_software_version = self.software_version( + adapter=self, + status__name="Active", + platform__name=device_data["platform"], + version=device_data["software_version"], + ) + self.add(network_software_version) + except diffsync.exceptions.ObjectAlreadyExists: + continue + def load(self): """Load network data.""" self.execute_command_getter() @@ -891,3 +938,5 @@ def load(self): self.load_vrf_to_interface() if self.job.sync_cables: self.load_cables() + if self.job.sync_software_versions: + self.load_software_versions() diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index 731e2396..a66178d4 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -1,5 +1,6 @@ """Diffsync models.""" +from uuid import UUID from typing import List, Optional try: @@ -11,7 +12,7 @@ from diffsync import exceptions as diffsync_exceptions from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from nautobot.dcim.choices import InterfaceTypeChoices -from nautobot.dcim.models import Cable, Device, Interface, Location +from nautobot.dcim.models import Cable, Device, Interface, Location, SoftwareVersion from nautobot.extras.models import Status from nautobot.ipam.models import VLAN, VRF, IPAddress, IPAddressToInterface from nautobot_ssot.contrib import CustomFieldAnnotation, NautobotModel @@ -590,3 +591,95 @@ class SyncNetworkDataCable(FilteredNautobotModel): termination_b__name: str status__name: str + + +class SyncNetworkSoftwareVersion(FilteredNautobotModel): + """Shared data model representing a software version.""" + + _modelname = "software_version" + _model = SoftwareVersion + _identifiers = ( + "version", + "platform__name", + ) + _attributes = () + _children = {} + + name: str + platform__name: str + status__name: str + + pk: Optional[UUID] = None + + +class SyncNetworkSoftwareVersiontoDevice(DiffSyncModel): + """Shared data model representing a software version to device.""" + + _modelname = "software_version_to_device" + _identifiers = ("device__name", "device__location", "software_version__name") + _attributes = () + + device__name: str + software_version__version: str + name: str + + @classmethod + def _get_and_assign_sofware_version(cls, adapter, attrs): + """Assign a software version to a device.""" + if attrs.get("software_version"): + try: + device = Device.objects.get(name=attrs["device__name"]) + except ObjectDoesNotExist: + adapter.job.logger.error( + f"Failed to assign software version to {attrs['device__name']}. An device with name: " + f"{attrs['device__name']} was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + try: + software_version = SoftwareVersion.objects.get(name=attrs["software_version__name"]) + except ObjectDoesNotExist: + adapter.job.logger.error( + f"Failed to assign software version to {attrs['device__name']}. An software version with name: " + f"{attrs['software_version__name']} was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + + software_version.devices.add(device) + software_version.validated_save() + + @classmethod + def create(cls, adapter, ids, attrs): + """Create a new SoftwareVersionToDevice object.""" + if attrs.get("software_version"): + try: + device = Device.objects.get(name=ids["device__name"]) + except ObjectDoesNotExist as err: + adapter.job.logger.error(f"{cls._modelname} failed to create, {err}") + return None + try: + software_version = SoftwareVersion.objects.get(name=attrs["software_version__name"]) + except ObjectDoesNotExist as err: + adapter.job.logger.error(f"{cls._modelname} failed to create, {err}") + return None + + software_version.devices.add(device) + software_version.validated_save() + return super().create(adapter, ids, attrs) + + def update(self, attrs): + """Update an existing SoftwareVersionToDevice object.""" + if attrs.get("software_version"): + try: + device = Device.objects.get(name=self.device__name) + except ObjectDoesNotExist as err: + self.adapter.job.logger.error(f"{self} failed to update, {err}") + return None + try: + software_version = SoftwareVersion.objects.get(name=attrs["software_version__name"]) + except ObjectDoesNotExist as err: + self.adapter.job.logger.error(f"{self} failed to update, {err}") + return None + + software_version.devices.add(device) + software_version.validated_save() + return super().update(attrs) From 12513e7d53163598382de4b02ccf5c6d779e7968 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Wed, 8 Jan 2025 20:59:19 +0000 Subject: [PATCH 02/31] added software version fixes --- .../command_mappers/cisco_ios.yml | 5 ++ .../command_mappers/cisco_nxos.yml | 5 ++ .../command_mappers/cisco_xe.yml | 5 ++ .../adapters/sync_network_data_adapters.py | 70 ++++++++++++---- .../models/sync_network_data_models.py | 82 +++++++++---------- nautobot_device_onboarding/jobs.py | 6 ++ .../nornir_plays/command_getter.py | 26 ++++-- .../nornir_plays/formatter.py | 3 + .../nornir_plays/schemas.py | 4 + 9 files changed, 135 insertions(+), 71 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 5d7734dc..116c29cf 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -129,3 +129,8 @@ sync_network_data: parser: "textfsm" jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" + software_version: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].version" \ No newline at end of file diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index e0f672a4..0f8f3e7d 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -122,3 +122,8 @@ sync_network_data: parser: "textfsm" jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" + software_version: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].os" \ No newline at end of file diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index aa1e5c8a..8d7634f0 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -126,3 +126,8 @@ sync_network_data: parser: "textfsm" jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" + software_version: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].version" \ No newline at end of file diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 6cab2b81..7a3d8f7b 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -6,7 +6,7 @@ from diffsync.enum import DiffSyncModelFlags from django.conf import settings from django.core.exceptions import ValidationError -from nautobot.dcim.models import Interface, SoftwareVersion +from nautobot.dcim.models import Interface, SoftwareVersion, Device from nautobot.ipam.models import VLAN, VRF, IPAddress from nautobot_ssot.contrib import NautobotAdapter from netaddr import EUI, mac_unix_expanded @@ -51,8 +51,8 @@ class SyncNetworkDataNautobotAdapter(FilteredNautobotAdapter): lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface cable = sync_network_data_models.SyncNetworkDataCable - software_version = sync_network_data_models.SyncNetworkDataSoftwareVersion - software_version_to_device = sync_network_data_models.SyncNetworkDataSoftwareVersionToDevice + software_version = sync_network_data_models.SyncNetworkSoftwareVersion + software_version_to_device = sync_network_data_models.SyncNetworkSoftwareVersionToDevice primary_ips = None @@ -67,6 +67,8 @@ class SyncNetworkDataNautobotAdapter(FilteredNautobotAdapter): "lag_to_interface", "vrf_to_interface", "cable", + "software_version", + "software_version_to_device", ] def _cache_primary_ips(self, device_queryset): @@ -291,16 +293,12 @@ def load_cables(self): continue def load_software_versions(self): - """ - Load Software Versions into the Diffsync store. - """ - # THIS IS THE ONE FROM THE NAUTOBOT - for software_version in SoftwareVersion.objects.all(): + """Load Software Versions into the Diffsync store.""" + for software_version in SoftwareVersion.objects.filter(devices__in=self.job.devices_to_load): network_software_version = self.software_version( adapter=self, version=software_version.version, - platform=software_version.platform, - status__name=software_version.status.name, + platform__name=software_version.platform.name, ) try: network_software_version.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST @@ -308,6 +306,18 @@ def load_software_versions(self): except diffsync.exceptions.ObjectAlreadyExists: continue + def load_software_version_to_device(self): + """Load Software Version to Device assignments into the Diffsync store.""" + for device in self.job.devices_to_load: + network_software_version_to_device = self.software_version_to_device( + adapter=self, + name=device.name, + serial=device.serial, + software_version__version=device.software_version.version if device.software_version else "", + ) + network_software_version_to_device.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_software_version_to_device) + def load(self): """Generic implementation of the load function.""" if not hasattr(self, "top_level") or not self.top_level: @@ -338,7 +348,11 @@ def load(self): if self.job.sync_cables: self.load_cables() elif model_name == "software_version": - self.load_software_versions() + if self.job.sync_software_version: + self.load_software_versions() + elif model_name == "software_version_to_device": + if self.job.sync_software_version: + self.load_software_version_to_device() else: diffsync_model = self._get_diffsync_class(model_name) self._load_objects(diffsync_model) @@ -414,8 +428,8 @@ def __init__(self, *args, job, sync=None, **kwargs): lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface cable = sync_network_data_models.SyncNetworkDataCable - software_version = sync_network_data_models.SyncNetworkDataSoftwareVersion - software_version_to_device = sync_network_data_models.SyncNetworkDataSoftwareVersionToDevice + software_version = sync_network_data_models.SyncNetworkSoftwareVersion + software_version_to_device = sync_network_data_models.SyncNetworkSoftwareVersionToDevice top_level = [ "ip_address", @@ -900,7 +914,6 @@ def load_cables(self): # pylint: disable=inconsistent-return-statements ) def load_software_versions(self): - # THIS IS THE ONE FROM THE DEVICE? """Load software versions into the Diffsync store.""" for ( # pylint: disable=too-many-nested-blocks hostname, @@ -908,18 +921,39 @@ def load_software_versions(self): ) in self.job.command_getter_result.items(): if self.job.debug: self.job.logger.debug(f"Loading Software Versions from {hostname}") + self.job.logger.info(f"device_data: {device_data}") if device_data["software_version"]: + device = Device.objects.get(serial=device_data["serial"]) try: network_software_version = self.software_version( adapter=self, - status__name="Active", - platform__name=device_data["platform"], + platform__name=device.platform.name, version=device_data["software_version"], ) self.add(network_software_version) except diffsync.exceptions.ObjectAlreadyExists: continue + def load_software_version_to_device(self): + """Load software version to device assignments into the Diffsync store.""" + for ( # pylint: disable=too-many-nested-blocks + hostname, + device_data, + ) in self.job.command_getter_result.items(): + if self.job.debug: + self.job.logger.debug(f"Loading Software Version to Device assignments from {hostname}") + if device_data["software_version"]: + try: + network_software_version_to_device = self.software_version_to_device( + adapter=self, + name=hostname, + serial=device_data["serial"], + software_version__version=device_data["software_version"], + ) + self.add(network_software_version_to_device) + except diffsync.exceptions.ObjectAlreadyExists: + continue + def load(self): """Load network data.""" self.execute_command_getter() @@ -938,5 +972,7 @@ def load(self): self.load_vrf_to_interface() if self.job.sync_cables: self.load_cables() - if self.job.sync_software_versions: + if self.job.sync_software_version: self.load_software_versions() + if self.job.sync_software_version: + self.load_software_version_to_device() diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index a66178d4..51cd66a8 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -605,81 +605,73 @@ class SyncNetworkSoftwareVersion(FilteredNautobotModel): _attributes = () _children = {} - name: str + version: str platform__name: str - status__name: str pk: Optional[UUID] = None -class SyncNetworkSoftwareVersiontoDevice(DiffSyncModel): +class SyncNetworkSoftwareVersionToDevice(DiffSyncModel): """Shared data model representing a software version to device.""" + _model = Device _modelname = "software_version_to_device" - _identifiers = ("device__name", "device__location", "software_version__name") - _attributes = () + _identifiers = ( + "name", + "serial", + ) + _attributes = ("software_version__version",) - device__name: str - software_version__version: str name: str + serial: str + software_version__version: str - @classmethod - def _get_and_assign_sofware_version(cls, adapter, attrs): + def _get_and_assign_sofware_version(self, adapter, attrs): """Assign a software version to a device.""" if attrs.get("software_version"): try: - device = Device.objects.get(name=attrs["device__name"]) + device = Device.objects.get(**self.get_identifiers()) except ObjectDoesNotExist: adapter.job.logger.error( - f"Failed to assign software version to {attrs['device__name']}. An device with name: " - f"{attrs['device__name']} was not found." + f"Failed to assign software version to {self.name}. An device with name: " + f"{self.name} was not found." ) raise diffsync_exceptions.ObjectNotCreated try: - software_version = SoftwareVersion.objects.get(name=attrs["software_version__name"]) + software_version = SoftwareVersion.objects.get( + version=attrs["software_version__version"], platform=device.platform + ) + device.software_version = software_version except ObjectDoesNotExist: adapter.job.logger.error( - f"Failed to assign software version to {attrs['device__name']}. An software version with name: " - f"{attrs['software_version__name']} was not found." + f"Failed to assign software version to {self.name}. An software version with name: " + f"{self.name} was not found." ) - raise diffsync_exceptions.ObjectNotCreated - - software_version.devices.add(device) - software_version.validated_save() - - @classmethod - def create(cls, adapter, ids, attrs): - """Create a new SoftwareVersionToDevice object.""" - if attrs.get("software_version"): - try: - device = Device.objects.get(name=ids["device__name"]) - except ObjectDoesNotExist as err: - adapter.job.logger.error(f"{cls._modelname} failed to create, {err}") - return None - try: - software_version = SoftwareVersion.objects.get(name=attrs["software_version__name"]) - except ObjectDoesNotExist as err: - adapter.job.logger.error(f"{cls._modelname} failed to create, {err}") - return None + raise diffsync_exceptions.ObjectNotUpdated - software_version.devices.add(device) software_version.validated_save() - return super().create(adapter, ids, attrs) def update(self, attrs): """Update an existing SoftwareVersionToDevice object.""" if attrs.get("software_version"): try: - device = Device.objects.get(name=self.device__name) - except ObjectDoesNotExist as err: - self.adapter.job.logger.error(f"{self} failed to update, {err}") - return None - try: - software_version = SoftwareVersion.objects.get(name=attrs["software_version__name"]) + self._get_and_assign_sofware_version(self.adapter, attrs) except ObjectDoesNotExist as err: self.adapter.job.logger.error(f"{self} failed to update, {err}") - return None + raise diffsync_exceptions.ObjectNotUpdated - software_version.devices.add(device) - software_version.validated_save() return super().update(attrs) + + @classmethod + def create(cls, adapter, ids, attrs): + """ + Do not create new devices. + + Network devices need to exist in Nautobot prior to syncing data and + need to be included in the queryset generated based on job form inputs. + """ + return None + + def delete(self): + """Prevent device deletion.""" + return None diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 90155f7d..bc739308 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -588,6 +588,7 @@ class Meta: sync_vlans = BooleanVar(default=False, description="Sync VLANs and interface VLAN assignments.") sync_vrfs = BooleanVar(default=False, description="Sync VRFs and interface VRF assignments.") sync_cables = BooleanVar(default=False, description="Sync cables between interfaces via a LLDP or CDP.") + sync_software_version = BooleanVar(default=False, description="Sync software version from device.") namespace = ObjectVar( model=Namespace, required=True, @@ -664,6 +665,7 @@ def run( sync_vlans, sync_vrfs, sync_cables, + sync_software_version, *args, **kwargs, ): @@ -682,6 +684,7 @@ def run( self.sync_vlans = sync_vlans self.sync_vrfs = sync_vrfs self.sync_cables = sync_cables + self.sync_software_version = sync_software_version # Check for last_network_data_sync CustomField if self.debug: @@ -744,6 +747,7 @@ def run( "sync_vlans": sync_vlans, "sync_vrfs": sync_vrfs, "sync_cables": sync_cables, + "sync_software_version": sync_software_version, "connectivity_test": kwargs["connectivity_test"], } @@ -799,6 +803,7 @@ def run(self, *args, **kwargs): # pragma: no cover kwargs.update({"sync_vrfs": True}) kwargs.update({"sync_vlans": True}) kwargs.update({"sync_cables": True}) + kwargs.update({"sync_software_version": True}) nr_with_processors.run( task=netmiko_send_commands, command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], @@ -818,6 +823,7 @@ def run(self, *args, **kwargs): # pragma: no cover kwargs.update({"sync_vrfs": True}) kwargs.update({"sync_vlans": True}) kwargs.update({"sync_cables": True}) + kwargs.update({"sync_software_version": True}) nr_with_processors.run( task=netmiko_send_commands, command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 521ced02..6c318ce1 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -58,7 +58,7 @@ def deduplicate_command_list(data): return unique_list -def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): +def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables, sync_software_version): """Using merged command mapper info and look up all commands that need to be run.""" all_commands = [] for key, value in yaml_parsed_info.items(): @@ -78,30 +78,36 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): # Deduplicate commands + parser key current_root_key = value.get("commands") if isinstance(current_root_key, list): - # Means their is any "nested" structures. e.g multiple commands + # Means there is a "nested" structures. e.g. multiple commands for command in value["commands"]: - # If syncing vlans isn't inscope don't run the unneeded commands. + # If syncing vlans isn't in scope don't run the unneeded commands. if not sync_vlans and key in ["interfaces__tagged_vlans", "interfaces__untagged_vlan"]: continue - # If syncing vrfs isn't inscope remove the unneeded commands. + # If syncing vrfs isn't in scope remove the unneeded commands. if not sync_vrfs and key == "interfaces__vrf": continue - # If syncing cables isn't inscope remove the unneeded commands. + # If syncing cables isn't in scope remove the unneeded commands. if not sync_cables and key == "cables": continue + # If syncing software_versions isn't in scope remove the unneeded commands. + if not sync_software_version and key == "software_version": + continue all_commands.append(command) else: if isinstance(current_root_key, dict): - # If syncing vlans isn't inscope don't run the unneeded commands. + # Means there isn't a "nested" structures. e.g. 1 command + # If syncing vlans isn't in scope don't run the unneeded commands. if not sync_vlans and key in ["interfaces__tagged_vlans", "interfaces__untagged_vlan"]: continue - # If syncing vrfs isn't inscope remove the unneeded commands. + # If syncing vrfs isn't in scope remove the unneeded commands. if not sync_vrfs and key == "interfaces__vrf": continue - # If syncing cables isn't inscope remove the unneeded commands. + # If syncing cables isn't in scope remove the unneeded commands. if not sync_cables and key == "cables": continue - # Means their isn't a "nested" structures. e.g 1 command + # If syncing software_versions isn't in scope remove the unneeded commands. + if not sync_software_version and key == "software_version": + continue all_commands.append(current_root_key) return deduplicate_command_list(all_commands) @@ -129,6 +135,7 @@ def netmiko_send_commands( orig_job_kwargs.get("sync_vlans", False), orig_job_kwargs.get("sync_vrfs", False), orig_job_kwargs.get("sync_cables", False), + orig_job_kwargs.get("sync_software_version", False), ) if ( orig_job_kwargs.get("sync_cables", False) @@ -353,6 +360,7 @@ def sync_network_data_command_getter(job_result, log_level, kwargs): "sync_vlans": kwargs["sync_vlans"], "sync_vrfs": kwargs["sync_vrfs"], "sync_cables": kwargs["sync_cables"], + "sync_software_version": kwargs["sync_software_version"], }, }, }, diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index d62620e5..1ea971f9 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -121,6 +121,7 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d sync_vlans = host.defaults.data.get("sync_vlans", False) sync_vrfs = host.defaults.data.get("sync_vrfs", False) sync_cables = host.defaults.data.get("sync_cables", False) + sync_software_version = host.defaults.data.get("sync_software_version", False) get_context_from_pre_processor = {} if command_info_dict.get("pre_processor"): for pre_processor_name, field_data in command_info_dict["pre_processor"].items(): @@ -149,6 +150,8 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d continue if not sync_cables and ssot_field == "cables": continue + if not sync_software_version and ssot_field == "software_versions": + continue if ssot_field == "pre_processor": continue if isinstance(field_data["commands"], dict): diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py index b9cb40e9..045a203d 100755 --- a/nautobot_device_onboarding/nornir_plays/schemas.py +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -216,5 +216,9 @@ def sync_network_data_schema(json_schema=True): }, }, }, + "software_version": { + "type": "string", + "description": "Software version of the device", + }, }, } From d3e9501c33d3d2e1f3e4f0d2bbd86d3784a618e0 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Wed, 15 Jan 2025 16:48:18 +0000 Subject: [PATCH 03/31] fix create method software version --- .../adapters/sync_network_data_adapters.py | 3 +- .../models/sync_network_data_models.py | 82 +++++++++++++------ 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 7a3d8f7b..7061a3de 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -294,7 +294,7 @@ def load_cables(self): def load_software_versions(self): """Load Software Versions into the Diffsync store.""" - for software_version in SoftwareVersion.objects.filter(devices__in=self.job.devices_to_load): + for software_version in SoftwareVersion.objects.all(): network_software_version = self.software_version( adapter=self, version=software_version.version, @@ -921,7 +921,6 @@ def load_software_versions(self): ) in self.job.command_getter_result.items(): if self.job.debug: self.job.logger.debug(f"Loading Software Versions from {hostname}") - self.job.logger.info(f"device_data: {device_data}") if device_data["software_version"]: device = Device.objects.get(serial=device_data["serial"]) try: diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index 51cd66a8..2db0997c 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -1,7 +1,7 @@ """Diffsync models.""" -from uuid import UUID from typing import List, Optional +from uuid import UUID try: from typing import Annotated # Python>=3.9 @@ -12,7 +12,7 @@ from diffsync import exceptions as diffsync_exceptions from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from nautobot.dcim.choices import InterfaceTypeChoices -from nautobot.dcim.models import Cable, Device, Interface, Location, SoftwareVersion +from nautobot.dcim.models import Cable, Device, Interface, Location, Platform, SoftwareVersion from nautobot.extras.models import Status from nautobot.ipam.models import VLAN, VRF, IPAddress, IPAddressToInterface from nautobot_ssot.contrib import CustomFieldAnnotation, NautobotModel @@ -593,7 +593,7 @@ class SyncNetworkDataCable(FilteredNautobotModel): status__name: str -class SyncNetworkSoftwareVersion(FilteredNautobotModel): +class SyncNetworkSoftwareVersion(DiffSyncModel): """Shared data model representing a software version.""" _modelname = "software_version" @@ -610,6 +610,35 @@ class SyncNetworkSoftwareVersion(FilteredNautobotModel): pk: Optional[UUID] = None + @classmethod + def create(cls, adapter, ids, attrs): + """Create a new software version.""" + try: + platform = Platform.objects.get(name=ids["platform__name"]) + except ObjectDoesNotExist: + adapter.job.logger.error( + f"Failed to create software version {ids['version']}. An platform with name: " + f"{ids['platform__name']} was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + try: + software_version = SoftwareVersion( + version=ids["version"], + platform=platform, + status=Status.objects.get(name="Active"), + ) + software_version.validated_save() + except ValidationError as err: + adapter.job.logger.error(f"Software version {software_version} failed to create, {err}") + raise diffsync_exceptions.ObjectNotCreated + + return super().create(adapter, ids, attrs) + + def delete(self): + """Prevent software version deletion.""" + self.adapter.job.logger.error(f"{self} will not be deleted.") + return None + class SyncNetworkSoftwareVersionToDevice(DiffSyncModel): """Shared data model representing a software version to device.""" @@ -628,32 +657,33 @@ class SyncNetworkSoftwareVersionToDevice(DiffSyncModel): def _get_and_assign_sofware_version(self, adapter, attrs): """Assign a software version to a device.""" - if attrs.get("software_version"): - try: - device = Device.objects.get(**self.get_identifiers()) - except ObjectDoesNotExist: - adapter.job.logger.error( - f"Failed to assign software version to {self.name}. An device with name: " - f"{self.name} was not found." - ) - raise diffsync_exceptions.ObjectNotCreated - try: - software_version = SoftwareVersion.objects.get( - version=attrs["software_version__version"], platform=device.platform - ) - device.software_version = software_version - except ObjectDoesNotExist: - adapter.job.logger.error( - f"Failed to assign software version to {self.name}. An software version with name: " - f"{self.name} was not found." - ) - raise diffsync_exceptions.ObjectNotUpdated - - software_version.validated_save() + try: + device = Device.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist: + adapter.job.logger.error( + f"Failed to assign software version to {self.name}. An device with name: " f"{self.name} was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + try: + software_version = SoftwareVersion.objects.get( + version=attrs["software_version__version"], platform=device.platform + ) + device.software_version = software_version + except ObjectDoesNotExist: + adapter.job.logger.error( + f"Failed to assign software version to {self.name}. An software version with name: " + f"{self.name} was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + try: + device.validated_save() + except ValidationError as err: + adapter.job.logger.error(f"Software version {software_version} failed to assign, {err}") + raise diffsync_exceptions.ObjectNotUpdated def update(self, attrs): """Update an existing SoftwareVersionToDevice object.""" - if attrs.get("software_version"): + if attrs.get("software_version__version"): try: self._get_and_assign_sofware_version(self.adapter, attrs) except ObjectDoesNotExist as err: From 061fa28b48bb42c8b3ffdcbc429b96ee714b1467 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Wed, 15 Jan 2025 18:34:43 +0000 Subject: [PATCH 04/31] added eos and junos software version --- nautobot_device_onboarding/command_mappers/arista_eos.yml | 5 +++++ .../command_mappers/juniper_junos.yml | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml index ef72954e..bad966d4 100755 --- a/nautobot_device_onboarding/command_mappers/arista_eos.yml +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -116,3 +116,8 @@ sync_network_data: jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans, native_vlan: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId}' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" + software_version: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].image" diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index b146f5f3..462372f1 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -121,3 +121,9 @@ sync_network_data: jpath: '"lldp-neighbors-information"[]."lldp-neighbor-information"[].{local_interface: "lldp-local-port-id"[0].data, remote_interface: "lldp-remote-port-id"[0].data, remote_device: "lldp-remote-system-name"[0].data}' # yamllint disable-line rule:quoted-strings post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" iterable_type: "dict" + software_version: + commands: + - command: "show system information | display json" + parser: "none" + jpath: '"system-information"[]."os-version"[].data' # yamllint disable-line rule:quoted-strings + \ No newline at end of file From 6d4203b8b3adbc32bbcfd744881739821c536d4a Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Wed, 15 Jan 2025 20:39:35 +0000 Subject: [PATCH 05/31] fix key error --- nautobot_device_onboarding/nornir_plays/command_getter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 6c318ce1..ca7e428a 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -124,7 +124,7 @@ def netmiko_send_commands( return Result( host=task.host, result=f"{task.host.name} has missing definitions in command_mapper YAML file.", failed=True ) - if orig_job_kwargs["connectivity_test"]: + if orig_job_kwargs.get("connectivity_test", False): if not tcp_ping(task.host.hostname, task.host.port): return Result( host=task.host, result=f"{task.host.name} failed connectivity check via tcp_ping.", failed=True From a025e295d80a5eb7d77b8d0d29f58742e0fbd19d Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Thu, 16 Jan 2025 20:13:01 +0000 Subject: [PATCH 06/31] data updates for testing --- .../adapters/sync_network_data_adapters.py | 2 +- .../fixtures/sync_network_data_fixture.py | 2 + .../expected_result_1.json | 71 + .../expected_result_1.json | 276 +++ .../expected_result_2.json | 201 ++ .../expected_result_1.json | 1221 ++++++++++++ .../expected_result_1.json | 771 ++++++++ .../expected_result_2.json | 1656 +++++++++++++++++ 8 files changed, 4199 insertions(+), 1 deletion(-) create mode 100644 nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_software/expected_result_1.json create mode 100644 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_1.json create mode 100644 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_2.json create mode 100644 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_software/expected_result_1.json create mode 100644 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_1.json create mode 100644 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_2.json diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 7061a3de..4db45351 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -6,7 +6,7 @@ from diffsync.enum import DiffSyncModelFlags from django.conf import settings from django.core.exceptions import ValidationError -from nautobot.dcim.models import Interface, SoftwareVersion, Device +from nautobot.dcim.models import Device, Interface, SoftwareVersion from nautobot.ipam.models import VLAN, VRF, IPAddress from nautobot_ssot.contrib import NautobotAdapter from netaddr import EUI, mac_unix_expanded diff --git a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py index 5043525a..d31e238d 100644 --- a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py +++ b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py @@ -109,6 +109,7 @@ "remote_interface": "GigabitEthernet3", }, ], + "software_version": "16.12.4", }, "demo-cisco-2": { "serial": "9ABUXU5882222", @@ -190,6 +191,7 @@ "remote_interface": "GigabitEthernet3", }, ], + "software_version": "3.12R.4", }, } failed_device = {"demo-cisco-3": {"failed": True, "failed_reason": "Authentication failure"}} diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_software/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_software/expected_result_1.json new file mode 100644 index 00000000..afd6bea1 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_software/expected_result_1.json @@ -0,0 +1,71 @@ +{ + "interfaces": { + "Ethernet1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "1.1.1.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "False", + "mac_address": "52:54:00:91:1e:bf", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet2": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:15:b8:13", + "mtu": "9214", + "type": "1000base-t" + }, + "Ethernet3": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:07:8d:69", + "mtu": "9214", + "type": "1000base-t" + }, + "Ethernet4": { + "802.1Q_mode": "tagged", + "description": "", + "ip_addresses": [ + { + "ip_address": "0.0.0.0", + "prefix_length": 0 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:91:1e:bf", + "mtu": "1500", + "type": "1000base-t" + }, + "Management1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:0d:29:5c", + "mtu": "1500", + "type": "1000base-t" + } + }, + "serial": "17E1C0B9EEFFCE88C2E0703E4A1D4FB0", + "software_version": "4.31.0F" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_1.json new file mode 100644 index 00000000..42528e1b --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_1.json @@ -0,0 +1,276 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3581", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/11": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/12": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/13": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/14": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/15": { + "802.1Q_mode": "tagged", + "description": "***connection to SW1***", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.358f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/16": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3590", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3582", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3583", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3584", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3585", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3586", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3587", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3588", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3589", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.35c0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.35c1", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC2341Y2CQ", + "software_version": "15.2(7)E9" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_2.json new file mode 100644 index 00000000..dda93f0e --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_software/expected_result_2.json @@ -0,0 +1,201 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC1541W2SP", + "software_version": "15.0(2)SE8" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_software/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_software/expected_result_1.json new file mode 100644 index 00000000..3f4d4321 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_software/expected_result_1.json @@ -0,0 +1,1221 @@ +{ + "serial": "FDO20432435", + "software_version": "7.0(3)I7(4)", + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "type": "other" + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual" + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual" + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "type": "other" + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "lag" + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag" + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "lag" + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "lag" + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag" + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "lag" + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "lag" + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "lag" + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "lag" + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "type": "lag" + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "lag" + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "lag" + } + } +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_1.json new file mode 100644 index 00000000..e637b3a4 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_1.json @@ -0,0 +1,771 @@ +{ + "interfaces": { + "GigabitEthernet0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5dcf", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.234", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1.100": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.1", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1.200": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.41.238.129", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1.300": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.209", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.217", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d42", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/0": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d50", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/1": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d51", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/2": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d52", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/3": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d53", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/4": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d54", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/5": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d55", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/6": { + "802.1Q_mode": "tagged-all", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d56", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/7": { + "802.1Q_mode": "access", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d57", + "mtu": "1500", + "type": "other" + }, + "Loopback0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1514", + "type": "other" + }, + "Serial0/1/0:0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:10": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:11": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:12": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:13": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:14": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:15": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:16": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:17": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:18": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:19": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:20": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:21": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:22": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:23": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:24": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:25": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:26": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:27": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:28": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:29": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:30": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:7": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:8": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:9": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Service-Engine0/1/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "cc70.ed3b.0716", + "mtu": "9216", + "type": "other" + }, + "Service-Engine0/4/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "9216", + "type": "other" + }, + "Tunnel0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "9972", + "type": "other" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5dc4", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FLM241611GV", + "software_version": "16.9.4" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_2.json new file mode 100644 index 00000000..5a39abb1 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_software/expected_result_2.json @@ -0,0 +1,1656 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t" + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag" + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual" + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FJC2304W0BB", + "software_version": "15.2(4)E9" +} \ No newline at end of file From 56de53de66ffec029a4e03b34e563bb4a0bf9eef Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Fri, 17 Jan 2025 19:45:11 +0000 Subject: [PATCH 07/31] tests --- changes/233.added | 1 + .../tests/test_sync_network_data_adapters.py | 39 ++++++++++++++++++- nautobot_device_onboarding/tests/utils.py | 20 +++++++++- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 changes/233.added diff --git a/changes/233.added b/changes/233.added new file mode 100644 index 00000000..e8505b54 --- /dev/null +++ b/changes/233.added @@ -0,0 +1 @@ +- Added support syncing in software versions from devices to nautobot core models. \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py index d4f73297..03e56519 100644 --- a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py +++ b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py @@ -3,7 +3,7 @@ from unittest.mock import MagicMock, patch from nautobot.core.testing import TransactionTestCase -from nautobot.dcim.models import Device, Interface +from nautobot.dcim.models import Device, Interface, SoftwareVersion from nautobot.extras.models import JobResult from nautobot.ipam.models import VLAN, VRF, IPAddress @@ -40,6 +40,7 @@ def setUp(self): # pylint: disable=invalid-name self.job.namespace = self.testing_objects["namespace"] self.job.sync_vlans = True self.job.sync_vrfs = True + self.job.sync_software_version = True self.job.debug = True self.job.devices_to_load = None @@ -226,6 +227,25 @@ def test_load_cables(self): self.assertEqual(termination_b_device, diffsync_obj.termination_b__device__name) self.assertEqual(termination_b_interface, diffsync_obj.termination_b__name) + def test_load_software_versions(self): + """Test loading software version data returned from command getter into the diffsync store.""" + self.sync_network_data_adapter.load_software_versions() + for _, device_data in self.job.command_getter_result.items(): + device_data = self.job.command_getter_result["demo-cisco-1"] + device = Device.objects.get(serial=device_data["serial"]) + unique_id = f"{device_data['software_version']}__{device.platform}" + diffsync_obj = self.sync_network_data_adapter.get("software_version", unique_id) + self.assertEqual("cisco_ios", diffsync_obj.platform__name) + self.assertEqual(device_data["software_version"], diffsync_obj.version) + + def test_load_software_version_to_device(self): + self.sync_network_data_adapter.load_software_version_to_device() + for _, device_data in self.job.command_getter_result.items(): + device = Device.objects.get(serial=device_data["serial"]) + unique_id = f"{device.name}__{device.serial}" + diffsync_obj = self.sync_network_data_adapter.get("software_version_to_device", unique_id) + self.assertEqual(device_data["software_version"], diffsync_obj.software_version__version) + class SyncNetworkDataNautobotAdapterTestCase(TransactionTestCase): """Test SyncNetworkDataNautobotAdapter class.""" @@ -362,6 +382,23 @@ def test_load_vrf_to_interface(self): self.assertEqual(interface.name, diffsync_obj.name) self.assertEqual(vrf, diffsync_obj.vrf) + def test_load_software_versions(self): + """Test loading Nautobot software version data into the diffsync store.""" + self.sync_network_data_adapter.load_software_versions() + for software_version in SoftwareVersion.objects.all(): + unique_id = f"{software_version.version}__{software_version.platform.name}" + diffsync_obj = self.sync_network_data_adapter.get("software_version", unique_id) + self.assertEqual(software_version.platform.name, diffsync_obj.platform__name) + self.assertEqual(software_version.version, diffsync_obj.version) + + def test_load_software_version_to_device(self): + """Test loading Nautobot software version device assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_software_version_to_device() + for device in Device.objects.filter(name__in=["demo-cisco-1", "demo-cisco-2"]): + unique_id = f"{device.name}__{device.serial}" + diffsync_obj = self.sync_network_data_adapter.get("software_version_to_device", unique_id) + self.assertEqual(device.software_version.version, diffsync_obj.software_version__version) + def test_sync_complete(self): """Test primary ip re-assignment if deleted during the sync.""" self.sync_network_data_adapter._cache_primary_ips( # pylint: disable=protected-access diff --git a/nautobot_device_onboarding/tests/utils.py b/nautobot_device_onboarding/tests/utils.py index 2733d973..b0ef1fd8 100644 --- a/nautobot_device_onboarding/tests/utils.py +++ b/nautobot_device_onboarding/tests/utils.py @@ -2,7 +2,17 @@ from django.contrib.contenttypes.models import ContentType from nautobot.dcim.choices import InterfaceModeChoices, InterfaceTypeChoices -from nautobot.dcim.models import Cable, Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform +from nautobot.dcim.models import ( + Cable, + Device, + DeviceType, + Interface, + Location, + LocationType, + Manufacturer, + Platform, + SoftwareVersion, +) from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices from nautobot.extras.models import Role, Secret, SecretsGroup, SecretsGroupAssociation, Status from nautobot.ipam.choices import IPAddressTypeChoices, PrefixTypeChoices @@ -23,6 +33,7 @@ def sync_network_data_ensure_required_nautobot_objects(): status.content_types.add(ContentType.objects.get_for_model(VLAN)) status.content_types.add(ContentType.objects.get_for_model(VRF)) status.content_types.add(ContentType.objects.get_for_model(Cable)) + status.content_types.add(ContentType.objects.get_for_model(SoftwareVersion)) status.validated_save() username_secret, _ = Secret.objects.get_or_create( @@ -85,6 +96,8 @@ def sync_network_data_ensure_required_nautobot_objects(): vlan_2, _ = VLAN.objects.get_or_create(vid=50, name="vlan50", location=location, status=status) vrf_1, _ = VRF.objects.get_or_create(name="mgmt", namespace=namespace) vrf_2, _ = VRF.objects.get_or_create(name="vrf2", namespace=namespace) + software_version_1, _ = SoftwareVersion.objects.get_or_create(version="16.12.4", platform=platform_1, status=status) + software_version_2, _ = SoftwareVersion.objects.get_or_create(version="3.12R.4", platform=platform_2, status=status) device_type, _ = DeviceType.objects.get_or_create(model="CSR1000V17", manufacturer=manufacturer) device_1, _ = Device.objects.get_or_create( @@ -96,6 +109,7 @@ def sync_network_data_ensure_required_nautobot_objects(): role=device_role, platform=platform_1, secrets_group=secrets_group, + software_version=software_version_1, ) device_2, _ = Device.objects.get_or_create( name="demo-cisco-2", @@ -106,6 +120,7 @@ def sync_network_data_ensure_required_nautobot_objects(): role=device_role, platform=platform_2, secrets_group=secrets_group, + software_version=software_version_2, ) device_3, _ = Device.objects.get_or_create( name="demo-cisco-3", @@ -116,6 +131,7 @@ def sync_network_data_ensure_required_nautobot_objects(): role=device_role, platform=platform_2, secrets_group=secrets_group, + software_version=software_version_2, ) interface_1, _ = Interface.objects.get_or_create( device=device_1, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL @@ -161,6 +177,8 @@ def sync_network_data_ensure_required_nautobot_objects(): testing_objects["vlan_2"] = vlan_2 testing_objects["vrf_1"] = vrf_1 testing_objects["vrf_2"] = vrf_2 + # testing_objects["software_version_1"] = software_version_1 + # testing_objects["software_version_2"] = software_version_2 return testing_objects From 1b8f872bfc6c687ff57ff7b8cff209f4c577f873 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Fri, 17 Jan 2025 20:00:00 +0000 Subject: [PATCH 08/31] docs update --- README.md | 1 + docs/admin/install.md | 2 +- docs/user/app_overview.md | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aa053dff..1599d311 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | 802.1Q mode | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | | Lag Member | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | | Vrf Membership | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | +| Software Version | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | | VLANS | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | | ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | diff --git a/docs/admin/install.md b/docs/admin/install.md index 15eb813a..12eb73a6 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -4,7 +4,7 @@ Here you will find detailed instructions on how to **install** and **configure** ## Prerequisites -- The app is compatible with Nautobot 2.0.3 and higher. +- The app is compatible with Nautobot 2.3.1 and higher. - Databases supported: PostgreSQL, MySQL !!! note diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md index 861f47a1..101004bb 100644 --- a/docs/user/app_overview.md +++ b/docs/user/app_overview.md @@ -48,6 +48,7 @@ Expose two new SSoT based Nautobot jobs to perform the syncing of data. - VRF Names - Route Distinguishers (RD) - Cabling + - Software Version !!! info For more information look at the provided jsonschema definitions for each of the jobs. From eafc91165c93b3d5bef924378091067f6ce25926 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Fri, 17 Jan 2025 20:18:28 +0000 Subject: [PATCH 09/31] linting --- nautobot_device_onboarding/command_mappers/cisco_ios.yml | 2 +- nautobot_device_onboarding/command_mappers/cisco_nxos.yml | 2 +- nautobot_device_onboarding/command_mappers/cisco_xe.yml | 2 +- nautobot_device_onboarding/command_mappers/juniper_junos.yml | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 116c29cf..b4141a54 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -133,4 +133,4 @@ sync_network_data: commands: - command: "show version" parser: "textfsm" - jpath: "[*].version" \ No newline at end of file + jpath: "[*].version" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 0f8f3e7d..c7db1408 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -126,4 +126,4 @@ sync_network_data: commands: - command: "show version" parser: "textfsm" - jpath: "[*].os" \ No newline at end of file + jpath: "[*].os" diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index 8d7634f0..64c280dc 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -130,4 +130,4 @@ sync_network_data: commands: - command: "show version" parser: "textfsm" - jpath: "[*].version" \ No newline at end of file + jpath: "[*].version" diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index 462372f1..7eb51d82 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -126,4 +126,3 @@ sync_network_data: - command: "show system information | display json" parser: "none" jpath: '"system-information"[]."os-version"[].data' # yamllint disable-line rule:quoted-strings - \ No newline at end of file From 21a78bbfc3e1b2efd41af34fa58687763c690886 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Fri, 17 Jan 2025 20:48:32 +0000 Subject: [PATCH 10/31] fix tests --- .../tests/test_command_getter.py | 11 ++++++++++- nautobot_device_onboarding/tests/test_jobs.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py index 88f0f332..28b08d9b 100755 --- a/nautobot_device_onboarding/tests/test_command_getter.py +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -24,6 +24,7 @@ def test_deduplicate_command_list_sync_devices(self): sync_vlans=False, sync_vrfs=False, sync_cables=False, + sync_software_version=False, ) expected_commands_to_run = [ {"command": "show version", "jpath": "[*].hostname", "parser": "textfsm"}, @@ -43,6 +44,7 @@ def test_deduplicate_command_list_sync_data_no_vrfs_no_vlans(self): sync_vlans=False, sync_vrfs=False, sync_cables=False, + sync_software_version=False, ) expected_commands_to_run = [ {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, @@ -76,6 +78,7 @@ def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): sync_vlans=False, sync_vrfs=True, sync_cables=False, + sync_software_version=False, ) expected_commands_to_run = [ {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, @@ -116,6 +119,7 @@ def test_deduplicate_command_list_sync_data_no_vrfs_with_vlans(self): sync_vlans=True, sync_vrfs=False, sync_cables=False, + sync_software_version=False, ) expected_commands_to_run = [ {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, @@ -150,6 +154,7 @@ def test_deduplicate_command_list_sync_data_with_vrfs_and_vlans(self): sync_vlans=True, sync_vrfs=True, sync_cables=False, + sync_software_version=False, ) expected_commands_to_run = [ {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, @@ -186,7 +191,11 @@ def test_deduplicate_command_list_sync_data_with_vrfs_and_vlans(self): def test_deduplicate_command_list_sync_data_cables(self): get_commands_to_run = _get_commands_to_run( - self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=False, sync_cables=True + self.expected_data["sync_network_data"], + sync_vlans=False, + sync_vrfs=False, + sync_cables=True, + sync_software_version=False, ) expected_commands_to_run = [ {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, diff --git a/nautobot_device_onboarding/tests/test_jobs.py b/nautobot_device_onboarding/tests/test_jobs.py index bb81d950..3e2c0e06 100644 --- a/nautobot_device_onboarding/tests/test_jobs.py +++ b/nautobot_device_onboarding/tests/test_jobs.py @@ -145,6 +145,7 @@ def test_sync_network_data__success(self, device_data): "sync_vlans": True, "sync_vrfs": True, "sync_cables": True, + "sync_software_version": True, "namespace": self.testing_objects["namespace"].pk, "interface_status": self.testing_objects["status"].pk, "ip_address_status": self.testing_objects["status"].pk, From 06a8bb1e749eaa2f718c9ae6529fb19377fdb915 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Wed, 22 Jan 2025 17:31:43 +0000 Subject: [PATCH 11/31] update testing object --- nautobot_device_onboarding/tests/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautobot_device_onboarding/tests/utils.py b/nautobot_device_onboarding/tests/utils.py index b0ef1fd8..fa0a994f 100644 --- a/nautobot_device_onboarding/tests/utils.py +++ b/nautobot_device_onboarding/tests/utils.py @@ -177,8 +177,8 @@ def sync_network_data_ensure_required_nautobot_objects(): testing_objects["vlan_2"] = vlan_2 testing_objects["vrf_1"] = vrf_1 testing_objects["vrf_2"] = vrf_2 - # testing_objects["software_version_1"] = software_version_1 - # testing_objects["software_version_2"] = software_version_2 + testing_objects["software_version_1"] = software_version_1 + testing_objects["software_version_2"] = software_version_2 return testing_objects From 07944fe3479b96b571e10b9b362bae1dacd03d0a Mon Sep 17 00:00:00 2001 From: Susan Hooks <51679702+susanhooks@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:15:52 -0700 Subject: [PATCH 12/31] fixed tests --- nautobot_device_onboarding/nornir_plays/formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index 1ea971f9..a2537c61 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -150,7 +150,7 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d continue if not sync_cables and ssot_field == "cables": continue - if not sync_software_version and ssot_field == "software_versions": + if not sync_software_version and ssot_field == "software_version": continue if ssot_field == "pre_processor": continue From 9f2c206d2fbc2268d3471be95c7970d4d755250c Mon Sep 17 00:00:00 2001 From: David Cates <57967713+Dav-C@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:49:16 -0700 Subject: [PATCH 13/31] fix loading and saving bugs with vlans, lags and vrfs (#310) * fix loading and saving bugs with vlans, lags. and vrfs * add change fragment --------- Co-authored-by: David Cates --- changes/311.fixed | 1 + .../adapters/sync_network_data_adapters.py | 46 +-- .../models/sync_network_data_models.py | 336 +++++++++++------- 3 files changed, 231 insertions(+), 152 deletions(-) create mode 100644 changes/311.fixed diff --git a/changes/311.fixed b/changes/311.fixed new file mode 100644 index 00000000..d459f9a8 --- /dev/null +++ b/changes/311.fixed @@ -0,0 +1 @@ +Fixed issue with Lags, VRFs and Untagged Vlans not being removed from interfaces \ No newline at end of file diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 081b40bb..86ab5f2e 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -157,12 +157,13 @@ def load_tagged_vlans_to_interface(self): vlan_dict["name"] = vlan.name vlan_dict["id"] = str(vlan.vid) tagged_vlans.append(vlan_dict) + sorted_tagged_vlans = sorted(tagged_vlans, key=lambda x: x["id"]) network_tagged_vlans_to_interface = self.tagged_vlans_to_interface( adapter=self, device__name=interface.device.name, name=interface.name, - tagged_vlans=tagged_vlans, + tagged_vlans=sorted_tagged_vlans, ) network_tagged_vlans_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST self.add(network_tagged_vlans_to_interface) @@ -606,24 +607,26 @@ def load_vlans(self): if interface_data["untagged_vlan"] and interface_data["untagged_vlan"].get("id") == "0": self.job.logger.warning("Interface with untagged vlan 0 found. Skipping untagged vlan load.") continue - try: - network_vlan = self.vlan( - adapter=self, - name=interface_data["untagged_vlan"]["name"], - vid=interface_data["untagged_vlan"]["id"], - location__name=location_names.get(hostname, ""), - ) - self.add(network_vlan) - except diffsync.exceptions.ObjectAlreadyExists: - continue - except Exception as err: # pylint: disable=broad-exception-caught - self._handle_general_load_exception( - error=err, - hostname=hostname, - data=device_data, - model_type="vlan", - ) - continue + + if interface_data["untagged_vlan"]: + try: + network_vlan = self.vlan( + adapter=self, + name=interface_data["untagged_vlan"]["name"], + vid=interface_data["untagged_vlan"]["id"], + location__name=location_names.get(hostname, ""), + ) + self.add(network_vlan) + except diffsync.exceptions.ObjectAlreadyExists: + continue + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, + hostname=hostname, + data=device_data, + model_type="vlan", + ) + continue def load_vrfs(self): """Load vrfs into the Diffsync store.""" @@ -691,11 +694,12 @@ def load_tagged_vlans_to_interface(self): # for interface in device_data["interfaces"]: for interface_name, interface_data in device_data["interfaces"].items(): try: + sorted_tagged_vlans = sorted(interface_data["tagged_vlans"], key=lambda x: x["id"]) network_tagged_vlans_to_interface = self.tagged_vlans_to_interface( adapter=self, device__name=hostname, name=interface_name, - tagged_vlans=interface_data["tagged_vlans"], + tagged_vlans=sorted_tagged_vlans, ) self.add(network_tagged_vlans_to_interface) except Exception as err: # pylint: disable=broad-exception-caught @@ -710,7 +714,6 @@ def load_tagged_vlans_to_interface(self): def load_untagged_vlan_to_interface(self): """Load untagged vlan to interface assignments into the Diffsync store.""" for hostname, device_data in self.job.command_getter_result.items(): - # for interface in device_data["interfaces"]: for interface_name, interface_data in device_data["interfaces"].items(): try: if interface_data["untagged_vlan"] and interface_data["untagged_vlan"].get("id") == "0": @@ -758,7 +761,6 @@ def load_lag_to_interface(self): def load_vrf_to_interface(self): """Load Vrf to interface assignments into the Diffsync store.""" for hostname, device_data in self.job.command_getter_result.items(): - # for interface in device_data["interfaces"]: for interface_name, interface_data in device_data["interfaces"].items(): try: network_vrf_to_interface = self.vrf_to_interface( diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index e8ecdf59..1d1f25a6 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -249,21 +249,31 @@ class SyncNetworkDataTaggedVlansToInterface(DiffSyncModel): tagged_vlans: Optional[list] = None @classmethod - def _get_and_assign_tagged_vlans(cls, adapter, attrs, interface): - """Loop through the tagged vlans for an interface and assign them.""" - for network_vlan in attrs["tagged_vlans"]: - try: - nautobot_vlan = VLAN.objects.get( - name=network_vlan["name"], vid=network_vlan["id"], location=interface.device.location - ) - interface.tagged_vlans.add(nautobot_vlan) - except ObjectDoesNotExist: - adapter.job.logger.error( - f"Failed to assign tagged vlan to {interface.device}:{interface}, unable to locate a vlan " - f"with attributes [name: {network_vlan['name']}, vid: {network_vlan['id']} " - f"location: {interface.device.location}]" - ) - raise diffsync_exceptions.ObjectNotCreated + def _get_and_assign_tagged_vlan(cls, adapter, network_vlan, interface, diff_method_type): + """Assign a tagged vlan to an interface.""" + try: + nautobot_vlan = VLAN.objects.get( + name=network_vlan["name"], vid=network_vlan["id"], location=interface.device.location + ) + interface.tagged_vlans.add(nautobot_vlan) + except ObjectDoesNotExist as err: + adapter.job.logger.error( + f"Failed to assign tagged vlan to interface: [{interface}] on device: [{interface.device}]. " + f"Unable to locate a vlan with attributes [{network_vlan}] at location: [{interface.device.location}]" + ) + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) + except Exception as err: + adapter.job.logger.error( + f"Failed to assign tagged vlan: [{network_vlan}] " + f"to interface: [{interface}]on device: [{interface.device}], {err}" + ) + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) @classmethod def create(cls, adapter, ids, attrs): @@ -271,43 +281,56 @@ def create(cls, adapter, ids, attrs): if attrs.get("tagged_vlans"): try: interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) - except ObjectDoesNotExist: + except ObjectDoesNotExist as err: adapter.job.logger.error( - f"Failed to assign tagged vlans {attrs['tagged_vlans']}. An interface with " - f"attributes: [device__name: {ids['device__name']} name: {ids['name']}] was not found." + f"Failed to assign tagged vlans {attrs['tagged_vlans']}. " + f"An interface with identifiers: [{ids}] was not found." ) - raise diffsync_exceptions.ObjectNotCreated - cls._get_and_assign_tagged_vlans(adapter, attrs, interface) - if interface: - try: - interface.validated_save() - except ValidationError as err: - adapter.job.logger.error( - f"Failed to assign tagged vlans {attrs['tagged_vlans']} to {interface} on {interface.device}, {err}" - ) - raise diffsync_exceptions.ObjectNotCreated + raise diffsync_exceptions.ObjectNotCreated(err) + for network_vlan in attrs["tagged_vlans"]: + cls._get_and_assign_tagged_vlan(adapter, network_vlan, interface, diff_method_type="create") + try: + interface.validated_save() + except ValidationError as err: + adapter.job.logger.error( + f"Failed to assign tagged vlans {attrs['tagged_vlans']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotCreated(err) return super().create(adapter, ids, attrs) def update(self, attrs): """Update tagged vlans.""" + # An interface must exist before vlan assignments can be updated + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist: + self.adapter.job.logger.error( + f"Failed to update tagged vlans, an interface with identifiers: [{self.get_identifiers()}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + # Clear all tagged vlans from an interface and assign them based on what was loaded into the diffsync store if attrs.get("tagged_vlans"): + interface.tagged_vlans.clear() + for network_vlan in attrs["tagged_vlans"]: + self._get_and_assign_tagged_vlan(self.adapter, network_vlan, interface, diff_method_type="update") try: - interface = Interface.objects.get(**self.get_identifiers()) - interface.tagged_vlans.clear() - except ObjectDoesNotExist: + interface.validated_save() + except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign tagged vlans {attrs['tagged_vlans']}. An interface with " - f"attributes: [{self.get_identifiers}] was not found." + f"Failed to assign tagged vlans {attrs['tagged_vlans']} " + f"to interface: [{interface}] on device: [{interface.device}], {err}" ) raise diffsync_exceptions.ObjectNotUpdated - self._get_and_assign_tagged_vlans(self.adapter, attrs, interface) + # Clear all tagged vlans from an interface + if not attrs.get("tagged_vlans"): + interface.tagged_vlans.clear() try: interface.validated_save() except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign tagged vlans {attrs['tagged_vlans']} to {interface} on {interface.device}, {err}" + f"Failed to remove tagged vlans from interface: [{interface}] on device: [{interface.device}], {err}" ) - raise diffsync_exceptions.ObjectNotUpdated + raise diffsync_exceptions.ObjectNotUpdated(err) return super().update(attrs) @@ -324,7 +347,7 @@ class SyncNetworkDataUnTaggedVlanToInterface(DiffSyncModel): untagged_vlan: Optional[dict] = None @classmethod - def _get_and_assign_untagged_vlan(cls, adapter, attrs, interface): + def _get_and_assign_untagged_vlan(cls, adapter, attrs, interface, diff_method_type): """Assign an untagged vlan to an interface.""" try: vlan = VLAN.objects.get( @@ -333,13 +356,25 @@ def _get_and_assign_untagged_vlan(cls, adapter, attrs, interface): location=interface.device.location, ) interface.untagged_vlan = vlan - except ObjectDoesNotExist: + except ObjectDoesNotExist as err: adapter.job.logger.error( - f"Failed to assign untagged vlan to {interface.device}:{interface}, unable to locate a vlan with " - f"attributes [name: {attrs['untagged_vlan']['name']}, vid: {attrs['untagged_vlan']['id']} " - f"location: {interface.device.location}]" + f"Failed to assign untagged vlan to interface: [{interface}] on device: [{interface.device}]. " + f"Unable to locate a vlan with attributes: [{attrs['untagged_vlan']}] " + f" at location: {interface.device.location}]" ) - raise diffsync_exceptions.ObjectNotCreated + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) + except Exception as err: + adapter.job.logger.error( + f"Failed to assign untagged vlan: [{attrs['untagged_vlan']}] " + f"to interface: [{interface}] on device: [{interface.device}], {err}" + ) + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) @classmethod def create(cls, adapter, ids, attrs): @@ -349,37 +384,50 @@ def create(cls, adapter, ids, attrs): interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) except ObjectDoesNotExist: adapter.job.logger.error( - f"Failed to assign untagged vlan {attrs['untagged_vlan']}. An interface with " - f"attributes: [device__name: {ids['device__name']} name: {ids['name']}] was not found." + f"Failed to assign untagged vlan {attrs['untagged_vlan']}. " + f"An interface with identifiers: [{ids}] was not found." ) raise diffsync_exceptions.ObjectNotCreated - cls._get_and_assign_untagged_vlan(adapter, attrs, interface) + cls._get_and_assign_untagged_vlan(adapter, attrs, interface, diff_method_type="create") try: interface.validated_save() except ValidationError as err: adapter.job.logger.error( - f"Failed to assign untagged vlan {attrs['untagged_vlan']} to {interface} on {interface.device}, {err}" + f"Failed to assign untagged vlan {attrs['untagged_vlan']} " + f"to interface: [{interface}] on device: [{interface.device}], {err}" ) - raise diffsync_exceptions.ObjectNotCreated + raise diffsync_exceptions.ObjectNotCreated(err) return super().create(adapter, ids, attrs) def update(self, attrs): """Update the untagged vlan on an interface.""" + # An interface must exist before vlan assignments can be updated + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist: + self.adapter.job.logger.error( + f"Failed to update untagged vlan, an interface with identifiers: [{self.get_identifiers()}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + # Assign an untagged vlan to an interface if attrs.get("untagged_vlan"): + self._get_and_assign_untagged_vlan(self.adapter, attrs, interface, diff_method_type="update") try: - interface = Interface.objects.get(**self.get_identifiers()) - except ObjectDoesNotExist: + interface.validated_save() + except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign untagged vlan {attrs['untagged_vlan']}. An interface with " - f"attributes: [{self.get_identifiers}] was not found." + f"Failed to assign untagged vlan {attrs['untagged_vlan']} " + f"to interface: [{interface}] on device: [{interface.device}], {err}" ) raise diffsync_exceptions.ObjectNotUpdated - self._get_and_assign_untagged_vlan(self.adapter, attrs, interface) + # Removed an untagged vlan from an interface + if not attrs.get("untagged_vlan"): + interface.untagged_vlan = None try: interface.validated_save() except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign untagged vlans {attrs['untagged_vlan']} to {interface} on {interface.device}, {err}" + f"Failed to remove untagged vlan from {interface} on {interface.device}, {err}" ) raise diffsync_exceptions.ObjectNotUpdated return super().update(attrs) @@ -397,70 +445,79 @@ class SyncNetworkDataLagToInterface(DiffSyncModel): lag__interface__name: Optional[str] = None - # TODO: move the create and update method locgic to a single utility function + @classmethod + def _get_and_assign_lag(cls, adapter, attrs, interface, diff_method_type): + """Assign a lag interface to an interface.""" + try: + lag_interface = Interface.objects.get( + name=attrs["lag__interface__name"], device=interface.device, type=InterfaceTypeChoices.TYPE_LAG + ) + interface.lag = lag_interface + except ObjectDoesNotExist as err: + adapter.job.logger.error( + f"Failed to assign lag to interface: [{interface}] on device: [{interface.device}]. " + f"Unable to locate a lag interface with name: [{attrs['lag__interface__name']}] " + f"on device: [{interface.device}]" + ) + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) + @classmethod def create(cls, adapter, ids, attrs): """Assign a lag to an interface.""" if attrs["lag__interface__name"]: try: interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) - except ObjectDoesNotExist: + except ObjectDoesNotExist as err: adapter.job.logger.error( - f"Failed to assign lag {attrs['lag__interface__name']}. An interface with " - f"attributes: [device__name: {ids['device__name']} name: {ids['name']}] was not found." + f"Failed to assign lag: [{attrs['lag__interface__name']}]. " + f"An interface with identifiers: [{ids}] was not found." ) - raise diffsync_exceptions.ObjectNotCreated - if interface: - try: - lag_interface = Interface.objects.get( - name=attrs["lag__interface__name"], device=interface.device, type=InterfaceTypeChoices.TYPE_LAG - ) - interface.lag = lag_interface - interface.validated_save() - except ObjectDoesNotExist: - adapter.job.logger.error( - f"Failed to assign lag to {interface.device}:{interface}, unable to locate a lag interface " - f"with attributes [name: {attrs['lag__interface__name']}, device: {interface.device.name} " - f"type: {InterfaceTypeChoices.TYPE_LAG}]" - ) - raise diffsync_exceptions.ObjectNotCreated - except ValidationError as err: - adapter.job.logger.error( - f"Failed to assign lag {lag_interface} to {interface} on {interface.device}, {err}" - ) - raise diffsync_exceptions.ObjectNotCreated + raise diffsync_exceptions.ObjectNotCreated(err) + cls._get_and_assign_lag(adapter, attrs, interface, diff_method_type="create") + try: + interface.validated_save() + except ValidationError as err: + adapter.job.logger.error( + f"Failed to assign lag: [{attrs['lag__interface__name']}] " + f"to interface: [{interface}] on device: [{interface.device}], {err}" + ) + raise diffsync_exceptions.ObjectNotCreated(err) return super().create(adapter, ids, attrs) def update(self, attrs): """Update and interface lag.""" + # An interface must exist before lag can be updated + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist as err: + self.adapter.job.logger.error( + f"Failed to update lag, an interface with identifiers: [{self.get_identifiers()}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated(err) + # Assign lag to an interface if attrs.get("lag__interface__name"): + self._get_and_assign_lag(self.adapter, attrs, interface, diff_method_type="update") try: - interface = Interface.objects.get(**self.get_identifiers()) - except ObjectDoesNotExist: + interface.validated_save() + except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign untagged lag {attrs['lag__interface__name']}. " - f"An interface with attributes: [{self.get_identifiers}] was not found." + f"Failed to assign lag: [{attrs['lag__interface__name']}] " + f"to interface: [{interface}] on device: [{interface.device}], {err}" ) - raise diffsync_exceptions.ObjectNotUpdated - try: - lag_interface = Interface.objects.get( - name=attrs["lag__interface__name"], device=interface.device, type=InterfaceTypeChoices.TYPE_LAG - ) - interface.lag = lag_interface - interface.validated_save() - except ObjectDoesNotExist: - self.adapter.job.logger.error( - f"Failed to assign lag to {interface}, unable to locate a lag interface " - f"with attributes [name: {attrs['lag__interface__name']}, device: {interface.device.name} " - f"type: {InterfaceTypeChoices.TYPE_LAG}]" - ) - raise diffsync_exceptions.ObjectNotUpdated - except ValidationError as err: - self.adapter.job.logger.error( - f"Failed to assign lag {lag_interface} to {interface} on {interface.device}, {err}" - ) - raise diffsync_exceptions.ObjectNotUpdated - + raise diffsync_exceptions.ObjectNotUpdated(err) + # Remove lag from an interface + if not attrs.get("lag__interface__name"): + interface.lag = None + try: + interface.validated_save() + except ValidationError as err: + self.adapter.job.logger.error( + f"Failed to remove lag from interface: [{interface}] on device: [{interface.device}], {err}" + ) + raise diffsync_exceptions.ObjectNotUpdated(err) return super().update(attrs) @@ -488,35 +545,42 @@ class SyncNetworkDataVrfToInterface(DiffSyncModel): vrf: Optional[dict] = None @classmethod - def _get_and_assign_vrf(cls, adapter, attrs, interface): + def _get_and_assign_vrf(cls, adapter, attrs, interface, diff_method_type): """Assign a vrf to an interface.""" try: vrf = VRF.objects.get( name=attrs["vrf"]["name"], namespace=adapter.job.namespace, ) - except ObjectDoesNotExist: + except ObjectDoesNotExist as err: adapter.job.logger.error( - f"Failed to assign vrf to {interface.device}:{interface}, unable to locate a vrf with attributes " - f"[name: {attrs['vrf']['name']} " - f"namespace: {adapter.job.namespace}]" + f"Failed to assign vrf to interface: [{interface}] on device: [{interface.device}]. " + f"Unable to locate a vrf with name: [{attrs['vrf']['name']}] in namespace: [{adapter.job.namespace}]" ) - raise diffsync_exceptions.ObjectNotCreated - except MultipleObjectsReturned: + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) + except MultipleObjectsReturned as err: adapter.job.logger.error( - f"Failed to assign vrf to {interface.device}:{interface}, there are multipple vrfs with attributes " - f"[name: {attrs['vrf']['name']} " - f"namespace: {adapter.job.namespace}]. " + f"Failed to assign vrf to interface: [{interface}] on device: [{interface.device}]. " + f"There are multipple vrfs with name: [{attrs['vrf']['name']}] in namespace: [{adapter.job.namespace}]. " "Unsure which to assign." ) - raise diffsync_exceptions.ObjectNotCreated + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) try: vrf.devices.add(interface.device) vrf.validated_save() + interface.vrf = vrf except Exception as err: - adapter.logger.error(f"Failed to assign device: {interface.device} to vrf: {vrf}, {err}") - raise diffsync_exceptions.ObjectNotCreated - interface.vrf = vrf + adapter.logger.error(f"Failed to assign device: [{interface.device}] to vrf: [{vrf}], {err}") + if diff_method_type == "create": + raise diffsync_exceptions.ObjectNotCreated(err) + if diff_method_type == "update": + raise diffsync_exceptions.ObjectNotUpdated(err) @classmethod def create(cls, adapter, ids, attrs): @@ -524,41 +588,53 @@ def create(cls, adapter, ids, attrs): if attrs.get("vrf"): try: interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) - except ObjectDoesNotExist: + except ObjectDoesNotExist as err: adapter.job.logger.error( - f"Failed to assign vrf {attrs['vrf']}. An interface with attributes: " - f"[device__name: {ids['device__name']} name: {ids['name']}] was not found." + f"Failed to assign vrf: [{attrs['vrf']['name']}]. " + f"An interface with identifiers: [{ids}] was not found." ) - raise diffsync_exceptions.ObjectNotCreated - cls._get_and_assign_vrf(adapter, attrs, interface) + raise diffsync_exceptions.ObjectNotCreated(err) + cls._get_and_assign_vrf(adapter, attrs, interface, diff_method_type="create") try: interface.validated_save() except ValidationError as err: adapter.job.logger.error( - f"Failed to assign vrf {attrs['vrf']} to {interface} on {interface.device}, {err}" + f"Failed to assign vrf: [{attrs['vrf']}] " + f"to interface: [{interface}] on device: [{interface.device}], {err}" ) - raise diffsync_exceptions.ObjectNotCreated + raise diffsync_exceptions.ObjectNotCreated(err) return super().create(adapter, ids, attrs) def update(self, attrs): """Update the vrf on an interface.""" + # An interface must exist before vrf can be updated + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist as err: + self.adapter.job.logger.error( + f"Failed to update vrf, an interface with identifiers: [{self.get_identifiers()}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated(err) if attrs.get("vrf"): + # Assign a vrf to an interface + self._get_and_assign_vrf(self.adapter, attrs, interface, diff_method_type="update") try: - interface = Interface.objects.get(**self.get_identifiers()) - except ObjectDoesNotExist: + interface.validated_save() + except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign vrf {attrs['vrf']['name']}. " - f"An interface with attributes: [{self.get_identifiers}] was not found." + f"Failed to assign vrf: [{attrs['vrf']}] " + f"to interface: [{interface}] on device: [{interface.device}], {err}" ) - raise diffsync_exceptions.ObjectNotUpdated - self._get_and_assign_vrf(self.adapter, attrs, interface) + raise diffsync_exceptions.ObjectNotUpdated(err) + if not attrs.get("vrf"): + interface.vrf = None try: interface.validated_save() except ValidationError as err: self.adapter.job.logger.error( - f"Failed to assign vrf {attrs['vrf']} to {interface} on {interface.device}, {err}" + f"Failed to remove vrf from interface: [{interface}] on device: [{interface.device}], {err}" ) - raise diffsync_exceptions.ObjectNotUpdated + raise diffsync_exceptions.ObjectNotUpdated(err) return super().update(attrs) From 7fcf6f1a4f56884eae6e688a70a4dccf37931aec Mon Sep 17 00:00:00 2001 From: Michael Sheinberg Date: Mon, 10 Feb 2025 13:00:28 -0800 Subject: [PATCH 14/31] Ensure that 'connectivity_test' kwargs always passed downstream (#314) --- changes/313.fixed | 1 + nautobot_device_onboarding/jobs.py | 50 +++++++++++-------- .../nornir_plays/command_getter.py | 2 +- .../tests/fixtures/all_required_fields.csv | 2 + nautobot_device_onboarding/tests/test_jobs.py | 50 ++++++++++++++++++- 5 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 changes/313.fixed create mode 100644 nautobot_device_onboarding/tests/fixtures/all_required_fields.csv diff --git a/changes/313.fixed b/changes/313.fixed new file mode 100644 index 00000000..46303025 --- /dev/null +++ b/changes/313.fixed @@ -0,0 +1 @@ +Fixed issue running a sync job via CSV would raise an exception. diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 25b0ebd1..60ca84bd 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -488,6 +488,11 @@ def run( self.memory_profiling = memory_profiling self.debug = debug + self.job_result.task_kwargs = { + "debug": debug, + "connectivity_test": kwargs["connectivity_test"], + } + if csv_file: self.processed_csv_data = self._process_csv_data(csv_file=csv_file) if self.processed_csv_data: @@ -496,10 +501,11 @@ def run( for ip_address in self.processed_csv_data: self.ip_addresses.append(ip_address) # prepare the task_kwargs needed by the CommandGetterDO job - self.job_result.task_kwargs = { - "debug": debug, - "csv_file": self.task_kwargs_csv_data, - } + self.job_result.task_kwargs.update( + { + "csv_file": self.task_kwargs_csv_data, + } + ) else: raise ValidationError(message="CSV check failed. No devices will be synced.") @@ -541,24 +547,24 @@ def run( self.secrets_group = secrets_group self.platform = platform - self.job_result.task_kwargs = { - "debug": debug, - "location": location, - "namespace": namespace, - "ip_addresses": ip_addresses, - "set_mgmt_only": set_mgmt_only, - "update_devices_without_primary_ip": update_devices_without_primary_ip, - "device_role": device_role, - "device_status": device_status, - "interface_status": interface_status, - "ip_address_status": ip_address_status, - "port": port, - "timeout": timeout, - "secrets_group": secrets_group, - "platform": platform, - "csv_file": "", - "connectivity_test": kwargs["connectivity_test"], - } + self.job_result.task_kwargs.update( + { + "location": location, + "namespace": namespace, + "ip_addresses": ip_addresses, + "set_mgmt_only": set_mgmt_only, + "update_devices_without_primary_ip": update_devices_without_primary_ip, + "device_role": device_role, + "device_status": device_status, + "interface_status": interface_status, + "ip_address_status": ip_address_status, + "port": port, + "timeout": timeout, + "secrets_group": secrets_group, + "platform": platform, + "csv_file": "", + } + ) super().run(dryrun, memory_profiling, *args, **kwargs) diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 07255690..fc2e0fb4 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -118,7 +118,7 @@ def netmiko_send_commands( return Result( host=task.host, result=f"{task.host.name} has missing definitions in command_mapper YAML file.", failed=True ) - if orig_job_kwargs["connectivity_test"]: + if orig_job_kwargs.get("connectivity_test", False): if not tcp_ping(task.host.hostname, task.host.port): return Result( host=task.host, result=f"{task.host.name} failed connectivity check via tcp_ping.", failed=True diff --git a/nautobot_device_onboarding/tests/fixtures/all_required_fields.csv b/nautobot_device_onboarding/tests/fixtures/all_required_fields.csv new file mode 100644 index 00000000..9c4e7d46 --- /dev/null +++ b/nautobot_device_onboarding/tests/fixtures/all_required_fields.csv @@ -0,0 +1,2 @@ +ip_address_host,location_name,device_role_name,namespace,device_status_name,interface_status_name,ip_address_status_name,secrets_group_name,set_mgmt_only,update_devices_without_primary_ip,port,timeout +172.23.0.8,Site A Parent,Network,Global,Active,Active,Active,test secrets group,True,False,22,30 diff --git a/nautobot_device_onboarding/tests/test_jobs.py b/nautobot_device_onboarding/tests/test_jobs.py index bb81d950..023fbc1e 100644 --- a/nautobot_device_onboarding/tests/test_jobs.py +++ b/nautobot_device_onboarding/tests/test_jobs.py @@ -1,11 +1,13 @@ """Test Jobs.""" -from unittest.mock import patch +from unittest.mock import ANY, patch +from django.core.files.base import ContentFile from nautobot.apps.testing import create_job_result_and_run_job from nautobot.core.testing import TransactionTestCase from nautobot.dcim.models import Device, Interface, Manufacturer, Platform from nautobot.extras.choices import JobResultStatusChoices +from nautobot.extras.models import FileProxy from nautobot_device_onboarding import jobs from nautobot_device_onboarding.tests import utils @@ -120,6 +122,52 @@ def test_process_csv_data__empty_file(self): processed_csv_data = onboarding_job._process_csv_data(csv_file=csv_file) # pylint: disable=protected-access self.assertEqual(processed_csv_data, None) + @patch("nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters.sync_devices_command_getter") + @patch.dict("os.environ", {"DEVICE_USER": "test_user", "DEVICE_PASS": "test_password"}) + def test_csv_process_pass_connectivity_test_flag(self, mock_sync_devices_command_getter): + """Ensure the 'connectivity_test' option is passed to the command_getter when a CSV is in-play.""" + with open("nautobot_device_onboarding/tests/fixtures/all_required_fields.csv", "rb") as csv_file: + csv_contents = csv_file.read() + + job_form_inputs = { + "debug": True, + "connectivity_test": "AnyWackyValueHere", + "dryrun": False, + "csv_file": FileProxy.objects.create( + name="onboarding.csv", file=ContentFile(csv_contents, name="onboarding.csv") + ).id, + "location": None, + "namespace": None, + "ip_addresses": None, + "port": None, + "timeout": None, + "set_mgmt_only": None, + "update_devices_without_primary_ip": None, + "device_role": None, + "device_status": None, + "interface_status": None, + "ip_address_status": None, + "secrets_group": None, + "platform": None, + "memory_profiling": False, + } + + create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncDevices", **job_form_inputs + ) + self.assertEqual( + mock_sync_devices_command_getter.mock_calls[0].args, + ( + ANY, + 10, + { + "debug": True, + "connectivity_test": "AnyWackyValueHere", + "csv_file": {"172.23.0.8": {"port": 22, "timeout": 30, "secrets_group": ANY, "platform": ""}}, + }, + ), + ) + class SSOTSyncNetworkDataTestCase(TransactionTestCase): """Test SSOTSyncNetworkData class.""" From 97d1d5772b50b81ee62a19114a47f353cb914dc5 Mon Sep 17 00:00:00 2001 From: Michael Sheinberg Date: Tue, 11 Feb 2025 07:15:09 -0800 Subject: [PATCH 15/31] Expand tests to cover ssh logic (#315) * Expand tests to cover ssh logic --------- --- .github/workflows/ci.yml | 3 - changes/315.housekeeping | 1 + .../nornir_plays/formatter.py | 8 ++- .../tests/fakenos/custom_ios.yaml | 69 +++++++++++++++++++ nautobot_device_onboarding/tests/test_jobs.py | 59 ++++++++++++++++ poetry.lock | 37 +++++++++- pyproject.toml | 2 + 7 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 changes/315.housekeeping create mode 100644 nautobot_device_onboarding/tests/fakenos/custom_ios.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 135a19a5..30191f55 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -146,9 +146,6 @@ jobs: - python-version: "3.11" db-backend: "postgresql" nautobot-version: "2.2.3" - # - python-version: "3.12" - # db-backend: "mysql" - # nautobot-version: "stable" runs-on: "ubuntu-22.04" env: INVOKE_NAUTOBOT_DEVICE_ONBOARDING_PYTHON_VER: "${{ matrix.python-version }}" diff --git a/changes/315.housekeeping b/changes/315.housekeeping new file mode 100644 index 00000000..c369a8d7 --- /dev/null +++ b/changes/315.housekeeping @@ -0,0 +1 @@ +Added fake SSH devices to tests to increase coverage. diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index d62620e5..1752c567 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -4,6 +4,7 @@ import logging from json.decoder import JSONDecodeError +import jinja2 from django.template import engines from django.utils.module_loading import import_string from jdiff import extract_data_from_json @@ -106,7 +107,12 @@ def extract_and_post_process(parsed_command_output, yaml_command_element, j2_dat # j2 context data changes obj(hostname) -> extracted_value for post_processor j2_data_context["obj"] = extracted_value template = j2_env.from_string(yaml_command_element["post_processor"]) - extracted_processed = template.render(**j2_data_context) + try: + extracted_processed = template.render(**j2_data_context) + except jinja2.exceptions.UndefinedError: + raise ValueError( + f"Failure Jinja parsing, context: {j2_data_context}. processor: {yaml_command_element['post_processor']}" + ) else: extracted_processed = extracted_value post_processed_data = normalize_processed_data(extracted_processed, iter_type) diff --git a/nautobot_device_onboarding/tests/fakenos/custom_ios.yaml b/nautobot_device_onboarding/tests/fakenos/custom_ios.yaml new file mode 100644 index 00000000..c9b71ebc --- /dev/null +++ b/nautobot_device_onboarding/tests/fakenos/custom_ios.yaml @@ -0,0 +1,69 @@ +--- +name: "tweaked_cisco_ios" +initial_prompt: "{base_prompt}>" +enable_prompt: "{base_prompt}#" +config_prompt: "{base_prompt}(config)#" +commands: + enable: + output: "null" + new_prompt: "{base_prompt}#" + help: "enter enable mode" + prompt: "{base_prompt}>" + show interfaces: + output: + "TenGigabitEthernet1/1/15 is up, line protocol is down (disabled)\n Hardware\ + \ is Ten Gigabit Ethernet Port, address is 6c41.6aba.b44e (bia 6c41.6aba.b44e)\n\ + \ Internet address is 127.0.0.1/32\n MTU 1500 bytes, BW 10000000 Kbit/sec,\ + \ DLY 10 usec,\n reliability 255/255, txload 1/255, rxload 1/255\n Encapsulation\ + \ ARPA, loopback not set\n Keepalive set (10 sec)\n Full-duplex, Auto-speed,\ + \ link type is auto, media type is No XCVR\n input flow-control is off, output\ + \ flow-control is off\n ARP type: ARPA, ARP Timeout 04:00:00\n Last input\ + \ never, output never, output hang never\n Last clearing of \"show interface\"\ + \ counters never\n Input queue: 0/2000/0/0 (size/max/drops/flushes); Total\ + \ output drops: 0\n Queueing strategy: fifo\n Output queue: 0/40 (size/max)\n\ + \ 5 minute input rate 0 bits/sec, 0 packets/sec\n 5 minute output rate 0\ + \ bits/sec, 0 packets/sec\n 0 packets input, 0 bytes, 0 no buffer\n \ + \ Received 0 broadcasts (0 multicasts)\n 0 runts, 0 giants, 0 throttles\n\ + \ 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored\n 0 input packets\ + \ with dribble condition detected\n 0 packets output, 0 bytes, 0 underruns\n\ + \ 0 output errors, 0 collisions, 1 interface resets\n 0 unknown protocol\ + \ drops\n 0 babbles, 0 late collision, 0 deferred\n 0 lost carrier,\ + \ 0 no carrier\n 0 output buffer failures, 0 output buffers swapped out" + help: "execute the command 'show interfaces'" + prompt: + - "{base_prompt}>" + - "{base_prompt}#" + show version: + output: + "Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.8(3)M2,\ + \ RELEASE SOFTWARE (fc2)\nTechnical Support: http://www.cisco.com/techsupport\n\ + \ Copyright (c) 1986-2019 by Cisco Systems, Inc.\nCompiled Thu 28-Mar-19 14:06\ + \ by prod_rel_team\n\n\nROM: Bootstrap program is IOSv\n\nfake-ios-01 uptime is 1\ + \ week, 3 days, 16 hours, 11 minutes\nSystem returned to ROM by reload\nSystem\ + \ image file is \"flash0:/vios-adventerprisek9-m\"\nLast reload reason: Unknown\ + \ reason\n \n\n\nThis product contains cryptographic features and is subject\ + \ to United\n States and local country laws governing import, export, transfer\ + \ and\nuse. Delivery of Cisco cryptographic products does not imply\nthird-party\ + \ authority to import, export, distribute or use encryption.\nImporters, exporters,\ + \ distributors and users are responsible for\ncompliance with U.S. and local\ + \ country laws. By using this product you\nagree to comply with applicable laws\ + \ and regulations. If you are unable\nto comply with U.S. and local laws, return\ + \ this product immediately.\n \nA summary of U.S. laws governing Cisco cryptographic\ + \ products may be found at:\nhttp://www.cisco.com/wwl/export/crypto/tool/stqrg.html\n\ + \nIf you require further assistance please contact us by sending email to\n\ + export@cisco.com.\n \nCisco IOSv (revision 1.0) with with 460137K/62464K bytes\ + \ of memory.\nProcessor board ID 991UCMIHG4UAJ1J010CQG\n4 Gigabit Ethernet interfaces\n\ + DRAM configuration is 72 bits wide with parity disabled.\n256K bytes of non-volatile\ + \ configuration memory.\n2097152K bytes of ATA System CompactFlash 0 (Read/Write)\n\ + 0K bytes of ATA CompactFlash 1 (Read/Write)\n11217K bytes of ATA CompactFlash\ + \ 2 (Read/Write)\n 0K bytes of ATA CompactFlash 3 (Read/Write)\n\n\n\nConfiguration\ + \ register is 0x0" + help: "execute the command 'show version'" + prompt: + - "{base_prompt}>" + - "{base_prompt}#" + _default_: + output: "% Invalid input detected at '^' marker." + help: "Output to print for unknown commands" + terminal width 511: {"output":"", "help":"Set terminal width to 511"} + terminal length 0: {"output":"", "help":"Set terminal length to 0"} diff --git a/nautobot_device_onboarding/tests/test_jobs.py b/nautobot_device_onboarding/tests/test_jobs.py index 023fbc1e..b2fd19cb 100644 --- a/nautobot_device_onboarding/tests/test_jobs.py +++ b/nautobot_device_onboarding/tests/test_jobs.py @@ -1,13 +1,18 @@ """Test Jobs.""" +import os from unittest.mock import ANY, patch from django.core.files.base import ContentFile +from django.test import override_settings +from fakenos import FakeNOS +from fakenos.core.host import Host from nautobot.apps.testing import create_job_result_and_run_job from nautobot.core.testing import TransactionTestCase from nautobot.dcim.models import Device, Interface, Manufacturer, Platform from nautobot.extras.choices import JobResultStatusChoices from nautobot.extras.models import FileProxy +from nautobot.ipam.models import IPAddress from nautobot_device_onboarding import jobs from nautobot_device_onboarding.tests import utils @@ -174,6 +179,10 @@ class SSOTSyncNetworkDataTestCase(TransactionTestCase): databases = ("default", "job_logs") + @classmethod + def setUpClass(cls): + super().setUpClass() + def setUp(self): # pylint: disable=invalid-name """Initialize test case.""" # Setup Nautobot Objects @@ -236,3 +245,53 @@ def test_sync_network_data__success(self, device_data): if interface_data["vrf"]: self.assertEqual(interface.vrf.name, interface_data["vrf"]["name"]) + + @override_settings(CELERY_TASK_ALWAYS_EAGER=True) + @patch.dict("os.environ", {"DEVICE_USER": "admin", "DEVICE_PASS": "admin"}) + def test_sync_network_devices_with_full_ssh(self): + """Use the fakeNOS library to expand test coverage to cover SSH connectivity.""" + job_form_inputs = { + "debug": False, + "connectivity_test": False, + "dryrun": False, + "csv_file": None, + "location": self.testing_objects["location"].pk, + "namespace": self.testing_objects["namespace"].pk, + "ip_addresses": "127.0.0.1", + "port": 6222, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role"].pk, + "device_status": self.testing_objects["status"].pk, + "interface_status": self.testing_objects["status"].pk, + "ip_address_status": self.testing_objects["status"].pk, + "default_prefix_status": self.testing_objects["status"].pk, + "secrets_group": self.testing_objects["secrets_group"].pk, + "platform": self.testing_objects["platform_1"].pk, + "memory_profiling": False, + } + current_file_path = os.path.dirname(os.path.abspath(__file__)) + fake_ios_inventory = { + "hosts": { + "dev1": { + "username": "admin", + "password": "admin", + "platform": "tweaked_cisco_ios", + "port": 6222, + } + } + } + # This is hacky, theres clearly a bug in the fakenos library + # https://github.com/fakenos/fakenos/issues/19 + with patch.object(Host, "_check_if_platform_is_supported"): + with FakeNOS( + inventory=fake_ios_inventory, plugins=[os.path.join(current_file_path, "fakenos/custom_ios.yaml")] + ): + create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncDevices", **job_form_inputs + ) + + newly_imported_device = Device.objects.get(name="fake-ios-01") + self.assertEqual(str(IPAddress.objects.get(id=newly_imported_device.primary_ip4_id)), "127.0.0.1/32") + self.assertEqual(newly_imported_device.serial, "991UCMIHG4UAJ1J010CQG") diff --git a/poetry.lock b/poetry.lock index b02bcf1d..12dacbec 100644 --- a/poetry.lock +++ b/poetry.lock @@ -816,6 +816,16 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "detect" +version = "2020.12.3" +description = "detect OS and Python versions" +optional = false +python-versions = "*" +files = [ + {file = "detect-2020.12.3.tar.gz", hash = "sha256:eecd6c41c17072b4db8dbfa850d979bda40b33b4f349ab4378205bceb74d712e"}, +] + [[package]] name = "diffsync" version = "2.0.1" @@ -1353,6 +1363,30 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +[[package]] +name = "fakenos" +version = "1.1.0" +description = "Fake Network Operating System" +optional = false +python-versions = ">=3.8,<3.13" +files = [] +develop = false + +[package.dependencies] +detect = "2020.12.*" +paramiko = "<4.0" +pydantic = "<3.0" +pyyaml = "<7.0" + +[package.extras] +test = [] + +[package.source] +type = "git" +url = "https://github.com/fakenos/fakenos" +reference = "master" +resolved_reference = "b465bc28b478cf72582191ee77eb8e968864a0da" + [[package]] name = "future" version = "1.0.0" @@ -3092,7 +3126,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -4791,4 +4824,4 @@ all = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.13" -content-hash = "8a645ab31340a5d29395f4c3f60cdefd86914701fe3464c2ec32607294713ab7" +content-hash = "4c234809ca69ce7c409b94934bbc84377e8b93bff549d7b4ee92a7f22ce424a0" diff --git a/pyproject.toml b/pyproject.toml index f8a02996..73616547 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,8 @@ mkdocstrings = "0.25.2" mkdocstrings-python = "1.10.8" griffe = "1.1.1" towncrier = "~23.6.0" +# Used in integration tests +fakenos = { git = "https://github.com/fakenos/fakenos", branch = "master" } [tool.poetry.extras] all = [ From d873f78d440467a3a01a4e5e8147870a7c40b3c2 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 11 Feb 2025 10:40:56 -0500 Subject: [PATCH 16/31] Release 4.2.1 --- changes/306.fixed | 1 - changes/307.dependencies | 1 - changes/311.fixed | 1 - changes/313.fixed | 1 - changes/315.housekeeping | 1 - docs/admin/release_notes/version_4.2.md | 22 +- poetry.lock | 537 ++++++++++++------------ pyproject.toml | 2 +- 8 files changed, 298 insertions(+), 268 deletions(-) delete mode 100644 changes/306.fixed delete mode 100644 changes/307.dependencies delete mode 100644 changes/311.fixed delete mode 100644 changes/313.fixed delete mode 100644 changes/315.housekeeping diff --git a/changes/306.fixed b/changes/306.fixed deleted file mode 100644 index a1a7b17f..00000000 --- a/changes/306.fixed +++ /dev/null @@ -1 +0,0 @@ -Fixed error with logging message in SyncNetworkDataIPAddress.update() \ No newline at end of file diff --git a/changes/307.dependencies b/changes/307.dependencies deleted file mode 100644 index dceedf73..00000000 --- a/changes/307.dependencies +++ /dev/null @@ -1 +0,0 @@ -Updated ntc-templates to 7.x \ No newline at end of file diff --git a/changes/311.fixed b/changes/311.fixed deleted file mode 100644 index d459f9a8..00000000 --- a/changes/311.fixed +++ /dev/null @@ -1 +0,0 @@ -Fixed issue with Lags, VRFs and Untagged Vlans not being removed from interfaces \ No newline at end of file diff --git a/changes/313.fixed b/changes/313.fixed deleted file mode 100644 index 46303025..00000000 --- a/changes/313.fixed +++ /dev/null @@ -1 +0,0 @@ -Fixed issue running a sync job via CSV would raise an exception. diff --git a/changes/315.housekeeping b/changes/315.housekeeping deleted file mode 100644 index c369a8d7..00000000 --- a/changes/315.housekeeping +++ /dev/null @@ -1 +0,0 @@ -Added fake SSH devices to tests to increase coverage. diff --git a/docs/admin/release_notes/version_4.2.md b/docs/admin/release_notes/version_4.2.md index 692233fd..a94e3e98 100755 --- a/docs/admin/release_notes/version_4.2.md +++ b/docs/admin/release_notes/version_4.2.md @@ -7,8 +7,26 @@ Versioning](https://semver.org/spec/v2.0.0.html). ## Release Overview -- Major features or milestones -- Changes to compatibility with Nautobot and/or other apps, libraries etc. +- [#200](https://github.com/nautobot/nautobot-app-device-onboarding/issues/200) - Added basic connectivity checker using Netutils tcp_ping method. +- [#274](https://github.com/nautobot/nautobot-app-device-onboarding/issues/274) - Added TTP Parser support. +- [#274](https://github.com/nautobot/nautobot-app-device-onboarding/issues/274) - Added Sync Device from Network support for Palo Alto Panos. + +## [v4.2.1 (2025-02-11)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.1) + +### Fixed + +- [#306](https://github.com/nautobot/nautobot-app-device-onboarding/issues/306) - Fixed error with logging message in SyncNetworkDataIPAddress.update() +- [#311](https://github.com/nautobot/nautobot-app-device-onboarding/issues/311) - Fixed issue with Lags, VRFs and Untagged Vlans not being removed from interfaces +- [#313](https://github.com/nautobot/nautobot-app-device-onboarding/issues/313) - Fixed issue running a sync job via CSV would raise an exception. + +### Dependencies + +- [#307](https://github.com/nautobot/nautobot-app-device-onboarding/issues/307) - Updated ntc-templates to 7.x + +### Housekeeping + +- [#315](https://github.com/nautobot/nautobot-app-device-onboarding/issues/315) - Added fake SSH devices to tests to increase coverage. + ## [v4.2.0 (2025-01-17)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.0) diff --git a/poetry.lock b/poetry.lock index 12dacbec..5e8f2d86 100644 --- a/poetry.lock +++ b/poetry.lock @@ -151,13 +151,13 @@ files = [ [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] @@ -185,20 +185,20 @@ tomli = {version = "*", markers = "python_version < \"3.11\""} [[package]] name = "babel" -version = "2.16.0" +version = "2.17.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, - {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] [[package]] name = "backcall" @@ -349,13 +349,13 @@ zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] @@ -864,13 +864,13 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "4.2.17" +version = "4.2.19" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.8" files = [ - {file = "Django-4.2.17-py3-none-any.whl", hash = "sha256:3a93350214ba25f178d4045c0786c61573e7dbfa3c509b3551374f1e11ba8de0"}, - {file = "Django-4.2.17.tar.gz", hash = "sha256:6b56d834cc94c8b21a8f4e775064896be3b4a4ca387f2612d4406a5927cd2fdc"}, + {file = "Django-4.2.19-py3-none-any.whl", hash = "sha256:a104e13f219fc55996a4e416ef7d18ab4eeb44e0aa95174c192f16cda9f94e75"}, + {file = "Django-4.2.19.tar.gz", hash = "sha256:6c833be4b0ca614f0a919472a1028a3bbdeb6f056fa04023aeb923346ba2c306"}, ] [package.dependencies] @@ -1306,13 +1306,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2024.12.1" +version = "2025.2.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf_spectacular_sidecar-2024.12.1-py3-none-any.whl", hash = "sha256:e30821d150d29294f3be2018aab31b55cd724158e9e690b51a215264751aa8c7"}, - {file = "drf_spectacular_sidecar-2024.12.1.tar.gz", hash = "sha256:6be31df38bcf95681224b6550faa9344ee6dd5360dcf2b44afcc3f7460385613"}, + {file = "drf_spectacular_sidecar-2025.2.1-py3-none-any.whl", hash = "sha256:674e1336810c7cf117442300b5c213c4fee1e984ba48689502c947a6ecd25d0c"}, + {file = "drf_spectacular_sidecar-2025.2.1.tar.gz", hash = "sha256:ca9507c5fe708680d6b8eda96928f3cf3ffc07e8d67678778bcd2e80f9f2baae"}, ] [package.dependencies] @@ -1351,13 +1351,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.1.0" +version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" files = [ - {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, - {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, + {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, + {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] @@ -1975,157 +1975,157 @@ files = [ [[package]] name = "lxml" -version = "5.3.0" +version = "5.3.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" 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"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, - {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, - {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, - {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, - {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, - {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, - {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, - {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, - {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, - {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, - {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, - {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, - {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, - {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, - {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, - {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, - {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, - {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, - {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, - {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, - {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, - {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, - {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, - {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, - {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, - {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, - {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, - {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, - {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, - {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, - {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, - {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, - {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, - {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, - {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, - {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, - {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, - {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, - {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, - {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, - {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, - {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, - {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, - {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, - {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, - {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, - {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, - {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, - {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, - {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, - {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, + {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, + {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:528f3a0498a8edc69af0559bdcf8a9f5a8bf7c00051a6ef3141fdcf27017bbf5"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4743e30d6f5f92b6d2b7c86b3ad250e0bad8dee4b7ad8a0c44bfb276af89a3"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17b5d7f8acf809465086d498d62a981fa6a56d2718135bb0e4aa48c502055f5c"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:928e75a7200a4c09e6efc7482a1337919cc61fe1ba289f297827a5b76d8969c2"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a997b784a639e05b9d4053ef3b20c7e447ea80814a762f25b8ed5a89d261eac"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7b82e67c5feb682dbb559c3e6b78355f234943053af61606af126df2183b9ef9"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:f1de541a9893cf8a1b1db9bf0bf670a2decab42e3e82233d36a74eda7822b4c9"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:de1fc314c3ad6bc2f6bd5b5a5b9357b8c6896333d27fdbb7049aea8bd5af2d79"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7c0536bd9178f754b277a3e53f90f9c9454a3bd108b1531ffff720e082d824f2"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68018c4c67d7e89951a91fbd371e2e34cd8cfc71f0bb43b5332db38497025d51"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa826340a609d0c954ba52fd831f0fba2a4165659ab0ee1a15e4aac21f302406"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:796520afa499732191e39fc95b56a3b07f95256f2d22b1c26e217fb69a9db5b5"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3effe081b3135237da6e4c4530ff2a868d3f80be0bda027e118a5971285d42d0"}, + {file = "lxml-5.3.1-cp310-cp310-win32.whl", hash = "sha256:a22f66270bd6d0804b02cd49dae2b33d4341015545d17f8426f2c4e22f557a23"}, + {file = "lxml-5.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:0bcfadea3cdc68e678d2b20cb16a16716887dd00a881e16f7d806c2138b8ff0c"}, + {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e220f7b3e8656ab063d2eb0cd536fafef396829cafe04cb314e734f87649058f"}, + {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f2cfae0688fd01f7056a17367e3b84f37c545fb447d7282cf2c242b16262607"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67d2f8ad9dcc3a9e826bdc7802ed541a44e124c29b7d95a679eeb58c1c14ade8"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db0c742aad702fd5d0c6611a73f9602f20aec2007c102630c06d7633d9c8f09a"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:198bb4b4dd888e8390afa4f170d4fa28467a7eaf857f1952589f16cfbb67af27"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2a3e412ce1849be34b45922bfef03df32d1410a06d1cdeb793a343c2f1fd666"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8969dbc8d09d9cd2ae06362c3bad27d03f433252601ef658a49bd9f2b22d79"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5be8f5e4044146a69c96077c7e08f0709c13a314aa5315981185c1f00235fe65"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:133f3493253a00db2c870d3740bc458ebb7d937bd0a6a4f9328373e0db305709"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:52d82b0d436edd6a1d22d94a344b9a58abd6c68c357ed44f22d4ba8179b37629"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b6f92e35e2658a5ed51c6634ceb5ddae32053182851d8cad2a5bc102a359b33"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:203b1d3eaebd34277be06a3eb880050f18a4e4d60861efba4fb946e31071a295"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:155e1a5693cf4b55af652f5c0f78ef36596c7f680ff3ec6eb4d7d85367259b2c"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22ec2b3c191f43ed21f9545e9df94c37c6b49a5af0a874008ddc9132d49a2d9c"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7eda194dd46e40ec745bf76795a7cccb02a6a41f445ad49d3cf66518b0bd9cff"}, + {file = "lxml-5.3.1-cp311-cp311-win32.whl", hash = "sha256:fb7c61d4be18e930f75948705e9718618862e6fc2ed0d7159b2262be73f167a2"}, + {file = "lxml-5.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c809eef167bf4a57af4b03007004896f5c60bd38dc3852fcd97a26eae3d4c9e6"}, + {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e69add9b6b7b08c60d7ff0152c7c9a6c45b4a71a919be5abde6f98f1ea16421c"}, + {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e52e1b148867b01c05e21837586ee307a01e793b94072d7c7b91d2c2da02ffe"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4b382e0e636ed54cd278791d93fe2c4f370772743f02bcbe431a160089025c9"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e49dc23a10a1296b04ca9db200c44d3eb32c8d8ec532e8c1fd24792276522a"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4399b4226c4785575fb20998dc571bc48125dc92c367ce2602d0d70e0c455eb0"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5412500e0dc5481b1ee9cf6b38bb3b473f6e411eb62b83dc9b62699c3b7b79f7"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c93ed3c998ea8472be98fb55aed65b5198740bfceaec07b2eba551e55b7b9ae"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:63d57fc94eb0bbb4735e45517afc21ef262991d8758a8f2f05dd6e4174944519"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:b450d7cabcd49aa7ab46a3c6aa3ac7e1593600a1a0605ba536ec0f1b99a04322"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:4df0ec814b50275ad6a99bc82a38b59f90e10e47714ac9871e1b223895825468"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d184f85ad2bb1f261eac55cddfcf62a70dee89982c978e92b9a74a1bfef2e367"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b725e70d15906d24615201e650d5b0388b08a5187a55f119f25874d0103f90dd"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a31fa7536ec1fb7155a0cd3a4e3d956c835ad0a43e3610ca32384d01f079ea1c"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c3c8b55c7fc7b7e8877b9366568cc73d68b82da7fe33d8b98527b73857a225f"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d61ec60945d694df806a9aec88e8f29a27293c6e424f8ff91c80416e3c617645"}, + {file = "lxml-5.3.1-cp312-cp312-win32.whl", hash = "sha256:f4eac0584cdc3285ef2e74eee1513a6001681fd9753b259e8159421ed28a72e5"}, + {file = "lxml-5.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:29bfc8d3d88e56ea0a27e7c4897b642706840247f59f4377d81be8f32aa0cfbf"}, + {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c093c7088b40d8266f57ed71d93112bd64c6724d31f0794c1e52cc4857c28e0e"}, + {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0884e3f22d87c30694e625b1e62e6f30d39782c806287450d9dc2fdf07692fd"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1637fa31ec682cd5760092adfabe86d9b718a75d43e65e211d5931809bc111e7"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a364e8e944d92dcbf33b6b494d4e0fb3499dcc3bd9485beb701aa4b4201fa414"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:779e851fd0e19795ccc8a9bb4d705d6baa0ef475329fe44a13cf1e962f18ff1e"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4393600915c308e546dc7003d74371744234e8444a28622d76fe19b98fa59d1"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:673b9d8e780f455091200bba8534d5f4f465944cbdd61f31dc832d70e29064a5"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2e4a570f6a99e96c457f7bec5ad459c9c420ee80b99eb04cbfcfe3fc18ec6423"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:71f31eda4e370f46af42fc9f264fafa1b09f46ba07bdbee98f25689a04b81c20"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:42978a68d3825eaac55399eb37a4d52012a205c0c6262199b8b44fcc6fd686e8"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8b1942b3e4ed9ed551ed3083a2e6e0772de1e5e3aca872d955e2e86385fb7ff9"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85c4f11be9cf08917ac2a5a8b6e1ef63b2f8e3799cec194417e76826e5f1de9c"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:231cf4d140b22a923b1d0a0a4e0b4f972e5893efcdec188934cc65888fd0227b"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5865b270b420eda7b68928d70bb517ccbe045e53b1a428129bb44372bf3d7dd5"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7bebc2275016cddf3c997bf8a0f7044160714c64a9b83975670a04e6d2252"}, + {file = "lxml-5.3.1-cp313-cp313-win32.whl", hash = "sha256:d0751528b97d2b19a388b302be2a0ee05817097bab46ff0ed76feeec24951f78"}, + {file = "lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332"}, + {file = "lxml-5.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:016b96c58e9a4528219bb563acf1aaaa8bc5452e7651004894a973f03b84ba81"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82a4bb10b0beef1434fb23a09f001ab5ca87895596b4581fd53f1e5145a8934a"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d68eeef7b4d08a25e51897dac29bcb62aba830e9ac6c4e3297ee7c6a0cf6439"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:f12582b8d3b4c6be1d298c49cb7ae64a3a73efaf4c2ab4e37db182e3545815ac"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2df7ed5edeb6bd5590914cd61df76eb6cce9d590ed04ec7c183cf5509f73530d"}, + {file = "lxml-5.3.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:585c4dc429deebc4307187d2b71ebe914843185ae16a4d582ee030e6cfbb4d8a"}, + {file = "lxml-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:06a20d607a86fccab2fc15a77aa445f2bdef7b49ec0520a842c5c5afd8381576"}, + {file = "lxml-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:057e30d0012439bc54ca427a83d458752ccda725c1c161cc283db07bcad43cf9"}, + {file = "lxml-5.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4867361c049761a56bd21de507cab2c2a608c55102311d142ade7dab67b34f32"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dddf0fb832486cc1ea71d189cb92eb887826e8deebe128884e15020bb6e3f61"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bcc211542f7af6f2dfb705f5f8b74e865592778e6cafdfd19c792c244ccce19"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaca5a812f050ab55426c32177091130b1e49329b3f002a32934cd0245571307"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:236610b77589faf462337b3305a1be91756c8abc5a45ff7ca8f245a71c5dab70"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:aed57b541b589fa05ac248f4cb1c46cbb432ab82cbd467d1c4f6a2bdc18aecf9"}, + {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:75fa3d6946d317ffc7016a6fcc44f42db6d514b7fdb8b4b28cbe058303cb6e53"}, + {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:96eef5b9f336f623ffc555ab47a775495e7e8846dde88de5f941e2906453a1ce"}, + {file = "lxml-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:ef45f31aec9be01379fc6c10f1d9c677f032f2bac9383c827d44f620e8a88407"}, + {file = "lxml-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0611da6b07dd3720f492db1b463a4d1175b096b49438761cc9f35f0d9eaaef5"}, + {file = "lxml-5.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2aca14c235c7a08558fe0a4786a1a05873a01e86b474dfa8f6df49101853a4e"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82fce1d964f065c32c9517309f0c7be588772352d2f40b1574a214bd6e6098"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7aae7a3d63b935babfdc6864b31196afd5145878ddd22f5200729006366bc4d5"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8e0d177b1fe251c3b1b914ab64135475c5273c8cfd2857964b2e3bb0fe196a7"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:6c4dd3bfd0c82400060896717dd261137398edb7e524527438c54a8c34f736bf"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f1208c1c67ec9e151d78aa3435aa9b08a488b53d9cfac9b699f15255a3461ef2"}, + {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c6aacf00d05b38a5069826e50ae72751cb5bc27bdc4d5746203988e429b385bb"}, + {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5881aaa4bf3a2d086c5f20371d3a5856199a0d8ac72dd8d0dbd7a2ecfc26ab73"}, + {file = "lxml-5.3.1-cp38-cp38-win32.whl", hash = "sha256:45fbb70ccbc8683f2fb58bea89498a7274af1d9ec7995e9f4af5604e028233fc"}, + {file = "lxml-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:7512b4d0fc5339d5abbb14d1843f70499cab90d0b864f790e73f780f041615d7"}, + {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5885bc586f1edb48e5d68e7a4b4757b5feb2a496b64f462b4d65950f5af3364f"}, + {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1b92fe86e04f680b848fff594a908edfa72b31bfc3499ef7433790c11d4c8cd8"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a091026c3bf7519ab1e64655a3f52a59ad4a4e019a6f830c24d6430695b1cf6a"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ffb141361108e864ab5f1813f66e4e1164181227f9b1f105b042729b6c15125"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3715cdf0dd31b836433af9ee9197af10e3df41d273c19bb249230043667a5dfd"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88b72eb7222d918c967202024812c2bfb4048deeb69ca328363fb8e15254c549"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa59974880ab5ad8ef3afaa26f9bda148c5f39e06b11a8ada4660ecc9fb2feb3"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3bb8149840daf2c3f97cebf00e4ed4a65a0baff888bf2605a8d0135ff5cf764e"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:0d6b2fa86becfa81f0a0271ccb9eb127ad45fb597733a77b92e8a35e53414914"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:136bf638d92848a939fd8f0e06fcf92d9f2e4b57969d94faae27c55f3d85c05b"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:89934f9f791566e54c1d92cdc8f8fd0009447a5ecdb1ec6b810d5f8c4955f6be"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8ade0363f776f87f982572c2860cc43c65ace208db49c76df0a21dde4ddd16e"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfbbab9316330cf81656fed435311386610f78b6c93cc5db4bebbce8dd146675"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:172d65f7c72a35a6879217bcdb4bb11bc88d55fb4879e7569f55616062d387c2"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3c623923967f3e5961d272718655946e5322b8d058e094764180cdee7bab1af"}, + {file = "lxml-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ce0930a963ff593e8bb6fda49a503911accc67dee7e5445eec972668e672a0f0"}, + {file = "lxml-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f7b64fcd670bca8800bc10ced36620c6bbb321e7bc1214b9c0c0df269c1dddc2"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:afa578b6524ff85fb365f454cf61683771d0170470c48ad9d170c48075f86725"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f5e80adf0aafc7b5454f2c1cb0cde920c9b1f2cbd0485f07cc1d0497c35c5d"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd0b80ac2d8f13ffc906123a6f20b459cb50a99222d0da492360512f3e50f84"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:422c179022ecdedbe58b0e242607198580804253da220e9454ffe848daa1cfd2"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:524ccfded8989a6595dbdda80d779fb977dbc9a7bc458864fc9a0c2fc15dc877"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:48fd46bf7155def2e15287c6f2b133a2f78e2d22cdf55647269977b873c65499"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:05123fad495a429f123307ac6d8fd6f977b71e9a0b6d9aeeb8f80c017cb17131"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a243132767150a44e6a93cd1dde41010036e1cbc63cc3e9fe1712b277d926ce3"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c92ea6d9dd84a750b2bae72ff5e8cf5fdd13e58dda79c33e057862c29a8d5b50"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2f1be45d4c15f237209bbf123a0e05b5d630c8717c42f59f31ea9eae2ad89394"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a83d3adea1e0ee36dac34627f78ddd7f093bb9cfc0a8e97f1572a949b695cb98"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3edbb9c9130bac05d8c3fe150c51c337a471cc7fdb6d2a0a7d3a88e88a829314"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2f23cf50eccb3255b6e913188291af0150d89dab44137a69e14e4dcb7be981f1"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7e5edac4778127f2bf452e0721a58a1cfa4d1d9eac63bdd650535eb8543615"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:094b28ed8a8a072b9e9e2113a81fda668d2053f2ca9f2d202c2c8c7c2d6516b1"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:514fe78fc4b87e7a7601c92492210b20a1b0c6ab20e71e81307d9c2e377c64de"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8fffc08de02071c37865a155e5ea5fce0282e1546fd5bde7f6149fcaa32558ac"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4b0d5cdba1b655d5b18042ac9c9ff50bda33568eb80feaaca4fc237b9c4fbfde"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3031e4c16b59424e8d78522c69b062d301d951dc55ad8685736c3335a97fc270"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb659702a45136c743bc130760c6f137870d4df3a9e14386478b8a0511abcfca"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a11b16a33656ffc43c92a5343a28dc71eefe460bcc2a4923a96f292692709f6"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c5ae125276f254b01daa73e2c103363d3e99e3e10505686ac7d9d2442dd4627a"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76722b5ed4a31ba103e0dc77ab869222ec36efe1a614e42e9bcea88a36186fe"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:33e06717c00c788ab4e79bc4726ecc50c54b9bfb55355eae21473c145d83c2d2"}, + {file = "lxml-5.3.1.tar.gz", hash = "sha256:106b7b5d2977b339f1e97efe2778e2ab20e99994cbb0ec5e55771ed0795920c8"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] -html-clean = ["lxml-html-clean"] +html-clean = ["lxml_html_clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.11)"] +source = ["Cython (>=3.0.11,<3.1.0)"] [[package]] name = "markdown" @@ -2541,13 +2541,13 @@ nornir-nautobot = ">=3.0.0,<4.0.0" [[package]] name = "nautobot-ssot" -version = "3.4.0" +version = "3.5.0" description = "Nautobot Single Source of Truth" optional = false python-versions = "<3.13,>=3.8" files = [ - {file = "nautobot_ssot-3.4.0-py3-none-any.whl", hash = "sha256:df33ca0004ca31fa7acb786691c520e4586c7d98abeb7e133ab2b0f78946fc7d"}, - {file = "nautobot_ssot-3.4.0.tar.gz", hash = "sha256:5d45f5d5060e7425bcb3271a3397070d73f5208ef51ceb2074adc98ad32afbcf"}, + {file = "nautobot_ssot-3.5.0-py3-none-any.whl", hash = "sha256:a20801c4e04bc65268de7e95f746a66d0c1739d85237658aa7c3fa628478d3a6"}, + {file = "nautobot_ssot-3.5.0.tar.gz", hash = "sha256:a5f26df1730863c78996ab4a8c7ba97ebf85d5121717b659690bb27312841405"}, ] [package.dependencies] @@ -2560,7 +2560,7 @@ retry = ">=0.9.2,<0.10.0" [package.extras] aci = ["PyYAML (>=6)"] -all = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)", "dnacentersdk (>=2.5.6,<3.0.0)", "dnspython (>=2.1.0,<3.0.0)", "ijson (>=2.5.1)", "ipfabric (>=6.0.0,<7.0.0)", "meraki (>=1.37.2,<1.46.0)", "nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)", "netutils (>=1.9.0,<2.0.0)", "oauthlib (>=3.1.0)", "orionsdk (>=0.4.0,<0.5.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)", "slurpit-sdk (>=0.9.58,<0.10.0)", "urllib3 (>=2.2.3)"] +all = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)", "dnacentersdk (>=2.5.6,<3.0.0)", "dnspython (>=2.1.0,<3.0.0)", "ijson (>=2.5.1)", "ipfabric (>=6.0.0,<7.0.0)", "meraki (>=1.37.2,<1.46.0)", "nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)", "netutils (>=1.9.0,<2.0.0)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)", "slurpit-sdk (>=0.9.58,<0.10.0)", "urllib3 (>=2.2.3)"] aristacv = ["cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)"] bootstrap = ["pytz (>=2019.3)"] citrix-adm = ["netutils (>=1.9.0,<2.0.0)", "requests (>=2.21.0)", "urllib3 (>=2.2.3)"] @@ -2573,7 +2573,6 @@ nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0. pysnow = ["ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] servicenow = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] slurpit = ["slurpit-sdk (>=0.9.58,<0.10.0)"] -solarwinds = ["orionsdk (>=0.4.0,<0.5.0)"] [[package]] name = "ncclient" @@ -2628,17 +2627,17 @@ textfsm = ">=1.1.3" [[package]] name = "netutils" -version = "1.11.0" +version = "1.12.0" description = "Common helper functions useful in network automation." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "netutils-1.11.0-py3-none-any.whl", hash = "sha256:863674eb7dce2b85972d52079b4884fb30e498ccf1dd581abc28b4d69bfdf0cd"}, - {file = "netutils-1.11.0.tar.gz", hash = "sha256:1631152256db1623675d9087d4327b2f4633d294f758518742a974e868a50ae8"}, + {file = "netutils-1.12.0-py3-none-any.whl", hash = "sha256:7cb37796ce86637814f8c899f64db2b054986b0eda719d3fcadc293d451a4db1"}, + {file = "netutils-1.12.0.tar.gz", hash = "sha256:96a790d11921063a6a64ee79c6e8c5a5ffcd05cbee07dd2b614d98c4416cffdd"}, ] [package.extras] -optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] +optionals = ["jsonschema (>=4.17.3,<5.0.0)", "legacycrypt (==0.3)", "napalm (>=4.0.0,<5.0.0)"] [[package]] name = "nh3" @@ -2775,13 +2774,13 @@ nornir = ">=3,<4" [[package]] name = "ntc-templates" -version = "7.6.0" +version = "7.7.0" description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "ntc_templates-7.6.0-py3-none-any.whl", hash = "sha256:6e855a443cd9ad28192bc766994cbfef58bcaae3ebaf19005a55c6f76e9ab6b5"}, - {file = "ntc_templates-7.6.0.tar.gz", hash = "sha256:b70ccaaf74014344a8446f13744691cfbf2e603101481c71decc8ee53eefea5d"}, + {file = "ntc_templates-7.7.0-py3-none-any.whl", hash = "sha256:314850358394f4edbc3170ce9d3b69f51c2877c67cd9c4c8fe21227cb81f8ab1"}, + {file = "ntc_templates-7.7.0.tar.gz", hash = "sha256:c7b9c2f8306ff6ff1133b5a1614f9627b520bc27c3c514c4e95bf27e221f2a2d"}, ] [package.dependencies] @@ -2845,13 +2844,13 @@ lint = ["black"] [[package]] name = "paramiko" -version = "3.5.0" +version = "3.5.1" description = "SSH2 protocol library" optional = false python-versions = ">=3.6" files = [ - {file = "paramiko-3.5.0-py3-none-any.whl", hash = "sha256:1fedf06b085359051cd7d0d270cebe19e755a8a921cc2ddbfa647fb0cd7d68f9"}, - {file = "paramiko-3.5.0.tar.gz", hash = "sha256:ad11e540da4f55cedda52931f1a3f812a8238a7af7f62a60de538cd80bb28124"}, + {file = "paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61"}, + {file = "paramiko-3.5.1.tar.gz", hash = "sha256:b2c665bc45b2b215bd7d7f039901b14b067da00f3a11e6640995fd58f2664822"}, ] [package.dependencies] @@ -3060,13 +3059,13 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", [[package]] name = "prompt-toolkit" -version = "3.0.48" +version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, - {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, + {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, + {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, ] [package.dependencies] @@ -3126,6 +3125,7 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -3208,13 +3208,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.5" +version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, - {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] [package.dependencies] @@ -3466,13 +3466,13 @@ pylint = ">=1.7" [[package]] name = "pymdown-extensions" -version = "10.14" +version = "10.14.3" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.14-py3-none-any.whl", hash = "sha256:202481f716cc8250e4be8fce997781ebf7917701b59652458ee47f2401f818b5"}, - {file = "pymdown_extensions-10.14.tar.gz", hash = "sha256:741bd7c4ff961ba40b7528d32284c53bc436b8b1645e8e37c3e57770b8700a34"}, + {file = "pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9"}, + {file = "pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b"}, ] [package.dependencies] @@ -3635,13 +3635,13 @@ postgresql = ["psycopg2"] [[package]] name = "pytz" -version = "2024.2" +version = "2025.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, - {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, + {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, + {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, ] [[package]] @@ -4359,15 +4359,18 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "structlog" -version = "24.4.0" +version = "25.1.0" description = "Structured Logging for Python" optional = false python-versions = ">=3.8" files = [ - {file = "structlog-24.4.0-py3-none-any.whl", hash = "sha256:597f61e80a91cc0749a9fd2a098ed76715a1c8a01f73e336b746504d1aad7610"}, - {file = "structlog-24.4.0.tar.gz", hash = "sha256:b27bfecede327a6d2da5fbc96bd859f114ecc398a6389d664f62085ee7ae6fc4"}, + {file = "structlog-25.1.0-py3-none-any.whl", hash = "sha256:843fe4f254540329f380812cbe612e1af5ec5b8172205ae634679cd35a6d6321"}, + {file = "structlog-25.1.0.tar.gz", hash = "sha256:2ef2a572e0e27f09664965d31a576afe64e46ac6084ef5cec3c2b8cd6e4e3ad3"}, ] +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} + [package.extras] dev = ["freezegun (>=0.2.8)", "mypy (>=1.4)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "rich", "simplejson", "twisted"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "sphinxext-opengraph", "twisted"] @@ -4574,13 +4577,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.2" +version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, - {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, ] [[package]] @@ -4695,76 +4698,90 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "wrapt" -version = "1.17.0" +version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" 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"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, - {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, - {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, - {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, - {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, - {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, - {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, - {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, - {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, - {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, - {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, - {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, - {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, - {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, - {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, - {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, - {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, - {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, - {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, - {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, - {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, - {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, - {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 73616547..f7b53426 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.2.1a0" +version = "4.2.1" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" From e4cfde7a0d515c839e9149f943506fa5760feea7 Mon Sep 17 00:00:00 2001 From: Gary Snider <75227981+gsnider2195@users.noreply.github.com> Date: Tue, 18 Feb 2025 15:32:22 -0800 Subject: [PATCH 17/31] Fixed app startup crashing nautobot during startup in some cases. (#321) --- changes/320.fixed | 1 + nautobot_device_onboarding/constants.py | 4 ---- nautobot_device_onboarding/nornir_plays/command_getter.py | 6 +++--- nautobot_device_onboarding/nornir_plays/empty_inventory.py | 4 ++-- 4 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 changes/320.fixed diff --git a/changes/320.fixed b/changes/320.fixed new file mode 100644 index 00000000..3ba7de8b --- /dev/null +++ b/changes/320.fixed @@ -0,0 +1 @@ +Fixed app startup crashing nautobot during startup in some cases. diff --git a/nautobot_device_onboarding/constants.py b/nautobot_device_onboarding/constants.py index 3b8e70ad..ffc8b209 100644 --- a/nautobot_device_onboarding/constants.py +++ b/nautobot_device_onboarding/constants.py @@ -1,7 +1,6 @@ """Constants for nautobot_device_onboarding app.""" from django.conf import settings -from nautobot.dcim.utils import get_all_network_driver_mappings NETMIKO_EXTRAS = ( settings.PLUGINS_CONFIG.get("nautobot_plugin_nornir", {}) @@ -23,9 +22,6 @@ } -# This is used in the new SSoT based jobs. -SUPPORTED_NETWORK_DRIVERS = list(get_all_network_driver_mappings().keys()) - # This is used in the new SSoT based jobs. Soon PYATS should be supported. SUPPORTED_COMMAND_PARSERS = ["textfsm", "ttp"] diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index fc2e0fb4..eff29225 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -20,7 +20,7 @@ from ntc_templates.parse import parse_output from ttp import ttp -from nautobot_device_onboarding.constants import SUPPORTED_COMMAND_PARSERS, SUPPORTED_NETWORK_DRIVERS +from nautobot_device_onboarding.constants import SUPPORTED_COMMAND_PARSERS from nautobot_device_onboarding.nornir_plays.empty_inventory import EmptyInventory from nautobot_device_onboarding.nornir_plays.inventory_creator import _set_inventory from nautobot_device_onboarding.nornir_plays.logger import NornirLogger @@ -112,7 +112,7 @@ def netmiko_send_commands( """Run commands specified in PLATFORM_COMMAND_MAP.""" if not task.host.platform: return Result(host=task.host, result=f"{task.host.name} has no platform set.", failed=True) - if task.host.platform not in SUPPORTED_NETWORK_DRIVERS or not "cisco_wlc_ssh": + if task.host.platform not in get_all_network_driver_mappings().keys() or not "cisco_wlc_ssh": return Result(host=task.host, result=f"{task.host.name} has a unsupported platform set.", failed=True) if not command_getter_yaml_data[task.host.platform].get(command_getter_job): return Result( @@ -354,7 +354,7 @@ def sync_network_data_command_getter(job_result, log_level, kwargs): "queryset": qs, "defaults": { "platform_parsing_info": add_platform_parsing_info(), - "network_driver_mappings": SUPPORTED_NETWORK_DRIVERS, + "network_driver_mappings": list(get_all_network_driver_mappings().keys()), "sync_vlans": kwargs["sync_vlans"], "sync_vrfs": kwargs["sync_vrfs"], "sync_cables": kwargs["sync_cables"], diff --git a/nautobot_device_onboarding/nornir_plays/empty_inventory.py b/nautobot_device_onboarding/nornir_plays/empty_inventory.py index 701a4afc..c8038529 100755 --- a/nautobot_device_onboarding/nornir_plays/empty_inventory.py +++ b/nautobot_device_onboarding/nornir_plays/empty_inventory.py @@ -1,8 +1,8 @@ """Empty Nornir Inventory Plugin.""" +from nautobot.dcim.utils import get_all_network_driver_mappings from nornir.core.inventory import Defaults, Groups, Hosts, Inventory -from nautobot_device_onboarding.constants import SUPPORTED_NETWORK_DRIVERS from nautobot_device_onboarding.nornir_plays.transform import add_platform_parsing_info @@ -15,7 +15,7 @@ def load(self) -> Inventory: defaults = Defaults( data={ "platform_parsing_info": add_platform_parsing_info(), - "network_driver_mappings": SUPPORTED_NETWORK_DRIVERS, + "network_driver_mappings": list(get_all_network_driver_mappings().keys()), } ) groups = Groups() From 4bec6d45d83558009f1015b806bc915987f7705c Mon Sep 17 00:00:00 2001 From: Stephen Kiely Date: Wed, 19 Feb 2025 12:22:12 -0600 Subject: [PATCH 18/31] Release 4.2.2 --- changes/320.fixed | 1 - docs/admin/release_notes/version_4.2.md | 6 ++++++ poetry.lock | 3 +-- pyproject.toml | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 changes/320.fixed diff --git a/changes/320.fixed b/changes/320.fixed deleted file mode 100644 index 3ba7de8b..00000000 --- a/changes/320.fixed +++ /dev/null @@ -1 +0,0 @@ -Fixed app startup crashing nautobot during startup in some cases. diff --git a/docs/admin/release_notes/version_4.2.md b/docs/admin/release_notes/version_4.2.md index a94e3e98..67ac3589 100755 --- a/docs/admin/release_notes/version_4.2.md +++ b/docs/admin/release_notes/version_4.2.md @@ -11,6 +11,12 @@ Versioning](https://semver.org/spec/v2.0.0.html). - [#274](https://github.com/nautobot/nautobot-app-device-onboarding/issues/274) - Added TTP Parser support. - [#274](https://github.com/nautobot/nautobot-app-device-onboarding/issues/274) - Added Sync Device from Network support for Palo Alto Panos. +## [v4.2.2 (2025-02-19)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.2) + +### Fixed + +- [#320](https://github.com/nautobot/nautobot-app-device-onboarding/issues/320) - Fixed app startup crashing nautobot during startup in some cases. + ## [v4.2.1 (2025-02-11)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.1) ### Fixed diff --git a/poetry.lock b/poetry.lock index 5e8f2d86..b44b63d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "amqp" @@ -3125,7 +3125,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, diff --git a/pyproject.toml b/pyproject.toml index f7b53426..3438e568 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.2.1" +version = "4.2.2" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" From ee5d077c851a7801db8f43bd57703ad829ac35d4 Mon Sep 17 00:00:00 2001 From: Stephen Kiely Date: Wed, 19 Feb 2025 12:27:38 -0600 Subject: [PATCH 19/31] Update docs/admin/release_notes/version_4.2.md Co-authored-by: Glenn Matthews --- docs/admin/release_notes/version_4.2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/release_notes/version_4.2.md b/docs/admin/release_notes/version_4.2.md index 67ac3589..6a1a5af4 100755 --- a/docs/admin/release_notes/version_4.2.md +++ b/docs/admin/release_notes/version_4.2.md @@ -15,7 +15,7 @@ Versioning](https://semver.org/spec/v2.0.0.html). ### Fixed -- [#320](https://github.com/nautobot/nautobot-app-device-onboarding/issues/320) - Fixed app startup crashing nautobot during startup in some cases. +- [#320](https://github.com/nautobot/nautobot-app-device-onboarding/issues/320) - Fixed app startup crashing Nautobot during startup in some cases. ## [v4.2.1 (2025-02-11)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.1) From 5afec57d4b1546f06db2b5150bcf65e8428a3fa7 Mon Sep 17 00:00:00 2001 From: Stephen Kiely Date: Wed, 19 Feb 2025 14:14:52 -0600 Subject: [PATCH 20/31] Prepatch version After 4.2.2 release --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3438e568..7ed49ef7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.2.2" +version = "4.2.3a0" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" From 4b51cea7f81c3a2fd0b481b3a4e892aefd7d0073 Mon Sep 17 00:00:00 2001 From: bakebot Date: Thu, 27 Feb 2025 13:57:47 +0000 Subject: [PATCH 21/31] Cookie updated by NetworkToCode Cookie Drift Manager Tool Template: ``` { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "dir": "nautobot-app", "ref": "refs/tags/nautobot-app-v2.4.2", "path": null } ``` Cookie: ``` { "remote": "https://github.com/nautobot/nautobot-app-device-onboarding.git", "path": "/tmp/tmp2kdf1gez/nautobot-app-device-onboarding", "repository_path": "/tmp/tmp2kdf1gez/nautobot-app-device-onboarding", "dir": "", "branch_prefix": "drift-manager", "context": { "codeowner_github_usernames": "@mzbroch @scetron @glennmatthews @chadell", "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "nautobot", "app_name": "nautobot_device_onboarding", "verbose_name": "Device Onboarding", "app_slug": "nautobot-device-onboarding", "project_slug": "nautobot-app-device-onboarding", "repo_url": "https://github.com/nautobot/nautobot-app-device-onboarding", "base_url": "nautobot-device-onboarding", "min_nautobot_version": "2.0.3", "max_nautobot_version": "2.9999", "camel_name": "NautobotDeviceOnboarding", "project_short_description": "Device Onboarding", "model_class_name": "None", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", "docs_app_url": "https://docs.nautobot.com/projects/device-onboarding/en/latest", "_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "_output_dir": "/tmp/tmp2kdf1gez", "_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app", "_checkout": "refs/tags/nautobot-app-v2.4.2" }, "base_branch": "develop", "remote_name": "origin", "pull_request_strategy": "PullRequestStrategy.CREATE", "post_actions": [ "PostAction.RUFF", "PostAction.POETRY" ], "baked_commit_ref": "860a6ce04937705d0ccc7d3be6578489b9c58a69", "draft": false } ``` CLI Arguments: ``` { "cookie_dir": "", "input": false, "json_filename": "", "output_dir": "", "push": true, "template": "", "template_dir": "", "template_ref": "refs/tags/nautobot-app-v2.4.2", "pull_request": null, "post_action": [ "ruff", "poetry" ], "disable_post_actions": true, "draft": false } ``` --- .cookiecutter.json | 4 +- changes/+nautobot-app-v2.4.2.housekeeping | 1 + docs/requirements.txt | 1 + nautobot_device_onboarding/urls.py | 1 + poetry.lock | 1241 +-------------------- pyproject.toml | 1 + 6 files changed, 68 insertions(+), 1181 deletions(-) create mode 100644 changes/+nautobot-app-v2.4.2.housekeeping diff --git a/.cookiecutter.json b/.cookiecutter.json index d2fbeea2..c2f00de9 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -21,7 +21,7 @@ "_drift_manager": { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "template_dir": "nautobot-app", - "template_ref": "refs/tags/nautobot-app-v2.4.1", + "template_ref": "refs/tags/nautobot-app-v2.4.2", "cookie_dir": "", "branch_prefix": "drift-manager", "pull_request_strategy": "create", @@ -30,7 +30,7 @@ "poetry" ], "draft": false, - "baked_commit_ref": "860a6ce04937705d0ccc7d3be6578489b9c58a69" + "baked_commit_ref": "73b37ee9bb127d3c2d0393354bc85335812e9d37" } } } \ No newline at end of file diff --git a/changes/+nautobot-app-v2.4.2.housekeeping b/changes/+nautobot-app-v2.4.2.housekeeping new file mode 100644 index 00000000..c3274daf --- /dev/null +++ b/changes/+nautobot-app-v2.4.2.housekeeping @@ -0,0 +1 @@ +Rebaked from the cookie `nautobot-app-v2.4.2`. diff --git a/docs/requirements.txt b/docs/requirements.txt index bf10c13b..4ee3aab1 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,3 +4,4 @@ markdown-version-annotations==1.0.1 griffe==1.1.1 mkdocstrings-python==1.10.8 mkdocstrings==0.25.2 +mkdocs-autorefs==1.2.0 diff --git a/nautobot_device_onboarding/urls.py b/nautobot_device_onboarding/urls.py index 17c52229..d7e168fb 100644 --- a/nautobot_device_onboarding/urls.py +++ b/nautobot_device_onboarding/urls.py @@ -9,6 +9,7 @@ # from nautobot_device_onboarding import views +app_name = "nautobot_device_onboarding" router = NautobotUIViewSetRouter() # Here is an example of how to register a viewset, you will want to replace views.NautobotDeviceOnboardingUIViewSet with your viewset diff --git a/poetry.lock b/poetry.lock index b44b63d3..101bfb02 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "amqp" @@ -25,42 +25,6 @@ files = [ {file = "aniso8601-7.0.0.tar.gz", hash = "sha256:513d2b6637b7853806ae79ffaca6f3e8754bdd547048f5ccc1420aec4b714f1e"}, ] -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} - -[[package]] -name = "anyio" -version = "4.5.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, - {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] -trio = ["trio (>=0.26.1)"] - [[package]] name = "appnope" version = "0.1.4" @@ -242,44 +206,6 @@ tzdata = {version = "*", optional = true, markers = "extra == \"tzdata\""} [package.extras] tzdata = ["tzdata"] -[[package]] -name = "bcrypt" -version = "4.2.1" -description = "Modern password hashing for your software and your servers" -optional = false -python-versions = ">=3.7" -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"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dbd0747208912b1e4ce730c6725cb56c07ac734b3629b60d4398f082ea718ad"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:aaa2e285be097050dba798d537b6efd9b698aa88eef52ec98d23dcd6d7cf6fea"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:76d3e352b32f4eeb34703370e370997065d28a561e4a18afe4fef07249cb4396"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:b7703ede632dc945ed1172d6f24e9f30f27b1b1a067f32f68bf169c5f08d0425"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89df2aea2c43be1e1fa066df5f86c8ce822ab70a30e4c210968669565c0f4685"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:04e56e3fe8308a88b77e0afd20bec516f74aecf391cdd6e374f15cbed32783d6"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cfdf3d7530c790432046c40cda41dfee8c83e29482e6a604f8930b9930e94139"}, - {file = "bcrypt-4.2.1-cp37-abi3-win32.whl", hash = "sha256:adadd36274510a01f33e6dc08f5824b97c9580583bd4487c564fc4617b328005"}, - {file = "bcrypt-4.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:8c458cd103e6c5d1d85cf600e546a639f234964d0228909d8f8dbeebff82d526"}, - {file = "bcrypt-4.2.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8ad2f4528cbf0febe80e5a3a57d7a74e6635e41af1ea5675282a33d769fba413"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909faa1027900f2252a9ca5dfebd25fc0ef1417943824783d1c8418dd7d6df4a"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cde78d385d5e93ece5479a0a87f73cd6fa26b171c786a884f955e165032b262c"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:533e7f3bcf2f07caee7ad98124fab7499cb3333ba2274f7a36cf1daee7409d99"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:687cf30e6681eeda39548a93ce9bfbb300e48b4d445a43db4298d2474d2a1e54"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:041fa0155c9004eb98a232d54da05c0b41d4b8e66b6fc3cb71b4b3f6144ba837"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f85b1ffa09240c89aa2e1ae9f3b1c687104f7b2b9d2098da4e923f1b7082d331"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c6f5fa3775966cca251848d4d5393ab016b3afed251163c1436fefdec3b02c84"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:807261df60a8b1ccd13e6599c779014a362ae4e795f5c59747f60208daddd96d"}, - {file = "bcrypt-4.2.1-cp39-abi3-win32.whl", hash = "sha256:b588af02b89d9fad33e5f98f7838bf590d6d692df7153647724a7f20c186f6bf"}, - {file = "bcrypt-4.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:e84e0e6f8e40a242b11bce56c313edc2be121cec3e0ec2d76fce01f6af33c07c"}, - {file = "bcrypt-4.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76132c176a6d9953cdc83c296aeaed65e1a708485fd55abf163e0d9f8f16ce0e"}, - {file = "bcrypt-4.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e158009a54c4c8bc91d5e0da80920d048f918c61a581f0a63e4e93bb556d362f"}, - {file = "bcrypt-4.2.1.tar.gz", hash = "sha256:6765386e3ab87f569b276988742039baab087b2cdb01e809d74e74503c2faafe"}, -] - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - [[package]] name = "billiard" version = "4.2.1" @@ -778,33 +704,15 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "decorator" -version = "5.1.1" +version = "5.2.1" description = "Decorators for Humans" optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - -[[package]] -name = "deepdiff" -version = "6.7.1" -description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, - {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, ] -[package.dependencies] -ordered-set = ">=4.0.2,<4.2.0" - -[package.extras] -cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] -optimize = ["orjson"] - [[package]] name = "defusedxml" version = "0.7.1" @@ -816,37 +724,6 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] -[[package]] -name = "detect" -version = "2020.12.3" -description = "detect OS and Python versions" -optional = false -python-versions = "*" -files = [ - {file = "detect-2020.12.3.tar.gz", hash = "sha256:eecd6c41c17072b4db8dbfa850d979bda40b33b4f349ab4378205bceb74d712e"}, -] - -[[package]] -name = "diffsync" -version = "2.0.1" -description = "Library to easily sync/diff/update 2 different data sources" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "diffsync-2.0.1-py3-none-any.whl", hash = "sha256:c375139d2d0c060106ef4f724044bd70ec03296f90255cd41831946e0544a585"}, - {file = "diffsync-2.0.1.tar.gz", hash = "sha256:7f6fe7705b0669f0249b18c97231b74bdfa2530117ad98f3b79a563c07ff7728"}, -] - -[package.dependencies] -colorama = ">=0.4.3,<0.5.0" -packaging = ">=21.3,<24.0" -pydantic = ">=2.0.0,<3.0.0" -structlog = ">=20.1.0" -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -redis = ["redis (>=4.3,<5.0)"] - [[package]] name = "dill" version = "0.3.9" @@ -1335,20 +1212,6 @@ typing-extensions = ">=4.7.0" [package.extras] dev = ["coverage", "pytest (>=7.4.4)"] -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "executing" version = "2.2.0" @@ -1363,41 +1226,6 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] -[[package]] -name = "fakenos" -version = "1.1.0" -description = "Fake Network Operating System" -optional = false -python-versions = ">=3.8,<3.13" -files = [] -develop = false - -[package.dependencies] -detect = "2020.12.*" -paramiko = "<4.0" -pydantic = "<3.0" -pyyaml = "<7.0" - -[package.extras] -test = [] - -[package.source] -type = "git" -url = "https://github.com/fakenos/fakenos" -reference = "master" -resolved_reference = "b465bc28b478cf72582191ee77eb8e968864a0da" - -[[package]] -name = "future" -version = "1.0.0" -description = "Clean single-source support for Python 3 and 2" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, - {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, -] - [[package]] name = "ghp-import" version = "2.1.0" @@ -1565,62 +1393,6 @@ files = [ astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - [[package]] name = "idna" version = "3.10" @@ -1637,22 +1409,26 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "importlib-metadata" -version = "4.13.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "importlib-resources" @@ -1769,21 +1545,6 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] -[[package]] -name = "jdiff" -version = "0.0.6" -description = "A light-weight library to compare structured output from network devices show commands." -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "jdiff-0.0.6-py3-none-any.whl", hash = "sha256:346798820be11ae2485ce2a29eb9a9cc0ddaa23388319566d367be18730cbaa8"}, - {file = "jdiff-0.0.6.tar.gz", hash = "sha256:b42d26947d24fe7c297c8e3d38709b6e78823a41dcf50417d6be916d7d49be45"}, -] - -[package.dependencies] -deepdiff = ">=5.5.0,<7.0" -jmespath = ">=1.0.1,<2.0.0" - [[package]] name = "jedi" version = "0.19.2" @@ -1820,17 +1581,6 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "jmespath" -version = "1.0.1" -description = "JSON Matching Expressions" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, - {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, -] - [[package]] name = "jsonschema" version = "4.23.0" @@ -1869,29 +1619,6 @@ files = [ importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} referencing = ">=0.31.0" -[[package]] -name = "junos-eznc" -version = "2.7.1" -description = "Junos 'EZ' automation for non-programmers" -optional = false -python-versions = ">=3.8" -files = [ - {file = "junos-eznc-2.7.1.tar.gz", hash = "sha256:371f0298bf03e0cb4c017c43f6f4122263584eda0d690d0112e93f13daae41ac"}, - {file = "junos_eznc-2.7.1-py3-none-any.whl", hash = "sha256:8a7918faa8f0570341cac64c1210c1cd3e3542162d1e7449c3364f8d805716b2"}, -] - -[package.dependencies] -jinja2 = ">=2.7.1" -lxml = ">=3.2.4" -ncclient = ">=0.6.15" -pyparsing = "*" -pyserial = "*" -PyYAML = ">=5.1" -scp = ">=0.7.0" -six = "*" -transitions = "*" -yamlordereddictloader = "*" - [[package]] name = "kombu" version = "5.4.2" @@ -1973,160 +1700,6 @@ files = [ {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] -[[package]] -name = "lxml" -version = "5.3.1" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -optional = false -python-versions = ">=3.6" -files = [ - {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, - {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:528f3a0498a8edc69af0559bdcf8a9f5a8bf7c00051a6ef3141fdcf27017bbf5"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4743e30d6f5f92b6d2b7c86b3ad250e0bad8dee4b7ad8a0c44bfb276af89a3"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17b5d7f8acf809465086d498d62a981fa6a56d2718135bb0e4aa48c502055f5c"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:928e75a7200a4c09e6efc7482a1337919cc61fe1ba289f297827a5b76d8969c2"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a997b784a639e05b9d4053ef3b20c7e447ea80814a762f25b8ed5a89d261eac"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7b82e67c5feb682dbb559c3e6b78355f234943053af61606af126df2183b9ef9"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:f1de541a9893cf8a1b1db9bf0bf670a2decab42e3e82233d36a74eda7822b4c9"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:de1fc314c3ad6bc2f6bd5b5a5b9357b8c6896333d27fdbb7049aea8bd5af2d79"}, - {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7c0536bd9178f754b277a3e53f90f9c9454a3bd108b1531ffff720e082d824f2"}, - {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68018c4c67d7e89951a91fbd371e2e34cd8cfc71f0bb43b5332db38497025d51"}, - {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa826340a609d0c954ba52fd831f0fba2a4165659ab0ee1a15e4aac21f302406"}, - {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:796520afa499732191e39fc95b56a3b07f95256f2d22b1c26e217fb69a9db5b5"}, - {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3effe081b3135237da6e4c4530ff2a868d3f80be0bda027e118a5971285d42d0"}, - {file = "lxml-5.3.1-cp310-cp310-win32.whl", hash = "sha256:a22f66270bd6d0804b02cd49dae2b33d4341015545d17f8426f2c4e22f557a23"}, - {file = "lxml-5.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:0bcfadea3cdc68e678d2b20cb16a16716887dd00a881e16f7d806c2138b8ff0c"}, - {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e220f7b3e8656ab063d2eb0cd536fafef396829cafe04cb314e734f87649058f"}, - {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f2cfae0688fd01f7056a17367e3b84f37c545fb447d7282cf2c242b16262607"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67d2f8ad9dcc3a9e826bdc7802ed541a44e124c29b7d95a679eeb58c1c14ade8"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db0c742aad702fd5d0c6611a73f9602f20aec2007c102630c06d7633d9c8f09a"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:198bb4b4dd888e8390afa4f170d4fa28467a7eaf857f1952589f16cfbb67af27"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2a3e412ce1849be34b45922bfef03df32d1410a06d1cdeb793a343c2f1fd666"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8969dbc8d09d9cd2ae06362c3bad27d03f433252601ef658a49bd9f2b22d79"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5be8f5e4044146a69c96077c7e08f0709c13a314aa5315981185c1f00235fe65"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:133f3493253a00db2c870d3740bc458ebb7d937bd0a6a4f9328373e0db305709"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:52d82b0d436edd6a1d22d94a344b9a58abd6c68c357ed44f22d4ba8179b37629"}, - {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b6f92e35e2658a5ed51c6634ceb5ddae32053182851d8cad2a5bc102a359b33"}, - {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:203b1d3eaebd34277be06a3eb880050f18a4e4d60861efba4fb946e31071a295"}, - {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:155e1a5693cf4b55af652f5c0f78ef36596c7f680ff3ec6eb4d7d85367259b2c"}, - {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22ec2b3c191f43ed21f9545e9df94c37c6b49a5af0a874008ddc9132d49a2d9c"}, - {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7eda194dd46e40ec745bf76795a7cccb02a6a41f445ad49d3cf66518b0bd9cff"}, - {file = "lxml-5.3.1-cp311-cp311-win32.whl", hash = "sha256:fb7c61d4be18e930f75948705e9718618862e6fc2ed0d7159b2262be73f167a2"}, - {file = "lxml-5.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c809eef167bf4a57af4b03007004896f5c60bd38dc3852fcd97a26eae3d4c9e6"}, - {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e69add9b6b7b08c60d7ff0152c7c9a6c45b4a71a919be5abde6f98f1ea16421c"}, - {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e52e1b148867b01c05e21837586ee307a01e793b94072d7c7b91d2c2da02ffe"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4b382e0e636ed54cd278791d93fe2c4f370772743f02bcbe431a160089025c9"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e49dc23a10a1296b04ca9db200c44d3eb32c8d8ec532e8c1fd24792276522a"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4399b4226c4785575fb20998dc571bc48125dc92c367ce2602d0d70e0c455eb0"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5412500e0dc5481b1ee9cf6b38bb3b473f6e411eb62b83dc9b62699c3b7b79f7"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c93ed3c998ea8472be98fb55aed65b5198740bfceaec07b2eba551e55b7b9ae"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:63d57fc94eb0bbb4735e45517afc21ef262991d8758a8f2f05dd6e4174944519"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:b450d7cabcd49aa7ab46a3c6aa3ac7e1593600a1a0605ba536ec0f1b99a04322"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:4df0ec814b50275ad6a99bc82a38b59f90e10e47714ac9871e1b223895825468"}, - {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d184f85ad2bb1f261eac55cddfcf62a70dee89982c978e92b9a74a1bfef2e367"}, - {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b725e70d15906d24615201e650d5b0388b08a5187a55f119f25874d0103f90dd"}, - {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a31fa7536ec1fb7155a0cd3a4e3d956c835ad0a43e3610ca32384d01f079ea1c"}, - {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c3c8b55c7fc7b7e8877b9366568cc73d68b82da7fe33d8b98527b73857a225f"}, - {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d61ec60945d694df806a9aec88e8f29a27293c6e424f8ff91c80416e3c617645"}, - {file = "lxml-5.3.1-cp312-cp312-win32.whl", hash = "sha256:f4eac0584cdc3285ef2e74eee1513a6001681fd9753b259e8159421ed28a72e5"}, - {file = "lxml-5.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:29bfc8d3d88e56ea0a27e7c4897b642706840247f59f4377d81be8f32aa0cfbf"}, - {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c093c7088b40d8266f57ed71d93112bd64c6724d31f0794c1e52cc4857c28e0e"}, - {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0884e3f22d87c30694e625b1e62e6f30d39782c806287450d9dc2fdf07692fd"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1637fa31ec682cd5760092adfabe86d9b718a75d43e65e211d5931809bc111e7"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a364e8e944d92dcbf33b6b494d4e0fb3499dcc3bd9485beb701aa4b4201fa414"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:779e851fd0e19795ccc8a9bb4d705d6baa0ef475329fe44a13cf1e962f18ff1e"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4393600915c308e546dc7003d74371744234e8444a28622d76fe19b98fa59d1"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:673b9d8e780f455091200bba8534d5f4f465944cbdd61f31dc832d70e29064a5"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2e4a570f6a99e96c457f7bec5ad459c9c420ee80b99eb04cbfcfe3fc18ec6423"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:71f31eda4e370f46af42fc9f264fafa1b09f46ba07bdbee98f25689a04b81c20"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:42978a68d3825eaac55399eb37a4d52012a205c0c6262199b8b44fcc6fd686e8"}, - {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8b1942b3e4ed9ed551ed3083a2e6e0772de1e5e3aca872d955e2e86385fb7ff9"}, - {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85c4f11be9cf08917ac2a5a8b6e1ef63b2f8e3799cec194417e76826e5f1de9c"}, - {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:231cf4d140b22a923b1d0a0a4e0b4f972e5893efcdec188934cc65888fd0227b"}, - {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5865b270b420eda7b68928d70bb517ccbe045e53b1a428129bb44372bf3d7dd5"}, - {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7bebc2275016cddf3c997bf8a0f7044160714c64a9b83975670a04e6d2252"}, - {file = "lxml-5.3.1-cp313-cp313-win32.whl", hash = "sha256:d0751528b97d2b19a388b302be2a0ee05817097bab46ff0ed76feeec24951f78"}, - {file = "lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332"}, - {file = "lxml-5.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:016b96c58e9a4528219bb563acf1aaaa8bc5452e7651004894a973f03b84ba81"}, - {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82a4bb10b0beef1434fb23a09f001ab5ca87895596b4581fd53f1e5145a8934a"}, - {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d68eeef7b4d08a25e51897dac29bcb62aba830e9ac6c4e3297ee7c6a0cf6439"}, - {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:f12582b8d3b4c6be1d298c49cb7ae64a3a73efaf4c2ab4e37db182e3545815ac"}, - {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2df7ed5edeb6bd5590914cd61df76eb6cce9d590ed04ec7c183cf5509f73530d"}, - {file = "lxml-5.3.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:585c4dc429deebc4307187d2b71ebe914843185ae16a4d582ee030e6cfbb4d8a"}, - {file = "lxml-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:06a20d607a86fccab2fc15a77aa445f2bdef7b49ec0520a842c5c5afd8381576"}, - {file = "lxml-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:057e30d0012439bc54ca427a83d458752ccda725c1c161cc283db07bcad43cf9"}, - {file = "lxml-5.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4867361c049761a56bd21de507cab2c2a608c55102311d142ade7dab67b34f32"}, - {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dddf0fb832486cc1ea71d189cb92eb887826e8deebe128884e15020bb6e3f61"}, - {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bcc211542f7af6f2dfb705f5f8b74e865592778e6cafdfd19c792c244ccce19"}, - {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaca5a812f050ab55426c32177091130b1e49329b3f002a32934cd0245571307"}, - {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:236610b77589faf462337b3305a1be91756c8abc5a45ff7ca8f245a71c5dab70"}, - {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:aed57b541b589fa05ac248f4cb1c46cbb432ab82cbd467d1c4f6a2bdc18aecf9"}, - {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:75fa3d6946d317ffc7016a6fcc44f42db6d514b7fdb8b4b28cbe058303cb6e53"}, - {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:96eef5b9f336f623ffc555ab47a775495e7e8846dde88de5f941e2906453a1ce"}, - {file = "lxml-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:ef45f31aec9be01379fc6c10f1d9c677f032f2bac9383c827d44f620e8a88407"}, - {file = "lxml-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0611da6b07dd3720f492db1b463a4d1175b096b49438761cc9f35f0d9eaaef5"}, - {file = "lxml-5.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2aca14c235c7a08558fe0a4786a1a05873a01e86b474dfa8f6df49101853a4e"}, - {file = "lxml-5.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82fce1d964f065c32c9517309f0c7be588772352d2f40b1574a214bd6e6098"}, - {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7aae7a3d63b935babfdc6864b31196afd5145878ddd22f5200729006366bc4d5"}, - {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8e0d177b1fe251c3b1b914ab64135475c5273c8cfd2857964b2e3bb0fe196a7"}, - {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:6c4dd3bfd0c82400060896717dd261137398edb7e524527438c54a8c34f736bf"}, - {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f1208c1c67ec9e151d78aa3435aa9b08a488b53d9cfac9b699f15255a3461ef2"}, - {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c6aacf00d05b38a5069826e50ae72751cb5bc27bdc4d5746203988e429b385bb"}, - {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5881aaa4bf3a2d086c5f20371d3a5856199a0d8ac72dd8d0dbd7a2ecfc26ab73"}, - {file = "lxml-5.3.1-cp38-cp38-win32.whl", hash = "sha256:45fbb70ccbc8683f2fb58bea89498a7274af1d9ec7995e9f4af5604e028233fc"}, - {file = "lxml-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:7512b4d0fc5339d5abbb14d1843f70499cab90d0b864f790e73f780f041615d7"}, - {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5885bc586f1edb48e5d68e7a4b4757b5feb2a496b64f462b4d65950f5af3364f"}, - {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1b92fe86e04f680b848fff594a908edfa72b31bfc3499ef7433790c11d4c8cd8"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a091026c3bf7519ab1e64655a3f52a59ad4a4e019a6f830c24d6430695b1cf6a"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ffb141361108e864ab5f1813f66e4e1164181227f9b1f105b042729b6c15125"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3715cdf0dd31b836433af9ee9197af10e3df41d273c19bb249230043667a5dfd"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88b72eb7222d918c967202024812c2bfb4048deeb69ca328363fb8e15254c549"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa59974880ab5ad8ef3afaa26f9bda148c5f39e06b11a8ada4660ecc9fb2feb3"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3bb8149840daf2c3f97cebf00e4ed4a65a0baff888bf2605a8d0135ff5cf764e"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:0d6b2fa86becfa81f0a0271ccb9eb127ad45fb597733a77b92e8a35e53414914"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:136bf638d92848a939fd8f0e06fcf92d9f2e4b57969d94faae27c55f3d85c05b"}, - {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:89934f9f791566e54c1d92cdc8f8fd0009447a5ecdb1ec6b810d5f8c4955f6be"}, - {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8ade0363f776f87f982572c2860cc43c65ace208db49c76df0a21dde4ddd16e"}, - {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfbbab9316330cf81656fed435311386610f78b6c93cc5db4bebbce8dd146675"}, - {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:172d65f7c72a35a6879217bcdb4bb11bc88d55fb4879e7569f55616062d387c2"}, - {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3c623923967f3e5961d272718655946e5322b8d058e094764180cdee7bab1af"}, - {file = "lxml-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ce0930a963ff593e8bb6fda49a503911accc67dee7e5445eec972668e672a0f0"}, - {file = "lxml-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f7b64fcd670bca8800bc10ced36620c6bbb321e7bc1214b9c0c0df269c1dddc2"}, - {file = "lxml-5.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:afa578b6524ff85fb365f454cf61683771d0170470c48ad9d170c48075f86725"}, - {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f5e80adf0aafc7b5454f2c1cb0cde920c9b1f2cbd0485f07cc1d0497c35c5d"}, - {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd0b80ac2d8f13ffc906123a6f20b459cb50a99222d0da492360512f3e50f84"}, - {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:422c179022ecdedbe58b0e242607198580804253da220e9454ffe848daa1cfd2"}, - {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:524ccfded8989a6595dbdda80d779fb977dbc9a7bc458864fc9a0c2fc15dc877"}, - {file = "lxml-5.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:48fd46bf7155def2e15287c6f2b133a2f78e2d22cdf55647269977b873c65499"}, - {file = "lxml-5.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:05123fad495a429f123307ac6d8fd6f977b71e9a0b6d9aeeb8f80c017cb17131"}, - {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a243132767150a44e6a93cd1dde41010036e1cbc63cc3e9fe1712b277d926ce3"}, - {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c92ea6d9dd84a750b2bae72ff5e8cf5fdd13e58dda79c33e057862c29a8d5b50"}, - {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2f1be45d4c15f237209bbf123a0e05b5d630c8717c42f59f31ea9eae2ad89394"}, - {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a83d3adea1e0ee36dac34627f78ddd7f093bb9cfc0a8e97f1572a949b695cb98"}, - {file = "lxml-5.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3edbb9c9130bac05d8c3fe150c51c337a471cc7fdb6d2a0a7d3a88e88a829314"}, - {file = "lxml-5.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2f23cf50eccb3255b6e913188291af0150d89dab44137a69e14e4dcb7be981f1"}, - {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7e5edac4778127f2bf452e0721a58a1cfa4d1d9eac63bdd650535eb8543615"}, - {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:094b28ed8a8a072b9e9e2113a81fda668d2053f2ca9f2d202c2c8c7c2d6516b1"}, - {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:514fe78fc4b87e7a7601c92492210b20a1b0c6ab20e71e81307d9c2e377c64de"}, - {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8fffc08de02071c37865a155e5ea5fce0282e1546fd5bde7f6149fcaa32558ac"}, - {file = "lxml-5.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4b0d5cdba1b655d5b18042ac9c9ff50bda33568eb80feaaca4fc237b9c4fbfde"}, - {file = "lxml-5.3.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3031e4c16b59424e8d78522c69b062d301d951dc55ad8685736c3335a97fc270"}, - {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb659702a45136c743bc130760c6f137870d4df3a9e14386478b8a0511abcfca"}, - {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a11b16a33656ffc43c92a5343a28dc71eefe460bcc2a4923a96f292692709f6"}, - {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c5ae125276f254b01daa73e2c103363d3e99e3e10505686ac7d9d2442dd4627a"}, - {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76722b5ed4a31ba103e0dc77ab869222ec36efe1a614e42e9bcea88a36186fe"}, - {file = "lxml-5.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:33e06717c00c788ab4e79bc4726ecc50c54b9bfb55355eae21473c145d83c2d2"}, - {file = "lxml-5.3.1.tar.gz", hash = "sha256:106b7b5d2977b339f1e97efe2778e2ab20e99994cbb0ec5e55771ed0795920c8"}, -] - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html-clean = ["lxml_html_clean"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.11,<3.1.0)"] - [[package]] name = "markdown" version = "3.6" @@ -2411,49 +1984,6 @@ files = [ griffe = ">=0.49" mkdocstrings = ">=0.25" -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "napalm" -version = "4.1.0" -description = "Network Automation and Programmability Abstraction Layer with Multivendor support" -optional = false -python-versions = "*" -files = [ - {file = "napalm-4.1.0-py2.py3-none-any.whl", hash = "sha256:14a5b7759a0247a26fff2c444b1cfc150a08224de8addf4076c384845285bf5b"}, - {file = "napalm-4.1.0.tar.gz", hash = "sha256:3b3e18efd556861c056ba509eb46f5ffc9e3e6c42db399fa76b6ea9af272c17a"}, -] - -[package.dependencies] -cffi = ">=1.11.3" -future = "*" -jinja2 = "*" -junos-eznc = ">=2.6.3" -lxml = ">=4.3.0" -ncclient = "*" -netaddr = "*" -netmiko = ">=4.1.0" -netutils = ">=1.0.0" -paramiko = ">=2.6.0" -pyeapi = ">=0.8.2" -pyYAML = "*" -requests = ">=2.7.0" -scp = "*" -setuptools = ">=38.4.0" -textfsm = "*" -ttp = "*" -ttp-templates = "*" -typing-extensions = ">=4.3.0" - [[package]] name = "nautobot" version = "2.3.16" @@ -2523,73 +2053,6 @@ napalm = ["napalm (>=4.1.0,<6.0.0)"] remote-storage = ["django-storages (==1.14.3)"] sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] -[[package]] -name = "nautobot-plugin-nornir" -version = "2.1.0" -description = "Nautobot App that provides a shim layer to simplify using Nornir within other Nautobot Apps and Nautobot Jobs" -optional = false -python-versions = "<3.13,>=3.8" -files = [ - {file = "nautobot_plugin_nornir-2.1.0-py3-none-any.whl", hash = "sha256:aa50882b5fc729fb95e2d03383596a582f1b09419c8ec9c6db5f12cbb6f6ffa0"}, - {file = "nautobot_plugin_nornir-2.1.0.tar.gz", hash = "sha256:ea7ead4e52d27f349846d55bcdc00d6953f1bd03813e70a094f035a66bc863e7"}, -] - -[package.dependencies] -nautobot = ">=2.0.0,<3.0.0" -netutils = ">=1.6.0" -nornir-nautobot = ">=3.0.0,<4.0.0" - -[[package]] -name = "nautobot-ssot" -version = "3.5.0" -description = "Nautobot Single Source of Truth" -optional = false -python-versions = "<3.13,>=3.8" -files = [ - {file = "nautobot_ssot-3.5.0-py3-none-any.whl", hash = "sha256:a20801c4e04bc65268de7e95f746a66d0c1739d85237658aa7c3fa628478d3a6"}, - {file = "nautobot_ssot-3.5.0.tar.gz", hash = "sha256:a5f26df1730863c78996ab4a8c7ba97ebf85d5121717b659690bb27312841405"}, -] - -[package.dependencies] -diffsync = ">=2.0.0,<3.0.0" -Markdown = "!=3.3.5" -nautobot = ">=2.1.0,<3.0.0" -packaging = ">=21.3,<24" -prometheus-client = ">=0.17.1" -retry = ">=0.9.2,<0.10.0" - -[package.extras] -aci = ["PyYAML (>=6)"] -all = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)", "dnacentersdk (>=2.5.6,<3.0.0)", "dnspython (>=2.1.0,<3.0.0)", "ijson (>=2.5.1)", "ipfabric (>=6.0.0,<7.0.0)", "meraki (>=1.37.2,<1.46.0)", "nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)", "netutils (>=1.9.0,<2.0.0)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)", "slurpit-sdk (>=0.9.58,<0.10.0)", "urllib3 (>=2.2.3)"] -aristacv = ["cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)"] -bootstrap = ["pytz (>=2019.3)"] -citrix-adm = ["netutils (>=1.9.0,<2.0.0)", "requests (>=2.21.0)", "urllib3 (>=2.2.3)"] -device42 = ["requests (>=2.21.0)"] -dna-center = ["dnacentersdk (>=2.5.6,<3.0.0)", "netutils (>=1.9.0,<2.0.0)"] -infoblox = ["dnspython (>=2.1.0,<3.0.0)"] -ipfabric = ["httpx (>=0.23.3)", "ipfabric (>=6.0.0,<7.0.0)", "netutils (>=1.9.0,<2.0.0)"] -meraki = ["meraki (>=1.37.2,<1.46.0)"] -nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)"] -pysnow = ["ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] -servicenow = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] -slurpit = ["slurpit-sdk (>=0.9.58,<0.10.0)"] - -[[package]] -name = "ncclient" -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" -files = [ - {file = "ncclient-0.6.16.tar.gz", hash = "sha256:a16a351d8c234e3bbf3495577b63c96ae4adfcdf67f2d84194313473ea65b805"}, -] - -[package.dependencies] -lxml = ">=3.3.0" -paramiko = ">=1.15.0" -setuptools = ">0.6" -six = "*" - [[package]] name = "netaddr" version = "1.3.0" @@ -2604,27 +2067,6 @@ files = [ [package.extras] nicer-shell = ["ipython"] -[[package]] -name = "netmiko" -version = "4.4.0" -description = "Multi-vendor library to simplify legacy CLI connections to network devices" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "netmiko-4.4.0-py3-none-any.whl", hash = "sha256:2ff4683f013fac0f80715286c7d3250e89166aefc4421cb75d3ff483f2ebbbc0"}, - {file = "netmiko-4.4.0.tar.gz", hash = "sha256:25ff1237976aa3ff2cacf04949314638c899220a1675bd029e31b07ce20ce3b6"}, -] - -[package.dependencies] -cffi = ">=1.17.0rc1" -ntc-templates = ">=3.1.0" -paramiko = ">=2.9.5" -pyserial = ">=3.3" -pyyaml = ">=5.3" -scp = ">=0.13.6" -setuptools = ">=65.0.0" -textfsm = ">=1.1.3" - [[package]] name = "netutils" version = "1.12.0" @@ -2641,151 +2083,37 @@ optionals = ["jsonschema (>=4.17.3,<5.0.0)", "legacycrypt (==0.3)", "napalm (>=4 [[package]] name = "nh3" -version = "0.2.20" +version = "0.2.21" description = "Python binding to Ammonia HTML sanitizer Rust crate" optional = false python-versions = ">=3.8" files = [ - {file = "nh3-0.2.20-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e1061a4ab6681f6bdf72b110eea0c4e1379d57c9de937db3be4202f7ad6043db"}, - {file = "nh3-0.2.20-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb4254b1dac4a1ee49919a5b3f1caf9803ea8dada1816d9e8289e63d3cd0dd9a"}, - {file = "nh3-0.2.20-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ae9cbd713524cdb81e64663d0d6aae26f678db9f2cd9db0bf162606f1f9f20c"}, - {file = "nh3-0.2.20-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e1f7370b4e14cc03f5ae141ef30a1caf81fa5787711f80be9081418dd9eb79d2"}, - {file = "nh3-0.2.20-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:ac4d27dc836a476efffc6eb661994426b8b805c951b29c9cf2ff36bc9ad58bc5"}, - {file = "nh3-0.2.20-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4fd2e9248725ebcedac3997a8d3da0d90a12a28c9179c6ba51f1658938ac30d0"}, - {file = "nh3-0.2.20-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f7d564871833ddbe54df3aa59053b1110729d3a800cb7628ae8f42adb3d75208"}, - {file = "nh3-0.2.20-cp313-cp313t-win32.whl", hash = "sha256:d2a176fd4306b6f0f178a3f67fac91bd97a3a8d8fafb771c9b9ef675ba5c8886"}, - {file = "nh3-0.2.20-cp313-cp313t-win_amd64.whl", hash = "sha256:6ed834c68452a600f517dd3e1534dbfaff1f67f98899fecf139a055a25d99150"}, - {file = "nh3-0.2.20-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:76e2f603b30c02ff6456b233a83fc377dedab6a50947b04e960a6b905637b776"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:181063c581defe683bd4bb78188ac9936d208aebbc74c7f7c16b6a32ae2ebb38"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:231addb7643c952cd6d71f1c8702d703f8fe34afcb20becb3efb319a501a12d7"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1b9a8340a0aab991c68a5ca938d35ef4a8a3f4bf1b455da8855a40bee1fa0ace"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10317cd96fe4bbd4eb6b95f3920b71c902157ad44fed103fdcde43e3b8ee8be6"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8698db4c04b140800d1a1cd3067fda399e36e1e2b8fc1fe04292a907350a3e9b"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eb04b9c3deb13c3a375ea39fd4a3c00d1f92e8fb2349f25f1e3e4506751774b"}, - {file = "nh3-0.2.20-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92f3f1c4f47a2c6f3ca7317b1d5ced05bd29556a75d3a4e2715652ae9d15c05d"}, - {file = "nh3-0.2.20-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ddefa9fd6794a87e37d05827d299d4b53a3ec6f23258101907b96029bfef138a"}, - {file = "nh3-0.2.20-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ce3731c8f217685d33d9268362e5b4f770914e922bba94d368ab244a59a6c397"}, - {file = "nh3-0.2.20-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:09f037c02fc2c43b211ff1523de32801dcfb0918648d8e651c36ef890f1731ec"}, - {file = "nh3-0.2.20-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:813f1c8012dd64c990514b795508abb90789334f76a561fa0fd4ca32d2275330"}, - {file = "nh3-0.2.20-cp38-abi3-win32.whl", hash = "sha256:47b2946c0e13057855209daeffb45dc910bd0c55daf10190bb0b4b60e2999784"}, - {file = "nh3-0.2.20-cp38-abi3-win_amd64.whl", hash = "sha256:da87573f03084edae8eb87cfe811ec338606288f81d333c07d2a9a0b9b976c0b"}, - {file = "nh3-0.2.20.tar.gz", hash = "sha256:9705c42d7ff88a0bea546c82d7fe5e59135e3d3f057e485394f491248a1f8ed5"}, -] - -[[package]] -name = "nornir" -version = "3.4.1" -description = "Pluggable multi-threaded framework with inventory management to help operate collections of devices" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "nornir-3.4.1-py3-none-any.whl", hash = "sha256:db079cb95e3baf855530f4f40cb6ee93f93e1bf3cb74ac08180546adb1b987b8"}, - {file = "nornir-3.4.1.tar.gz", hash = "sha256:82a90a3478a3890bef8ad51b256fa966e6e4ca326cbe20a230918ef907cf68c3"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4,<5", markers = "python_version < \"3.10\""} -mypy_extensions = ">=1.0.0,<2.0.0" -"ruamel.yaml" = ">=0.17" - -[[package]] -name = "nornir-jinja2" -version = "0.2.0" -description = "Jinja2 plugins for nornir" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "nornir_jinja2-0.2.0-py3-none-any.whl", hash = "sha256:0c446bec7a8492923d4eb9ca00fb327603b41bc35d5f0112843c048737b506b1"}, - {file = "nornir_jinja2-0.2.0.tar.gz", hash = "sha256:9ee5e725fe5543dcba4ec8b976804e9e88ecd356ea3b62bad97578cea0de1f75"}, -] - -[package.dependencies] -jinja2 = ">=2.11.2,<4" -nornir = ">=3,<4" - -[[package]] -name = "nornir-napalm" -version = "0.4.0" -description = "NAPALM's plugins for nornir" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "nornir_napalm-0.4.0-py3-none-any.whl", hash = "sha256:20a41499aecf9c4e41181b18a73b2ee3ab7763824645ac0eb80abb3973a5f17e"}, - {file = "nornir_napalm-0.4.0.tar.gz", hash = "sha256:84e0711ccbdf24bdb228042ab530bf688d6b2b8f12c65fa3cb73499c6974a9de"}, -] - -[package.dependencies] -napalm = ">=4,<5" -nornir = ">=3,<4" - -[[package]] -name = "nornir-nautobot" -version = "3.2.0" -description = "Nornir Nautobot" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "nornir_nautobot-3.2.0-py3-none-any.whl", hash = "sha256:ed0ac258eebd2e3072f1d7a0c1f964965e7c9bf8c744290bb5ea04d5800b0ef4"}, - {file = "nornir_nautobot-3.2.0.tar.gz", hash = "sha256:087ad3f6b37112e2a4ff4be64a3b5bfbddfae22057c182e57fae7084850d3d63"}, -] - -[package.dependencies] -httpx = ">=0.23.0,<=0.27.0" -netutils = ">=1.6.0,<2.0.0" -nornir = ">=3.0.0,<4.0.0" -nornir-jinja2 = ">=0.2.0,<0.3.0" -nornir-napalm = ">=0.4.0,<1.0.0" -nornir-netmiko = ">=1,<2" -nornir-utils = ">=0,<1" -pynautobot = ">=2.0.2" -requests = ">=2.25.1,<3.0.0" - -[package.extras] -mikrotik-driver = ["routeros-api (>=0.17.0,<0.18.0)"] - -[[package]] -name = "nornir-netmiko" -version = "1.0.1" -description = "Netmiko's plugins for Nornir" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "nornir_netmiko-1.0.1-py3-none-any.whl", hash = "sha256:eaee2944ad386b40c0719e8ac393ac63d531f44fb9a07d660bae7de430f12834"}, - {file = "nornir_netmiko-1.0.1.tar.gz", hash = "sha256:498546df001e0e499f10c5646d1356e361ccbb165b1335b89cfe8f19765e24d7"}, -] - -[package.dependencies] -netmiko = ">=4.0.0,<5.0.0" - -[[package]] -name = "nornir-utils" -version = "0.2.0" -description = "Collection of plugins and functions for nornir that don't require external dependencies" -optional = false -python-versions = ">=3.6.2,<4.0.0" -files = [ - {file = "nornir_utils-0.2.0-py3-none-any.whl", hash = "sha256:b4c430793a74f03affd5ff2d90abc8c67a28c7ff325f48e3a01a9a44ec71b844"}, - {file = "nornir_utils-0.2.0.tar.gz", hash = "sha256:4de6aaa35e5c1a98e1c84db84a008b0b1e974dc65d88484f2dcea3e30c95fbc2"}, + {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"}, + {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"}, + {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d426d7be1a2f3d896950fe263332ed1662f6c78525b4520c8e9861f8d7f0d243"}, + {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9d67709bc0d7d1f5797b21db26e7a8b3d15d21c9c5f58ccfe48b5328483b685b"}, + {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:55823c5ea1f6b267a4fad5de39bc0524d49a47783e1fe094bcf9c537a37df251"}, + {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:818f2b6df3763e058efa9e69677b5a92f9bc0acff3295af5ed013da544250d5b"}, + {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b3b5c58161e08549904ac4abd450dacd94ff648916f7c376ae4b2c0652b98ff9"}, + {file = "nh3-0.2.21-cp313-cp313t-win32.whl", hash = "sha256:637d4a10c834e1b7d9548592c7aad760611415fcd5bd346f77fd8a064309ae6d"}, + {file = "nh3-0.2.21-cp313-cp313t-win_amd64.whl", hash = "sha256:713d16686596e556b65e7f8c58328c2df63f1a7abe1277d87625dcbbc012ef82"}, + {file = "nh3-0.2.21-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a772dec5b7b7325780922dd904709f0f5f3a79fbf756de5291c01370f6df0967"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d002b648592bf3033adfd875a48f09b8ecc000abd7f6a8769ed86b6ccc70c759"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2a5174551f95f2836f2ad6a8074560f261cf9740a48437d6151fd2d4d7d617ab"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b8d55ea1fc7ae3633d758a92aafa3505cd3cc5a6e40470c9164d54dff6f96d42"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ae319f17cd8960d0612f0f0ddff5a90700fa71926ca800e9028e7851ce44a6f"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ca02ac6f27fc80f9894409eb61de2cb20ef0a23740c7e29f9ec827139fa578"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f77e62aed5c4acad635239ac1290404c7e940c81abe561fd2af011ff59f585"}, + {file = "nh3-0.2.21-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293"}, + {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ac7006c3abd097790e611fe4646ecb19a8d7f2184b882f6093293b8d9b887431"}, + {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:6141caabe00bbddc869665b35fc56a478eb774a8c1dfd6fba9fe1dfdf29e6efa"}, + {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:20979783526641c81d2f5bfa6ca5ccca3d1e4472474b162c6256745fbfe31cd1"}, + {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a7ea28cd49293749d67e4fcf326c554c83ec912cd09cd94aa7ec3ab1921c8283"}, + {file = "nh3-0.2.21-cp38-abi3-win32.whl", hash = "sha256:6c9c30b8b0d291a7c5ab0967ab200598ba33208f754f2f4920e9343bdd88f79a"}, + {file = "nh3-0.2.21-cp38-abi3-win_amd64.whl", hash = "sha256:bb0014948f04d7976aabae43fcd4cb7f551f9f8ce785a4c9ef66e6c2590f8629"}, + {file = "nh3-0.2.21.tar.gz", hash = "sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e"}, ] -[package.dependencies] -colorama = ">=0.4.3,<0.5.0" -nornir = ">=3,<4" - -[[package]] -name = "ntc-templates" -version = "7.7.0" -description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "ntc_templates-7.7.0-py3-none-any.whl", hash = "sha256:314850358394f4edbc3170ce9d3b69f51c2877c67cd9c4c8fe21227cb81f8ab1"}, - {file = "ntc_templates-7.7.0.tar.gz", hash = "sha256:c7b9c2f8306ff6ff1133b5a1614f9627b520bc27c3c514c4e95bf27e221f2a2d"}, -] - -[package.dependencies] -textfsm = ">=1.1.0,<2.0.0" - [[package]] name = "oauthlib" version = "3.2.2" @@ -2802,29 +2130,15 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] -[[package]] -name = "ordered-set" -version = "4.1.0" -description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, - {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, -] - -[package.extras] -dev = ["black", "mypy", "pytest"] - [[package]] name = "packaging" -version = "23.2" +version = "24.2" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -2842,27 +2156,6 @@ files = [ dev = ["pytest", "tox"] lint = ["black"] -[[package]] -name = "paramiko" -version = "3.5.1" -description = "SSH2 protocol library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61"}, - {file = "paramiko-3.5.1.tar.gz", hash = "sha256:b2c665bc45b2b215bd7d7f039901b14b067da00f3a11e6640995fd58f2664822"}, -] - -[package.dependencies] -bcrypt = ">=3.2" -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)"] -invoke = ["invoke (>=2.0)"] - [[package]] name = "parso" version = "0.8.4" @@ -3125,6 +2418,7 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -3172,17 +2466,6 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pycodestyle" version = "2.12.1" @@ -3205,155 +2488,6 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -[[package]] -name = "pydantic" -version = "2.10.6" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, - {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.27.2" -typing-extensions = ">=4.12.2" - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, - {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, - {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, - {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, - {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, - {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, - {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, - {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, - {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, - {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, - {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, - {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, - {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, - {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, - {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, - {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, - {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, - {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyeapi" -version = "1.0.4" -description = "Python Client for eAPI" -optional = false -python-versions = "*" -files = [ - {file = "pyeapi-1.0.4.tar.gz", hash = "sha256:05920677246823cd3dddf7d4d0f831fbc86fd416f356706a03bc56a291d78f3d"}, -] - -[package.dependencies] -netaddr = "*" - -[package.extras] -dev = ["check-manifest", "pep8", "pyflakes", "twine"] -test = ["coverage"] - [[package]] name = "pygments" version = "2.19.1" @@ -3481,76 +2615,6 @@ pyyaml = "*" [package.extras] extra = ["pygments (>=2.19.1)"] -[[package]] -name = "pynacl" -version = "1.5.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -optional = false -python-versions = ">=3.6" -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"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] - -[package.dependencies] -cffi = ">=1.4.1" - -[package.extras] -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.1.1" -description = "Nautobot API client library" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "pynautobot-2.1.1-py3-none-any.whl", hash = "sha256:bcf56fee4733942a87dd07f956418f67580f45d08e5296c8fa3d11316c4ca419"}, - {file = "pynautobot-2.1.1.tar.gz", hash = "sha256:f01907a519689dc842f909f850737f68b53953818c97380a8101406d37e49d1b"}, -] - -[package.dependencies] -packaging = ">=23.2,<24.0" -requests = ">=2.30.0,<3.0.0" -urllib3 = ">=1.21.1,<1.27" - -[[package]] -name = "pyparsing" -version = "3.1.4" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pyserial" -version = "3.5" -description = "Python Serial Port Extension" -optional = false -python-versions = "*" -files = [ - {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, - {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, -] - -[package.extras] -cp2110 = ["hidapi"] - [[package]] name = "python-crontab" version = "3.2.0" @@ -3958,21 +3022,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "retry" -version = "0.9.2" -description = "Easy to use retry decorator." -optional = false -python-versions = "*" -files = [ - {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, - {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, -] - -[package.dependencies] -decorator = ">=3.4.2" -py = ">=1.4.26,<2.0.0" - [[package]] name = "rpds-py" version = "0.20.1" @@ -4085,83 +3134,6 @@ files = [ {file = "rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350"}, ] -[[package]] -name = "ruamel-yaml" -version = "0.18.10" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1"}, - {file = "ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} - -[package.extras] -docs = ["mercurial (>5.7)", "ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.8" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, - {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, - {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, -] - [[package]] name = "ruff" version = "0.5.5" @@ -4199,20 +3171,6 @@ files = [ {file = "Rx-1.6.3.tar.gz", hash = "sha256:ca71b65d0fc0603a3b5cfaa9e33f5ba81e4aae10a58491133595088d7734b2da"}, ] -[[package]] -name = "scp" -version = "0.15.0" -description = "scp module for paramiko" -optional = false -python-versions = "*" -files = [ - {file = "scp-0.15.0-py2.py3-none-any.whl", hash = "sha256:9e7f721e5ac563c33eb0831d0f949c6342f1c28c3bdc3b02f39d77b5ea20df7e"}, - {file = "scp-0.15.0.tar.gz", hash = "sha256:f1b22e9932123ccf17eebf19e0953c6e9148f589f93d91b872941a696305c83f"}, -] - -[package.dependencies] -paramiko = "*" - [[package]] name = "setuptools" version = "75.3.0" @@ -4270,17 +3228,6 @@ files = [ {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, ] -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - [[package]] name = "social-auth-app-django" version = "5.4.2" @@ -4399,19 +3346,18 @@ files = [ ] [[package]] -name = "textfsm" -version = "1.1.3" -description = "Python module for parsing semi-structured text into python tables." +name = "to-json-schema" +version = "1.0.1" +description = "" optional = false python-versions = "*" files = [ - {file = "textfsm-1.1.3-py2.py3-none-any.whl", hash = "sha256:dcbeebc6a6137bed561c71a56344d752e6dbc04ae5ea309252cb70fb97ccc9cd"}, - {file = "textfsm-1.1.3.tar.gz", hash = "sha256:577ef278a9237f5341ae9b682947cefa4a2c1b24dbe486f94f2c95addc6504b5"}, + {file = "to_json_schema-1.0.1-py3-none-any.whl", hash = "sha256:5708663f1c81815e4ff01fce910ac32ee3964d0c6b3587fd4fff2e38d5c9aa7b"}, + {file = "to_json_schema-1.0.1.tar.gz", hash = "sha256:ec747bd5129256dd571105f66a7bc9a4546228cd5e5fbf5e06dc9776e255400e"}, ] -[package.dependencies] -future = "*" -six = "*" +[package.extras] +testing = ["pytest", "pytest-cov", "setuptools"] [[package]] name = "toml" @@ -4513,56 +3459,6 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] -[[package]] -name = "transitions" -version = "0.9.2" -description = "A lightweight, object-oriented Python state machine implementation with many extensions." -optional = false -python-versions = "*" -files = [ - {file = "transitions-0.9.2-py2.py3-none-any.whl", hash = "sha256:f7b40c9b4a93869f36c4d1c33809aeb18cdeeb065fd1adba018ee39c3db216f3"}, - {file = "transitions-0.9.2.tar.gz", hash = "sha256:2f8490dbdbd419366cef1516032ab06d07ccb5839ef54905e842a472692d4204"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -diagrams = ["pygraphviz"] -test = ["pytest"] - -[[package]] -name = "ttp" -version = "0.9.5" -description = "Template Text Parser" -optional = false -python-versions = ">=2.7,<4.0" -files = [ - {file = "ttp-0.9.5-py2.py3-none-any.whl", hash = "sha256:2c9fcf560b3f696e9fdd3554dc8e4622cbb10cac1d4fca13a7cf608c4a7fd137"}, - {file = "ttp-0.9.5.tar.gz", hash = "sha256:234414f4d3039d2d1cde09993f89f8db1b34d447f76c6a402555cefac2e59c4e"}, -] - -[package.extras] -docs = ["Sphinx (==4.3.0)", "readthedocs-sphinx-search (==0.1.1)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"] -full = ["cerberus (>=1.3.0,<1.4.0)", "deepdiff (>=5.8.0,<5.9.0)", "jinja2 (>=3.0.0,<3.1.0)", "n2g (>=0.2.0,<0.3.0)", "openpyxl (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)"] - -[[package]] -name = "ttp-templates" -version = "0.3.7" -description = "Template Text Parser Templates collections" -optional = false -python-versions = "<4.0,>=3.6" -files = [ - {file = "ttp_templates-0.3.7-py3-none-any.whl", hash = "sha256:2328304fb4c957ee60db6f301143e8a4556b22a12b3e2f30511e8ef97fc78f7e"}, - {file = "ttp_templates-0.3.7.tar.gz", hash = "sha256:f9103041a3683a0cb3811609ad990f679beadfc9a92c3e3fa05d6037414ad2bf"}, -] - -[package.dependencies] -ttp = ">=0.6.0" - -[package.extras] -docs = ["mkdocs (==1.2.4)", "mkdocs-material (==7.2.2)", "mkdocs-material-extensions (==1.0.1)", "mkdocstrings[python] (>=0.18.0,<0.19.0)", "pygments (==2.11)", "pymdown-extensions (==9.3)"] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -4598,19 +3494,20 @@ files = [ [[package]] name = "urllib3" -version = "1.26.20" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, - {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "vine" @@ -4801,20 +3698,6 @@ pyyaml = "*" [package.extras] dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] -[[package]] -name = "yamlordereddictloader" -version = "0.4.2" -description = "YAML loader and dumper for PyYAML allowing to keep keys order." -optional = false -python-versions = "*" -files = [ - {file = "yamlordereddictloader-0.4.2-py3-none-any.whl", hash = "sha256:dc048adb67026786cd24119bd71241f35bc8b0fd37d24b415c37bbc8049f9cd7"}, - {file = "yamlordereddictloader-0.4.2.tar.gz", hash = "sha256:36af2f6210fcff5da4fc4c12e1d815f973dceb41044e795e1f06115d634bca13"}, -] - -[package.dependencies] -pyyaml = "*" - [[package]] name = "zipp" version = "3.20.2" @@ -4840,4 +3723,4 @@ all = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.13" -content-hash = "4c234809ca69ce7c409b94934bbc84377e8b93bff549d7b4ee92a7f22ce424a0" +content-hash = "75ca2a31b5bd2e95328f05082d918a4be0086a40df1759699b2ab8408eaea55e" diff --git a/pyproject.toml b/pyproject.toml index 7ed49ef7..eeef9ce8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ mkdocs-material = "9.5.32" # Automatic documentation from sources, for MkDocs mkdocstrings = "0.25.2" mkdocstrings-python = "1.10.8" +mkdocs-autorefs = "1.2.0" griffe = "1.1.1" towncrier = "~23.6.0" # Used in integration tests From 6b8a68494bd84251eed37f099d89149592dca513 Mon Sep 17 00:00:00 2001 From: Stephen Kiely Date: Fri, 28 Feb 2025 22:15:26 -0600 Subject: [PATCH 22/31] Poetry lock and fix the change fragment filename. Using additional periods in the change fragment filename confuses Towncrier. --- ...ping => +nautobot-app-v2-4-2.housekeeping} | 0 poetry.lock | 1207 ++++++++++++++++- 2 files changed, 1174 insertions(+), 33 deletions(-) rename changes/{+nautobot-app-v2.4.2.housekeeping => +nautobot-app-v2-4-2.housekeeping} (100%) diff --git a/changes/+nautobot-app-v2.4.2.housekeeping b/changes/+nautobot-app-v2-4-2.housekeeping similarity index 100% rename from changes/+nautobot-app-v2.4.2.housekeeping rename to changes/+nautobot-app-v2-4-2.housekeeping diff --git a/poetry.lock b/poetry.lock index 101bfb02..e6446ff1 100644 --- a/poetry.lock +++ b/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 1.8.2 and should not be changed by hand. [[package]] name = "amqp" @@ -25,6 +25,42 @@ files = [ {file = "aniso8601-7.0.0.tar.gz", hash = "sha256:513d2b6637b7853806ae79ffaca6f3e8754bdd547048f5ccc1420aec4b714f1e"}, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + +[[package]] +name = "anyio" +version = "4.5.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + [[package]] name = "appnope" version = "0.1.4" @@ -206,6 +242,70 @@ tzdata = {version = "*", optional = true, markers = "extra == \"tzdata\""} [package.extras] tzdata = ["tzdata"] +[[package]] +name = "bcrypt" +version = "4.3.0" +description = "Modern password hashing for your software and your servers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "bcrypt-4.3.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f01e060f14b6b57bbb72fc5b4a83ac21c443c9a2ee708e04a10e9192f90a6281"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5eeac541cefd0bb887a371ef73c62c3cd78535e4887b310626036a7c0a817bb"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59e1aa0e2cd871b08ca146ed08445038f42ff75968c7ae50d2fdd7860ade2180"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:0042b2e342e9ae3d2ed22727c1262f76cc4f345683b5c1715f0250cf4277294f"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74a8d21a09f5e025a9a23e7c0fd2c7fe8e7503e4d356c0a2c1486ba010619f09"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:0142b2cb84a009f8452c8c5a33ace5e3dfec4159e7735f5afe9a4d50a8ea722d"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:12fa6ce40cde3f0b899729dbd7d5e8811cb892d31b6f7d0334a1f37748b789fd"}, + {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:5bd3cca1f2aa5dbcf39e2aa13dd094ea181f48959e1071265de49cc2b82525af"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:335a420cfd63fc5bc27308e929bee231c15c85cc4c496610ffb17923abf7f231"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:0e30e5e67aed0187a1764911af023043b4542e70a7461ad20e837e94d23e1d6c"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b8d62290ebefd49ee0b3ce7500f5dbdcf13b81402c05f6dafab9a1e1b27212f"}, + {file = "bcrypt-4.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef6630e0ec01376f59a006dc72918b1bf436c3b571b80fa1968d775fa02fe7d"}, + {file = "bcrypt-4.3.0-cp313-cp313t-win32.whl", hash = "sha256:7a4be4cbf241afee43f1c3969b9103a41b40bcb3a3f467ab19f891d9bc4642e4"}, + {file = "bcrypt-4.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c1949bf259a388863ced887c7861da1df681cb2388645766c89fdfd9004c669"}, + {file = "bcrypt-4.3.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:f81b0ed2639568bf14749112298f9e4e2b28853dab50a8b357e31798686a036d"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:864f8f19adbe13b7de11ba15d85d4a428c7e2f344bac110f667676a0ff84924b"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e36506d001e93bffe59754397572f21bb5dc7c83f54454c990c74a468cd589e"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:842d08d75d9fe9fb94b18b071090220697f9f184d4547179b60734846461ed59"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7c03296b85cb87db865d91da79bf63d5609284fc0cab9472fdd8367bbd830753"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:62f26585e8b219cdc909b6a0069efc5e4267e25d4a3770a364ac58024f62a761"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:beeefe437218a65322fbd0069eb437e7c98137e08f22c4660ac2dc795c31f8bb"}, + {file = "bcrypt-4.3.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:97eea7408db3a5bcce4a55d13245ab3fa566e23b4c67cd227062bb49e26c585d"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:191354ebfe305e84f344c5964c7cd5f924a3bfc5d405c75ad07f232b6dffb49f"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:41261d64150858eeb5ff43c753c4b216991e0ae16614a308a15d909503617732"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:33752b1ba962ee793fa2b6321404bf20011fe45b9afd2a842139de3011898fef"}, + {file = "bcrypt-4.3.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:50e6e80a4bfd23a25f5c05b90167c19030cf9f87930f7cb2eacb99f45d1c3304"}, + {file = "bcrypt-4.3.0-cp38-abi3-win32.whl", hash = "sha256:67a561c4d9fb9465ec866177e7aebcad08fe23aaf6fbd692a6fab69088abfc51"}, + {file = "bcrypt-4.3.0-cp38-abi3-win_amd64.whl", hash = "sha256:584027857bc2843772114717a7490a37f68da563b3620f78a849bcb54dc11e62"}, + {file = "bcrypt-4.3.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d3efb1157edebfd9128e4e46e2ac1a64e0c1fe46fb023158a407c7892b0f8c3"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08bacc884fd302b611226c01014eca277d48f0a05187666bca23aac0dad6fe24"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6746e6fec103fcd509b96bacdfdaa2fbde9a553245dbada284435173a6f1aef"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:afe327968aaf13fc143a56a3360cb27d4ad0345e34da12c7290f1b00b8fe9a8b"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d9af79d322e735b1fc33404b5765108ae0ff232d4b54666d46730f8ac1a43676"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f1e3ffa1365e8702dc48c8b360fef8d7afeca482809c5e45e653af82ccd088c1"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3004df1b323d10021fda07a813fd33e0fd57bef0e9a480bb143877f6cba996fe"}, + {file = "bcrypt-4.3.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:531457e5c839d8caea9b589a1bcfe3756b0547d7814e9ce3d437f17da75c32b0"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:17a854d9a7a476a89dcef6c8bd119ad23e0f82557afbd2c442777a16408e614f"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6fb1fd3ab08c0cbc6826a2e0447610c6f09e983a281b919ed721ad32236b8b23"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e965a9c1e9a393b8005031ff52583cedc15b7884fce7deb8b0346388837d6cfe"}, + {file = "bcrypt-4.3.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:79e70b8342a33b52b55d93b3a59223a844962bef479f6a0ea318ebbcadf71505"}, + {file = "bcrypt-4.3.0-cp39-abi3-win32.whl", hash = "sha256:b4d4e57f0a63fd0b358eb765063ff661328f69a04494427265950c71b992a39a"}, + {file = "bcrypt-4.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c950d682f0952bafcceaf709761da0a32a942272fad381081b51096ffa46cea1"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:107d53b5c67e0bbc3f03ebf5b030e0403d24dda980f8e244795335ba7b4a027d"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b693dbb82b3c27a1604a3dff5bfc5418a7e6a781bb795288141e5f80cf3a3492"}, + {file = "bcrypt-4.3.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:b6354d3760fcd31994a14c89659dee887f1351a06e5dac3c1142307172a79f90"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a839320bf27d474e52ef8cb16449bb2ce0ba03ca9f44daba6d93fa1d8828e48a"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bdc6a24e754a555d7316fa4774e64c6c3997d27ed2d1964d55920c7c227bc4ce"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:55a935b8e9a1d2def0626c4269db3fcd26728cbff1e84f0341465c31c4ee56d8"}, + {file = "bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57967b7a28d855313a963aaea51bf6df89f833db4320da458e5b3c5ab6d4c938"}, + {file = "bcrypt-4.3.0.tar.gz", hash = "sha256:3a3fd2204178b6d2adcf09cb4f6426ffef54762577a7c9b54c159008cb288c18"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + [[package]] name = "billiard" version = "4.2.1" @@ -713,6 +813,24 @@ files = [ {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, ] +[[package]] +name = "deepdiff" +version = "6.7.1" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.7" +files = [ + {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, + {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, +] + +[package.dependencies] +ordered-set = ">=4.0.2,<4.2.0" + +[package.extras] +cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] +optimize = ["orjson"] + [[package]] name = "defusedxml" version = "0.7.1" @@ -724,6 +842,37 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "detect" +version = "2020.12.3" +description = "detect OS and Python versions" +optional = false +python-versions = "*" +files = [ + {file = "detect-2020.12.3.tar.gz", hash = "sha256:eecd6c41c17072b4db8dbfa850d979bda40b33b4f349ab4378205bceb74d712e"}, +] + +[[package]] +name = "diffsync" +version = "2.0.1" +description = "Library to easily sync/diff/update 2 different data sources" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "diffsync-2.0.1-py3-none-any.whl", hash = "sha256:c375139d2d0c060106ef4f724044bd70ec03296f90255cd41831946e0544a585"}, + {file = "diffsync-2.0.1.tar.gz", hash = "sha256:7f6fe7705b0669f0249b18c97231b74bdfa2530117ad98f3b79a563c07ff7728"}, +] + +[package.dependencies] +colorama = ">=0.4.3,<0.5.0" +packaging = ">=21.3,<24.0" +pydantic = ">=2.0.0,<3.0.0" +structlog = ">=20.1.0" +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +redis = ["redis (>=4.3,<5.0)"] + [[package]] name = "dill" version = "0.3.9" @@ -1212,6 +1361,20 @@ typing-extensions = ">=4.7.0" [package.extras] dev = ["coverage", "pytest (>=7.4.4)"] +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "executing" version = "2.2.0" @@ -1226,6 +1389,41 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +[[package]] +name = "fakenos" +version = "1.1.0" +description = "Fake Network Operating System" +optional = false +python-versions = ">=3.8,<3.13" +files = [] +develop = false + +[package.dependencies] +detect = "2020.12.*" +paramiko = "<4.0" +pydantic = "<3.0" +pyyaml = "<7.0" + +[package.extras] +test = [] + +[package.source] +type = "git" +url = "https://github.com/fakenos/fakenos" +reference = "master" +resolved_reference = "b465bc28b478cf72582191ee77eb8e968864a0da" + +[[package]] +name = "future" +version = "1.0.0" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -1393,6 +1591,62 @@ files = [ astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "idna" version = "3.10" @@ -1409,26 +1663,22 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "importlib-metadata" -version = "8.5.0" +version = "4.13.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, - {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, ] [package.dependencies] -zipp = ">=3.20" +zipp = ">=0.5" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "importlib-resources" @@ -1545,6 +1795,21 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] +[[package]] +name = "jdiff" +version = "0.0.6" +description = "A light-weight library to compare structured output from network devices show commands." +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "jdiff-0.0.6-py3-none-any.whl", hash = "sha256:346798820be11ae2485ce2a29eb9a9cc0ddaa23388319566d367be18730cbaa8"}, + {file = "jdiff-0.0.6.tar.gz", hash = "sha256:b42d26947d24fe7c297c8e3d38709b6e78823a41dcf50417d6be916d7d49be45"}, +] + +[package.dependencies] +deepdiff = ">=5.5.0,<7.0" +jmespath = ">=1.0.1,<2.0.0" + [[package]] name = "jedi" version = "0.19.2" @@ -1581,6 +1846,17 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + [[package]] name = "jsonschema" version = "4.23.0" @@ -1619,6 +1895,29 @@ files = [ importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} referencing = ">=0.31.0" +[[package]] +name = "junos-eznc" +version = "2.7.1" +description = "Junos 'EZ' automation for non-programmers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "junos-eznc-2.7.1.tar.gz", hash = "sha256:371f0298bf03e0cb4c017c43f6f4122263584eda0d690d0112e93f13daae41ac"}, + {file = "junos_eznc-2.7.1-py3-none-any.whl", hash = "sha256:8a7918faa8f0570341cac64c1210c1cd3e3542162d1e7449c3364f8d805716b2"}, +] + +[package.dependencies] +jinja2 = ">=2.7.1" +lxml = ">=3.2.4" +ncclient = ">=0.6.15" +pyparsing = "*" +pyserial = "*" +PyYAML = ">=5.1" +scp = ">=0.7.0" +six = "*" +transitions = "*" +yamlordereddictloader = "*" + [[package]] name = "kombu" version = "5.4.2" @@ -1700,6 +1999,160 @@ files = [ {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] +[[package]] +name = "lxml" +version = "5.3.1" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4058f16cee694577f7e4dd410263cd0ef75644b43802a689c2b3c2a7e69453b"}, + {file = "lxml-5.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:364de8f57d6eda0c16dcfb999af902da31396949efa0e583e12675d09709881b"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:528f3a0498a8edc69af0559bdcf8a9f5a8bf7c00051a6ef3141fdcf27017bbf5"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4743e30d6f5f92b6d2b7c86b3ad250e0bad8dee4b7ad8a0c44bfb276af89a3"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17b5d7f8acf809465086d498d62a981fa6a56d2718135bb0e4aa48c502055f5c"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:928e75a7200a4c09e6efc7482a1337919cc61fe1ba289f297827a5b76d8969c2"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a997b784a639e05b9d4053ef3b20c7e447ea80814a762f25b8ed5a89d261eac"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7b82e67c5feb682dbb559c3e6b78355f234943053af61606af126df2183b9ef9"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:f1de541a9893cf8a1b1db9bf0bf670a2decab42e3e82233d36a74eda7822b4c9"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:de1fc314c3ad6bc2f6bd5b5a5b9357b8c6896333d27fdbb7049aea8bd5af2d79"}, + {file = "lxml-5.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7c0536bd9178f754b277a3e53f90f9c9454a3bd108b1531ffff720e082d824f2"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68018c4c67d7e89951a91fbd371e2e34cd8cfc71f0bb43b5332db38497025d51"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa826340a609d0c954ba52fd831f0fba2a4165659ab0ee1a15e4aac21f302406"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:796520afa499732191e39fc95b56a3b07f95256f2d22b1c26e217fb69a9db5b5"}, + {file = "lxml-5.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3effe081b3135237da6e4c4530ff2a868d3f80be0bda027e118a5971285d42d0"}, + {file = "lxml-5.3.1-cp310-cp310-win32.whl", hash = "sha256:a22f66270bd6d0804b02cd49dae2b33d4341015545d17f8426f2c4e22f557a23"}, + {file = "lxml-5.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:0bcfadea3cdc68e678d2b20cb16a16716887dd00a881e16f7d806c2138b8ff0c"}, + {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e220f7b3e8656ab063d2eb0cd536fafef396829cafe04cb314e734f87649058f"}, + {file = "lxml-5.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f2cfae0688fd01f7056a17367e3b84f37c545fb447d7282cf2c242b16262607"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67d2f8ad9dcc3a9e826bdc7802ed541a44e124c29b7d95a679eeb58c1c14ade8"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db0c742aad702fd5d0c6611a73f9602f20aec2007c102630c06d7633d9c8f09a"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:198bb4b4dd888e8390afa4f170d4fa28467a7eaf857f1952589f16cfbb67af27"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2a3e412ce1849be34b45922bfef03df32d1410a06d1cdeb793a343c2f1fd666"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8969dbc8d09d9cd2ae06362c3bad27d03f433252601ef658a49bd9f2b22d79"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5be8f5e4044146a69c96077c7e08f0709c13a314aa5315981185c1f00235fe65"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:133f3493253a00db2c870d3740bc458ebb7d937bd0a6a4f9328373e0db305709"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:52d82b0d436edd6a1d22d94a344b9a58abd6c68c357ed44f22d4ba8179b37629"}, + {file = "lxml-5.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b6f92e35e2658a5ed51c6634ceb5ddae32053182851d8cad2a5bc102a359b33"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:203b1d3eaebd34277be06a3eb880050f18a4e4d60861efba4fb946e31071a295"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:155e1a5693cf4b55af652f5c0f78ef36596c7f680ff3ec6eb4d7d85367259b2c"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22ec2b3c191f43ed21f9545e9df94c37c6b49a5af0a874008ddc9132d49a2d9c"}, + {file = "lxml-5.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7eda194dd46e40ec745bf76795a7cccb02a6a41f445ad49d3cf66518b0bd9cff"}, + {file = "lxml-5.3.1-cp311-cp311-win32.whl", hash = "sha256:fb7c61d4be18e930f75948705e9718618862e6fc2ed0d7159b2262be73f167a2"}, + {file = "lxml-5.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c809eef167bf4a57af4b03007004896f5c60bd38dc3852fcd97a26eae3d4c9e6"}, + {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e69add9b6b7b08c60d7ff0152c7c9a6c45b4a71a919be5abde6f98f1ea16421c"}, + {file = "lxml-5.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e52e1b148867b01c05e21837586ee307a01e793b94072d7c7b91d2c2da02ffe"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4b382e0e636ed54cd278791d93fe2c4f370772743f02bcbe431a160089025c9"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e49dc23a10a1296b04ca9db200c44d3eb32c8d8ec532e8c1fd24792276522a"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4399b4226c4785575fb20998dc571bc48125dc92c367ce2602d0d70e0c455eb0"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5412500e0dc5481b1ee9cf6b38bb3b473f6e411eb62b83dc9b62699c3b7b79f7"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c93ed3c998ea8472be98fb55aed65b5198740bfceaec07b2eba551e55b7b9ae"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:63d57fc94eb0bbb4735e45517afc21ef262991d8758a8f2f05dd6e4174944519"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:b450d7cabcd49aa7ab46a3c6aa3ac7e1593600a1a0605ba536ec0f1b99a04322"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:4df0ec814b50275ad6a99bc82a38b59f90e10e47714ac9871e1b223895825468"}, + {file = "lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d184f85ad2bb1f261eac55cddfcf62a70dee89982c978e92b9a74a1bfef2e367"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b725e70d15906d24615201e650d5b0388b08a5187a55f119f25874d0103f90dd"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a31fa7536ec1fb7155a0cd3a4e3d956c835ad0a43e3610ca32384d01f079ea1c"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c3c8b55c7fc7b7e8877b9366568cc73d68b82da7fe33d8b98527b73857a225f"}, + {file = "lxml-5.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d61ec60945d694df806a9aec88e8f29a27293c6e424f8ff91c80416e3c617645"}, + {file = "lxml-5.3.1-cp312-cp312-win32.whl", hash = "sha256:f4eac0584cdc3285ef2e74eee1513a6001681fd9753b259e8159421ed28a72e5"}, + {file = "lxml-5.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:29bfc8d3d88e56ea0a27e7c4897b642706840247f59f4377d81be8f32aa0cfbf"}, + {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c093c7088b40d8266f57ed71d93112bd64c6724d31f0794c1e52cc4857c28e0e"}, + {file = "lxml-5.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0884e3f22d87c30694e625b1e62e6f30d39782c806287450d9dc2fdf07692fd"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1637fa31ec682cd5760092adfabe86d9b718a75d43e65e211d5931809bc111e7"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a364e8e944d92dcbf33b6b494d4e0fb3499dcc3bd9485beb701aa4b4201fa414"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:779e851fd0e19795ccc8a9bb4d705d6baa0ef475329fe44a13cf1e962f18ff1e"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4393600915c308e546dc7003d74371744234e8444a28622d76fe19b98fa59d1"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:673b9d8e780f455091200bba8534d5f4f465944cbdd61f31dc832d70e29064a5"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2e4a570f6a99e96c457f7bec5ad459c9c420ee80b99eb04cbfcfe3fc18ec6423"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:71f31eda4e370f46af42fc9f264fafa1b09f46ba07bdbee98f25689a04b81c20"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:42978a68d3825eaac55399eb37a4d52012a205c0c6262199b8b44fcc6fd686e8"}, + {file = "lxml-5.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8b1942b3e4ed9ed551ed3083a2e6e0772de1e5e3aca872d955e2e86385fb7ff9"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85c4f11be9cf08917ac2a5a8b6e1ef63b2f8e3799cec194417e76826e5f1de9c"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:231cf4d140b22a923b1d0a0a4e0b4f972e5893efcdec188934cc65888fd0227b"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5865b270b420eda7b68928d70bb517ccbe045e53b1a428129bb44372bf3d7dd5"}, + {file = "lxml-5.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7bebc2275016cddf3c997bf8a0f7044160714c64a9b83975670a04e6d2252"}, + {file = "lxml-5.3.1-cp313-cp313-win32.whl", hash = "sha256:d0751528b97d2b19a388b302be2a0ee05817097bab46ff0ed76feeec24951f78"}, + {file = "lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332"}, + {file = "lxml-5.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:016b96c58e9a4528219bb563acf1aaaa8bc5452e7651004894a973f03b84ba81"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82a4bb10b0beef1434fb23a09f001ab5ca87895596b4581fd53f1e5145a8934a"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d68eeef7b4d08a25e51897dac29bcb62aba830e9ac6c4e3297ee7c6a0cf6439"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:f12582b8d3b4c6be1d298c49cb7ae64a3a73efaf4c2ab4e37db182e3545815ac"}, + {file = "lxml-5.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2df7ed5edeb6bd5590914cd61df76eb6cce9d590ed04ec7c183cf5509f73530d"}, + {file = "lxml-5.3.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:585c4dc429deebc4307187d2b71ebe914843185ae16a4d582ee030e6cfbb4d8a"}, + {file = "lxml-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:06a20d607a86fccab2fc15a77aa445f2bdef7b49ec0520a842c5c5afd8381576"}, + {file = "lxml-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:057e30d0012439bc54ca427a83d458752ccda725c1c161cc283db07bcad43cf9"}, + {file = "lxml-5.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4867361c049761a56bd21de507cab2c2a608c55102311d142ade7dab67b34f32"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dddf0fb832486cc1ea71d189cb92eb887826e8deebe128884e15020bb6e3f61"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bcc211542f7af6f2dfb705f5f8b74e865592778e6cafdfd19c792c244ccce19"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaca5a812f050ab55426c32177091130b1e49329b3f002a32934cd0245571307"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:236610b77589faf462337b3305a1be91756c8abc5a45ff7ca8f245a71c5dab70"}, + {file = "lxml-5.3.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:aed57b541b589fa05ac248f4cb1c46cbb432ab82cbd467d1c4f6a2bdc18aecf9"}, + {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:75fa3d6946d317ffc7016a6fcc44f42db6d514b7fdb8b4b28cbe058303cb6e53"}, + {file = "lxml-5.3.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:96eef5b9f336f623ffc555ab47a775495e7e8846dde88de5f941e2906453a1ce"}, + {file = "lxml-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:ef45f31aec9be01379fc6c10f1d9c677f032f2bac9383c827d44f620e8a88407"}, + {file = "lxml-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0611da6b07dd3720f492db1b463a4d1175b096b49438761cc9f35f0d9eaaef5"}, + {file = "lxml-5.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2aca14c235c7a08558fe0a4786a1a05873a01e86b474dfa8f6df49101853a4e"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82fce1d964f065c32c9517309f0c7be588772352d2f40b1574a214bd6e6098"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7aae7a3d63b935babfdc6864b31196afd5145878ddd22f5200729006366bc4d5"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8e0d177b1fe251c3b1b914ab64135475c5273c8cfd2857964b2e3bb0fe196a7"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:6c4dd3bfd0c82400060896717dd261137398edb7e524527438c54a8c34f736bf"}, + {file = "lxml-5.3.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f1208c1c67ec9e151d78aa3435aa9b08a488b53d9cfac9b699f15255a3461ef2"}, + {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c6aacf00d05b38a5069826e50ae72751cb5bc27bdc4d5746203988e429b385bb"}, + {file = "lxml-5.3.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5881aaa4bf3a2d086c5f20371d3a5856199a0d8ac72dd8d0dbd7a2ecfc26ab73"}, + {file = "lxml-5.3.1-cp38-cp38-win32.whl", hash = "sha256:45fbb70ccbc8683f2fb58bea89498a7274af1d9ec7995e9f4af5604e028233fc"}, + {file = "lxml-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:7512b4d0fc5339d5abbb14d1843f70499cab90d0b864f790e73f780f041615d7"}, + {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5885bc586f1edb48e5d68e7a4b4757b5feb2a496b64f462b4d65950f5af3364f"}, + {file = "lxml-5.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1b92fe86e04f680b848fff594a908edfa72b31bfc3499ef7433790c11d4c8cd8"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a091026c3bf7519ab1e64655a3f52a59ad4a4e019a6f830c24d6430695b1cf6a"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ffb141361108e864ab5f1813f66e4e1164181227f9b1f105b042729b6c15125"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3715cdf0dd31b836433af9ee9197af10e3df41d273c19bb249230043667a5dfd"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88b72eb7222d918c967202024812c2bfb4048deeb69ca328363fb8e15254c549"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa59974880ab5ad8ef3afaa26f9bda148c5f39e06b11a8ada4660ecc9fb2feb3"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3bb8149840daf2c3f97cebf00e4ed4a65a0baff888bf2605a8d0135ff5cf764e"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:0d6b2fa86becfa81f0a0271ccb9eb127ad45fb597733a77b92e8a35e53414914"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:136bf638d92848a939fd8f0e06fcf92d9f2e4b57969d94faae27c55f3d85c05b"}, + {file = "lxml-5.3.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:89934f9f791566e54c1d92cdc8f8fd0009447a5ecdb1ec6b810d5f8c4955f6be"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8ade0363f776f87f982572c2860cc43c65ace208db49c76df0a21dde4ddd16e"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfbbab9316330cf81656fed435311386610f78b6c93cc5db4bebbce8dd146675"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:172d65f7c72a35a6879217bcdb4bb11bc88d55fb4879e7569f55616062d387c2"}, + {file = "lxml-5.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3c623923967f3e5961d272718655946e5322b8d058e094764180cdee7bab1af"}, + {file = "lxml-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ce0930a963ff593e8bb6fda49a503911accc67dee7e5445eec972668e672a0f0"}, + {file = "lxml-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:f7b64fcd670bca8800bc10ced36620c6bbb321e7bc1214b9c0c0df269c1dddc2"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:afa578b6524ff85fb365f454cf61683771d0170470c48ad9d170c48075f86725"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f5e80adf0aafc7b5454f2c1cb0cde920c9b1f2cbd0485f07cc1d0497c35c5d"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd0b80ac2d8f13ffc906123a6f20b459cb50a99222d0da492360512f3e50f84"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:422c179022ecdedbe58b0e242607198580804253da220e9454ffe848daa1cfd2"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:524ccfded8989a6595dbdda80d779fb977dbc9a7bc458864fc9a0c2fc15dc877"}, + {file = "lxml-5.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:48fd46bf7155def2e15287c6f2b133a2f78e2d22cdf55647269977b873c65499"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:05123fad495a429f123307ac6d8fd6f977b71e9a0b6d9aeeb8f80c017cb17131"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a243132767150a44e6a93cd1dde41010036e1cbc63cc3e9fe1712b277d926ce3"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c92ea6d9dd84a750b2bae72ff5e8cf5fdd13e58dda79c33e057862c29a8d5b50"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2f1be45d4c15f237209bbf123a0e05b5d630c8717c42f59f31ea9eae2ad89394"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a83d3adea1e0ee36dac34627f78ddd7f093bb9cfc0a8e97f1572a949b695cb98"}, + {file = "lxml-5.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3edbb9c9130bac05d8c3fe150c51c337a471cc7fdb6d2a0a7d3a88e88a829314"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2f23cf50eccb3255b6e913188291af0150d89dab44137a69e14e4dcb7be981f1"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7e5edac4778127f2bf452e0721a58a1cfa4d1d9eac63bdd650535eb8543615"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:094b28ed8a8a072b9e9e2113a81fda668d2053f2ca9f2d202c2c8c7c2d6516b1"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:514fe78fc4b87e7a7601c92492210b20a1b0c6ab20e71e81307d9c2e377c64de"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8fffc08de02071c37865a155e5ea5fce0282e1546fd5bde7f6149fcaa32558ac"}, + {file = "lxml-5.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4b0d5cdba1b655d5b18042ac9c9ff50bda33568eb80feaaca4fc237b9c4fbfde"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3031e4c16b59424e8d78522c69b062d301d951dc55ad8685736c3335a97fc270"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb659702a45136c743bc130760c6f137870d4df3a9e14386478b8a0511abcfca"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a11b16a33656ffc43c92a5343a28dc71eefe460bcc2a4923a96f292692709f6"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c5ae125276f254b01daa73e2c103363d3e99e3e10505686ac7d9d2442dd4627a"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76722b5ed4a31ba103e0dc77ab869222ec36efe1a614e42e9bcea88a36186fe"}, + {file = "lxml-5.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:33e06717c00c788ab4e79bc4726ecc50c54b9bfb55355eae21473c145d83c2d2"}, + {file = "lxml-5.3.1.tar.gz", hash = "sha256:106b7b5d2977b339f1e97efe2778e2ab20e99994cbb0ec5e55771ed0795920c8"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml_html_clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.11,<3.1.0)"] + [[package]] name = "markdown" version = "3.6" @@ -1984,6 +2437,49 @@ files = [ griffe = ">=0.49" mkdocstrings = ">=0.25" +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "napalm" +version = "4.1.0" +description = "Network Automation and Programmability Abstraction Layer with Multivendor support" +optional = false +python-versions = "*" +files = [ + {file = "napalm-4.1.0-py2.py3-none-any.whl", hash = "sha256:14a5b7759a0247a26fff2c444b1cfc150a08224de8addf4076c384845285bf5b"}, + {file = "napalm-4.1.0.tar.gz", hash = "sha256:3b3e18efd556861c056ba509eb46f5ffc9e3e6c42db399fa76b6ea9af272c17a"}, +] + +[package.dependencies] +cffi = ">=1.11.3" +future = "*" +jinja2 = "*" +junos-eznc = ">=2.6.3" +lxml = ">=4.3.0" +ncclient = "*" +netaddr = "*" +netmiko = ">=4.1.0" +netutils = ">=1.0.0" +paramiko = ">=2.6.0" +pyeapi = ">=0.8.2" +pyYAML = "*" +requests = ">=2.7.0" +scp = "*" +setuptools = ">=38.4.0" +textfsm = "*" +ttp = "*" +ttp-templates = "*" +typing-extensions = ">=4.3.0" + [[package]] name = "nautobot" version = "2.3.16" @@ -2053,6 +2549,71 @@ napalm = ["napalm (>=4.1.0,<6.0.0)"] remote-storage = ["django-storages (==1.14.3)"] sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] +[[package]] +name = "nautobot-plugin-nornir" +version = "2.2.0" +description = "Nautobot App that provides a shim layer to simplify using Nornir within other Nautobot Apps and Nautobot Jobs" +optional = false +python-versions = "<3.13,>=3.8" +files = [ + {file = "nautobot_plugin_nornir-2.2.0-py3-none-any.whl", hash = "sha256:28f963d0199dbf826f8e58f158876a95ddab6650912f0a72ced4cd051de5cc5e"}, + {file = "nautobot_plugin_nornir-2.2.0.tar.gz", hash = "sha256:5acb40adea89c437ec3fc0784ac75ad9a1590eec62d740e3cd21d0170bd077c9"}, +] + +[package.dependencies] +nautobot = ">=2.0.0,<3.0.0" +netutils = ">=1.6.0" +nornir-nautobot = ">=3.0.0,<4.0.0" + +[[package]] +name = "nautobot-ssot" +version = "3.5.0" +description = "Nautobot Single Source of Truth" +optional = false +python-versions = "<3.13,>=3.8" +files = [ + {file = "nautobot_ssot-3.5.0-py3-none-any.whl", hash = "sha256:a20801c4e04bc65268de7e95f746a66d0c1739d85237658aa7c3fa628478d3a6"}, + {file = "nautobot_ssot-3.5.0.tar.gz", hash = "sha256:a5f26df1730863c78996ab4a8c7ba97ebf85d5121717b659690bb27312841405"}, +] + +[package.dependencies] +diffsync = ">=2.0.0,<3.0.0" +Markdown = "!=3.3.5" +nautobot = ">=2.1.0,<3.0.0" +packaging = ">=21.3,<24" +prometheus-client = ">=0.17.1" +retry = ">=0.9.2,<0.10.0" + +[package.extras] +aci = ["PyYAML (>=6)"] +all = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)", "dnacentersdk (>=2.5.6,<3.0.0)", "dnspython (>=2.1.0,<3.0.0)", "ijson (>=2.5.1)", "ipfabric (>=6.0.0,<7.0.0)", "meraki (>=1.37.2,<1.46.0)", "nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)", "netutils (>=1.9.0,<2.0.0)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)", "slurpit-sdk (>=0.9.58,<0.10.0)", "urllib3 (>=2.2.3)"] +aristacv = ["cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)"] +bootstrap = ["pytz (>=2019.3)"] +citrix-adm = ["netutils (>=1.9.0,<2.0.0)", "requests (>=2.21.0)", "urllib3 (>=2.2.3)"] +device42 = ["requests (>=2.21.0)"] +dna-center = ["dnacentersdk (>=2.5.6,<3.0.0)", "netutils (>=1.9.0,<2.0.0)"] +infoblox = ["dnspython (>=2.1.0,<3.0.0)"] +ipfabric = ["httpx (>=0.23.3)", "ipfabric (>=6.0.0,<7.0.0)", "netutils (>=1.9.0,<2.0.0)"] +meraki = ["meraki (>=1.37.2,<1.46.0)"] +nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)"] +pysnow = ["ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] +servicenow = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] +slurpit = ["slurpit-sdk (>=0.9.58,<0.10.0)"] + +[[package]] +name = "ncclient" +version = "0.6.17" +description = "Python library for NETCONF clients" +optional = false +python-versions = ">=3.5" +files = [ + {file = "ncclient-0.6.17.tar.gz", hash = "sha256:cc8eb9d4e0abf0ae715fbc95d365e2fb39347a188f828d5e84ceb7444df10b02"}, +] + +[package.dependencies] +lxml = ">=3.3.0" +paramiko = ">=1.15.0" + [[package]] name = "netaddr" version = "1.3.0" @@ -2067,6 +2628,27 @@ files = [ [package.extras] nicer-shell = ["ipython"] +[[package]] +name = "netmiko" +version = "4.4.0" +description = "Multi-vendor library to simplify legacy CLI connections to network devices" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "netmiko-4.4.0-py3-none-any.whl", hash = "sha256:2ff4683f013fac0f80715286c7d3250e89166aefc4421cb75d3ff483f2ebbbc0"}, + {file = "netmiko-4.4.0.tar.gz", hash = "sha256:25ff1237976aa3ff2cacf04949314638c899220a1675bd029e31b07ce20ce3b6"}, +] + +[package.dependencies] +cffi = ">=1.17.0rc1" +ntc-templates = ">=3.1.0" +paramiko = ">=2.9.5" +pyserial = ">=3.3" +pyyaml = ">=5.3" +scp = ">=0.13.6" +setuptools = ">=65.0.0" +textfsm = ">=1.1.3" + [[package]] name = "netutils" version = "1.12.0" @@ -2114,6 +2696,120 @@ files = [ {file = "nh3-0.2.21.tar.gz", hash = "sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e"}, ] +[[package]] +name = "nornir" +version = "3.4.1" +description = "Pluggable multi-threaded framework with inventory management to help operate collections of devices" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "nornir-3.4.1-py3-none-any.whl", hash = "sha256:db079cb95e3baf855530f4f40cb6ee93f93e1bf3cb74ac08180546adb1b987b8"}, + {file = "nornir-3.4.1.tar.gz", hash = "sha256:82a90a3478a3890bef8ad51b256fa966e6e4ca326cbe20a230918ef907cf68c3"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4,<5", markers = "python_version < \"3.10\""} +mypy_extensions = ">=1.0.0,<2.0.0" +"ruamel.yaml" = ">=0.17" + +[[package]] +name = "nornir-jinja2" +version = "0.2.0" +description = "Jinja2 plugins for nornir" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "nornir_jinja2-0.2.0-py3-none-any.whl", hash = "sha256:0c446bec7a8492923d4eb9ca00fb327603b41bc35d5f0112843c048737b506b1"}, + {file = "nornir_jinja2-0.2.0.tar.gz", hash = "sha256:9ee5e725fe5543dcba4ec8b976804e9e88ecd356ea3b62bad97578cea0de1f75"}, +] + +[package.dependencies] +jinja2 = ">=2.11.2,<4" +nornir = ">=3,<4" + +[[package]] +name = "nornir-napalm" +version = "0.4.0" +description = "NAPALM's plugins for nornir" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "nornir_napalm-0.4.0-py3-none-any.whl", hash = "sha256:20a41499aecf9c4e41181b18a73b2ee3ab7763824645ac0eb80abb3973a5f17e"}, + {file = "nornir_napalm-0.4.0.tar.gz", hash = "sha256:84e0711ccbdf24bdb228042ab530bf688d6b2b8f12c65fa3cb73499c6974a9de"}, +] + +[package.dependencies] +napalm = ">=4,<5" +nornir = ">=3,<4" + +[[package]] +name = "nornir-nautobot" +version = "3.2.0" +description = "Nornir Nautobot" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "nornir_nautobot-3.2.0-py3-none-any.whl", hash = "sha256:ed0ac258eebd2e3072f1d7a0c1f964965e7c9bf8c744290bb5ea04d5800b0ef4"}, + {file = "nornir_nautobot-3.2.0.tar.gz", hash = "sha256:087ad3f6b37112e2a4ff4be64a3b5bfbddfae22057c182e57fae7084850d3d63"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<=0.27.0" +netutils = ">=1.6.0,<2.0.0" +nornir = ">=3.0.0,<4.0.0" +nornir-jinja2 = ">=0.2.0,<0.3.0" +nornir-napalm = ">=0.4.0,<1.0.0" +nornir-netmiko = ">=1,<2" +nornir-utils = ">=0,<1" +pynautobot = ">=2.0.2" +requests = ">=2.25.1,<3.0.0" + +[package.extras] +mikrotik-driver = ["routeros-api (>=0.17.0,<0.18.0)"] + +[[package]] +name = "nornir-netmiko" +version = "1.0.1" +description = "Netmiko's plugins for Nornir" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "nornir_netmiko-1.0.1-py3-none-any.whl", hash = "sha256:eaee2944ad386b40c0719e8ac393ac63d531f44fb9a07d660bae7de430f12834"}, + {file = "nornir_netmiko-1.0.1.tar.gz", hash = "sha256:498546df001e0e499f10c5646d1356e361ccbb165b1335b89cfe8f19765e24d7"}, +] + +[package.dependencies] +netmiko = ">=4.0.0,<5.0.0" + +[[package]] +name = "nornir-utils" +version = "0.2.0" +description = "Collection of plugins and functions for nornir that don't require external dependencies" +optional = false +python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "nornir_utils-0.2.0-py3-none-any.whl", hash = "sha256:b4c430793a74f03affd5ff2d90abc8c67a28c7ff325f48e3a01a9a44ec71b844"}, + {file = "nornir_utils-0.2.0.tar.gz", hash = "sha256:4de6aaa35e5c1a98e1c84db84a008b0b1e974dc65d88484f2dcea3e30c95fbc2"}, +] + +[package.dependencies] +colorama = ">=0.4.3,<0.5.0" +nornir = ">=3,<4" + +[[package]] +name = "ntc-templates" +version = "7.7.0" +description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "ntc_templates-7.7.0-py3-none-any.whl", hash = "sha256:314850358394f4edbc3170ce9d3b69f51c2877c67cd9c4c8fe21227cb81f8ab1"}, + {file = "ntc_templates-7.7.0.tar.gz", hash = "sha256:c7b9c2f8306ff6ff1133b5a1614f9627b520bc27c3c514c4e95bf27e221f2a2d"}, +] + +[package.dependencies] +textfsm = ">=1.1.0,<2.0.0" + [[package]] name = "oauthlib" version = "3.2.2" @@ -2130,15 +2826,29 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + [[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" 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]] @@ -2156,6 +2866,27 @@ files = [ dev = ["pytest", "tox"] lint = ["black"] +[[package]] +name = "paramiko" +version = "3.5.1" +description = "SSH2 protocol library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61"}, + {file = "paramiko-3.5.1.tar.gz", hash = "sha256:b2c665bc45b2b215bd7d7f039901b14b067da00f3a11e6640995fd58f2664822"}, +] + +[package.dependencies] +bcrypt = ">=3.2" +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)"] +invoke = ["invoke (>=2.0)"] + [[package]] name = "parso" version = "0.8.4" @@ -2418,7 +3149,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -2466,6 +3196,17 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + [[package]] name = "pycodestyle" version = "2.12.1" @@ -2488,6 +3229,155 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pydantic" +version = "2.10.6" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.27.2" +typing-extensions = ">=4.12.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyeapi" +version = "1.0.4" +description = "Python Client for eAPI" +optional = false +python-versions = "*" +files = [ + {file = "pyeapi-1.0.4.tar.gz", hash = "sha256:05920677246823cd3dddf7d4d0f831fbc86fd416f356706a03bc56a291d78f3d"}, +] + +[package.dependencies] +netaddr = "*" + +[package.extras] +dev = ["check-manifest", "pep8", "pyflakes", "twine"] +test = ["coverage"] + [[package]] name = "pygments" version = "2.19.1" @@ -2615,6 +3505,76 @@ pyyaml = "*" [package.extras] extra = ["pygments (>=2.19.1)"] +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +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"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +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.1.1" +description = "Nautobot API client library" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pynautobot-2.1.1-py3-none-any.whl", hash = "sha256:bcf56fee4733942a87dd07f956418f67580f45d08e5296c8fa3d11316c4ca419"}, + {file = "pynautobot-2.1.1.tar.gz", hash = "sha256:f01907a519689dc842f909f850737f68b53953818c97380a8101406d37e49d1b"}, +] + +[package.dependencies] +packaging = ">=23.2,<24.0" +requests = ">=2.30.0,<3.0.0" +urllib3 = ">=1.21.1,<1.27" + +[[package]] +name = "pyparsing" +version = "3.1.4" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyserial" +version = "3.5" +description = "Python Serial Port Extension" +optional = false +python-versions = "*" +files = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] + +[package.extras] +cp2110 = ["hidapi"] + [[package]] name = "python-crontab" version = "3.2.0" @@ -3022,6 +3982,21 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "retry" +version = "0.9.2" +description = "Easy to use retry decorator." +optional = false +python-versions = "*" +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] + +[package.dependencies] +decorator = ">=3.4.2" +py = ">=1.4.26,<2.0.0" + [[package]] name = "rpds-py" version = "0.20.1" @@ -3134,6 +4109,83 @@ files = [ {file = "rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350"}, ] +[[package]] +name = "ruamel-yaml" +version = "0.18.10" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1"}, + {file = "ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] + [[package]] name = "ruff" version = "0.5.5" @@ -3171,6 +4223,20 @@ files = [ {file = "Rx-1.6.3.tar.gz", hash = "sha256:ca71b65d0fc0603a3b5cfaa9e33f5ba81e4aae10a58491133595088d7734b2da"}, ] +[[package]] +name = "scp" +version = "0.15.0" +description = "scp module for paramiko" +optional = false +python-versions = "*" +files = [ + {file = "scp-0.15.0-py2.py3-none-any.whl", hash = "sha256:9e7f721e5ac563c33eb0831d0f949c6342f1c28c3bdc3b02f39d77b5ea20df7e"}, + {file = "scp-0.15.0.tar.gz", hash = "sha256:f1b22e9932123ccf17eebf19e0953c6e9148f589f93d91b872941a696305c83f"}, +] + +[package.dependencies] +paramiko = "*" + [[package]] name = "setuptools" version = "75.3.0" @@ -3228,6 +4294,17 @@ files = [ {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "social-auth-app-django" version = "5.4.2" @@ -3346,18 +4423,19 @@ files = [ ] [[package]] -name = "to-json-schema" -version = "1.0.1" -description = "" +name = "textfsm" +version = "1.1.3" +description = "Python module for parsing semi-structured text into python tables." optional = false python-versions = "*" files = [ - {file = "to_json_schema-1.0.1-py3-none-any.whl", hash = "sha256:5708663f1c81815e4ff01fce910ac32ee3964d0c6b3587fd4fff2e38d5c9aa7b"}, - {file = "to_json_schema-1.0.1.tar.gz", hash = "sha256:ec747bd5129256dd571105f66a7bc9a4546228cd5e5fbf5e06dc9776e255400e"}, + {file = "textfsm-1.1.3-py2.py3-none-any.whl", hash = "sha256:dcbeebc6a6137bed561c71a56344d752e6dbc04ae5ea309252cb70fb97ccc9cd"}, + {file = "textfsm-1.1.3.tar.gz", hash = "sha256:577ef278a9237f5341ae9b682947cefa4a2c1b24dbe486f94f2c95addc6504b5"}, ] -[package.extras] -testing = ["pytest", "pytest-cov", "setuptools"] +[package.dependencies] +future = "*" +six = "*" [[package]] name = "toml" @@ -3459,6 +4537,56 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "transitions" +version = "0.9.2" +description = "A lightweight, object-oriented Python state machine implementation with many extensions." +optional = false +python-versions = "*" +files = [ + {file = "transitions-0.9.2-py2.py3-none-any.whl", hash = "sha256:f7b40c9b4a93869f36c4d1c33809aeb18cdeeb065fd1adba018ee39c3db216f3"}, + {file = "transitions-0.9.2.tar.gz", hash = "sha256:2f8490dbdbd419366cef1516032ab06d07ccb5839ef54905e842a472692d4204"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +diagrams = ["pygraphviz"] +test = ["pytest"] + +[[package]] +name = "ttp" +version = "0.9.5" +description = "Template Text Parser" +optional = false +python-versions = ">=2.7,<4.0" +files = [ + {file = "ttp-0.9.5-py2.py3-none-any.whl", hash = "sha256:2c9fcf560b3f696e9fdd3554dc8e4622cbb10cac1d4fca13a7cf608c4a7fd137"}, + {file = "ttp-0.9.5.tar.gz", hash = "sha256:234414f4d3039d2d1cde09993f89f8db1b34d447f76c6a402555cefac2e59c4e"}, +] + +[package.extras] +docs = ["Sphinx (==4.3.0)", "readthedocs-sphinx-search (==0.1.1)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"] +full = ["cerberus (>=1.3.0,<1.4.0)", "deepdiff (>=5.8.0,<5.9.0)", "jinja2 (>=3.0.0,<3.1.0)", "n2g (>=0.2.0,<0.3.0)", "openpyxl (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)"] + +[[package]] +name = "ttp-templates" +version = "0.3.7" +description = "Template Text Parser Templates collections" +optional = false +python-versions = "<4.0,>=3.6" +files = [ + {file = "ttp_templates-0.3.7-py3-none-any.whl", hash = "sha256:2328304fb4c957ee60db6f301143e8a4556b22a12b3e2f30511e8ef97fc78f7e"}, + {file = "ttp_templates-0.3.7.tar.gz", hash = "sha256:f9103041a3683a0cb3811609ad990f679beadfc9a92c3e3fa05d6037414ad2bf"}, +] + +[package.dependencies] +ttp = ">=0.6.0" + +[package.extras] +docs = ["mkdocs (==1.2.4)", "mkdocs-material (==7.2.2)", "mkdocs-material-extensions (==1.0.1)", "mkdocstrings[python] (>=0.18.0,<0.19.0)", "pygments (==2.11)", "pymdown-extensions (==9.3)"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -3494,20 +4622,19 @@ files = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "vine" @@ -3698,6 +4825,20 @@ pyyaml = "*" [package.extras] dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] +[[package]] +name = "yamlordereddictloader" +version = "0.4.2" +description = "YAML loader and dumper for PyYAML allowing to keep keys order." +optional = false +python-versions = "*" +files = [ + {file = "yamlordereddictloader-0.4.2-py3-none-any.whl", hash = "sha256:dc048adb67026786cd24119bd71241f35bc8b0fd37d24b415c37bbc8049f9cd7"}, + {file = "yamlordereddictloader-0.4.2.tar.gz", hash = "sha256:36af2f6210fcff5da4fc4c12e1d815f973dceb41044e795e1f06115d634bca13"}, +] + +[package.dependencies] +pyyaml = "*" + [[package]] name = "zipp" version = "3.20.2" @@ -3723,4 +4864,4 @@ all = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.13" -content-hash = "75ca2a31b5bd2e95328f05082d918a4be0086a40df1759699b2ab8408eaea55e" +content-hash = "3596a44889fd1243cab715d3383b39401b169a1a460a8dc6549cd4e2e1a89f0d" From 99a597a515a51882529fa27ab9519d5e6378c393 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 7 Mar 2025 14:10:02 -0500 Subject: [PATCH 23/31] filter out non device/interface connected cables --- .../diffsync/adapters/sync_network_data_adapters.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 86ab5f2e..bc4e0cc6 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -251,9 +251,18 @@ def load_cables(self): """ for device in self.job.devices_to_load: for cable in device.get_cables(): + if cable.termination_a.type != "dcim.interface" or cable.termination_b.type != "dcim.interface": + self.job.logger.warning( + f"Skipping Cable: {cable}. Only cables with interface terminations are supported." + ) + continue + if not cable.termination_a.device or not cable.termination_b.device: + self.job.logger.warning( + f"Skipping Cable: {cable}. Only cables connected to devices are support (e.g. Circuit Terminations)." + ) if cable.termination_b.device.name == "" or cable.termination_a.device.name == "": self.job.logger.warning( - f"Device attached to a cable is missing a name. Devices must have a name to utilize cable onboarding. " + f"Device attached to a cable is missing a name. Devices must have a name to utilize cable onboarding." f"Skipping Cable: {cable}" ) continue From 9db7f2447b43d3645a8dd2fff0f307d1b6dc4edf Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 10 Mar 2025 15:53:47 -0400 Subject: [PATCH 24/31] update utils and add test --- .../tests/test_sync_network_data_adapters.py | 15 ++++++++++ nautobot_device_onboarding/tests/utils.py | 30 +++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py index d4f73297..03a73c0a 100644 --- a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py +++ b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py @@ -2,6 +2,7 @@ from unittest.mock import MagicMock, patch +from nautobot.dcim.models import Cable from nautobot.core.testing import TransactionTestCase from nautobot.dcim.models import Device, Interface from nautobot.extras.models import JobResult @@ -349,6 +350,20 @@ def test_load_vrfs(self): self.assertEqual(vrf.name, diffsync_obj.name) self.assertEqual(self.job.namespace.name, diffsync_obj.namespace__name) + def test_load_cables(self): + """Test loading Nautobot cable data into the diffsync store.""" + self.sync_network_data_adapter.load_cables() + for cable in Cable.objects.all(): + if not cable.termination_a.type == "dcim.interface" or cable.termination_b.type == "dcim.interface": + # skip loading cables connected to circuits (they should be skipped by the adapter) + continue + unique_id = f"dcim__interface__{cable.termination_a.device.name}__{cable.termination_a.name}__dcim__interface__{cable.termination_b.device.name}__{cable.termination_b.name}" + diffsync_obj = self.sync_network_data_adapter.get("cable", unique_id) + self.assertEqual(cable.termination_a.device.name, diffsync_obj.termination_a__device__name) + self.assertEqual(cable.termination_a.name, diffsync_obj.termination_a__name) + self.assertEqual(cable.termination_b.device.name, diffsync_obj.termination_b__device__name) + self.assertEqual(cable.termination_b.name, diffsync_obj.termination_b__name) + def test_load_vrf_to_interface(self): """Test loading Nautobot vrf interface assignments into the Diffsync store.""" self.sync_network_data_adapter.load_vrf_to_interface() diff --git a/nautobot_device_onboarding/tests/utils.py b/nautobot_device_onboarding/tests/utils.py index 2733d973..8c717f29 100644 --- a/nautobot_device_onboarding/tests/utils.py +++ b/nautobot_device_onboarding/tests/utils.py @@ -1,6 +1,7 @@ """Testing utilites.""" from django.contrib.contenttypes.models import ContentType +from nautobot.circuits.models import Circuit, CircuitType, Provider, CircuitTermination from nautobot.dcim.choices import InterfaceModeChoices, InterfaceTypeChoices from nautobot.dcim.models import Cable, Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices @@ -19,10 +20,10 @@ def sync_network_data_ensure_required_nautobot_objects(): status.content_types.add(ContentType.objects.get_for_model(IPAddress)) status.content_types.add(ContentType.objects.get_for_model(Location)) status.content_types.add(ContentType.objects.get_for_model(Interface)) - status.content_types.add(ContentType.objects.get_for_model(Interface)) status.content_types.add(ContentType.objects.get_for_model(VLAN)) status.content_types.add(ContentType.objects.get_for_model(VRF)) status.content_types.add(ContentType.objects.get_for_model(Cable)) + status.content_types.add(ContentType.objects.get_for_model(Circuit)) status.validated_save() username_secret, _ = Secret.objects.get_or_create( @@ -129,6 +130,9 @@ def sync_network_data_ensure_required_nautobot_objects(): interface_3, _ = Interface.objects.get_or_create( device=device_3, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL ) + interface_4, _ = Interface.objects.get_or_create( + device=device_1, name="GigabitEthernet2", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL + ) IPAddressToInterface.objects.get_or_create(interface=interface_1, ip_address=ip_address_1) device_1.primary_ip4 = ip_address_1 device_1.validated_save() @@ -141,6 +145,29 @@ def sync_network_data_ensure_required_nautobot_objects(): device_3.primary_ip4 = ip_address_3 device_3.validated_save() + provider_1, _ = Provider.objects.get_or_create(name="Provider 1") + circuit_type_1, _ = CircuitType.objects.get_or_create(name="Circuit Type 1") + circuit_1, _ = Circuit.objects.get_or_create( + cid="Circuit 1", + provider=provider_1, + circuit_type=circuit_type_1, + status=status, + ) + + circuit_termination_1, _ = CircuitTermination.objects.get_or_create( + circuit=circuit_1, + term_side="A", + location=location, + ) + + cable_to_circuit_1 = Cable.objects.get_or_create( + termination_a_type=ContentType.objects.get_for_model(Interface), + termination_a_id=interface_4.id, + termination_b_type=ContentType.objects.get_for_model(CircuitTermination), + termination_b_id=circuit_termination_1.id, + status=status, + ) + testing_objects["status"] = status testing_objects["secrets_group"] = secrets_group testing_objects["namespace"] = namespace @@ -175,7 +202,6 @@ def sync_devices_ensure_required_nautobot_objects(): status.content_types.add(ContentType.objects.get_for_model(IPAddress)) status.content_types.add(ContentType.objects.get_for_model(Location)) status.content_types.add(ContentType.objects.get_for_model(Interface)) - status.content_types.add(ContentType.objects.get_for_model(Interface)) status.validated_save() status_planned, _ = Status.objects.get_or_create(name="Planned") From 166c16f5a86a16af6bf67d92f611a81291f52894 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 10 Mar 2025 16:08:51 -0400 Subject: [PATCH 25/31] add a note to the docs --- docs/user/app_overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md index 861f47a1..abb37817 100644 --- a/docs/user/app_overview.md +++ b/docs/user/app_overview.md @@ -47,7 +47,7 @@ Expose two new SSoT based Nautobot jobs to perform the syncing of data. - VRFs - VRF Names - Route Distinguishers (RD) - - Cabling + - Cabling (**Note** Cables attached to Circuits will be skipped) !!! info For more information look at the provided jsonschema definitions for each of the jobs. From ad81ef0a6edcb088d73bad059834bbceb1ddb401 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 10 Mar 2025 16:09:14 -0400 Subject: [PATCH 26/31] linting --- .../tests/test_sync_network_data_adapters.py | 3 +-- nautobot_device_onboarding/tests/utils.py | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py index 03a73c0a..fe7aed11 100644 --- a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py +++ b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py @@ -2,9 +2,8 @@ from unittest.mock import MagicMock, patch -from nautobot.dcim.models import Cable from nautobot.core.testing import TransactionTestCase -from nautobot.dcim.models import Device, Interface +from nautobot.dcim.models import Cable, Device, Interface from nautobot.extras.models import JobResult from nautobot.ipam.models import VLAN, VRF, IPAddress diff --git a/nautobot_device_onboarding/tests/utils.py b/nautobot_device_onboarding/tests/utils.py index 8c717f29..97756618 100644 --- a/nautobot_device_onboarding/tests/utils.py +++ b/nautobot_device_onboarding/tests/utils.py @@ -1,7 +1,7 @@ """Testing utilites.""" from django.contrib.contenttypes.models import ContentType -from nautobot.circuits.models import Circuit, CircuitType, Provider, CircuitTermination +from nautobot.circuits.models import Circuit, CircuitTermination, CircuitType, Provider from nautobot.dcim.choices import InterfaceModeChoices, InterfaceTypeChoices from nautobot.dcim.models import Cable, Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices @@ -157,7 +157,7 @@ def sync_network_data_ensure_required_nautobot_objects(): circuit_termination_1, _ = CircuitTermination.objects.get_or_create( circuit=circuit_1, term_side="A", - location=location, + location=location, ) cable_to_circuit_1 = Cable.objects.get_or_create( @@ -188,6 +188,7 @@ def sync_network_data_ensure_required_nautobot_objects(): testing_objects["vlan_2"] = vlan_2 testing_objects["vrf_1"] = vrf_1 testing_objects["vrf_2"] = vrf_2 + testing_objects["cable_to_circuit"] = cable_to_circuit_1 return testing_objects From 1ea57ea869084f245186095ea29d4460207fa44f Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 10 Mar 2025 16:20:16 -0400 Subject: [PATCH 27/31] add fragment --- changes/326.fixed | 1 + 1 file changed, 1 insertion(+) create mode 100644 changes/326.fixed diff --git a/changes/326.fixed b/changes/326.fixed new file mode 100644 index 00000000..41f76d6d --- /dev/null +++ b/changes/326.fixed @@ -0,0 +1 @@ +Fixed error from ingesting existing cable attached to a circuit. From b5d4b89a9c6a4f39efb1b067110fa490d3b4241f Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 10 Mar 2025 16:45:28 -0400 Subject: [PATCH 28/31] update error message --- .../diffsync/adapters/sync_network_data_adapters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index bc4e0cc6..da438ab2 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -258,7 +258,7 @@ def load_cables(self): continue if not cable.termination_a.device or not cable.termination_b.device: self.job.logger.warning( - f"Skipping Cable: {cable}. Only cables connected to devices are support (e.g. Circuit Terminations)." + f"Skipping Cable: {cable}. Only cables connected to device interfaces are supported." ) if cable.termination_b.device.name == "" or cable.termination_a.device.name == "": self.job.logger.warning( From 5256e72a428ec887814e6406aa03595ca9187daa Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 11 Mar 2025 16:09:14 -0400 Subject: [PATCH 29/31] update version and lock --- poetry.lock | 33 +++++++++++++++++---------------- pyproject.toml | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/poetry.lock b/poetry.lock index e6446ff1..0eb5f0dd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "amqp" @@ -890,13 +890,13 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "4.2.19" +version = "4.2.20" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.8" files = [ - {file = "Django-4.2.19-py3-none-any.whl", hash = "sha256:a104e13f219fc55996a4e416ef7d18ab4eeb44e0aa95174c192f16cda9f94e75"}, - {file = "Django-4.2.19.tar.gz", hash = "sha256:6c833be4b0ca614f0a919472a1028a3bbdeb6f056fa04023aeb923346ba2c306"}, + {file = "Django-4.2.20-py3-none-any.whl", hash = "sha256:213381b6e4405f5c8703fffc29cd719efdf189dec60c67c04f76272b3dc845b9"}, + {file = "Django-4.2.20.tar.gz", hash = "sha256:92bac5b4432a64532abb73b2ac27203f485e40225d2640a7fbef2b62b876e789"}, ] [package.dependencies] @@ -1332,13 +1332,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2025.2.1" +version = "2025.3.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf_spectacular_sidecar-2025.2.1-py3-none-any.whl", hash = "sha256:674e1336810c7cf117442300b5c213c4fee1e984ba48689502c947a6ecd25d0c"}, - {file = "drf_spectacular_sidecar-2025.2.1.tar.gz", hash = "sha256:ca9507c5fe708680d6b8eda96928f3cf3ffc07e8d67678778bcd2e80f9f2baae"}, + {file = "drf_spectacular_sidecar-2025.3.1-py3-none-any.whl", hash = "sha256:6b9c96204c8e45a06c39928dad704b18536d3253b61591c478540b63db6bdcea"}, + {file = "drf_spectacular_sidecar-2025.3.1.tar.gz", hash = "sha256:7425940a409fb68a46c9b024eb504098fab5b4d73d12573efcaef048445d678f"}, ] [package.dependencies] @@ -1411,7 +1411,7 @@ test = [] type = "git" url = "https://github.com/fakenos/fakenos" reference = "master" -resolved_reference = "b465bc28b478cf72582191ee77eb8e968864a0da" +resolved_reference = "70713d43f8263b986577977e3851fd6465c150ed" [[package]] name = "future" @@ -1831,13 +1831,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" -version = "3.1.5" +version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, - {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] [package.dependencies] @@ -2602,12 +2602,12 @@ slurpit = ["slurpit-sdk (>=0.9.58,<0.10.0)"] [[package]] name = "ncclient" -version = "0.6.17" +version = "0.6.19" description = "Python library for NETCONF clients" optional = false python-versions = ">=3.5" files = [ - {file = "ncclient-0.6.17.tar.gz", hash = "sha256:cc8eb9d4e0abf0ae715fbc95d365e2fb39347a188f828d5e84ceb7444df10b02"}, + {file = "ncclient-0.6.19.tar.gz", hash = "sha256:de7a796221910cbd0f32eb20f7dd7c94cfe61aa170fc5f0c5941c557f835c312"}, ] [package.dependencies] @@ -3149,6 +3149,7 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -4382,13 +4383,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "structlog" -version = "25.1.0" +version = "25.2.0" description = "Structured Logging for Python" optional = false python-versions = ">=3.8" files = [ - {file = "structlog-25.1.0-py3-none-any.whl", hash = "sha256:843fe4f254540329f380812cbe612e1af5ec5b8172205ae634679cd35a6d6321"}, - {file = "structlog-25.1.0.tar.gz", hash = "sha256:2ef2a572e0e27f09664965d31a576afe64e46ac6084ef5cec3c2b8cd6e4e3ad3"}, + {file = "structlog-25.2.0-py3-none-any.whl", hash = "sha256:0fecea2e345d5d491b72f3db2e5fcd6393abfc8cd06a4851f21fcd4d1a99f437"}, + {file = "structlog-25.2.0.tar.gz", hash = "sha256:d9f9776944207d1035b8b26072b9b140c63702fd7aa57c2f85d28ab701bd8e92"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index eeef9ce8..ee238cdf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.2.3a0" +version = "4.2.3" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" From 44f4c17d16ef15b379ed71d8da03c33d4d0f8bc1 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 11 Mar 2025 16:17:22 -0400 Subject: [PATCH 30/31] Release 4.2.3 --- changes/+nautobot-app-v2-4-2.housekeeping | 1 - changes/326.fixed | 1 - docs/admin/release_notes/version_4.2.md | 11 +++++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) delete mode 100644 changes/+nautobot-app-v2-4-2.housekeeping delete mode 100644 changes/326.fixed diff --git a/changes/+nautobot-app-v2-4-2.housekeeping b/changes/+nautobot-app-v2-4-2.housekeeping deleted file mode 100644 index c3274daf..00000000 --- a/changes/+nautobot-app-v2-4-2.housekeeping +++ /dev/null @@ -1 +0,0 @@ -Rebaked from the cookie `nautobot-app-v2.4.2`. diff --git a/changes/326.fixed b/changes/326.fixed deleted file mode 100644 index 41f76d6d..00000000 --- a/changes/326.fixed +++ /dev/null @@ -1 +0,0 @@ -Fixed error from ingesting existing cable attached to a circuit. diff --git a/docs/admin/release_notes/version_4.2.md b/docs/admin/release_notes/version_4.2.md index 6a1a5af4..79ff695b 100755 --- a/docs/admin/release_notes/version_4.2.md +++ b/docs/admin/release_notes/version_4.2.md @@ -11,6 +11,17 @@ Versioning](https://semver.org/spec/v2.0.0.html). - [#274](https://github.com/nautobot/nautobot-app-device-onboarding/issues/274) - Added TTP Parser support. - [#274](https://github.com/nautobot/nautobot-app-device-onboarding/issues/274) - Added Sync Device from Network support for Palo Alto Panos. +## [v4.2.3 (2025-03-11)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.3) + +### Fixed + +- [#326](https://github.com/nautobot/nautobot-app-device-onboarding/issues/326) - Fixed error from ingesting existing cable attached to a circuit. + +### Housekeeping + +- Rebaked from the cookie `nautobot-app-v2.4.2`. + + ## [v4.2.2 (2025-02-19)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.2.2) ### Fixed From e66fc397d3c3b7c870ae2d801382fb84c50e1833 Mon Sep 17 00:00:00 2001 From: scetron Date: Wed, 12 Mar 2025 09:17:08 -0400 Subject: [PATCH 31/31] bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ee238cdf..49665a6f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.2.3" +version = "4.2.4a0" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0"