Skip to content

Commit 23f2fbc

Browse files
jdrew82cdtomkinskacem-expereoKircheneersmk4664
authored
Release v3.9.3 (#958)
* fix: 🐛 Fix _handle_single_parameter metadata key vs name inconsistency * Changelog Fragment * fix: ⚡ Fix a very small typo * Added UT * Lint * Added the enable_global_search configuration option. * Add the optional in the env example and documentation * Bump prepatch * style: 💡 Remove commented old code * Adding docstring to __init__ * LibreNMS Integration Creates Unknown Location in Dry Run Mode (#937) * fix: 🐛 Fix class to be Adapter instead of DiffSync * fix: 🐛 Correct assignments to vars * fix: 🐛 Remove creation of Unknown Site Location as this should be done in the CRUD operations for Locations. * fix: 🐛 Correct LocationType to pull from Job form variable * test: ✅ Add LocationType to test * docs: 📝 Add changelog fragment * U/smk4664 validate create update (#941) * Move cache to adapter and validate response This change moves the cache to the adapter, which means there will be a new cache every job run, instead of using a cache from when the server starts. Also adds checks and debug messages for the create/update so we can see when there are issues creating or updating. * Add Change Fragment * Fix Citrix ADM Throwing IP Error (#943) * refactor: ♻️ Separate IPAddress into host address and mask length and adjust identifiers on model. Also adjust the adapters and models to use updated ids and attrs. * test: ✅ Adjust tests for changes to model * fix: 🐛 Correct attribute for IPAddress in find_closer_parent_prefix function * fix: 🐛 Update IPAddressToInterface model to use host address instead of CIDR. * test: ✅ Update tests to address model change * refactor: ♻️ Update IPAddress query to include parent Namespace just to avoid duplicate IPs. * Add changelog fragment * test: ✅ Add tests for find_closest_parent_prefix() function * test: ✅ Add tests validating create/update functions for NautobotAddress * Handle 404 in Infoblox Integration (#944) * Have log use default arg "msg" instead of "message=" TypeErrors received because self.job.logger.warning expects positional arg "msg", but "message" was used. * Use required default arg ("msg") instead of kwarg ("message") when using self.job.logger. * Add Metadata to Bootstrap Integration (#938) * enable object metadata for bootstrap integration * consolidate metadata utils, set keys to app_label.model_name * Remove unnecessary INTEGRATION variable * Cookie updated by NetworkToCode Cookie Drift Manager Tool (#942) Template: ``` { "template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "dir": "nautobot-app", "ref": "nautobot-app-v2.5.1", "path": null } ``` Cookie: ``` { "remote": "https://github.com/nautobot/nautobot-app-ssot.git", "path": "/tmp/tmp3_ituvjv/nautobot-app-ssot", "repository_path": "/tmp/tmp3_ituvjv/nautobot-app-ssot", "dir": "", "branch_prefix": "drift-manager", "context": { "codeowner_github_usernames": "@smith-ntc", "full_name": "Network to Code, LLC", "email": "opensource@networktocode.com", "github_org": "nautobot", "app_name": "nautobot_ssot", "verbose_name": "Single Source of Truth", "app_slug": "nautobot-ssot", "project_slug": "nautobot-app-ssot", "repo_url": "https://github.com/nautobot/nautobot-app-ssot", "base_url": "ssot", "min_nautobot_version": "2.0.0", "max_nautobot_version": "2.9999", "camel_name": "NautobotSSOTApp", "project_short_description": "Nautobot Single Source of Truth", "model_class_name": "Sync", "open_source_license": "Apache-2.0", "docs_base_url": "https://docs.nautobot.com", "docs_app_url": "https://docs.nautobot.com/projects/ssot/en/latest", "_extensions": [ "local_extensions.camel_case_to_kebab", "local_extensions.camel_case_to_words" ], "_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git", "_output_dir": "/tmp/tmp3_ituvjv", "_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app", "_checkout": "nautobot-app-v2.5.1" }, "base_branch": "develop", "remote_name": "origin", "pull_request_strategy": "PullRequestStrategy.CREATE", "post_actions": [], "baked_commit_ref": "a93c33a2e5583173d90b69dbc7268ca90083a248", "draft": false } ``` CLI Arguments: ``` { "cookie_dir": "", "input": false, "json_filename": "", "output_dir": "", "push": true, "template": "", "template_dir": "", "template_ref": "nautobot-app-v2.5.1", "pull_request": null, "post_action": [], "disable_post_actions": true, "draft": null } ``` Co-authored-by: bakebot <info@networktocode.com> * Import filters from integrations. (#947) * Import filters from integrations. * Update Changelog * Fix __all__ definition (pylint) * fix(ssot/dnac): Process devices with unrecognized platforms instead o… (#953) * fix(ssot/dnac): Process devices with unrecognized platforms instead of skipping When syncing some devices from Cisco DNA Center, the SSoT job would silently skip creating or updating any device whose platform was not recognized or explicitly mapped, such as certain models of Cisco Wireless APs. This resulted in an incomplete synchronization where these devices would be missing in Nautobot, but the job would still report as successful, making the data discrepancy difficult to notice. This commit modifies the device processing logic to ensure that devices are no longer skipped due to an unrecognized platform. Now, these devices are correctly identified and synced into Nautobot, leading to a more complete and accurate inventory representation. Fixes #908 * Update Changelog * Optimize Sync history queryset to avoid excessive memory usage (#952) * Optimize Sync history queryset to avoid excessive memory usage * add fragment * Add ExternalIntegration creation to Bootstrap integration. (#948) * feat: ✨ Add ExternalIntegration creation to Bootstrap integration * Correct documentation for extra_config/headers formatting * Generalise Secrets/SecretsGroup and remove extra logging * Missed one reference * Update Python Target Version for Ruff (#955) * build: Update ruff to target Python 3.9 * Add changelog fragment * build: 📝 Update release notes for 3.9.3 * Bump version * docs: Add first time contributors to release notes * docs: ⏪️ Revert release note change * Update .cookiecutter.json Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com> --------- Co-authored-by: Chris Tomkins <chris.tomkins@networktocode.com> Co-authored-by: Kacem Ben Dhiab <kacem.bendhiab@expereo.com> Co-authored-by: Chris Tomkins <80041880+cdtomkins@users.noreply.github.com> Co-authored-by: Leo Kirchner <Kircheneer@users.noreply.github.com> Co-authored-by: Stephen Kiely <stephenkiely87@gmail.com> Co-authored-by: fpocai <fpocai@gmail.com> Co-authored-by: Ryan Gillespie <24619595+nopg@users.noreply.github.com> Co-authored-by: Nautobot-Bot <79372327+nautobot-bot@users.noreply.github.com> Co-authored-by: bakebot <info@networktocode.com> Co-authored-by: Rodrigo Gonçalves de Branco <rodrigo.g.branco@gmail.com> Co-authored-by: Roberto Duarte <roberto.duarte@codilime.com> Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
2 parents 378785a + e84189a commit 23f2fbc

File tree

48 files changed

+1563
-471
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1563
-471
lines changed

.cookiecutter.json

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,13 @@
2121
"_drift_manager": {
2222
"template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
2323
"template_dir": "nautobot-app",
24-
"template_ref": "refs/tags/nautobot-app-v2.5.0",
24+
"template_ref": "nautobot-app-v2.5.1",
2525
"cookie_dir": "",
2626
"branch_prefix": "drift-manager",
2727
"pull_request_strategy": "create",
28-
"post_actions": [
29-
"ruff",
30-
"poetry"
31-
],
28+
"post_actions": [],
3229
"draft": false,
33-
"baked_commit_ref": "a93c33a2e5583173d90b69dbc7268ca90083a248"
30+
"baked_commit_ref": "4d0e57e0195ea0cef972e828baf5f72b8d47a617"
3431
}
3532
}
3633
}

