ajoute les alertes Prometheus du self-healing et installe Larastan (dette de l'étape 8, 72 erreurs corrigées à la racine)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-12 21:32:52 +02:00
parent f2649d0f8b
commit d47e8356fc
23 changed files with 340 additions and 22 deletions

View file

@ -62,6 +62,9 @@ class DefinitionLab
return count($this->machines);
}
/**
* @param array<string, mixed> $donnees
*/
private function __construct(array $donnees)
{
$this->identifiant = $donnees['id'];

View file

@ -66,7 +66,14 @@ class StockChaud
LUA;
for ($essai = 0; $essai < 3; $essai++) {
$brut = Redis::eval($script, 2, self::clePretes($lab), self::ATTRIBUEES, time());
// Redis::eval(...) (facade) : la classe réellement utilisée au
// runtime (PhpRedisConnection) redispose les arguments pour
// l'extension phpredis, mais PHPStan ne résout le mixin de la
// façade Redis que sur la classe abstraite Connection (@mixin
// \Redis, la signature native à 3 arguments) — jamais sur la
// classe effective choisie par REDIS_CLIENT. `command()` est une
// vraie méthode (pas un mixin) : même effet, correctement typé.
$brut = Redis::command('eval', [$script, [self::clePretes($lab), self::ATTRIBUEES, time()], 2]);
if (! is_string($brut)) {
return null;
@ -135,7 +142,10 @@ class StockChaud
*/
public function retirer(string $lab, string $brut): bool
{
if ((int) Redis::lrem(self::clePretes($lab), 1, $brut) === 0) {
// Même raison que dans prendre() : command() plutôt que le mixin de
// la façade, qui ne voit pas le réordonnancement des arguments fait
// par PhpRedisConnection::lrem().
if ((int) Redis::command('lrem', [self::clePretes($lab), $brut, 1]) === 0) {
return false;
}
@ -373,11 +383,18 @@ class StockChaud
}
/**
* @param array{nom: string, id: string}|null $stack
* $stack vient d'un `json_decode` (Redis) : sa forme n'est pas garantie
* par le type (contrairement à ce que laissait croire l'ancienne
* signature `array{nom: string, id: string}`, qui rendait les `isset()`
* ci-dessous inutiles aux yeux de PHPStan alors qu'ils sont le seul
* rempart contre une entrée du stock corrompue ou tronquée).
*
* @param array<string, mixed>|null $stack
*/
private function estUtilisable(?array $stack): bool
{
if ($stack === null || ! isset($stack['nom'], $stack['id'], $stack['instances'])) {
if ($stack === null || ! isset($stack['nom'], $stack['id'], $stack['instances'])
|| ! is_string($stack['nom']) || ! is_string($stack['id'])) {
return false;
}

View file

@ -17,7 +17,7 @@ use App\Services\Labs\DefinitionLab;
class GenerateurTemplateHeat
{
/**
* @return array{template: array, noms_machines: array<int, string>}
* @return array{template: array<string, mixed>, noms_machines: array<int, string>}
*/
public function genererDepuis(DefinitionLab $lab, string $prefixe): array
{

View file

@ -2,6 +2,7 @@
namespace App\Services\OpenStack;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Facades\Http;
use RuntimeException;
@ -15,6 +16,7 @@ class HeatClient
public function __construct(private readonly KeystoneAuth $auth) {}
/**
* @param array<string, mixed> $template
* @return array{id: string}
*/
public function creerStack(string $nom, array $template): array
@ -86,7 +88,7 @@ class HeatClient
}
}
private function requete()
private function requete(): PendingRequest
{
return Http::withHeaders(['X-Auth-Token' => $this->auth->jeton()]);
}