github.com/verrazzano/verrazzano@v1.7.0/tools/oam-converter/pkg/resources/createresources_test.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 resources
     5  
     6  import (
     7  	"encoding/json"
     8  	"github.com/stretchr/testify/assert"
     9  	vzapi "github.com/verrazzano/verrazzano/application-operator/apis/oam/v1alpha1"
    10  	consts "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/constants"
    11  	reader "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/testdata"
    12  	"github.com/verrazzano/verrazzano/tools/oam-converter/pkg/types"
    13  	vsapi "istio.io/client-go/pkg/apis/networking/v1beta1"
    14  	k8net "k8s.io/api/networking/v1"
    15  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    16  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    17  	k8scheme "k8s.io/client-go/kubernetes/scheme"
    18  	"sigs.k8s.io/controller-runtime/pkg/client/fake"
    19  	"testing"
    20  )
    21  
    22  func TestCreateResources(t *testing.T) {
    23  
    24  	appConf, err := reader.ReadFromYAMLTemplate("testdata/template/app_conf.yaml")
    25  	if err != nil {
    26  		t.Fatalf("Failed to read yaml file: %v", err)
    27  	}
    28  
    29  	spec, found, err := unstructured.NestedMap(appConf, "spec")
    30  	if !found || err != nil {
    31  		t.Fatalf("Spec component doesn't exist or not found in the specified type: %v", err)
    32  	}
    33  
    34  	appComponents, found, err := unstructured.NestedSlice(spec, "components")
    35  
    36  	if !found || err != nil {
    37  		t.Fatalf("app components doesn't exist or not found in the specified type: %v", err)
    38  	}
    39  	ingressData := make(map[string]interface{})
    40  	for _, component := range appComponents {
    41  		componentMap := component.(map[string]interface{})
    42  		componentTraits, ok := componentMap[consts.YamlTraits].([]interface{})
    43  		if ok && len(componentTraits) > 0 {
    44  			for _, trait := range componentTraits {
    45  				traitMap := trait.(map[string]interface{})
    46  				ingressData, found, err = unstructured.NestedMap(traitMap, "trait")
    47  				if !found || err != nil {
    48  					t.Fatalf("ingress trait doesn't exist or not found in the specified type: %v", err)
    49  
    50  				}
    51  
    52  			}
    53  		}
    54  	}
    55  	jsonData, err := json.Marshal(ingressData)
    56  	if err != nil {
    57  		t.Fatalf("error in marshalling ingress trait : %v", err)
    58  	}
    59  	ingressTrait := &vzapi.IngressTrait{}
    60  	err = json.Unmarshal(jsonData, &ingressTrait)
    61  	if err != nil {
    62  		t.Fatalf("error in unmarshalling ingress trait : %v", err)
    63  	}
    64  
    65  	compConf, err := reader.ReadFromYAMLTemplate("testdata/template/helidon_workload.yaml")
    66  	if err != nil {
    67  		t.Fatalf("error in reading yaml file : %v", err)
    68  	}
    69  
    70  	compSpec, found, err := unstructured.NestedMap(compConf, "spec")
    71  	if !found || err != nil {
    72  		t.Fatalf("component spec doesn't exist or not found in specified type: %v", err)
    73  	}
    74  	compWorkload, found, err := unstructured.NestedMap(compSpec, "workload")
    75  	if !found || err != nil {
    76  		t.Fatalf("component workload doesn't exist or not found in specified type: %v", err)
    77  	}
    78  	helidonWorkload := &unstructured.Unstructured{
    79  		Object: compWorkload,
    80  	}
    81  
    82  	conversionComponents := []*types.ConversionComponents{
    83  
    84  		{
    85  			AppName:         "myapp",
    86  			ComponentName:   "mycomponent",
    87  			AppNamespace:    "mynamespace",
    88  			IngressTrait:    ingressTrait,
    89  			Helidonworkload: helidonWorkload,
    90  		},
    91  	}
    92  	ingress := k8net.Ingress{
    93  		ObjectMeta: metav1.ObjectMeta{
    94  			Name:      "verrazzano-ingress",
    95  			Namespace: "verrazzano-system",
    96  			Annotations: map[string]string{
    97  				"external-dns.alpha.kubernetes.io/target": "test.nip.io",
    98  			},
    99  		},
   100  	}
   101  	cli := fake.NewClientBuilder().WithScheme(k8scheme.Scheme).WithObjects(&ingress).Build()
   102  	// Call the method being tested
   103  	kubeResources, err := CreateResources(cli, conversionComponents)
   104  
   105  	// Check for errors
   106  	assert.NoError(t, err, "Error occurred")
   107  
   108  	// Assert that the returned kubeResources is not nil
   109  	assert.NotNil(t, kubeResources, "kubeResources is nil")
   110  
   111  	// Assert that the kubeResources fields are not empty or nil
   112  	assert.NotEmpty(t, kubeResources.VirtualServices, "VirtualServices is empty")
   113  	assert.NotNil(t, kubeResources.Gateway, "Gateway is nil")
   114  }
   115  
   116  func TestCreateChildResources(t *testing.T) {
   117  
   118  	appConf, err := reader.ReadFromYAMLTemplate("testdata/template/app_conf.yaml")
   119  	if err != nil {
   120  		t.Fatalf("error in reading yaml file: %v", err)
   121  	}
   122  
   123  	spec, found, err := unstructured.NestedMap(appConf, "spec")
   124  	if !found || err != nil {
   125  		t.Fatalf("app spec doesn't exist or not found in specified type: %v", err)
   126  	}
   127  
   128  	appComponents, found, err := unstructured.NestedSlice(spec, "components")
   129  
   130  	if !found || err != nil {
   131  		t.Fatalf("app components doesn't exist or not found in specified type: %v", err)
   132  	}
   133  	ingressData := make(map[string]interface{})
   134  	for _, component := range appComponents {
   135  		componentMap := component.(map[string]interface{})
   136  		componentTraits, ok := componentMap[consts.YamlTraits].([]interface{})
   137  		if ok && len(componentTraits) > 0 {
   138  			for _, trait := range componentTraits {
   139  				traitMap := trait.(map[string]interface{})
   140  				ingressData, found, err = unstructured.NestedMap(traitMap, "trait")
   141  				if !found || err != nil {
   142  					t.Fatalf("ingress trait doesn't exist or not found in specified type: %v", err)
   143  
   144  				}
   145  
   146  			}
   147  		}
   148  	}
   149  
   150  	jsonData, err := json.Marshal(ingressData)
   151  	if err != nil {
   152  		t.Fatalf("error in marshalling ingress trait: %v", err)
   153  	}
   154  	ingressTrait := &vzapi.IngressTrait{}
   155  	err = json.Unmarshal(jsonData, &ingressTrait)
   156  	if err != nil {
   157  		t.Fatalf("error in unmarshaling ingress trait: %v", err)
   158  	}
   159  	compConf, err := reader.ReadFromYAMLTemplate("testdata/template/helidon_workload.yaml")
   160  	if err != nil {
   161  		t.Fatalf("error in reading yaml file: %v", err)
   162  	}
   163  	compSpec, found, err := unstructured.NestedMap(compConf, "spec")
   164  	if !found || err != nil {
   165  		t.Fatalf("component spec doesn't exist or not found in specified type: %v", err)
   166  	}
   167  	compWorkload, found, err := unstructured.NestedMap(compSpec, "workload")
   168  	if !found || err != nil {
   169  		t.Fatalf("component workload doesn't exist or not found in specified type: %v", err)
   170  	}
   171  	helidonWorkload := &unstructured.Unstructured{
   172  		Object: compWorkload,
   173  	}
   174  
   175  	// Test input data
   176  	conversionComponent := &types.ConversionComponents{
   177  		AppName:         "myapp",
   178  		ComponentName:   "mycomponent",
   179  		AppNamespace:    "mynamespace",
   180  		IngressTrait:    ingressTrait,
   181  		Helidonworkload: helidonWorkload,
   182  	}
   183  
   184  	// Mock the necessary dependencies (e.g., gateway, allHostsForTrait) if needed.
   185  	gateway := &vsapi.Gateway{}
   186  	allHostsForTrait := []string{"example.com"}
   187  	ingress := k8net.Ingress{
   188  		ObjectMeta: metav1.ObjectMeta{
   189  			Name:      "verrazzano-ingress",
   190  			Namespace: "verrazzano-system",
   191  			Annotations: map[string]string{
   192  				"external-dns.alpha.kubernetes.io/target": "test.nip.io",
   193  			},
   194  		},
   195  	}
   196  	cli := fake.NewClientBuilder().WithScheme(k8scheme.Scheme).WithObjects(&ingress).Build()
   197  	// Call the method being tested
   198  	virtualServices, destinationRules, authzPolicies, err := createChildResources(cli, conversionComponent, gateway, allHostsForTrait)
   199  
   200  	// Check for errors
   201  	assert.NoError(t, err, "Error occurred")
   202  
   203  	// Assert that the returned virtualServices, destinationRules, and authzPolicies are not nil
   204  	assert.NotNil(t, virtualServices, "virtualServices is nil")
   205  	assert.NotNil(t, destinationRules, "destinationRules is nil")
   206  	assert.NotNil(t, authzPolicies, "authzPolicies is nil")
   207  
   208  	// Assert that the returned slices are not empty
   209  	assert.NotEmpty(t, virtualServices, "virtualServices is empty")
   210  	assert.NotEmpty(t, destinationRules, "destinationRules is empty")
   211  	assert.NotEmpty(t, authzPolicies, "authzPolicies is empty")
   212  
   213  	expectedNumRules := len(conversionComponent.IngressTrait.Spec.Rules)
   214  	assert.Len(t, virtualServices, expectedNumRules, "unexpected number of VirtualServices")
   215  	assert.Len(t, destinationRules, expectedNumRules, "unexpected number of DestinationRules")
   216  	assert.Len(t, authzPolicies, expectedNumRules, "unexpected number of AuthorizationPolicies")
   217  }