ajoute le self-healing des VM (sonde de santé, relance automatique, stock écarté) — bloc A, semaine 6
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
b054888f5a
commit
f2649d0f8b
21 changed files with 938 additions and 28 deletions
|
|
@ -6,7 +6,7 @@ use RuntimeException;
|
|||
|
||||
/**
|
||||
* Parle au service correcteur (Go, sur l'hyperviseur) par son socket Unix.
|
||||
* Le portail n'envoie que trois identifiants : jamais une commande. Les
|
||||
* Le portail n'envoie que des identifiants : jamais une commande. Les
|
||||
* commandes sont lues dans le lab.yaml par le correcteur lui-même.
|
||||
*/
|
||||
class ClientCorrecteur
|
||||
|
|
@ -15,6 +15,32 @@ class ClientCorrecteur
|
|||
* @return array{reussi: bool, erreur: ?string}
|
||||
*/
|
||||
public function verifier(string $instanceId, string $lab, string $verification): array
|
||||
{
|
||||
// 10 s par vérification côté correcteur, plus une marge.
|
||||
$reponse = $this->envoyer(['instance' => $instanceId, 'lab' => $lab, 'verification' => $verification], 15);
|
||||
|
||||
return ['reussi' => $reponse['reussi'], 'erreur' => $reponse['erreur'] ?? null];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sonde de santé (self-healing) : état libvirt de la VM et réponse de son
|
||||
* agent invité. Rien n'est exécuté dans la VM.
|
||||
*
|
||||
* @return array{repond: bool, etat: ?string, erreur: ?string}
|
||||
*/
|
||||
public function sante(string $instanceId): array
|
||||
{
|
||||
// 8 s maximum côté correcteur, plus une marge.
|
||||
$reponse = $this->envoyer(['instance' => $instanceId, 'sante' => true], 10);
|
||||
|
||||
return ['repond' => $reponse['reussi'], 'etat' => $reponse['etat'] ?? null, 'erreur' => $reponse['erreur'] ?? null];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, string|bool> $requete
|
||||
* @return array{reussi: bool, erreur?: string, etat?: string}
|
||||
*/
|
||||
private function envoyer(array $requete, int $delai): array
|
||||
{
|
||||
$flux = @stream_socket_client('unix://'.config('labs.correcteur.socket'), $codeErreur, $messageErreur, 2);
|
||||
|
||||
|
|
@ -22,10 +48,9 @@ class ClientCorrecteur
|
|||
throw new RuntimeException("Correcteur injoignable : {$messageErreur}");
|
||||
}
|
||||
|
||||
// 10 s par vérification côté correcteur, plus une marge.
|
||||
stream_set_timeout($flux, 15);
|
||||
stream_set_timeout($flux, $delai);
|
||||
|
||||
fwrite($flux, json_encode(['instance' => $instanceId, 'lab' => $lab, 'verification' => $verification])."\n");
|
||||
fwrite($flux, json_encode($requete)."\n");
|
||||
$ligne = fgets($flux);
|
||||
fclose($flux);
|
||||
|
||||
|
|
@ -35,6 +60,6 @@ class ClientCorrecteur
|
|||
throw new RuntimeException('Réponse illisible du correcteur');
|
||||
}
|
||||
|
||||
return ['reussi' => $reponse['reussi'], 'erreur' => $reponse['erreur'] ?? null];
|
||||
return $reponse;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue