From 5d3c07885d6293fe144b0da2d72f96869d8ec2fb Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Tue, 5 May 2026 15:11:30 +0200 Subject: [PATCH] feat(servers): drop colonnes legacy (snapshot_required/pre_patch_script/post_patch_script/satellite_host/need_pct) avec migration donnees + recreation views v_servers / v_patchable / v_conformity_todo + adaptation prereq_service et server_detail.html --- app/services/prereq_service.py | 4 +- app/templates/partials/server_detail.html | 4 +- migrate_drop_legacy_servers.sql | 135 ++++++++++++++++++++++ 3 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 migrate_drop_legacy_servers.sql diff --git a/app/services/prereq_service.py b/app/services/prereq_service.py index c020b1b..a2e8993 100644 --- a/app/services/prereq_service.py +++ b/app/services/prereq_service.py @@ -23,7 +23,7 @@ def check_prereqs_campaign(db, campaign_id): """Verifie les prereqs de tous les serveurs pending d'une campagne.""" sessions = db.execute(text(""" SELECT ps.id, s.hostname, s.os_family, s.etat, s.licence_support, - s.machine_type, s.satellite_host, s.ssh_method, + s.machine_type, s.satellite_url AS satellite_host, s.ssh_method, d.code as domain_code, z.name as zone FROM patch_sessions ps JOIN servers s ON ps.server_id = s.id @@ -294,7 +294,7 @@ def check_single_prereq(db, session_id): """Verifie les prereqs d'un seul serveur""" s = db.execute(text(""" SELECT ps.id, s.hostname, s.os_family, s.etat, s.licence_support, - s.machine_type, s.satellite_host, s.ssh_method, + s.machine_type, s.satellite_url AS satellite_host, s.ssh_method, d.code as domain_code, z.name as zone FROM patch_sessions ps JOIN servers s ON ps.server_id = s.id diff --git a/app/templates/partials/server_detail.html b/app/templates/partials/server_detail.html index a92fd94..8364a41 100644 --- a/app/templates/partials/server_detail.html +++ b/app/templates/partials/server_detail.html @@ -72,10 +72,10 @@
Owner OS{{ s.patch_os_owner }}
Frequence{{ s.patch_frequency }}
Podman{{ 'Oui' if s.is_podman else 'Non' }}
-
Prevenance{{ 'Oui' if s.need_pct else 'Non' }}
+
Prevenance PCT{{ 'Oui' if s.pct_required else 'Non' }}
Jour préféré{{ s.pref_patch_jour or 'indifférent' }}
Heure préférée{{ s.pref_patch_heure or 'indifférent' }}
-
Satellite{% if s.satellite_host %}{% if 'sat1' in s.satellite_host %}SAT1 (DMZ){% elif 'sat2' in s.satellite_host %}SAT2 (LAN){% else %}{{ s.satellite_host }}{% endif %}{% else %}N/A{% endif %}
+
Satellite{% if s.satellite_url %}{% if 'sat1' in s.satellite_url %}SAT1 (DMZ){% elif 'sat2' in s.satellite_url %}SAT2 (LAN){% else %}{{ s.satellite_url }}{% endif %}{% else %}N/A{% endif %}
diff --git a/migrate_drop_legacy_servers.sql b/migrate_drop_legacy_servers.sql new file mode 100644 index 0000000..e6460c4 --- /dev/null +++ b/migrate_drop_legacy_servers.sql @@ -0,0 +1,135 @@ +-- Migration : suppression des colonnes legacy de servers (consolidées avec les nouvelles) +-- - snapshot_required → requires_snapshot +-- - pre_patch_script → pre_patch_cmd +-- - post_patch_script → post_patch_cmd +-- - satellite_host → satellite_url +-- - need_pct → pct_required +-- ⚠ responsable_nom/email et referent_nom/email sont CONSERVÉS (le backfill +-- vers responsable_domaine_contact_id / referent_technique_contact_id +-- nécessite un fuzzy match qui sera fait dans un script séparé). +-- Idempotent. + +\echo '═══ 1. Migration des données legacy → nouvelles ═══' + +-- snapshot_required → requires_snapshot (si nouveau pas encore défini) +UPDATE public.servers + SET requires_snapshot = snapshot_required, updated_at = NOW() + WHERE requires_snapshot IS NULL + AND snapshot_required IS NOT NULL; + +-- pre_patch_script → pre_patch_cmd +UPDATE public.servers + SET pre_patch_cmd = pre_patch_script, updated_at = NOW() + WHERE pre_patch_cmd IS NULL + AND pre_patch_script IS NOT NULL AND pre_patch_script != ''; + +-- post_patch_script → post_patch_cmd +UPDATE public.servers + SET post_patch_cmd = post_patch_script, updated_at = NOW() + WHERE post_patch_cmd IS NULL + AND post_patch_script IS NOT NULL AND post_patch_script != ''; + +-- satellite_host → satellite_url (si vide) +UPDATE public.servers + SET satellite_url = satellite_host, updated_at = NOW() + WHERE (satellite_url IS NULL OR satellite_url = '') + AND satellite_host IS NOT NULL AND satellite_host != ''; + +-- need_pct → pct_required (si nouveau false / NULL et legacy true) +UPDATE public.servers + SET pct_required = need_pct, updated_at = NOW() + WHERE need_pct = true + AND (pct_required IS NULL OR pct_required = false); + +\echo '═══ 2. Drop des views qui dépendent ═══' + +DROP VIEW IF EXISTS public.v_patchable; +DROP VIEW IF EXISTS public.v_servers; +DROP VIEW IF EXISTS public.v_conformity_todo; + +\echo '═══ 3. Drop des colonnes legacy ═══' + +ALTER TABLE public.servers + DROP COLUMN IF EXISTS snapshot_required, + DROP COLUMN IF EXISTS pre_patch_script, + DROP COLUMN IF EXISTS post_patch_script, + DROP COLUMN IF EXISTS satellite_host, + DROP COLUMN IF EXISTS need_pct; + +\echo '═══ 4. Recréation des views avec les nouveaux noms ═══' + +CREATE OR REPLACE VIEW public.v_servers AS + SELECT s.id, + s.hostname, + s.fqdn, + s.domain_ltd, + d.name AS domaine, + d.code AS domaine_code, + e.name AS environnement, + e.code AS env_code, + z.name AS zone_reseau, + s.os_family, + s.os_version, + s.machine_type, + s.tier, + s.etat, + s.licence_support, + s.is_bdd, + s.is_flux_libre, + s.is_emv, + s.is_podman, + s.pct_required, + s.patch_os_owner, + COALESCE(s.patch_excludes, de.patch_excludes, d.default_excludes) AS effective_excludes, + s.responsable_nom, + s.referent_nom, + s.ssh_method, + s.ssh_user, + s.mode_operatoire, + s.commentaire, + s.satellite_url, + s.requires_snapshot, + s.snap_can_be_skipped, + s.cluster_id, + s.cluster_order + FROM public.servers s + LEFT JOIN public.domain_environments de ON s.domain_env_id = de.id + LEFT JOIN public.domains d ON de.domain_id = d.id + LEFT JOIN public.environments e ON de.environment_id = e.id + LEFT JOIN public.zones z ON s.zone_id = z.id; + +CREATE OR REPLACE VIEW public.v_patchable AS + SELECT id, hostname, fqdn, domain_ltd, domaine, domaine_code, environnement, + env_code, zone_reseau, os_family, os_version, machine_type, tier, etat, + licence_support, is_bdd, is_flux_libre, is_emv, is_podman, pct_required, + patch_os_owner, effective_excludes, responsable_nom, referent_nom, + ssh_method, ssh_user, mode_operatoire, commentaire, satellite_url, + requires_snapshot, snap_can_be_skipped, cluster_id, cluster_order + FROM public.v_servers + WHERE patch_os_owner::text = 'secops' + AND etat::text = 'en_production' + AND licence_support::text IN ('active', 'els'); + +CREATE OR REPLACE VIEW public.v_conformity_todo AS + SELECT s.hostname, + d.name AS domaine, + e.name AS environnement, + s.tier, + s.patch_os_owner, + (s.responsable_nom IS NULL) AS resp_missing + FROM public.servers s + LEFT JOIN public.domain_environments de ON s.domain_env_id = de.id + LEFT JOIN public.domains d ON de.domain_id = d.id + LEFT JOIN public.environments e ON de.environment_id = e.id + WHERE s.etat::text = 'en_production' + AND (s.patch_os_owner::text = 'a_definir' OR s.responsable_nom IS NULL); + +\echo '═══ 5. Vérification ═══' + +SELECT column_name, data_type + FROM information_schema.columns + WHERE table_name = 'servers' + AND column_name IN ('snapshot_required','pre_patch_script','post_patch_script', + 'satellite_host','need_pct') + ORDER BY column_name; +-- Résultat attendu : 0 ligne (toutes les legacy ont été drop)