Some checks are pending
verifier / verifier (push) Waiting to run
LA VUE. La nomenclature etait le seul registre que le GUI ne savait pas ecrire du tout : ajouter une fonction exigeait d ouvrir le YAML. Elle a sa vue, et son formulaire est GENERE depuis le schema. Deuxieme registre sur six. couverture_gui verifier passe : les 28 champs des plans reels sont editables. Elle n est pas un registre comme les autres : elle decrit la REGLE dont VMID, VLAN, adresse et passerelle se derivent. Chaque fonction montre ce qu elle derive et les VM qui la portent ; l index est montre mais pas editable, parce qu il est alloue par le site ; valider_nomenclature refuse de retirer une fonction encore portee, ou de designer une zone non declaree. DEUX FAUTES, ET POURQUOI MES BANCS NE LES VOYAIENT PAS. Le formulaire des bases, livre la veille, etait casse dans un navigateur. Il lisait data.schema, or il n existe aucun data global : c est une const locale de charger(). ReferenceError a l ouverture, et zone morte dans sauvegarderBases. Je l avais eprouve sous node EN LUI PASSANT data : le banc reproduisait la fonction, pas sa portee. D ou test_rendu_gui.py, qui charge le JS entier dans un DOM simule et dessine les douze vues, avec son controle negatif. Le schema decrivait reservations comme une table de zones ; le fichier reel est un bloc plat. P61 comparait des NOMS aplatis, donc ne voyait rien. Elle compare desormais aussi la FORME. ECRIRE SANS DEPLACER UN COMMENTAIRE. _fusion_chirurgicale remplace le bloc entier des qu une valeur change : quinze entrees compactes devenaient 42 lignes, et le commentaire du poste d exploitation se retrouvait en tete du bloc, ou il affirmait que collab etait le poste d exploitation. Un commentaire deplace n est pas laid, il est faux. _fusion_table edite les tables ligne a ligne ; le diff fait trois lignes. Au passage : sort_keys triait le schema, donc l ordre des cases a l ecran (reserve_max avant reserve_min) ; et _ecrire_index_nomenclature ecrivait encore par write_text, oubliee au passage des ecritures atomiques. LIMITE : deux registres sur six sont generes, et je n ai toujours pas ouvert cette page dans un navigateur. make prouver : CONFORME, 60 OK, 0 echec, 1 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
382 lines
12 KiB
JSON
382 lines
12 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"title": "Registres du plan Set-OPS",
|
|
"description": "GENERE par scripts/schema_plan.py (make schema). Ne pas editer a la main. Decrit la FORME des registres ; la COHERENCE reste aux validateurs de inventory_rules.py.",
|
|
"registres": {
|
|
"serveurs": {
|
|
"title": "Serveurs (VM)",
|
|
"x-fichier": "plan/serveurs.yml",
|
|
"x-racine": "serveurs",
|
|
"entite": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fonction": {
|
|
"type": "string",
|
|
"title": "Fonction",
|
|
"description": "Determine VMID, IP, VLAN et passerelle. Doit exister dans la nomenclature.",
|
|
"x-source-valeurs": "nomenclature.fonctions"
|
|
},
|
|
"etat": {
|
|
"type": "string",
|
|
"title": "État",
|
|
"description": "`planifie` = decrit mais pas deploye ; `actif` = joignable par Ansible.",
|
|
"enum": [
|
|
"actif",
|
|
"planifie"
|
|
]
|
|
},
|
|
"integrations": {
|
|
"type": "array",
|
|
"title": "Intégrations facultatives",
|
|
"description": "Seulement les facultatives. Les universelles viennent du role et sont refusees ici.",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"noeud": {
|
|
"type": "string",
|
|
"title": "Nœud Proxmox",
|
|
"description": "Surcharge le defaut de `make config`."
|
|
},
|
|
"stockage": {
|
|
"type": "string",
|
|
"title": "Stockage",
|
|
"description": "Surcharge le defaut."
|
|
},
|
|
"disque": {
|
|
"type": "string",
|
|
"title": "Disque",
|
|
"description": "Ex. `32G`. Vide = derive des empreintes des roles."
|
|
},
|
|
"memoire": {
|
|
"type": "integer",
|
|
"title": "Mémoire (Mo)",
|
|
"description": "Vide = derive des empreintes des roles."
|
|
},
|
|
"coeurs": {
|
|
"type": "integer",
|
|
"title": "Cœurs",
|
|
"description": "Vide = derive des empreintes des roles."
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"fonction"
|
|
]
|
|
},
|
|
"x-clef": {
|
|
"title": "Nom d'hôte",
|
|
"description": "Le nom court de la VM. Le rang final derive l'adresse."
|
|
}
|
|
},
|
|
"applications": {
|
|
"title": "Applications",
|
|
"x-fichier": "plan/applications.yml",
|
|
"x-racine": "applications",
|
|
"entite": {
|
|
"type": "object",
|
|
"properties": {
|
|
"groupe": {
|
|
"type": "string",
|
|
"title": "Groupe (rôle)",
|
|
"description": "La capacite appliquee. Doit avoir un playbook homonyme.",
|
|
"x-source-valeurs": "groupes_operationnels"
|
|
},
|
|
"hote": {
|
|
"type": "string",
|
|
"title": "Hôte",
|
|
"description": "Une VM declaree au plan. Un hote inconnu est un « hote fantome » (P06).",
|
|
"x-source-valeurs": "serveurs"
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"title": "Port"
|
|
},
|
|
"expose": {
|
|
"type": "array",
|
|
"title": "Exposition publique",
|
|
"description": "FQDN publies par l'edge. Derivent le vhost, les SAN et le plancher /etc/hosts.",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"requiert": {
|
|
"type": "array",
|
|
"title": "Requiert",
|
|
"description": "Dependance applicative. Indicative : l'ordre de deploiement vient des couches.",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"liens": {
|
|
"type": "array",
|
|
"title": "Liens (bindings)",
|
|
"description": "Roles acceptes par le role porteur (meta/liens.yml).",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"websocket": {
|
|
"type": "boolean",
|
|
"title": "WebSocket",
|
|
"description": "L'edge doit relayer la mise a niveau de connexion."
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"groupe",
|
|
"hote"
|
|
]
|
|
},
|
|
"x-clef": {
|
|
"title": "Identifiant",
|
|
"description": "Nom de l'application dans le plan."
|
|
}
|
|
},
|
|
"bases_donnees": {
|
|
"title": "Bases de donnees",
|
|
"x-fichier": "plan/bases-donnees.yml",
|
|
"x-racine": "bases_donnees",
|
|
"entite": {
|
|
"type": "object",
|
|
"properties": {
|
|
"serveur": {
|
|
"type": "string",
|
|
"title": "Serveur de BD",
|
|
"x-source-valeurs": "serveurs_bd"
|
|
},
|
|
"base": {
|
|
"type": "string",
|
|
"title": "Base"
|
|
},
|
|
"proprietaire": {
|
|
"type": "string",
|
|
"title": "Propriétaire"
|
|
},
|
|
"secret": {
|
|
"type": "string",
|
|
"title": "Secret (Vault)",
|
|
"description": "NOM d'une variable Vault, jamais une valeur. Le secret ne quitte pas le role."
|
|
},
|
|
"consommateur": {
|
|
"type": "string",
|
|
"title": "Consommateur",
|
|
"description": "Qui utilise cette base. La liste depend de la portee.",
|
|
"x-source-selon": {
|
|
"champ": "portee",
|
|
"cas": {
|
|
"hote": "serveurs",
|
|
"application": "applications"
|
|
},
|
|
"defaut": "groupes_operationnels"
|
|
}
|
|
},
|
|
"portee": {
|
|
"type": "string",
|
|
"title": "Portée",
|
|
"description": "Comment le consommateur est designe : par application, par groupe ou par hote.",
|
|
"enum": [
|
|
"application",
|
|
"groupe",
|
|
"hote"
|
|
],
|
|
"default": "groupe"
|
|
},
|
|
"usage": {
|
|
"type": "string",
|
|
"title": "Usage",
|
|
"default": "principale"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"base",
|
|
"consommateur",
|
|
"proprietaire",
|
|
"secret",
|
|
"serveur"
|
|
]
|
|
},
|
|
"x-clef": {
|
|
"title": "Identifiant",
|
|
"description": "Nom de l'entree au registre, ex. `bd_forgejo`."
|
|
}
|
|
},
|
|
"serveurs_bd": {
|
|
"title": "Serveurs de bases de donnees",
|
|
"x-fichier": "plan/bases-donnees.yml",
|
|
"x-racine": "serveurs_bd",
|
|
"entite": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {
|
|
"type": "string",
|
|
"title": "Moteur"
|
|
},
|
|
"hote": {
|
|
"type": "string",
|
|
"title": "Hôte",
|
|
"x-source-valeurs": "serveurs"
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"title": "Port"
|
|
},
|
|
"groupe": {
|
|
"type": "string",
|
|
"title": "Groupe",
|
|
"x-source-valeurs": "groupes_operationnels"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"hote",
|
|
"type"
|
|
]
|
|
},
|
|
"x-clef": {
|
|
"title": "Nom",
|
|
"description": "Nom du serveur de bases, ex. `pg-principal`."
|
|
}
|
|
},
|
|
"domaines_publics": {
|
|
"title": "Domaines publics",
|
|
"x-fichier": "plan/domaines.yml",
|
|
"x-racine": "domaines_publics",
|
|
"entite": {
|
|
"type": "object",
|
|
"properties": {
|
|
"autorite": {
|
|
"type": "string",
|
|
"title": "Autorité DNS",
|
|
"enum": [
|
|
"auto-heberge",
|
|
"delegue",
|
|
"primaire-cache"
|
|
]
|
|
},
|
|
"edge": {
|
|
"type": "string",
|
|
"title": "Edge",
|
|
"x-source-valeurs": "serveurs"
|
|
},
|
|
"secondaires": {
|
|
"type": "array",
|
|
"title": "Secondaires",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"dnssec": {
|
|
"type": "boolean",
|
|
"title": "DNSSEC"
|
|
},
|
|
"mail": {
|
|
"type": "boolean",
|
|
"title": "Courriel",
|
|
"description": "La zone porte des enregistrements de messagerie."
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"x-clef": {
|
|
"title": "Domaine",
|
|
"description": "Le nom public, ex. `chezlepro.ca`."
|
|
}
|
|
},
|
|
"nomenclature": {
|
|
"title": "Nomenclature",
|
|
"x-fichier": "plan/nomenclature.yml",
|
|
"x-racine": null,
|
|
"entite": {
|
|
"type": "object",
|
|
"properties": {
|
|
"index": {
|
|
"type": "integer",
|
|
"title": "Index (seed)",
|
|
"description": "LE seul champ d'adressage. Tout en derive ; P20 refuse d'en stocker un autre.",
|
|
"minimum": 0,
|
|
"maximum": 255
|
|
},
|
|
"cidr_hote": {
|
|
"type": "integer",
|
|
"title": "CIDR d'hôte",
|
|
"description": "Masque des sous-reseaux de zone. 24 = 254 hotes par zone."
|
|
},
|
|
"categories": {
|
|
"type": "object",
|
|
"title": "Catégories (zones)",
|
|
"description": "Une zone de securite par cle. Le numero derive le 3e octet et le VLAN.",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"properties": {
|
|
"libelle": {
|
|
"type": "string",
|
|
"title": "Libellé",
|
|
"description": "Nom lisible de la zone (Frontiere, Identite...)."
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"libelle"
|
|
]
|
|
}
|
|
},
|
|
"fonctions": {
|
|
"type": "object",
|
|
"title": "Fonctions",
|
|
"description": "categorie + service par fonction. VMID et IP en derivent.",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"properties": {
|
|
"categorie": {
|
|
"type": "integer",
|
|
"title": "Catégorie",
|
|
"description": "La zone. Fixe le 3e octet (15 + categorie) et le VLAN.",
|
|
"x-source-valeurs": "nomenclature.categories"
|
|
},
|
|
"service": {
|
|
"type": "integer",
|
|
"title": "Service",
|
|
"description": "Fixe le bloc d'adresses de l'hote dans la zone."
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"categorie",
|
|
"service"
|
|
]
|
|
}
|
|
},
|
|
"reservations": {
|
|
"type": "object",
|
|
"title": "Réservations",
|
|
"description": "Adresses soustraites a la derivation dans la zone.",
|
|
"properties": {
|
|
"passerelle": {
|
|
"type": "integer",
|
|
"title": "Passerelle",
|
|
"description": "Dernier octet de la passerelle. P23 refuse un SVI qui s'en ecarte."
|
|
},
|
|
"reserve_min": {
|
|
"type": "integer",
|
|
"title": "Réserve (min)",
|
|
"description": "Premier octet soustrait a la derivation."
|
|
},
|
|
"reserve_max": {
|
|
"type": "integer",
|
|
"title": "Réserve (max)",
|
|
"description": "Dernier octet soustrait a la derivation."
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"index"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|