forward-netbox 2.2.3__tar.gz → 2.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/PKG-INFO +3 -2
  2. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/README.md +2 -1
  3. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/__init__.py +1 -1
  4. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/jobs.py +35 -0
  5. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_analysis.nqe +3 -3
  6. forward_netbox-2.2.4/forward_netbox/tests/test_device_analysis_query.py +26 -0
  7. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/pyproject.toml +1 -1
  8. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/LICENSE +0 -0
  9. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/api/__init__.py +0 -0
  10. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/api/serializers.py +0 -0
  11. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/api/urls.py +0 -0
  12. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/api/views.py +0 -0
  13. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/choices.py +0 -0
  14. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/exceptions.py +0 -0
  15. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/filtersets.py +0 -0
  16. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/forms.py +0 -0
  17. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/__init__.py +0 -0
  18. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/__init__.py +0 -0
  19. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_apic_cimc_readiness_audit.py +0 -0
  20. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_apply_identity_audit.py +0 -0
  21. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_blocker_audit.py +0 -0
  22. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_collection_gap_alert.py +0 -0
  23. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_device_scope_reconciliation_audit.py +0 -0
  24. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_link_vsys_parents.py +0 -0
  25. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_module_readiness.py +0 -0
  26. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_primary_ip_audit.py +0 -0
  27. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_pushdown_profile.py +0 -0
  28. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_query_diff_coverage_audit.py +0 -0
  29. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_scope_ipam_audit.py +0 -0
  30. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_seed_ui_harness.py +0 -0
  31. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_tag_delete_eligible.py +0 -0
  32. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/management/commands/forward_validation_org_query_audit.py +0 -0
  33. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0001_initial.py +0 -0
  34. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0002_add_coalesce_fields.py +0 -0
  35. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0003_forwardingestionissue_context_fields.py +0 -0
  36. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0004_forwardingestion_baseline_fields.py +0 -0
  37. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0005_validation_and_reporting.py +0 -0
  38. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0006_alter_forwardnqemap_netbox_model.py +0 -0
  39. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0007_forwardingestion_persisted_change_counters.py +0 -0
  40. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0008_alter_forwardnqemap_netbox_model.py +0 -0
  41. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0009_alter_forwardnqemap_netbox_model.py +0 -0
  42. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0010_forwardvalidationrun_override_applied_and_more.py +0 -0
  43. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0011_forwardingestion_change_request_id.py +0 -0
  44. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0012_forwardnqemap_query_reference.py +0 -0
  45. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0013_execution_run_step.py +0 -0
  46. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0014_execution_step_fetch_scope.py +0 -0
  47. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0015_execution_step_apply_engine.py +0 -0
  48. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0016_execution_step_query_metrics.py +0 -0
  49. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0017_execution_step_row_counters.py +0 -0
  50. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0018_execution_run_reconciliation_events.py +0 -0
  51. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0019_forwardexecutionstep_query_parameters.py +0 -0
  52. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0020_execution_step_operation.py +0 -0
  53. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0021_add_fhrpgroup_nqe_map_choice.py +0 -0
  54. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0022_alter_forwardnqemap_netbox_model.py +0 -0
  55. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0023_split_ip_address_maps.py +0 -0
  56. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0024_forwarddeviceanalysis.py +0 -0
  57. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0025_device_analysis_netboxmodel.py +0 -0
  58. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0026_forwarddeviceanalysis_collection_result.py +0 -0
  59. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0027_alter_forwardexecutionrun_backend.py +0 -0
  60. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0028_remove_forwardexecutionstep_run_and_more.py +0 -0
  61. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0029_forward_parent_device_cf.py +0 -0
  62. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/0030_forwarddeviceanalysis_cve_ids.py +0 -0
  63. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/migrations/__init__.py +0 -0
  64. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/models.py +0 -0
  65. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/navigation.py +0 -0
  66. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/__init__.py +0 -0
  67. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_apic_cimc_inventory.nqe +0 -0
  68. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_apic_nodes.nqe +0 -0
  69. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_app_profiles.nqe +0 -0
  70. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_bridge_domains.nqe +0 -0
  71. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_command_inventory.nqe +0 -0
  72. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_contracts.nqe +0 -0
  73. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_endpoint_groups.nqe +0 -0
  74. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_fabrics.nqe +0 -0
  75. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_filters.nqe +0 -0
  76. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_l3outs.nqe +0 -0
  77. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_nodes.nqe +0 -0
  78. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_pods.nqe +0 -0
  79. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_static_port_bindings.nqe +0 -0
  80. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_tenants.nqe +0 -0
  81. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_aci_vrfs.nqe +0 -0
  82. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_bgp_address_families.nqe +0 -0
  83. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_bgp_peer_address_families.nqe +0 -0
  84. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_bgp_peers.nqe +0 -0
  85. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_feature_tags.nqe +0 -0
  86. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_feature_tags_with_rules.nqe +0 -0
  87. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_models.nqe +0 -0
  88. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_models_with_netbox_aliases.nqe +0 -0
  89. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_types.nqe +0 -0
  90. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_device_vendors.nqe +0 -0
  91. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_devices.nqe +0 -0
  92. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_devices_with_netbox_aliases.nqe +0 -0
  93. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_hsrp_groups.nqe +0 -0
  94. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_inferred_interface_cables.nqe +0 -0
  95. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_interfaces.nqe +0 -0
  96. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_inventory_items.nqe +0 -0
  97. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_ip_addresses_ipv4.nqe +0 -0
  98. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_ip_addresses_ipv6.nqe +0 -0
  99. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_ip_addresses_unassignable_diagnostics.nqe +0 -0
  100. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_locations.nqe +0 -0
  101. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_mac_addresses.nqe +0 -0
  102. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_modules.nqe +0 -0
  103. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_ospf_areas.nqe +0 -0
  104. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_ospf_instances.nqe +0 -0
  105. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_ospf_interfaces.nqe +0 -0
  106. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_peering_sessions.nqe +0 -0
  107. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_platforms.nqe +0 -0
  108. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_prefixes_ipv4.nqe +0 -0
  109. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_prefixes_ipv6.nqe +0 -0
  110. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_routing_import_diagnostics.nqe +0 -0
  111. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_virtual_chassis.nqe +0 -0
  112. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_vlans.nqe +0 -0
  113. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/forward_vrfs.nqe +0 -0
  114. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/queries/netbox_utilities.nqe +0 -0
  115. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/signals.py +0 -0
  116. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/static/forward_netbox/img/fn-logo.svg +0 -0
  117. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tables.py +0 -0
  118. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/template_content.py +0 -0
  119. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwarddriftpolicy.html +0 -0
  120. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardingestion.html +0 -0
  121. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardnqemap.html +0 -0
  122. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsource.html +0 -0
  123. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsync.html +0 -0
  124. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsync_dependency_preview.html +0 -0
  125. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsync_drift_report.html +0 -0
  126. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsync_health.html +0 -0
  127. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsync_module_readiness.html +0 -0
  128. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardsync_scope_reconciliation.html +0 -0
  129. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/forwardvalidationrun.html +0 -0
  130. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/brand_bar.html +0 -0
  131. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/device_analysis_panel.html +0 -0
  132. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/diff.html +0 -0
  133. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/execution_insights.html +0 -0
  134. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/logs_pending.html +0 -0
  135. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/merge_form.html +0 -0
  136. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/inc/validation_force_allow_form.html +0 -0
  137. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/change_explainability.html +0 -0
  138. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/ingestion_all.html +0 -0
  139. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/ingestion_merge_button.html +0 -0
  140. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/ingestion_progress.html +0 -0
  141. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/ingestion_statistics.html +0 -0
  142. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/ingestion_status.html +0 -0
  143. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/job_logs.html +0 -0
  144. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/object_tabs.html +0 -0
  145. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/stage_switcher_buttons.html +0 -0
  146. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templates/forward_netbox/partials/validation_force_allow_button.html +0 -0
  147. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templatetags/__init__.py +0 -0
  148. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/templatetags/forward_netbox_helpers.py +0 -0
  149. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/__init__.py +0 -0
  150. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/fixtures/aci_command_inventory_expected.json +0 -0
  151. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/fixtures/aci_discovery_expected.json +0 -0
  152. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/scenarios.py +0 -0
  153. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_api_usage.py +0 -0
  154. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_api_views.py +0 -0
  155. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_apic_cimc_readiness_audit_command.py +0 -0
  156. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_apply_engine.py +0 -0
  157. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_apply_identity_audit.py +0 -0
  158. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_branching.py +0 -0
  159. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_brand_bar.py +0 -0
  160. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_bulk_adapter_parity.py +0 -0
  161. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_bulk_merge.py +0 -0
  162. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_bulk_merge_scale.py +0 -0
  163. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_device_scope_reconciliation_audit_command.py +0 -0
  164. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_device_scope_tagging.py +0 -0
  165. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_execution_insights_delete_label.py +0 -0
  166. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_forms.py +0 -0
  167. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_forward_api.py +0 -0
  168. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_health.py +0 -0
  169. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_ingestion_merge.py +0 -0
  170. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_interface_naming.py +0 -0
  171. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_ip_address_dedup_query.py +0 -0
  172. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_ipaddress_dup_global.py +0 -0
  173. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_issue_rendering.py +0 -0
  174. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_job_compat.py +0 -0
  175. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_job_liveness.py +0 -0
  176. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_jobs.py +0 -0
  177. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_log_export.py +0 -0
  178. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_logging.py +0 -0
  179. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_models.py +0 -0
  180. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_module_readiness.py +0 -0
  181. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_module_readiness_rollup.py +0 -0
  182. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_plugin_integrations.py +0 -0
  183. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_primary_ip.py +0 -0
  184. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_primary_ip_audit.py +0 -0
  185. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_primary_ip_integration.py +0 -0
  186. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_query_binding.py +0 -0
  187. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_query_diff_coverage_audit_command.py +0 -0
  188. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_query_registry.py +0 -0
  189. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_release_readiness_audit.py +0 -0
  190. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_runtime_dependency_check.py +0 -0
  191. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_scope_ipam_audit.py +0 -0
  192. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_scope_matched_tags.py +0 -0
  193. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_scope_module_ui.py +0 -0
  194. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sensitive_content.py +0 -0
  195. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_stability_hardening.py +0 -0
  196. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sync.py +0 -0
  197. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sync_aci.py +0 -0
  198. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sync_facade.py +0 -0
  199. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sync_orchestration.py +0 -0
  200. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sync_runner_contracts.py +0 -0
  201. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_sync_state.py +0 -0
  202. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_synthetic_scenarios.py +0 -0
  203. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_validation_org_query_audit_command.py +0 -0
  204. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/tests/test_vsys_parent.py +0 -0
  205. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/urls.py +0 -0
  206. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/__init__.py +0 -0
  207. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/api_usage.py +0 -0
  208. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/apply_engine.py +0 -0
  209. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/apply_engine_bulk.py +0 -0
  210. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/apply_engine_decision.py +0 -0
  211. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/apply_identity_audit.py +0 -0
  212. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/branch_budget.py +0 -0
  213. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/branching.py +0 -0
  214. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/bulk_merge.py +0 -0
  215. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/change_explainability.py +0 -0
  216. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/density_learning.py +0 -0
  217. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/device_analysis.py +0 -0
  218. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/direct_changes.py +0 -0
  219. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/drift_report.py +0 -0
  220. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/execution_ledger.py +0 -0
  221. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/execution_telemetry.py +0 -0
  222. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/fast_bootstrap_executor.py +0 -0
  223. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/fetch_artifacts.py +0 -0
  224. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/forward_api.py +0 -0
  225. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/forward_api_impl.py +0 -0
  226. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/health.py +0 -0
  227. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/health_apply_fetch.py +0 -0
  228. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/health_checks.py +0 -0
  229. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/health_summary_blocks.py +0 -0
  230. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/ingestion_issues.py +0 -0
  231. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/ingestion_merge.py +0 -0
  232. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/ingestion_presentation.py +0 -0
  233. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/interface_naming.py +0 -0
  234. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/job_compat.py +0 -0
  235. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/job_liveness.py +0 -0
  236. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/json_safe.py +0 -0
  237. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/logging.py +0 -0
  238. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/merge.py +0 -0
  239. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/model_contracts.py +0 -0
  240. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/model_validation.py +0 -0
  241. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/module_readiness.py +0 -0
  242. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/multi_branch_lifecycle.py +0 -0
  243. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/plugin_integrations/__init__.py +0 -0
  244. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/plugin_integrations/registry.py +0 -0
  245. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/primary_ip.py +0 -0
  246. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/primary_ip_audit.py +0 -0
  247. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/query_binding.py +0 -0
  248. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/query_binding_resolution.py +0 -0
  249. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/query_diagnostics.py +0 -0
  250. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/query_fetch.py +0 -0
  251. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/query_fetch_execution.py +0 -0
  252. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/query_registry.py +0 -0
  253. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/runtime_guidance.py +0 -0
  254. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/scope_ipam_audit.py +0 -0
  255. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/scope_reconciliation.py +0 -0
  256. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sensitive_content.py +0 -0
  257. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/single_branch_executor.py +0 -0
  258. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/snapshot_freshness.py +0 -0
  259. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/support_bundle_archive.py +0 -0
  260. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync.py +0 -0
  261. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_aci.py +0 -0
  262. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_cable.py +0 -0
  263. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_contracts.py +0 -0
  264. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_core_models.py +0 -0
  265. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_device.py +0 -0
  266. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_events.py +0 -0
  267. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_execution.py +0 -0
  268. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_facade.py +0 -0
  269. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_interface.py +0 -0
  270. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_inventory_module.py +0 -0
  271. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_ipam.py +0 -0
  272. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_orchestration.py +0 -0
  273. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_primitives.py +0 -0
  274. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_reporting.py +0 -0
  275. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_routing.py +0 -0
  276. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_routing_impl.py +0 -0
  277. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_runner_adapters.py +0 -0
  278. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_runner_contracts.py +0 -0
  279. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/sync_state.py +0 -0
  280. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/validation.py +0 -0
  281. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/validation_org_query.py +0 -0
  282. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/utilities/vsys_parent.py +0 -0
  283. {forward_netbox-2.2.3 → forward_netbox-2.2.4}/forward_netbox/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forward-netbox
