labSession->lab->identifiant); $nomStack = "lab-session-{$this->labSession->id}"; ['template' => $template] = $generateur->genererDepuis($lab, $nomStack); $stack = $heat->creerStack($nomStack, $template); $this->labSession->forceFill([ 'heat_stack_id' => $stack['id'], 'heat_stack_name' => $nomStack, ])->save(); $etat = $this->attendreCompletion($heat, $nomStack, $stack['id']); if ($etat['statut'] !== 'CREATE_COMPLETE') { Log::error("CreerStackLab : la stack {$nomStack} n'a pas abouti", $etat); return; } foreach ($lab->machines as $machine) { $cle = GenerateurTemplateHeat::cle($machine['nom']); $this->labSession->machines()->create([ 'nom' => $machine['nom'], 'instance_id' => $etat['sorties']["{$cle}_id"], ]); } $this->labSession->forceFill(['etat' => LabSession::ACTIF])->save(); } /** * Heat crée une stack de cette taille (réseaux + quelques VM) en * général en moins d'une minute : on attend jusqu'à 2 minutes. * * @return array{statut: string, raison: ?string, sorties: array} */ private function attendreCompletion(HeatClient $heat, string $nom, string $id): array { for ($tentative = 0; $tentative < 60; $tentative++) { $etat = $heat->etatStack($nom, $id); if (! str_ends_with($etat['statut'], '_IN_PROGRESS')) { return $etat; } sleep(2); } return $etat; } }