@@ -1337,23 +1337,55 @@ func (h *HelmProvisioner) waitForRollout(namespace string) error {
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
case <-time.After(5 * time.Second):
|
||||
// Utiliser kubectl pour vérifier le rollout
|
||||
cmd := exec.Command("kubectl", "rollout", "status", "deployment", "-n", namespace, "--timeout=30s")
|
||||
var stderr bytes.Buffer
|
||||
cmd.Stderr = &stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
// Si c'est juste un timeout, on continue d'attendre
|
||||
if strings.Contains(stderr.String(), "timed out") {
|
||||
continue
|
||||
}
|
||||
return fmt.Errorf("rollout check: %v: %s", err, stderr.String())
|
||||
ready, err := h.rolloutReady(ctx, namespace)
|
||||
if err != nil {
|
||||
return fmt.Errorf("rollout check: %w", err)
|
||||
}
|
||||
if ready {
|
||||
return nil
|
||||
}
|
||||
// Si la commande réussit, tous les déploiements sont prêts
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rolloutReady : true si tous les Deployment et StatefulSet du namespace ont
|
||||
// toutes leurs répliques prêtes. Remplace un ancien appel à
|
||||
// "kubectl rollout status deployment -n <namespace>" — en plus de l'absence
|
||||
// du binaire kubectl dans l'image (seul helm y est installé, voir
|
||||
// control-plane/api/Dockerfile), cette commande était de toute façon
|
||||
// invalide sans nom de déploiement précis (jamais réellement exercée avant
|
||||
// la première migration premium en conditions réelles).
|
||||
func (h *HelmProvisioner) rolloutReady(ctx context.Context, namespace string) (bool, error) {
|
||||
deploys, err := h.k8sClient.AppsV1().Deployments(namespace).List(ctx, metav1.ListOptions{})
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
for _, d := range deploys.Items {
|
||||
desired := int32(1)
|
||||
if d.Spec.Replicas != nil {
|
||||
desired = *d.Spec.Replicas
|
||||
}
|
||||
if d.Status.ReadyReplicas < desired {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
|
||||
statefulSets, err := h.k8sClient.AppsV1().StatefulSets(namespace).List(ctx, metav1.ListOptions{})
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
for _, s := range statefulSets.Items {
|
||||
desired := int32(1)
|
||||
if s.Spec.Replicas != nil {
|
||||
desired = *s.Spec.Replicas
|
||||
}
|
||||
if s.Status.ReadyReplicas < desired {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// componentResourceLimits : limites CPU/mémoire configurées dans chaque chart
|
||||
// (deploy/chart-gestion/*/values.yaml), utilisées pour calculer un % d'usage.
|
||||
var componentResourceLimits = map[string]struct {
|
||||
|
||||
Reference in New Issue
Block a user