{% extends 'generic/object.html' %} {% load helpers %} {% load i18n %} {% block title %}{{ object }} - {% trans "Drift Report" %}{% endblock %} {% block extra_controls %} {% if perms.forward_netbox.run_forwardsync %}
{% csrf_token %}
{% endif %}  {% trans "Sync" %} {% endblock extra_controls %} {% block content %} {% if drift_stale %} {% endif %} {% if not report.comparison_available %} {% endif %} {% if latest_sync_evidence %} {% if latest_sync_evidence.status == "confirmation_required" %} {% elif latest_sync_evidence.status == "converged" %} {% elif latest_sync_evidence.status == "failed" %} {% elif latest_sync_evidence.status == "unsatisfiable_rows" %} {% elif latest_sync_evidence.status == "incomplete" %} {% elif latest_sync_evidence.status == "ownership_incomplete" %} {% elif latest_sync_evidence.status == "snapshot_mismatch" %} {% elif latest_sync_evidence.status == "snapshot_unknown" %} {% endif %} {% endif %} {% if report.looks_like_full_create %} {% endif %}
{% trans "Drift Summary" %}
{% trans "In sync" %} {% if not report.comparison_available %} {% trans "Not measured" %} {% elif report.in_sync %} {% trans "Yes" %} {% else %} {% trans "No" %} {% endif %}
{% trans "Drifted models" %} {% if report.comparison_available %}{{ report.drifted_model_count }} / {{ report.model_count }}{% else %}{% trans "Not measured" %}{% endif %}
{% trans "Total drift" %} {% if report.comparison_available %}{{ report.total_drift }}{% else %}{% trans "Not measured" %}{% endif %}
{% trans "Estimated apply work" %} {{ report.total_apply_work }}
{% trans "From preview" %} {{ report.generated_at|placeholder }}
{% if latest_sync_evidence %}
{% trans "Latest Sync Evidence" %}
{% trans "Convergence" %} {% if latest_sync_evidence.convergence_confirmed %} {% trans "Confirmed" %} {% elif latest_sync_evidence.status == "failed" %} {% trans "Failed" %} {% else %} {% trans "Not confirmed" %} {% endif %}
{% trans "Sync snapshot" %} {{ latest_sync_evidence.snapshot_id|placeholder }}
{% trans "Ownership" %} {% if latest_sync_evidence.ownership.complete %} {% trans "Current" %} {% else %} {% trans "Incomplete" %} {% endif %}
{% trans "Same as preview" %} {% if not latest_sync_evidence.snapshot_comparison_available %} {% trans "Unknown" %} {% elif latest_sync_evidence.same_snapshot %} {% trans "Yes" %} {% else %} {% trans "No" %} {% endif %}
{% trans "Applied" %}{{ latest_sync_evidence.applied }}
{% trans "Created" %}{{ latest_sync_evidence.created }}
{% trans "Updated" %}{{ latest_sync_evidence.updated }}
{% trans "Deleted" %}{{ latest_sync_evidence.deleted }}
{% trans "Failed" %}{{ latest_sync_evidence.failed }}
{% trans "Skipped (rule rejections)" %}{{ latest_sync_evidence.skipped }}
{% trans "Completed" %}{{ latest_sync_evidence.completed_at|placeholder }}
{% endif %}
{% trans "Per-Model Drift (NetBox vs Forward)" %}
{% for row in report.models %} {% empty %} {% endfor %}
{% trans "Model" %} {% trans "Forward rows" %} {% trans "Upsert/change candidates" %} {% trans "Pending removals" %} {% trans "Estimated apply work" %} {% trans "Drift" %} {% trans "In sync" %}
{{ row.model }} {{ row.forward_rows|placeholder }} {{ row.pending_changes }} {{ row.pending_removes }} {{ row.estimated_apply_work }} {% if row.comparison_available %}{% if row.drift %}{{ row.drift }}{% else %}0{% endif %}{% else %}{% trans "Not measured" %}{% endif %} {% if not row.comparison_available %}{% trans "Not measured" %}{% elif row.in_sync %}{% trans "Yes" %}{% else %}{% trans "No" %}{% endif %}
{% trans "No model results in the preview." %}
{% endblock content %}