3
- Version: 2.2.3
3
+ Version: 2.2.4
4
4
  Summary: NetBox plugin to sync Forward data into NetBox via built-in NQE queries
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -31,7 +31,8 @@ Forward 26.6 is the baseline for async NQE.
31
31
 
32
32
  | Plugin Release | NetBox Version | Status |
33
33
  | --- | --- | --- |
34
- | `v2.2.3` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Field-feedback fixes: delete-count labeling, vsys/vdom auto-link, skip empty VRFs, per-device CVE list, churn pinpoint, query-ID status clarify |
34
+ | `v2.2.4` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Hotfix: device-analysis NQE (bare foreach) errored refresh + CVE list; surface job errors into job.data |
35
+ | `v2.2.3` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.4`; Field-feedback fixes: delete-count labeling, vsys/vdom auto-link, skip empty VRFs, per-device CVE list, churn pinpoint, query-ID status clarify |
35
36
  | `v2.2.2` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.3`; Fix 504 gateway timeouts on large syncs: stop recomputing change-explainability on every poll during a long merge + back off poll to 15s |
36
37
  | `v2.2.1` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.2`; Add read-only forward_apply_identity_audit diagnostic to pinpoint 1-created/1-deleted idempotency churn |
37
38
  | `v2.2.0` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.1`; Fix devices mis-assigned the ACI platform; link Palo vsys / Fortinet vdom firewalls to their physical chassis |
