f-37: add new lib for state handle #37
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
parent
e2748f05a6
commit
3edc319969
2 changed files with 236 additions and 0 deletions
68
internal/state/state.go
Normal file
68
internal/state/state.go
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
// 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))
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue