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 }