@@ -8,7 +8,8 @@ Forward 26.6 is the baseline for async NQE.
8
8
 
9
9
  | Plugin Release | NetBox Version | Status |
10
10
  | --- | --- | --- |
11
- | `v2.2.3` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Field-feedback fixes: delete-count labeling, vsys/vdom auto-link, skip empty VRFs, per-device CVE list, churn pinpoint, query-ID status clarify |
11
+ | `v2.2.4` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Hotfix: device-analysis NQE (bare foreach) errored refresh + CVE list; surface job errors into job.data |
12
+ | `v2.2.3` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.4`; Field-feedback fixes: delete-count labeling, vsys/vdom auto-link, skip empty VRFs, per-device CVE list, churn pinpoint, query-ID status clarify |
12
13
  | `v2.2.2` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.3`; Fix 504 gateway timeouts on large syncs: stop recomputing change-explainability on every poll during a long merge + back off poll to 15s |
13
14
  | `v2.2.1` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.2`; Add read-only forward_apply_identity_audit diagnostic to pinpoint 1-created/1-deleted idempotency churn |
14
15
  | `v2.2.0` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.1`; Fix devices mis-assigned the ACI platform; link Palo vsys / Fortinet vdom firewalls to their physical chassis |
@@ -8,7 +8,7 @@ class NetboxForwardConfig(PluginConfig):
8
8
  name = "forward_netbox"
