diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 92f848d..3fc9131 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,4 +1,12 @@ +## v0.9.6 - 2022-05-31 +### Fixed + +- #94 - Fix `primary_ip` usage in `interface` model, `delete` operations and `device_content` embedded `iframe`. + +### Changed + +- #94 - Make `ssot-safe-delete` log messages less noisy, using `debug` log level. ## v0.9.5 - 2022-05-11 diff --git a/nautobot_ssot_ipfabric/diffsync/adapter_ipfabric.py b/nautobot_ssot_ipfabric/diffsync/adapter_ipfabric.py index 30d1533..261854c 100644 --- a/nautobot_ssot_ipfabric/diffsync/adapter_ipfabric.py +++ b/nautobot_ssot_ipfabric/diffsync/adapter_ipfabric.py @@ -68,8 +68,9 @@ def load_device_interfaces(self, device_model, interfaces, device_primary_ip): type=DEFAULT_INTERFACE_TYPE, mgmt_only=iface.get("mgmt_only", False), ip_address=ip_address, + # TODO: why is only IPv4? and why /32? subnet_mask="255.255.255.255", - ip_is_primary=ip_address == device_primary_ip, + ip_is_primary=ip_address is not None and ip_address == device_primary_ip, status="Active", ) self.add(interface) diff --git a/nautobot_ssot_ipfabric/diffsync/adapter_nautobot.py b/nautobot_ssot_ipfabric/diffsync/adapter_nautobot.py index b8ac0c7..6dd1473 100644 --- a/nautobot_ssot_ipfabric/diffsync/adapter_nautobot.py +++ b/nautobot_ssot_ipfabric/diffsync/adapter_nautobot.py @@ -82,8 +82,12 @@ def sync_complete(self, source: DiffSync, *args, **kwargs): def load_interfaces(self, device_record: Device, diffsync_device): """Import a single Nautobot Interface object as a DiffSync Interface model.""" - # Get MGMT IP - mgmt_int_qset = device_record.interfaces.filter(mgmt_only=True) + device_primary_ip = None + if device_record.primary_ip4: + device_primary_ip = device_record.primary_ip4 + elif device_record.primary_ip6: + device_primary_ip = device_record.primary_ip6 + for interface_record in device_record.interfaces.all(): interface = self.interface( diffsync=self, @@ -100,9 +104,9 @@ def load_interfaces(self, device_record: Device, diffsync_device): type=DEFAULT_INTERFACE_TYPE, mgmt_only=interface_record.mgmt_only if interface_record.mgmt_only else False, pk=interface_record.pk, - ip_is_primary=bool( - any(interface for interface in mgmt_int_qset if interface.name == interface_record.name) - ), + ip_is_primary=interface_record.ip_addresses.first() == device_primary_ip + if device_primary_ip + else False, ip_address=str(interface_record.ip_addresses.first().host) if interface_record.ip_addresses.first() else None, diff --git a/nautobot_ssot_ipfabric/diffsync/diffsync_models.py b/nautobot_ssot_ipfabric/diffsync/diffsync_models.py index 75d094f..f23d896 100644 --- a/nautobot_ssot_ipfabric/diffsync/diffsync_models.py +++ b/nautobot_ssot_ipfabric/diffsync/diffsync_models.py @@ -83,7 +83,7 @@ def safe_delete(self, nautobot_object: Any, safe_delete_status: Optional[str] = if update: tonb_nbutils.tag_object(nautobot_object=nautobot_object, custom_field="ssot-synced-from-ipfabric") else: - self.diffsync.job.log_warning( + self.diffsync.job.log_debug( message=f"{nautobot_object} has previously been tagged with `ssot-safe-delete`. Skipping..." ) @@ -118,7 +118,7 @@ def delete(self) -> Optional["DiffSyncModel"]: site_object, SAFE_DELETE_SITE_STATUS, ) - return self + return super().delete() def update(self, attrs): """Update Site Object in Nautobot.""" @@ -215,7 +215,7 @@ def delete(self) -> Optional["DiffSyncModel"]: device_object, SAFE_DELETE_DEVICE_STATUS, ) - return self + return super().delete() except NautobotDevice.DoesNotExist: self.diffsync.job.log_warning(f"Unable to match device by name, {self.name}") @@ -271,7 +271,7 @@ class Interface(DiffSyncExtras): "mgmt_only", "ip_address", "subnet_mask", - # "ip_is_primary", + "ip_is_primary", "status", ) @@ -314,8 +314,10 @@ def create(cls, diffsync, ids, attrs): if attrs.get("ip_is_primary"): if ip_address_obj.family == 4: device_obj.primary_ip4 = ip_address_obj + device_obj.save() if ip_address_obj.family == 6: device_obj.primary_ip6 = ip_address_obj + device_obj.save() interface_obj.save() return super().create(ids=ids, diffsync=diffsync, attrs=attrs) @@ -335,11 +337,11 @@ def delete(self) -> Optional["DiffSyncModel"]: self.safe_delete( interface, ) - return self + return super().delete() except NautobotDevice.DoesNotExist: self.diffsync.job.log_warning(f"Unable to match device by name, {self.name}") - def update(self, attrs): + def update(self, attrs): # pylint: disable=too-many-branches """Update Interface object in Nautobot.""" try: ssot_tag, _ = Tag.objects.get_or_create(name="SSoT Synced from IPFabric") @@ -372,6 +374,16 @@ def update(self, attrs): object_pk=interface, ) interface.ip_addresses.add(ip_address_obj) + if attrs.get("ip_is_primary"): + interface_obj = interface.ip_addresses.first() + if interface_obj: + if interface_obj.family == 4: + device.primary_ip4 = interface_obj + device.save() + if interface_obj.family == 6: + device.primary_ip6 = interface_obj + device.save() + interface.save() tonb_nbutils.tag_object(nautobot_object=interface, custom_field="ssot-synced-from-ipfabric") return super().update(attrs) @@ -418,7 +430,7 @@ def delete(self) -> Optional["DiffSyncModel"]: vlan, SAFE_DELETE_VLAN_STATUS, ) - return self + return super().delete() def update(self, attrs): """Update VLAN object in Nautobot.""" diff --git a/nautobot_ssot_ipfabric/template_content.py b/nautobot_ssot_ipfabric/template_content.py index 52696e6..9bb4b90 100644 --- a/nautobot_ssot_ipfabric/template_content.py +++ b/nautobot_ssot_ipfabric/template_content.py @@ -1,4 +1,4 @@ -"""Testing.""" +"""Template Content for other models.""" from nautobot.extras.plugins import PluginTemplateExtension @@ -12,9 +12,6 @@ def full_width_page(self): """Implement cool topology from IPFabric based on site.""" return self.render( "nautobot_ssot_ipfabric/inc/diagram.html", - extra_context={ - "ipfabric_site": "{{ settings.PLUGINS_CONFIG.nautobot_ssot_ipfabric.ipfabric_host }}/graph?urls=domains%3Fad%3DvSite%252F55467784%2Btransit%3Fad%3DvSite%252F55467784" - }, ) diff --git a/nautobot_ssot_ipfabric/templates/nautobot_ssot_ipfabric/inc/diagram.html b/nautobot_ssot_ipfabric/templates/nautobot_ssot_ipfabric/inc/diagram.html index f461f11..018e8ac 100644 --- a/nautobot_ssot_ipfabric/templates/nautobot_ssot_ipfabric/inc/diagram.html +++ b/nautobot_ssot_ipfabric/templates/nautobot_ssot_ipfabric/inc/diagram.html @@ -5,7 +5,7 @@ IPFabric Site Diagram
- +
{% endblock %} diff --git a/poetry.lock b/poetry.lock index 83709bf..1ba98af 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1095,6 +1095,19 @@ pytz = ">=2022.1,<2023.0" [package.extras] examples = ["openpyxl (>=3.0.9,<4.0.0)", "pandas (==1.3.0)", "tabulate (>=0.8.9,<0.9.0)"] +[[package]] +name = "ipfabric-diagrams" +version = "1.2.7" +description = "Python package for interacting with IP Fabric Diagrams" +category = "dev" +optional = false +python-versions = ">=3.7.1,<4.0.0" + +[package.dependencies] +ipfabric = ">=0,<1" +pydantic = ">=1.8.2,<2.0.0" +typing-extensions = ">=4.1.1,<5.0.0" + [[package]] name = "ipython" version = "7.33.0" @@ -1394,12 +1407,12 @@ social-auth-app-django = ">=5.0.0,<5.1.0" svgwrite = ">=1.4.1,<1.5.0" [package.extras] -all = ["django-auth-ldap (>=4.0.0,<4.1.0)", "django-storages (>=1.12.3,<1.13.0)", "mysqlclient (>=2.1.0,<2.2.0)", "napalm (>=3.3.1,<3.4.0)", "social-auth-core[openidconnect,saml] (>=4.2.0,<4.3.0)"] +all = ["django-auth-ldap (>=4.0.0,<4.1.0)", "django-storages (>=1.12.3,<1.13.0)", "mysqlclient (>=2.1.0,<2.2.0)", "napalm (>=3.3.1,<3.4.0)", "social-auth-core[saml,openidconnect] (>=4.2.0,<4.3.0)"] ldap = ["django-auth-ldap (>=4.0.0,<4.1.0)"] remote_storage = ["django-storages (>=1.12.3,<1.13.0)"] mysql = ["mysqlclient (>=2.1.0,<2.2.0)"] napalm = ["napalm (>=3.3.1,<3.4.0)"] -sso = ["social-auth-core[openidconnect,saml] (>=4.2.0,<4.3.0)"] +sso = ["social-auth-core[saml,openidconnect] (>=4.2.0,<4.3.0)"] [[package]] name = "nautobot-capacity-metrics" @@ -1431,13 +1444,15 @@ webexteamssdk = ">=1.3,<2.0" [[package]] name = "nautobot-chatops-ipfabric" -version = "1.1.1" -description = "IPFabric" +version = "1.1.2" +description = "Nautobot Plugin Chatops IPFabric" category = "dev" optional = false -python-versions = ">=3.6.2,<4.0.0" +python-versions = ">=3.7.1,<4.0.0" [package.dependencies] +ipfabric = ">=0,<1" +ipfabric-diagrams = ">=1.2.7,<2.0.0" nautobot-chatops = ">=1.1.0,<2.0.0" netutils = ">=1.0.0,<2.0.0" @@ -1706,7 +1721,7 @@ python-versions = ">=3.6" [[package]] name = "pyjwt" -version = "2.3.0" +version = "2.4.0" description = "JSON Web Token implementation in Python" category = "main" optional = false @@ -2928,6 +2943,10 @@ ipfabric = [ {file = "ipfabric-0.10.8-py3-none-any.whl", hash = "sha256:ed11216d25068287195fdb7259c70b4c99b85112f0be0f3e59a9b49853f18960"}, {file = "ipfabric-0.10.8.tar.gz", hash = "sha256:fdffd9185764adfe338d83cb0a038631a9063de5bd137a94f6c49f11f3385433"}, ] +ipfabric-diagrams = [ + {file = "ipfabric-diagrams-1.2.7.tar.gz", hash = "sha256:e6c1a005270ae170b07937de2f8b4d203f9ddf4b6cad39d5e2adf07169eb6f82"}, + {file = "ipfabric_diagrams-1.2.7-py3-none-any.whl", hash = "sha256:1efb25c951fbb5ef4d045408c807d3c539e9fcaa6ef9da6829688438c6b34965"}, +] ipython = [ {file = "ipython-7.33.0-py3-none-any.whl", hash = "sha256:916a3126896e4fd78dd4d9cf3e21586e7fd93bae3f1cd751588b75524b64bf94"}, {file = "ipython-7.33.0.tar.gz", hash = "sha256:bcffb865a83b081620301ba0ec4d95084454f26b91d6d66b475bff3dfb0218d4"}, @@ -3078,8 +3097,8 @@ nautobot-chatops = [ {file = "nautobot_chatops-1.8.0-py3-none-any.whl", hash = "sha256:87a10b9bcb77a71b4eb8ab64a41afcf6c242c06e4828ea8a81cbc5d133ca5209"}, ] nautobot-chatops-ipfabric = [ - {file = "nautobot-chatops-ipfabric-1.1.1.tar.gz", hash = "sha256:3d1fee420a6b369c5ffa3b36e12fd7aa97862522d71978692de5df1e7840d7c4"}, - {file = "nautobot_chatops_ipfabric-1.1.1-py3-none-any.whl", hash = "sha256:57adf3035dce2b286c309daf6675f11fdf61d86c8b0969c443a1800e8b175f3b"}, + {file = "nautobot-chatops-ipfabric-1.1.2.tar.gz", hash = "sha256:8242ad2aff6b823a54bdd573a39f4175a9443502fb0c17d1cc69241c738efa30"}, + {file = "nautobot_chatops_ipfabric-1.1.2-py3-none-any.whl", hash = "sha256:683595da778e626cbd02783c274a3ca37c6e7169d2d0100c903523a40d3d665d"}, ] nautobot-ssot = [ {file = "nautobot-ssot-1.1.1.tar.gz", hash = "sha256:11794d18b39d686df88cdabc6f5d58e002ea0a7bd6ff6fbcf567dc1f4fc3a1c6"}, @@ -3333,8 +3352,8 @@ pygments = [ {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pyjwt = [ - {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"}, - {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"}, + {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"}, + {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, ] pylint = [ {file = "pylint-2.13.8-py3-none-any.whl", hash = "sha256:f87e863a0b08f64b5230e7e779bcb75276346995737b2c0dc2793070487b1ff6"}, @@ -3402,36 +3421,26 @@ pyuwsgi = [ {file = "pyuwsgi-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd09a7328558728f6e38f77609f44d16f18d8b4dc5f8b8776f657c8892b70337"}, {file = "pyuwsgi-2.0.20-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:210ad768b8af02bbfd3c0345a51c6d2c56a2333ac268d9a97ecf2d4209f78ef8"}, {file = "pyuwsgi-2.0.20-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e33111308a79dbd202094963fd3a537dab30854e375d9be018f642fcd359e03d"}, - {file = "pyuwsgi-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0306c3ca6f781ed7409774e44a2a90217824d3efb44e075a1f39a78a54ffe7d"}, - {file = "pyuwsgi-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3eeea48fd965b68801618fc20eda2cb65dc2aeb4121955c9c422685f046311da"}, {file = "pyuwsgi-2.0.20-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dd048b85abb90c79a34afbf787995ab2933cb2a8b210a6e064e5fca0a9bdf2d8"}, {file = "pyuwsgi-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f612a72437c2934e39393fb575fab791e919efc102a0aa1a27b5d9a301d462e9"}, {file = "pyuwsgi-2.0.20-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:78ac2d8b7d307232f8276cb8a45300211b0fae179c0494f2a3e3178c70693f81"}, {file = "pyuwsgi-2.0.20-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f84fc44bba77d05fa9d01189028501ff8e6a2d63db184ceea42085ce28196317"}, {file = "pyuwsgi-2.0.20-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:342c312949c2f494f5d9ac272965715483cb22ed0353c18abb1b4590769ef00f"}, - {file = "pyuwsgi-2.0.20-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5740b84a016a246c69edef0df11912560df9a45c2adf6e47701329a974e37a71"}, - {file = "pyuwsgi-2.0.20-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:82058f6b6656f12dbc66c963be2d7c0b977f481ddca5d4d3918e26def003b60d"}, {file = "pyuwsgi-2.0.20-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dc99724df6d5613300d3357c4017cde840830ca132fe98f0a4feab9a6af48622"}, {file = "pyuwsgi-2.0.20-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:70096084ccfa18f058dfb3380aa10e80d48958ddfdb888b827f06aacb72f80b8"}, {file = "pyuwsgi-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e7a8576452635612c82f660e5be99ba42cdcdff142948f5c263b5278f2c17b0"}, {file = "pyuwsgi-2.0.20-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2844205e0095a29d3a6e9e23bd37bcf18d65e4e5ab23a14a45f5159c03a3b890"}, {file = "pyuwsgi-2.0.20-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e2c0d5dafb9faacc8ed5b662f9eacb22e723fbc3cb7152b2ebf09a92b8bd6c0d"}, - {file = "pyuwsgi-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087397457837c5fd653eda91c5d2c7948e06da589c786d26145bdcc397656bb2"}, - {file = "pyuwsgi-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:da24ddb7e3522d36b4cdc2dbf131141d559084862f515d37f9a4b7b5c8b538b1"}, {file = "pyuwsgi-2.0.20-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:99b0c5a87aa95dcbaca2ccb599d783f37461600e098881d4ec9796ba68e3ff8f"}, {file = "pyuwsgi-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:df08a05dda4a92da46bd56af755dac091b145815c3cf6dda1855e01e40d12a99"}, {file = "pyuwsgi-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7c8ac4b2f411d15222f53a96627b8fa79056b39606925f429f59a51668bd95ab"}, {file = "pyuwsgi-2.0.20-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f1494d00df440865b1ee269a350187766c9c364ba5f124eddb064f366c4b6d8a"}, {file = "pyuwsgi-2.0.20-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c5ee8782932dbacdb4dd98714c3575cbbb88ba87d7bcb3149c828725ba048897"}, - {file = "pyuwsgi-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cdc4b32234b40fa2d515108a2f56a159896134ef16394f26dba764635142976"}, - {file = "pyuwsgi-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:300417d6669171a454da19991fc7f910b3975232dac5b2dbc359e26f1038624b"}, {file = "pyuwsgi-2.0.20-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:015a8d310503eb8c0028ac8f98c7df3b49bc937c7db137aaf149ca7fae64c777"}, {file = "pyuwsgi-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9fc3d256270adf24b87f1dff893f3bc59bd5ee20c4ebb5add25e944c36359e1e"}, {file = "pyuwsgi-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:052fe12d6a9ab9e9fc7814e40d2d28061aaea1a610069008d773e1d8a71feb11"}, {file = "pyuwsgi-2.0.20-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7d160c7bfa8f2974fc6b807a8fc080be0d130b1a4ad0b463c0320e707e6a6eb6"}, {file = "pyuwsgi-2.0.20-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7691ca470e541133c444b23f83c6f07ecca12f4771a49e0e3a04b05f4c80f2d3"}, - {file = "pyuwsgi-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c87fb1d56dd2c6f18b87b08496be326afb6cf57c6a059261b01ce99046d9147"}, - {file = "pyuwsgi-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8eb97cf51f58df05ec0dd74d83510172a2f5bcd8adc91382e24690a2abddc2f3"}, {file = "pyuwsgi-2.0.20-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a8fc4d52232f55df16e9cbf6faf4bf16910d15042229d5f8c717278fd4ea37a5"}, {file = "pyuwsgi-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1acedb1841aa0e60e1a7245ae483a5fcb30e39cf0cdfe3987e14de4746daf75b"}, {file = "pyuwsgi-2.0.20.tar.gz", hash = "sha256:8b0936a964511fa0e2ac2847c2435e95130e7c98619f06fe1f67320527576043"}, @@ -3504,10 +3513,6 @@ rq = [ {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, ] "ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, diff --git a/pyproject.toml b/pyproject.toml index f63c216..4be1746 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-ssot-ipfabric" -version = "0.9.5" +version = "0.9.6" description = "Nautobot SSoT IPFabric" authors = ["Network to Code, LLC "] license = "Apache-2.0"