github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/orbiter/kinds/orb/desired.go (about) 1 package orb 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/caos/orbos/mntr" 8 "github.com/caos/orbos/pkg/tree" 9 ) 10 11 type DesiredV0 struct { 12 Common *tree.Common `yaml:",inline"` 13 Spec struct { 14 Verbose bool 15 PProf bool 16 } 17 Clusters map[string]*tree.Tree 18 Providers map[string]*tree.Tree 19 } 20 21 func ParseDesiredV0(desiredTree *tree.Tree) (*DesiredV0, error) { 22 desiredKind := &DesiredV0{Common: desiredTree.Common} 23 24 if err := desiredTree.Original.Decode(desiredKind); err != nil { 25 return nil, mntr.ToUserError(fmt.Errorf("parsing desired state failed: %w", err)) 26 } 27 desiredKind.Common.OverwriteVersion("v0") 28 29 return desiredKind, nil 30 } 31 32 func (d *DesiredV0) validate() (err error) { 33 defer func() { 34 err = mntr.ToUserError(err) 35 }() 36 if len(d.Clusters) < 1 { 37 return errors.New("no clusters configured") 38 } 39 if len(d.Providers) < 1 { 40 return errors.New("no providers configured") 41 } 42 43 k8sKind := "orbiter.caos.ch/KubernetesCluster" 44 var k8s int 45 for _, cluster := range d.Clusters { 46 if cluster.Common.Kind == k8sKind { 47 k8s++ 48 } 49 } 50 if k8s != 1 { 51 return fmt.Errorf("exactly one cluster of kind %s must be configured, but got %d", k8sKind, k8s) 52 } 53 return nil 54 }