9
9
  verbose_name = "Forward Field Integration"
10
10
  description = "Sync Forward data into NetBox using built-in NQE queries."
11
- version = "2.2.3"
11
+ version = "2.2.4"
12
12
  base_url = "forward"
13
13
  min_version = "4.6.3"
14
14
 
@@ -385,6 +385,13 @@ def refresh_forward_device_analysis(job, *args, **kwargs):
385
385
  job.save(update_fields=["data"])
386
386
  job.terminate()
387
387
  except Exception as exc:
388
+ # Record the failure on the job so it is visible in the UI (the Data
389
+ # panel) instead of an empty Error field with null data.
390
+ job.data = {
391
+ "error": str(exc) or exc.__class__.__name__,
392
+ "error_type": exc.__class__.__name__,
393
+ }
394
+ job.save(update_fields=["data"])
388
395
  job.terminate(status=JobStatusChoices.STATUS_ERRORED)
389
396
  if type(exc) in (SyncError, JobTimeoutException):
390
397
  logger.error(exc)
@@ -408,6 +415,13 @@ def tag_forward_backfilled_devices(job, *args, **kwargs):
408
415
  job.save(update_fields=["data"])
409
416
  job.terminate()
410
417
  except Exception as exc:
418
+ # Record the failure on the job so it is visible in the UI (the Data
419
+ # panel) instead of an empty Error field with null data.
420
+ job.data = {
421
+ "error": str(exc) or exc.__class__.__name__,
422
+ "error_type": exc.__class__.__name__,
423
+ }
424
+ job.save(update_fields=["data"])
411
425
  job.terminate(status=JobStatusChoices.STATUS_ERRORED)