.github/ISSUE_TEMPLATE/bug_report.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
---
22
name: 🐛 Bug Report
33
about: Report a reproducible bug in the current release of nautobot-ssot
4+
labels:
5+
- "type: bug"
46
---
57

68
### Environment

.github/ISSUE_TEMPLATE/feature_request.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
---
22
name: ✨ Feature Request
33
about: Propose a new feature or enhancement
4-
4+
labels:
5+
- "type: feature"
56
---
67

78
### Environment

development/creds.example.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,5 @@ MERAKI_TOKEN='vtx01710aa0fn452740055y1hs60ns8c107ho168'
6161

6262
NAUTOBOT_SSOT_VSPHERE_USERNAME="Test"
6363
NAUTOBOT_SSOT_VSPHERE_PASSWORD="Test"
64+
65+
NAUTOBOT_SSOT_ENABLE_GLOBAL_SEARCH=True

development/nautobot_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@
214214
"prefix": True,
215215
"scheduled_job": True,
216216
"custom_field": True,
217+
"external_integration": True,
217218
},
218219
"citrix_adm_update_sites": is_truthy(os.getenv("NAUTOBOT_SSOT_CITRIX_ADM_UPDATE_SITES", "true")),
219220
"enable_aci": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ACI")),
@@ -296,6 +297,7 @@
296297
"servicenow_username": os.getenv("SERVICENOW_USERNAME", ""),
297298
"vsphere_url": os.getenv("NAUTOBOT_SSOT_VSPHERE_URL", "https://replace.me.local"),
298299
"vsphere_verify_ssl": is_truthy(os.getenv("NAUTOBOT_SSOT_VSPHERE_VERIFY_SSL", "false")),
300+
"enable_global_search": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_GLOBAL_SEARCH", "true")),
299301
},
300302
"nautobot_device_lifecycle_mgmt": {
301303
"barchart_bar_width": float(os.environ.get("BARCHART_BAR_WIDTH", 0.1)),

docs/admin/install.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ The app behavior can be controlled with the following list of settings:
8282
| Key | Example | Default | Description |
8383
|----------------------|----------------|-----------|-----------------------------------------------------------------------------|
8484
| `hide_example_jobs` | `True` | `False` | A boolean to represent whether or not to display the example job. |
85-
| `enable_metadata_for`| `DataSourceJob`| *(empty)* | List of job class names for which object metadata support should be enabled.|
85+
| `enable_metadata_for`| `DataSourceJob`| *(empty)* | List of job class names for which object metadata support should be enabled. |
86+
| `enable_global_search`| `False`| `True` | A boolean to represent wether or not to allow nautobot global search to include SSOT Sync logs. |
8687

8788
## Integrations Configuration
8889

docs/admin/integrations/bootstrap_setup.md

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,43 +21,44 @@ PLUGINS = ["nautobot_ssot"]
2121

2222
PLUGINS_CONFIG = {
2323
"nautobot_ssot": {
24-
# Other nautobot_ssot settings ommitted.
25-
"enable_bootstrap": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_BOOTSTRAP", "true")),
26-
"bootstrap_nautobot_environment_branch": os.getenv("NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH", "develop"),
27-
"bootstrap_models_to_sync": {
28-
"secret": True,
29-
"secrets_group": True,
30-
"git_repository": True,
31-
"dynamic_group": True,
32-
"computed_field": True,
33-
"custom_field": True,
34-
"tag": True,
35-
"graph_ql_query": True,
36-
"software": False,
37-
"software_image": False,
38-
"validated_software": False,
39-
"tenant_group": True,
40-
"tenant": True,
41-
"role": True,
42-
"manufacturer": True,
43-
"platform": True,
44-
"location_type": True,
45-
"location": True,
46-
"team": True,
47-
"contact": True,
48-
"provider": True,
49-
"provider_network": True,
50-
"circuit_type": True,
51-
"circuit": True,
52-
"circuit_termination": True,
53-
"namespace": True,
54-
"rir": True,
55-
"vlan_group": True,
56-
"vlan": True,
57-
"vrf": True,
58-
"prefix": True,
59-
"scheduled_job": True,
60-
},
24+
# Other nautobot_ssot settings omitted.
25+
"enable_bootstrap": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_BOOTSTRAP", "true")),
26+
"bootstrap_nautobot_environment_branch": os.getenv("NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH", "develop"),
27+
"bootstrap_models_to_sync": {
28+
"secret": True,
29+
"secrets_group": True,
30+
"git_repository": True,
31+
"dynamic_group": True,
32+
"computed_field": True,
33+
"custom_field": True,
34+
"tag": True,
35+
"graph_ql_query": True,
36+
"software": False,
37+
"software_image": False,
38+
"validated_software": False,
39+
"tenant_group": True,
40+
"tenant": True,
41+
"role": True,
42+
"manufacturer": True,
43+
"platform": True,
44+
"location_type": True,
45+
"location": True,
46+
"team": True,
47+
"contact": True,
48+
"provider": True,
49+
"provider_network": True,
50+
"circuit_type": True,
51+
"circuit": True,
52+
"circuit_termination": True,
53+
"namespace": True,
54+
"rir": True,
55+
"vlan_group": True,
56+
"vlan": True,
57+
"vrf": True,
58+
"prefix": True,
59+
"scheduled_job": True,
60+
"external_integration": True,
61+
},
6162
}
6263
}
6364
```

docs/admin/integrations/librenms_setup.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ PLUGINS = ["nautobot_ssot"]
2121

2222
PLUGINS_CONFIG = {
2323
"nautobot_ssot": {
24-
# Other nautobot_ssot settings ommitted.
24+
# Other nautobot_ssot settings omitted.
2525
"enable_librenms": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_LIBRENMS", "true")),
2626
}
2727
}

docs/admin/release_notes/version_3.9.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,27 @@ Please note that the behavior in the SNOW integration now is to swallow and log
9393
### Documentation
9494

9595
- [#925](https://github.com/nautobot/nautobot-app-ssot/issues/925) - Added Analytics GTM template override only to the public ReadTheDocs build.
96+
97+
## [v3.9.3 (2025-09-09)](https://github.com/nautobot/nautobot-app-ssot/releases/tag/v3.9.3)
98+
99+
### Added
100+
101+
- [#913](https://github.com/nautobot/nautobot-app-ssot/issues/913) - Added the enable_global_search configuration option to control whether the Nautobot global search includes synclogs.
102+
- [#938](https://github.com/nautobot/nautobot-app-ssot/issues/938) - Added support for Object Metadata in the Bootstrap integration.
103+
- [#948](https://github.com/nautobot/nautobot-app-ssot/issues/948) - Added ExternalIntegration creation to Bootstrap integration.
104+
105+
### Fixed
106+
107+
- [#548](https://github.com/nautobot/nautobot-app-ssot/issues/548) - Improved performance of the SSoT Sync history page by removing an unnecessary log prefetch and deferring large JSON fields.
108+
- [#596](https://github.com/nautobot/nautobot-app-ssot/issues/596) - Use required default arg ("msg") instead of kwarg ("message") when using self.job.logger.
109+
- [#723](https://github.com/nautobot/nautobot-app-ssot/issues/723) - Fixed `_handle_single_parameter` metadata key vs name inconsistency.
110+
- [#910](https://github.com/nautobot/nautobot-app-ssot/issues/910) - Fixed Service Now caching sys_ids causing objects to not be created.
111+
- [#936](https://github.com/nautobot/nautobot-app-ssot/issues/936) - Fixed creation of "Unknown" location when running LibreNMS integration in dry run mode.
112+
- [#940](https://github.com/nautobot/nautobot-app-ssot/issues/940) - Fixed error in Citrix ADM integration when attempting to assign an IP Address to an Interface.
113+
- [#947](https://github.com/nautobot/nautobot-app-ssot/issues/947) - Fixed Advanced Filters for Infoblox Config and Automation Gateway Management.
114+
- [#953](https://github.com/nautobot/nautobot-app-ssot/issues/953) - Fixed an issue in the Cisco DNA Center integration where devices with unmapped platforms were silently skipped during synchronization, resulting in an incomplete inventory
115+
116+
### Housekeeping
117+
118+
- [#954](https://github.com/nautobot/nautobot-app-ssot/issues/954) - Update ruff to target Python 3.9
119+
- Rebaked from the cookie `nautobot-app-v2.5.1`.

docs/user/integrations/bootstrap.md

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Synchronization of data follows this workflow:
1313
5. If an object needs to be updated it will be updated with the values provided by Bootstrap data.
1414
6. If an object needs to be deleted it will be deleted.
1515

16+
> Starting in SSoT 3.9.3, the Objects imported and updated by Bootstrap will have a [Object Metadata](https://docs.nautobot.com/projects/core/en/stable/user-guide/platform-functionality/objectmetadata/) created or updated to track the last update from Bootstrap.
1617
1718
### Bootstrap as DataTarget
1819

@@ -28,35 +29,43 @@ Data values are generally normalized in the app code. If a value is supposed to
2829

2930
```yaml
3031
secret:
31-
- name: Github_Service_Acct
32+
- name: Service_Acct_User
3233
provider: environment-variable # or text-file
3334
parameters:
34-
variable: GITHUB_SERVICE_ACCT
35+
variable: SERVICE_ACCT_USER
3536
path:
36-
- name: Github_Service_Token
37+
- name: Service_Acct_Token
3738
provider: environment-variable # or text-file
3839
parameters:
39-
variable: GITHUB_SERVICE_TOKEN
40+
variable: SERVICE_ACCT_TOKEN
41+
path:
42+
- name: Service_Acct_Password
43+
provider: environment-variable # or text-file
44+
parameters:
45+
variable: SERVICE_ACCT_PASSWORD
4046
path:
4147
secrets_group:
42-
- name: Github_Service_Account
48+
- name: Service_Account
4349
secrets:
44-
- name: Github_Service_Acct
50+
- name: Service_Acct_User
4551
secret_type: username
4652
access_type: HTTP(S)
47-
- name: Github_Service_Token
53+
- name: Service_Acct_Token
4854
secret_type: token
4955
access_type: HTTP(S)
56+
- name: Service_Acct_Password
57+
secret_type: password
58+
access_type: HTTP(S)
5059
git_repository:
5160
- name: "Backbone Config Contexts"
5261
url: "https://github.com/nautobot/backbone-config-contexts.git"
5362
branch: "main" # if branch is defined it will be used instead of the "git_branch" in the "branch" variable file.
54-
secrets_group_name: "Github_Service_Account"
63+
secrets_group_name: "Service_Account"
5564
provided_data_type:
5665
- "config contexts"
5766
- name: "Datacenter Config Contexts"
5867
url: "https://github.com/nautobot/datacenter-config-contexts.git"
59-
secrets_group_name: "Github_Service_Account"
68+
secrets_group_name: "Service_Account"
6069
provided_data_type:
6170
- "config contexts"
6271
dynamic_group:
@@ -135,6 +144,20 @@ validated_software:
135144
valid_until:
136145
preferred_version: false
137146
tags: []
147+
external_integration:
148+
- name: "Altiplano"
149+
remote_url: "https://my.altiplano.instance:45321"
150+
verify_ssl: false
151+
secrets_group: "Service_Account"
152+
timeout: 30
153+
headers:
154+
Accept: "application/yang-data+json"
155+
Content-Type: "application/yang-data+json"
156+
extra_config:
157+
device_types:
158+
- "LS-SF-SFMB-A"
159+
duid_prefixes_to_ignore:
160+
- "9876"
138161
```
139162
140163
#### develop.yml
@@ -873,3 +896,22 @@ validated_software:
873896
```
874897

875898
The `software:` key is a reference to the platform and software version of a Software object that already exists in Nautobot (or is created by this plugin). The `valid_since` and `valid_until` fields must dates in YYYY-MM-DD format. The `devices`, `device_types`, `device_roles`, `inventory_items`, and `object_tags` are all lists of objects to apply the validated software to for validation against what is currently running on the device.
899+
900+
### ExternalIntegration
901+
902+
Create ExternalIntegration objects. Uses the following data structure, only `name`, `remote_url`, and `timeout` are required. Any external_integrations not included in the Bootstrap `global_settings.yaml` file may be deleted.
903+
904+
```yaml
905+
external_integration:
906+
- name: # str
907+
remote_url: # str
908+
timeout: # int
909+
# Optional Arguments
910+
verify_ssl: # bool, default: True
911+
secrets_group: # str
912+
headers: {} # dict
913+
http_method: # str -- Options are: get, post, put, patch, delete
914+
ca_file_path: # str
915+
extra_config: {} # dict
916+
tags: [] # List[str]
917+
```

0 commit comments

Comments
 (0)