github.com/verrazzano/verrazzano@v1.7.1/tools/oam-converter/pkg/traits/extracttrait.go (about) 1 // Copyright (c) 2023, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package traits 5 6 import ( 7 "encoding/json" 8 "errors" 9 "fmt" 10 vzapi "github.com/verrazzano/verrazzano/application-operator/apis/oam/v1alpha1" 11 consts "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/constants" 12 "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/types" 13 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 14 ) 15 16 // ExtractTrait - Extract traits from the app map 17 func ExtractTrait(appMaps []map[string]interface{}) ([]*types.ConversionComponents, error) { 18 conversionComponents := []*types.ConversionComponents{} 19 for _, appMap := range appMaps { 20 appMetadata, found, err := unstructured.NestedMap(appMap, "metadata") 21 if !found || err != nil { 22 return nil, errors.New("app metadata doesn't exist") 23 24 } 25 appName, found, err := unstructured.NestedString(appMetadata, "name") 26 if !found || err != nil { 27 return nil, errors.New("app name key doesn't exist") 28 } 29 30 appNamespace, found, err := unstructured.NestedString(appMetadata, "namespace") 31 if !found || err != nil { 32 return nil, errors.New("namespace key doesn't exist") 33 } 34 35 appSpec, found, err := unstructured.NestedMap(appMap, "spec") 36 if !found || err != nil { 37 return nil, errors.New("app spec doesn't exist") 38 } 39 40 appComponents, found, err := unstructured.NestedSlice(appSpec, "components") 41 if !found || err != nil { 42 return nil, errors.New("app components doesn't exist") 43 } 44 45 for _, component := range appComponents { 46 componentMap := component.(map[string]interface{}) 47 componentTraits, ok := componentMap[consts.YamlTraits].([]interface{}) 48 if ok && len(componentTraits) > 0 { 49 for _, trait := range componentTraits { 50 traitMap := trait.(map[string]interface{}) 51 //traitSpec := traitMap[consts.TraitComponent].(map[string]interface{}) 52 traitSpec, found, err := unstructured.NestedMap(traitMap, "trait") 53 if !found || err != nil { 54 return nil, fmt.Errorf("trait spec doesn't exist") 55 56 } 57 58 traitKind, found, err := unstructured.NestedString(traitSpec, "kind") 59 if !found || err != nil { 60 return nil, errors.New("trait kind doesn't exist") 61 } 62 if traitKind == consts.IngressTrait { 63 ingressTrait := &vzapi.IngressTrait{} 64 traitJSON, err := json.Marshal(traitSpec) 65 66 if err != nil { 67 return nil, fmt.Errorf("failed to marshal trait: %w", err) 68 } 69 70 err = json.Unmarshal(traitJSON, ingressTrait) 71 72 if err != nil { 73 return nil, fmt.Errorf("failed to unmarshal trait: %w", err) 74 } 75 76 conversionComponents = append(conversionComponents, &types.ConversionComponents{ 77 AppNamespace: appNamespace, 78 AppName: appName, 79 ComponentName: componentMap["componentName"].(string), 80 IngressTrait: ingressTrait, 81 }) 82 } 83 84 } 85 86 } 87 } 88 } 89 90 return conversionComponents, nil 91 92 }