From 309d2160ee14581d90b73ae8768b03ae3d408ade Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:56:55 -0600 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Add=20check=20for=20d?= =?UTF-8?q?efault=20settings=20being=20defined.=20Raise=20Exception=20if?= =?UTF-8?q?=20missing.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_ssot/integrations/aristacv/jobs.py | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/nautobot_ssot/integrations/aristacv/jobs.py b/nautobot_ssot/integrations/aristacv/jobs.py index 6556d549d..4c2c5e9dc 100644 --- a/nautobot_ssot/integrations/aristacv/jobs.py +++ b/nautobot_ssot/integrations/aristacv/jobs.py @@ -18,6 +18,20 @@ name = "SSoT - Arista CloudVision" # pylint: disable=invalid-name +class MissingConfigSetting(Exception): + """Exception raised for missing configuration settings. + + Attributes: + message (str): Returned explanation of Error. + """ + + def __init__(self, setting): + """Initialize Exception with Setting that is missing and message.""" + self.setting = setting + self.message = f"Missing configuration setting - {setting}!" + super().__init__(self.message) + + class CloudVisionDataSource(DataSource, Job): # pylint: disable=abstract-method """CloudVision SSoT Data Source.""" @@ -84,6 +98,16 @@ def data_mappings(cls): def load_source_adapter(self): """Load data from CloudVision into DiffSync models.""" + if not APP_SETTINGS.get("from_cloudvision_default_site"): + self.logger.error( + "App setting `aristacv_from_cloudvision_default_site` is not defined. This setting is required for the App to function." + ) + raise MissingConfigSetting(setting="aristacv_from_cloudvision_default_site") + if not APP_SETTINGS.get("from_cloudvision_default_device_role"): + self.logger.error( + "App setting `aristacv_from_cloudvision_default_device_role` is not defined. This setting is required for the App to function." + ) + raise MissingConfigSetting(setting="aristacv_from_cloudvision_default_device_role") if self.debug: if APP_SETTINGS.get("delete_devices_on_sync"): self.logger.warning( From 0739e218de3860a5a8bd1c4762e60afd2df473a3 Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:34:23 -0600 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Correct=20Device=20at?= =?UTF-8?q?tribute=20to=20be=20role=20instead=20of=20device=5Frole.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrations/aristacv/diffsync/models/nautobot.py | 2 +- nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nautobot_ssot/integrations/aristacv/diffsync/models/nautobot.py b/nautobot_ssot/integrations/aristacv/diffsync/models/nautobot.py index a41342f61..f6659dd4c 100644 --- a/nautobot_ssot/integrations/aristacv/diffsync/models/nautobot.py +++ b/nautobot_ssot/integrations/aristacv/diffsync/models/nautobot.py @@ -78,7 +78,7 @@ def create(cls, diffsync, ids, attrs): new_device = OrmDevice( status=OrmStatus.objects.get(name=attrs["status"]), device_type=device_type_object, - device_role=role, + role=role, platform=platform, site=site, name=ids["name"], diff --git a/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py b/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py index 15963bf79..310ba292f 100644 --- a/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py +++ b/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py @@ -27,10 +27,10 @@ # device_role = DeviceRole.objects.create(name="Router", slug="router") # Device.objects.create( -# name="csr1", device_type=device_type, device_role=device_role, site=site_1, status=status_active +# name="csr1", device_type=device_type, role=device_role, site=site_1, status=status_active # ) # Device.objects.create( -# name="csr2", device_type=device_type, device_role=device_role, site=site_2, status=status_active +# name="csr2", device_type=device_type, role=device_role, site=site_2, status=status_active # ) # VLAN.objects.create(name="VLAN101", vid=101, status=status_active, site=site_1) From 153c981b3fca087710605b509a940a8ee45ff8ee Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:36:53 -0600 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Ensure=20CustomField?= =?UTF-8?q?=20key=20doesn't=20have=20dashes=20when=20slugified.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py | 2 +- nautobot_ssot/integrations/infoblox/utils/diffsync.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py b/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py index 988de2ffb..5a164c955 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py @@ -58,7 +58,7 @@ def process_ext_attrs(diffsync, obj: object, extattrs: dict): f"Unable to find Tenant {attr_value} for {obj} found in Extensibility Attributes '{attr}'. {err}" ) _cf_dict = { - "key": slugify(attr), + "key": slugify(attr).replace("-", "_"), "type": CustomFieldTypeChoices.TYPE_TEXT, "label": attr, } diff --git a/nautobot_ssot/integrations/infoblox/utils/diffsync.py b/nautobot_ssot/integrations/infoblox/utils/diffsync.py index ccbe3f12c..88eecbc4c 100644 --- a/nautobot_ssot/integrations/infoblox/utils/diffsync.py +++ b/nautobot_ssot/integrations/infoblox/utils/diffsync.py @@ -58,7 +58,7 @@ def get_ext_attr_dict(extattrs: dict): """ fixed_dict = {} for key, value in extattrs.items(): - fixed_dict[slugify(key)] = value["value"] + fixed_dict[slugify(key).replace("-", "_")] = value["value"] return fixed_dict