github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/boom/api/api.go (about)

     1  package api
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/caos/orbos/mntr"
     9  
    10  	"github.com/caos/orbos/internal/operator/boom/api/common"
    11  	"github.com/caos/orbos/internal/operator/boom/api/latest"
    12  	"github.com/caos/orbos/internal/operator/boom/api/migrate"
    13  	"github.com/caos/orbos/internal/operator/boom/api/v1beta1"
    14  	"github.com/caos/orbos/internal/operator/boom/api/v1beta2"
    15  	"github.com/caos/orbos/internal/operator/boom/metrics"
    16  	"github.com/caos/orbos/pkg/tree"
    17  )
    18  
    19  const (
    20  	boomPrefix = "caos.ch"
    21  )
    22  
    23  func ParseToolset(desiredTree *tree.Tree) (ts *latest.Toolset, mig bool, kind string, vers string, err error) {
    24  
    25  	defer func() {
    26  		if err != nil {
    27  			err = mntr.ToUserError(err)
    28  		}
    29  	}()
    30  
    31  	desiredKindCommon := common.New()
    32  	if err := desiredTree.Original.Decode(desiredKindCommon); err != nil {
    33  		metrics.WrongCRDFormat()
    34  		return nil, false, "", "", fmt.Errorf("parsing desired state failed: %w", err)
    35  	}
    36  	if desiredKindCommon.Kind != "Boom" {
    37  		return nil, false, "", "", errors.New("kind unknown")
    38  	}
    39  
    40  	if !strings.HasPrefix(desiredKindCommon.APIVersion, boomPrefix) {
    41  		metrics.UnsupportedAPIGroup()
    42  		return nil, false, "", "", errors.New("group unknown")
    43  	}
    44  
    45  	switch desiredKindCommon.APIVersion {
    46  	case boomPrefix + "/v1beta1":
    47  		old, err := v1beta1.ParseToolset(desiredTree)
    48  		if err != nil {
    49  			return nil, false, "", "", err
    50  		}
    51  		metrics.SuccessfulUnmarshalCRD()
    52  		return migrate.V1beta2Tov1(migrate.V1beta1Tov1beta2(old)), true, desiredKindCommon.Kind, "v1beta1", err
    53  	case boomPrefix + "/v1beta2":
    54  		v1beta2Toolset, err := v1beta2.ParseToolset(desiredTree)
    55  		if err != nil {
    56  			return nil, false, "", "", err
    57  		}
    58  		metrics.SuccessfulUnmarshalCRD()
    59  		return migrate.V1beta2Tov1(v1beta2Toolset), true, desiredKindCommon.Kind, "v1beta2", nil
    60  	case boomPrefix + "/v1":
    61  		desiredKind, err := latest.ParseToolset(desiredTree)
    62  		if err != nil {
    63  			return nil, false, "", "", err
    64  		}
    65  		metrics.SuccessfulUnmarshalCRD()
    66  		return desiredKind, false, desiredKindCommon.Kind, "v1", nil
    67  	default:
    68  		metrics.UnsupportedVersion()
    69  		return nil, false, "", "", errors.New("APIVersion unknown")
    70  	}
    71  
    72  }