forward-netbox 2.2.1__tar.gz → 2.2.2__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 (280) hide show
  1. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/PKG-INFO +3 -2
  2. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/README.md +2 -1
  3. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/__init__.py +1 -1
  4. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardingestion.html +1 -1
  5. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/ingestion_all.html +1 -1
  6. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_log_export.py +60 -0
  7. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/apply_identity_audit.py +0 -2
  8. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/views.py +21 -7
  9. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/pyproject.toml +1 -1
  10. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/LICENSE +0 -0
  11. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/api/__init__.py +0 -0
  12. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/api/serializers.py +0 -0
  13. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/api/urls.py +0 -0
  14. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/api/views.py +0 -0
  15. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/choices.py +0 -0
  16. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/exceptions.py +0 -0
  17. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/filtersets.py +0 -0
  18. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/forms.py +0 -0
  19. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/jobs.py +0 -0
  20. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/__init__.py +0 -0
  21. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/__init__.py +0 -0
  22. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_apic_cimc_readiness_audit.py +0 -0
  23. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_apply_identity_audit.py +0 -0
  24. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_blocker_audit.py +0 -0
  25. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_collection_gap_alert.py +0 -0
  26. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_device_scope_reconciliation_audit.py +0 -0
  27. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_link_vsys_parents.py +0 -0
  28. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_module_readiness.py +0 -0
  29. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_primary_ip_audit.py +0 -0
  30. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_pushdown_profile.py +0 -0
  31. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_query_diff_coverage_audit.py +0 -0
  32. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_scope_ipam_audit.py +0 -0
  33. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_seed_ui_harness.py +0 -0
  34. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_tag_delete_eligible.py +0 -0
  35. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/management/commands/forward_validation_org_query_audit.py +0 -0
  36. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0001_initial.py +0 -0
  37. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0002_add_coalesce_fields.py +0 -0
  38. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0003_forwardingestionissue_context_fields.py +0 -0
  39. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0004_forwardingestion_baseline_fields.py +0 -0
  40. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0005_validation_and_reporting.py +0 -0
  41. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0006_alter_forwardnqemap_netbox_model.py +0 -0
  42. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0007_forwardingestion_persisted_change_counters.py +0 -0
  43. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0008_alter_forwardnqemap_netbox_model.py +0 -0
  44. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0009_alter_forwardnqemap_netbox_model.py +0 -0
  45. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0010_forwardvalidationrun_override_applied_and_more.py +0 -0
  46. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0011_forwardingestion_change_request_id.py +0 -0
  47. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0012_forwardnqemap_query_reference.py +0 -0
  48. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0013_execution_run_step.py +0 -0
  49. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0014_execution_step_fetch_scope.py +0 -0
  50. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0015_execution_step_apply_engine.py +0 -0
  51. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0016_execution_step_query_metrics.py +0 -0
  52. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0017_execution_step_row_counters.py +0 -0
  53. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0018_execution_run_reconciliation_events.py +0 -0
  54. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0019_forwardexecutionstep_query_parameters.py +0 -0
  55. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0020_execution_step_operation.py +0 -0
  56. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0021_add_fhrpgroup_nqe_map_choice.py +0 -0
  57. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0022_alter_forwardnqemap_netbox_model.py +0 -0
  58. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0023_split_ip_address_maps.py +0 -0
  59. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0024_forwarddeviceanalysis.py +0 -0
  60. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0025_device_analysis_netboxmodel.py +0 -0
  61. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0026_forwarddeviceanalysis_collection_result.py +0 -0
  62. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0027_alter_forwardexecutionrun_backend.py +0 -0
  63. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0028_remove_forwardexecutionstep_run_and_more.py +0 -0
  64. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/0029_forward_parent_device_cf.py +0 -0
  65. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/migrations/__init__.py +0 -0
  66. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/models.py +0 -0
  67. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/navigation.py +0 -0
  68. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/__init__.py +0 -0
  69. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_apic_cimc_inventory.nqe +0 -0
  70. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_apic_nodes.nqe +0 -0
  71. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_app_profiles.nqe +0 -0
  72. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_bridge_domains.nqe +0 -0
  73. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_command_inventory.nqe +0 -0
  74. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_contracts.nqe +0 -0
  75. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_endpoint_groups.nqe +0 -0
  76. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_fabrics.nqe +0 -0
  77. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_filters.nqe +0 -0
  78. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_l3outs.nqe +0 -0
  79. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_nodes.nqe +0 -0
  80. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_pods.nqe +0 -0
  81. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_static_port_bindings.nqe +0 -0
  82. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_tenants.nqe +0 -0
  83. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_aci_vrfs.nqe +0 -0
  84. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_bgp_address_families.nqe +0 -0
  85. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_bgp_peer_address_families.nqe +0 -0
  86. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_bgp_peers.nqe +0 -0
  87. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_analysis.nqe +0 -0
  88. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_feature_tags.nqe +0 -0
  89. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_feature_tags_with_rules.nqe +0 -0
  90. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_models.nqe +0 -0
  91. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_models_with_netbox_aliases.nqe +0 -0
  92. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_types.nqe +0 -0
  93. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_device_vendors.nqe +0 -0
  94. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_devices.nqe +0 -0
  95. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_devices_with_netbox_aliases.nqe +0 -0
  96. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_hsrp_groups.nqe +0 -0
  97. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_inferred_interface_cables.nqe +0 -0
  98. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_interfaces.nqe +0 -0
  99. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_inventory_items.nqe +0 -0
  100. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_ip_addresses_ipv4.nqe +0 -0
  101. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_ip_addresses_ipv6.nqe +0 -0
  102. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_ip_addresses_unassignable_diagnostics.nqe +0 -0
  103. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_locations.nqe +0 -0
  104. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_mac_addresses.nqe +0 -0
  105. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_modules.nqe +0 -0
  106. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_ospf_areas.nqe +0 -0
  107. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_ospf_instances.nqe +0 -0
  108. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_ospf_interfaces.nqe +0 -0
  109. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_peering_sessions.nqe +0 -0
  110. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_platforms.nqe +0 -0
  111. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_prefixes_ipv4.nqe +0 -0
  112. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_prefixes_ipv6.nqe +0 -0
  113. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_routing_import_diagnostics.nqe +0 -0
  114. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_virtual_chassis.nqe +0 -0
  115. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_vlans.nqe +0 -0
  116. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/forward_vrfs.nqe +0 -0
  117. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/queries/netbox_utilities.nqe +0 -0
  118. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/signals.py +0 -0
  119. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/static/forward_netbox/img/fn-logo.svg +0 -0
  120. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tables.py +0 -0
  121. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/template_content.py +0 -0
  122. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwarddriftpolicy.html +0 -0
  123. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardnqemap.html +0 -0
  124. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsource.html +0 -0
  125. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsync.html +0 -0
  126. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsync_dependency_preview.html +0 -0
  127. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsync_drift_report.html +0 -0
  128. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsync_health.html +0 -0
  129. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsync_module_readiness.html +0 -0
  130. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardsync_scope_reconciliation.html +0 -0
  131. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/forwardvalidationrun.html +0 -0
  132. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/brand_bar.html +0 -0
  133. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/device_analysis_panel.html +0 -0
  134. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/diff.html +0 -0
  135. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/execution_insights.html +0 -0
  136. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/logs_pending.html +0 -0
  137. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/merge_form.html +0 -0
  138. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/inc/validation_force_allow_form.html +0 -0
  139. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/change_explainability.html +0 -0
  140. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/ingestion_merge_button.html +0 -0
  141. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/ingestion_progress.html +0 -0
  142. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/ingestion_statistics.html +0 -0
  143. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/ingestion_status.html +0 -0
  144. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/job_logs.html +0 -0
  145. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/object_tabs.html +0 -0
  146. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/stage_switcher_buttons.html +0 -0
  147. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templates/forward_netbox/partials/validation_force_allow_button.html +0 -0
  148. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templatetags/__init__.py +0 -0
  149. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/templatetags/forward_netbox_helpers.py +0 -0
  150. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/__init__.py +0 -0
  151. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/fixtures/aci_command_inventory_expected.json +0 -0
  152. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/fixtures/aci_discovery_expected.json +0 -0
  153. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/scenarios.py +0 -0
  154. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_api_usage.py +0 -0
  155. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_api_views.py +0 -0
  156. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_apic_cimc_readiness_audit_command.py +0 -0
  157. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_apply_engine.py +0 -0
  158. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_apply_identity_audit.py +0 -0
  159. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_branching.py +0 -0
  160. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_brand_bar.py +0 -0
  161. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_bulk_adapter_parity.py +0 -0
  162. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_bulk_merge.py +0 -0
  163. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_bulk_merge_scale.py +0 -0
  164. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_device_scope_reconciliation_audit_command.py +0 -0
  165. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_device_scope_tagging.py +0 -0
  166. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_forms.py +0 -0
  167. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_forward_api.py +0 -0
  168. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_health.py +0 -0
  169. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_ingestion_merge.py +0 -0
  170. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_interface_naming.py +0 -0
  171. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_ip_address_dedup_query.py +0 -0
  172. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_ipaddress_dup_global.py +0 -0
  173. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_issue_rendering.py +0 -0
  174. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_job_compat.py +0 -0
  175. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_job_liveness.py +0 -0
  176. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_jobs.py +0 -0
  177. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_logging.py +0 -0
  178. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_models.py +0 -0
  179. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_module_readiness.py +0 -0
  180. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_module_readiness_rollup.py +0 -0
  181. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_plugin_integrations.py +0 -0
  182. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_primary_ip.py +0 -0
  183. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_primary_ip_audit.py +0 -0
  184. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_primary_ip_integration.py +0 -0
  185. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_query_binding.py +0 -0
  186. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_query_diff_coverage_audit_command.py +0 -0
  187. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_query_registry.py +0 -0
  188. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_release_readiness_audit.py +0 -0
  189. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_runtime_dependency_check.py +0 -0
  190. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_scope_ipam_audit.py +0 -0
  191. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_scope_matched_tags.py +0 -0
  192. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_scope_module_ui.py +0 -0
  193. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sensitive_content.py +0 -0
  194. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_stability_hardening.py +0 -0
  195. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sync.py +0 -0
  196. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sync_aci.py +0 -0
  197. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sync_facade.py +0 -0
  198. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sync_orchestration.py +0 -0
  199. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sync_runner_contracts.py +0 -0
  200. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_sync_state.py +0 -0
  201. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_synthetic_scenarios.py +0 -0
  202. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_validation_org_query_audit_command.py +0 -0
  203. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/tests/test_vsys_parent.py +0 -0
  204. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/urls.py +0 -0
  205. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/__init__.py +0 -0
  206. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/api_usage.py +0 -0
  207. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/apply_engine.py +0 -0
  208. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/apply_engine_bulk.py +0 -0
  209. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/apply_engine_decision.py +0 -0
  210. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/branch_budget.py +0 -0
  211. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/branching.py +0 -0
  212. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/bulk_merge.py +0 -0
  213. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/change_explainability.py +0 -0
  214. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/density_learning.py +0 -0
  215. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/device_analysis.py +0 -0
  216. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/direct_changes.py +0 -0
  217. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/drift_report.py +0 -0
  218. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/execution_ledger.py +0 -0
  219. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/execution_telemetry.py +0 -0
  220. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/fast_bootstrap_executor.py +0 -0
  221. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/fetch_artifacts.py +0 -0
  222. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/forward_api.py +0 -0
  223. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/forward_api_impl.py +0 -0
  224. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/health.py +0 -0
  225. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/health_apply_fetch.py +0 -0
  226. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/health_checks.py +0 -0
  227. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/health_summary_blocks.py +0 -0
  228. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/ingestion_issues.py +0 -0
  229. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/ingestion_merge.py +0 -0
  230. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/ingestion_presentation.py +0 -0
  231. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/interface_naming.py +0 -0
  232. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/job_compat.py +0 -0
  233. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/job_liveness.py +0 -0
  234. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/json_safe.py +0 -0
  235. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/logging.py +0 -0
  236. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/merge.py +0 -0
  237. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/model_contracts.py +0 -0
  238. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/model_validation.py +0 -0
  239. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/module_readiness.py +0 -0
  240. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/multi_branch_lifecycle.py +0 -0
  241. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/plugin_integrations/__init__.py +0 -0
  242. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/plugin_integrations/registry.py +0 -0
  243. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/primary_ip.py +0 -0
  244. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/primary_ip_audit.py +0 -0
  245. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/query_binding.py +0 -0
  246. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/query_binding_resolution.py +0 -0
  247. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/query_diagnostics.py +0 -0
  248. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/query_fetch.py +0 -0
  249. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/query_fetch_execution.py +0 -0
  250. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/query_registry.py +0 -0
  251. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/runtime_guidance.py +0 -0
  252. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/scope_ipam_audit.py +0 -0
  253. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/scope_reconciliation.py +0 -0
  254. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sensitive_content.py +0 -0
  255. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/single_branch_executor.py +0 -0
  256. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/snapshot_freshness.py +0 -0
  257. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/support_bundle_archive.py +0 -0
  258. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync.py +0 -0
  259. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_aci.py +0 -0
  260. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_cable.py +0 -0
  261. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_contracts.py +0 -0
  262. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_core_models.py +0 -0
  263. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_device.py +0 -0
  264. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_events.py +0 -0
  265. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_execution.py +0 -0
  266. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_facade.py +0 -0
  267. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_interface.py +0 -0
  268. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_inventory_module.py +0 -0
  269. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_ipam.py +0 -0
  270. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_orchestration.py +0 -0
  271. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_primitives.py +0 -0
  272. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_reporting.py +0 -0
  273. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_routing.py +0 -0
  274. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_routing_impl.py +0 -0
  275. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_runner_adapters.py +0 -0
  276. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_runner_contracts.py +0 -0
  277. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/sync_state.py +0 -0
  278. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/validation.py +0 -0
  279. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/validation_org_query.py +0 -0
  280. {forward_netbox-2.2.1 → forward_netbox-2.2.2}/forward_netbox/utilities/vsys_parent.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forward-netbox