412
426
  if type(exc) in (SyncError, JobTimeoutException):
413
427
  logger.error(exc)
@@ -464,6 +478,13 @@ def tag_forward_delete_eligible_ipam(job, *args, **kwargs):
464
478
  job.save(update_fields=["data"])
465
479
  job.terminate()
466
480
  except Exception as exc:
481
+ # Record the failure on the job so it is visible in the UI (the Data
482
+ # panel) instead of an empty Error field with null data.
483
+ job.data = {
484
+ "error": str(exc) or exc.__class__.__name__,
485
+ "error_type": exc.__class__.__name__,
486
+ }
487
+ job.save(update_fields=["data"])
467
488
  job.terminate(status=JobStatusChoices.STATUS_ERRORED)
468
489
  if type(exc) in (SyncError, JobTimeoutException):
469
490
  logger.error(exc)
@@ -485,6 +506,13 @@ def create_forward_module_bays(job, *args, **kwargs):
485
506
  job.save(update_fields=["data"])
486
507
  job.terminate()
487
508
  except Exception as exc:
509
+ # Record the failure on the job so it is visible in the UI (the Data
510
+ # panel) instead of an empty Error field with null data.
511
+ job.data = {
512
+ "error": str(exc) or exc.__class__.__name__,
513
+ "error_type": exc.__class__.__name__,
514
+ }
515
+ job.save(update_fields=["data"])
488
516
  job.terminate(status=JobStatusChoices.STATUS_ERRORED)
