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 }