3
- Version: 2.2.1
3
+ Version: 2.2.2
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.1` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Add read-only forward_apply_identity_audit diagnostic to pinpoint 1-created/1-deleted idempotency churn |
34
+ | `v2.2.2` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Fix 504 gateway timeouts on large syncs: stop recomputing change-explainability on every poll during a long merge + back off poll to 15s |
35
+ | `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 |
35
36
  | `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 |
36
37
  | `v2.1.5` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.0`; Fix Prune orphans erroring on empty sites that still hold a VLAN/VM/prefix (delete only truly-empty sites) |
37
38
  | `v2.1.4` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.1.5`; Tag delete-eligible global IPAM (prefixes/VLANs/VRFs) for manual review |
@@ -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.1` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Add read-only forward_apply_identity_audit diagnostic to pinpoint 1-created/1-deleted idempotency churn |
11
+ | `v2.2.2` | `4.6.3` required; needs netbox-branching `1.1.0+` | Current release; Fix 504 gateway timeouts on large syncs: stop recomputing change-explainability on every poll during a long merge + back off poll to 15s |
12
+ | `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 |
12
13
  | `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 |
13
14
  | `v2.1.5` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.2.0`; Fix Prune orphans erroring on empty sites that still hold a VLAN/VM/prefix (delete only truly-empty sites) |
14
15
  | `v2.1.4` | `4.6.3` required; needs netbox-branching `1.1.0+` | Superseded by `v2.1.5`; Tag delete-eligible global IPAM (prefixes/VLANs/VRFs) for manual review |
@@ -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.1"
11
+ version = "2.2.2"
12
12
  base_url = "forward"
13
13
  min_version = "4.6.3"
14
14
 
@@ -167,7 +167,7 @@
167
167
  <div id="ingestion_poll"
168
168
  class="col col-md-12"
169
169
  hx-get="{% url 'plugins:forward_netbox:forwardingestion_logs' pk=object.pk %}?stage={{ active_stage|default:'sync' }}"
170
- hx-trigger="{% if job_running %}every 5s{% else %}none{% endif %}"
170
+ hx-trigger="{% if job_running %}every 15s{% else %}none{% endif %}"
171
171
  hx-target="#ingestion_logs"
172
172
  hx-select="#ingestion_logs"
173
173
  hx-select-oob="#ingestion_status:innerHTML,#ingestion_progress:innerHTML,#ingestion_statistics:innerHTML,#change_explainability:innerHTML,#object_tabs:innerHTML,#ingestion_merge_button:innerHTML"
@@ -22,7 +22,7 @@
22
22
  hx-swap-oob="true"
23
23
  class="col col-md-12"
24
24
  hx-get="{{ logs_url }}?stage={{ active_stage }}"
25
- hx-trigger="{% if polling_done %}none{% else %}every 5s{% endif %}"
25
+ hx-trigger="{% if polling_done %}none{% else %}every 15s{% endif %}"
26
26
  hx-target="#ingestion_logs"
27
27
  hx-select="#ingestion_logs"
28
28
  hx-select-oob="#ingestion_status:innerHTML,#ingestion_progress:innerHTML,#ingestion_statistics:innerHTML,#change_explainability:innerHTML,#object_tabs:innerHTML,#ingestion_merge_button:innerHTML"
@@ -338,6 +338,66 @@ class ForwardIngestionLogExportViewTest(TestCase):
338
338
  self.assertContains(response, "ipam.prefix 1")
339
339
  self.assertContains(response, "vrf 1")
340
340
 
341
+ def test_poll_defers_change_explainability_while_running(self):
342
+ # Regression (504 fix): while the job is running, the 5s/15s poll must
343
+ # NOT recompute change_explainability — doing so on every poll piles DB
344
+ # load onto the web workers during a long settling merge, which is what
345
+ # produces the gateway 504s on large platform-reclassification syncs.
346
+ running_sync = ForwardSync.objects.create(
347
+ name="sync-running-poll",
348
+ source=self.source,
349
+ parameters={"snapshot_id": "latestProcessed"},
350
+ )
351
+ running_ing = ForwardIngestion.objects.create(
352
+ sync=running_sync,
353
+ snapshot_selector="latestProcessed",
354
+ snapshot_id="snap-running",
355
+ )
356
+ now = timezone.now()
357
+ running_job = Job.objects.create(
358
+ object_type=ContentType.objects.get_for_model(ForwardIngestion),
359
+ object_id=running_ing.pk,
360
+ name="running-ingestion-job",
361
+ user=None,
362
+ status=JobStatusChoices.STATUS_RUNNING,
363
+ job_id="333e4567-e89b-12d3-a456-426614174002",
364
+ created=now,
365
+ started=now,
366
+ completed=None,
367
+ data={},
368
+ )
369
+ running_ing.job = running_job
370
+ running_ing.save(update_fields=["job"])
371
+
372
+ self.client.force_login(self.user)
373
+ with patch("forward_netbox.views.change_explainability_summary") as mock_ce:
374
+ response = self.client.get(
375
+ reverse(
376
+ "plugins:forward_netbox:forwardingestion_logs",
377
+ kwargs={"pk": running_ing.pk},
378
+ ),
379
+ headers={"HX-Request": "true"},
380
+ )
381
+ self.assertEqual(response.status_code, 200)
382
+ mock_ce.assert_not_called()
383
+
384
+ def test_poll_computes_change_explainability_when_done(self):
385
+ # The completed ingestion still computes it (the deferral is only while
386
+ # the job runs), so the operator sees the breakdown once it finishes.
387
+ self.client.force_login(self.user)
388
+ with patch(
389
+ "forward_netbox.views.change_explainability_summary",
390
+ return_value={"available": False},
391
+ ) as mock_ce:
392
+ self.client.get(
393
+ reverse(
394
+ "plugins:forward_netbox:forwardingestion_logs",
395
+ kwargs={"pk": self.ingestion.pk},
396
+ ),
397
+ headers={"HX-Request": "true"},
398
+ )
399
+ mock_ce.assert_called_once()
400
+
341
401
  def test_export_logs_compacts_large_execution_plan_items(self):
342
402
  sync = ForwardSync.objects.create(
343
403
  name="sync-log-export-plan-items",
@@ -67,14 +67,12 @@ def audit_model_identity(model_string, rows, *, sample_limit=15):
67
67
 
68
68
  # Forward key sets (per lookup_set) from emitted row fields.
69
69
  forward_keys = {lookup_set: set() for lookup_set in lookup_sets}
70
- forward_row_by_key = {}
71
70
  for row in rows:
72
71
  values = {field: (row.get(field) or None) for field in row_fields}
73
72
  for lookup_set in lookup_sets:
74
73
  key = lookup_key_from_values(values, lookup_set, model_string=model_string)
75
74
  if key is not None:
76
75
  forward_keys[lookup_set].add(key)
77
- forward_row_by_key.setdefault((lookup_set, key), row)
78
76
 
79
77
  netbox_keys = {lookup_set: set() for lookup_set in lookup_sets}
80
78
  netbox_count = 0
@@ -1374,19 +1374,27 @@ class ForwardIngestionLogView(LoginRequiredMixin, View):
1374
1374
  data["execution_state"] = _compact_execution_state_payload(
1375
1375
  json_safe_value(get_execution_display_state(ingestion.sync))
1376
1376
  )
1377
- data["change_explainability"] = change_explainability_summary(ingestion)
1377
+ sync_running = ingestion.job and not ingestion.job.completed
1378
+ merge_running = ingestion.merge_job and not ingestion.merge_job.completed
1379
+ job_running = bool(sync_running or merge_running)
1380
+ # Defer the change-explainability recompute while the job is running: it
1381
+ # is only meaningful once staging/merge completes, and recomputing it on
1382
+ # every poll piles DB load onto the web workers during a long settling
1383
+ # merge (a large platform reclassification can run for minutes) — that
1384
+ # contention is what produces the 504 gateway timeouts the customer sees.
1385
+ data["change_explainability"] = (
1386
+ {"available": False, "reason": "deferred_while_running"}
1387
+ if job_running
1388
+ else change_explainability_summary(ingestion)
1389
+ )
1378
1390
  data["export_logs_url"] = reverse(
1379
1391
  "plugins:forward_netbox:forwardingestion_export_logs",
1380
1392
  kwargs={"pk": ingestion.pk},
1381
1393
  )
1382
1394
 
1383
1395
  if request.htmx:
1384
- sync_running = ingestion.job and not ingestion.job.completed
1385
- merge_running = ingestion.merge_job and not ingestion.merge_job.completed
1386
1396
  anything_ever_ran = ingestion.job or ingestion.merge_job
1387
- data["polling_done"] = (
1388
- bool(anything_ever_ran) and not sync_running and not merge_running
1389
- )
1397
+ data["polling_done"] = bool(anything_ever_ran) and not job_running
1390
1398
  return render(request, self.template_name, data)
1391
1399
 
1392
1400
 
@@ -1447,7 +1455,13 @@ class ForwardIngestionView(generic.ObjectView):
1447
1455
  data["execution_state"] = _compact_execution_state_payload(
1448
1456
  json_safe_value(get_execution_display_state(instance.sync))
1449
1457
  )
1450
- data["change_explainability"] = change_explainability_summary(instance)
1458
+ # Defer change-explainability while the job is running (see
1459
+ # ForwardIngestionLogView): avoids recomputing it under merge contention.
1460
+ data["change_explainability"] = (
1461
+ {"available": False, "reason": "deferred_while_running"}
1462
+ if data["job_running"]
1463
+ else change_explainability_summary(instance)
1464
+ )
1451
1465
  data["export_logs_url"] = reverse(
1452
1466
  "plugins:forward_netbox:forwardingestion_export_logs",
1453
1467
  kwargs={"pk": instance.pk},
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "forward-netbox"
3
- version = "2.2.1"
3
+ version = "2.2.2"
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