489
517
  if type(exc) in (SyncError, JobTimeoutException):
490
518
  logger.error(exc)
@@ -511,6 +539,13 @@ def forward_dependency_preview(job, *args, **kwargs):
511
539
  job.save(update_fields=["data"])
512
540
  job.terminate()
513
541
  except Exception as exc:
542
+ # Record the failure on the job so it is visible in the UI (the Data
543
+ # panel) instead of an empty Error field with null data.
544
+ job.data = {
545
+ "error": str(exc) or exc.__class__.__name__,
546
+ "error_type": exc.__class__.__name__,
547
+ }
548
+ job.save(update_fields=["data"])
514
549
  job.terminate(status=JobStatusChoices.STATUS_ERRORED)
515
550
  if type(exc) in (SyncError, JobTimeoutException):
516
551
  logger.error(exc)
@@ -31,9 +31,9 @@ let physicalLinks =
31
31
  foreach l in i.links
32
32
  select l)
33
33
  let cveIds =
34
- foreach c in device.cveFindings
35
- where c.isVulnerable
36
- select c.cveId
34
+ (foreach c in device.cveFindings
35
+ where c.isVulnerable
36
+ select c.cveId)
37
37
  select {
38
38
  name: device.name,
39
39
  reachable: device.snapshotInfo.result == DeviceSnapshotResult.completed,
@@ -0,0 +1,26 @@
1
+ import re
2
+
3
+ from django.test import SimpleTestCase
4
+
5
+ from forward_netbox.utilities.query_registry import read_builtin_query_source
6
+
7
+
8
+ class DeviceAnalysisQueryTest(SimpleTestCase):
9
+ """Guard the device-analysis NQE against the 2.2.3 regression: a bare
10
+ ``let x = foreach ... select ...`` is INVALID NQE — the live Forward engine
11
+ returns HTTP 400 (``extraneous input 'foreach'``) and the whole
12
+ refresh-device-analysis job errors. The local NQE linter does NOT catch this
13
+ (it reported 0 errors on the broken query), so this source-level test is the
14
+ real guard. A ``foreach`` used as a value must be wrapped in parens / a call.
15
+ """
16
+
17
+ def test_cve_ids_comprehension_is_parenthesized(self):
18
+ source = read_builtin_query_source("forward_device_analysis.nqe")
19
+ self.assertIn("(foreach c in device.cveFindings", source)
20
+
21
+ def test_no_bare_foreach_in_let_binding(self):
22
+ source = read_builtin_query_source("forward_device_analysis.nqe")
23
+ # A `let <name> =` immediately followed by a bare `foreach` is the invalid
24
+ # pattern; wrapped forms (`(foreach`, `length(foreach`) are fine.
25
+ bare = re.findall(r"let\s+\w+\s*=\s*\n\s*foreach\b", source)
26
+ self.assertEqual(bare, [], f"bare foreach in a let binding: {bare}")
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "forward-netbox"
3
- version = "2.2.3"
3
+ version = "2.2.4"
4
4
  description = "NetBox plugin to sync Forward data into NetBox via built-in NQE queries"
5
5
  authors = ["Craig Johnson <craigjohnson@forwardnetworks.com>"]
6
6
  license = "MIT"
File without changes