two/internal/state/state.go
GnomeZworc 3edc319969
f-37: add new lib for state handle #37
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2026-08-13 23:02:36 +02:00

68 lines
1.9 KiB
Go

// Package state définit les états possibles d'une ressource (VPC, subnet, VM)
// et centralise leur lecture/écriture en DB.
package state
import (
"fmt"
"git.g3e.fr/syonad/two/pkg/db/kv"
"github.com/dgraph-io/badger/v4"
)
type State string
const (
Creating State = "creating"
Running State = "running"
Error State = "error"
Deleting State = "deleting"
Deleted State = "deleted"
)
// All retourne tous les états valides, dans l'ordre du cycle de vie.
func All() []State {
return []State{Creating, Running, Error, Deleting, Deleted}
}
// Parse convertit une valeur brute lue en DB en State.
func Parse(s string) (State, error) {
for _, valid := range All() {
if State(s) == valid {
return valid, nil
}
}
return "", fmt.Errorf("unknown state %q", s)
}
// CanDelete indique si une ressource dans cet état peut être supprimée.
// Une ressource en cours de création ou déjà en cours de suppression ne l'est pas ;
// une ressource en erreur l'est, pour permettre le nettoyage d'un échec partiel.
func CanDelete(s State) bool {
return s == Running || s == Error
}
// IsTransient indique si l'état suppose une commande en cours d'exécution.
// Au démarrage de l'agent, la queue worker est vide : une ressource dans un état
// transitoire est donc orpheline.
func IsTransient(s State) bool {
return s == Creating || s == Deleting
}
// Get lit l'état d'une ressource. prefix est la racine de la ressource,
// sans le suffixe /state (ex: "vpc/vpc-1").
func Get(db *badger.DB, prefix string) (State, error) {
raw, err := kv.GetFromDB(db, prefix+"/state")
if err != nil {
return "", err
}
return Parse(raw)
}
// Set écrit l'état d'une ressource. prefix suit la même convention que Get.
func Set(db *badger.DB, prefix string, s State) error {
if _, err := Parse(string(s)); err != nil {
return err
}
return kv.AddInDB(db, prefix+"/state", string(s))
}