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  }