K8s Operator - Conditions
Tags: kubernetes, devops, sre, french
Published: 2023-06-26 13:00:00

Après avoir vu comment gérer les statuts de vos ressources, aujourd'hui on va aller une étape plus loin et aller définir des **Conditions**.

## Qu'est-ce que c'est?
En regardant des ressources Kubernetes vous avez sûrement déjà vu ces conditions, sans forcément y faire attention. Pourtant cet élément est très important!

> Les conditions sont un ensemble de validations effectuées sur une ressource pour s'assurer qu'elle est dans l'état **Ready**.

---

## Pourquoi les implémenter?
Si c'est important de les implémenter c'est qu'elles peuvent vous donner énormément d'informations utiles pour le débuggage.

Si on repend notre exemple, MyProxy pourrait avoir comme condition **"Pods correctement démarrés"**. Ainsi rien qu'en regardant le statut de notre ressource, on est capable de savoir si tout se passe bien.

Un autre point où les conditions peuvent être très utiles, est pour savoir si **tous les prérequis sont présents** afin de pouvoir créer une ressource ou effectuer une action. 

---

## Comment l'implémenter
Tout comme le statut, il faut aller modifier la définition du statut dans `api/../xxx_types.go` et aller mettre à jour le statut de la ressource dans la méthode **Reconcile** du contrôleur.

### Mise à jour de la définition du statut
Dans le statut, on va ajouter donc une nouvelle variable `Conditions`

```go
type MyProxyStatus struct {  
   Conditions []metav1.Condition `json:"conditions"`  
   PodNames   []string           `json:"pod_names"`  
}
```

### Mise à jour de la méthode Reconcile
Tout comme pour le reste du statut, on peut modifier la valeur du contenu de `Conditions` et faire la mise à jour
```go
myProxy.Status.Conditions = conditions  
err = r.Status().Update(ctx, myProxy)  
if err != nil {  
   log.Error(err, "Failed to update MyProxy status")  
   return ctrl.Result{}, err  
}
```

### Création des Conditions
Les conditions sont des objets plutôt simples. Ils sont composés de 4 champs

- **Status** : Qui va contenir le statut de la condition. Il n'accepte que trois valeurs
	- `metav1.ConditionTrue` : Si la condition est résolue
	- `metav1.ConditionFalse` : Si la condition n'est pas résolue
	- `metav1.ConditionUnknown` : Si les informations manquent pour savoir si la condition est résolue ou non
- **Type** : Le nom de la condition *(ex: Vérifier présence pods)*
- **Reason** : Qui est le résumé du statut *(ex: Pods présents)*
- **Message** : Qui est un message qui vient ajouter du détail sur la raison de la condition. *(principalement utilisé pour insérer un message détaillant l'erreur qui aurait pu se produire)*

Donc de là, vous pouvez créer vos méthodes qui vont créer vos conditions et remplir la variable `conditions` de l'exemple précédent

*Exemple*
```go
func checkPodExistance(podNames []string) metav1.Condition {  
   if len(podNames) == 2 {  
      return metav1.Condition{  
         Status:  metav1.ConditionTrue,  
         Reason:  "Pods found",  
         Message: "Both pods were found",  
         Type:    "Check existance of pods",  
      }  
   } else {  
      return metav1.Condition{  
         Status:  metav1.ConditionFalse,  
         Reason:  "Pods not found",  
         Message: "The list of pod names doesn't contains the correct number of pods",  
         Type:    "Check existance of pods",  
      }  
   }  
}
```

---

En résumé les conditions sont un outil puissant et vous ne pourrez plus vous en passer quand vous les aurez essayés!

Dans le prochain épisode de cette série, on va se focaliser sur les annotations que l'on peut ajouter dans notre opérateur!

J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient *(Il n'y a jamais de questions bêtes!)* ou des points qui ne sont pas clairs pour vous, n'hésitez pas à laisser un message dans les commentaires ou à me joindre directement sur [LinkedIn](https://www.linkedin.com/in/maxime-guilbert-14b6a5128/) *(même pour parler d'autres sujets!)*.

---

<center><h3>Vous voulez me supporter?</h3></center>
<a href="https://www.buymeacoffee.com/mxguilbert7" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>