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  }