github.com/oam-dev/kubevela@v1.9.11/pkg/webhook/core.oam.dev/v1beta1/application/suite_test.go (about) 1 /* 2 Copyright 2021 The KubeVela Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package application 18 19 import ( 20 "context" 21 "encoding/json" 22 "os" 23 "path/filepath" 24 "testing" 25 "time" 26 27 . "github.com/onsi/ginkgo/v2" 28 . "github.com/onsi/gomega" 29 corev1 "k8s.io/api/core/v1" 30 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 31 "k8s.io/apimachinery/pkg/runtime" 32 "k8s.io/client-go/kubernetes/scheme" 33 "k8s.io/client-go/rest" 34 "sigs.k8s.io/controller-runtime/pkg/client" 35 "sigs.k8s.io/controller-runtime/pkg/envtest" 36 logf "sigs.k8s.io/controller-runtime/pkg/log" 37 "sigs.k8s.io/controller-runtime/pkg/log/zap" 38 "sigs.k8s.io/controller-runtime/pkg/webhook/admission" 39 "sigs.k8s.io/yaml" 40 41 "github.com/kubevela/workflow/pkg/cue/packages" 42 43 "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" 44 // +kubebuilder:scaffold:imports 45 ) 46 47 // These tests use Ginkgo (BDD-style Go testing framework). Refer to 48 // http://onsi.github.io/ginkgo/ to learn more about Ginkgo. 49 50 var cfg *rest.Config 51 var k8sClient client.Client 52 var testEnv *envtest.Environment 53 var testScheme = runtime.NewScheme() 54 var decoder *admission.Decoder 55 var pd *packages.PackageDiscover 56 var ctx = context.Background() 57 var handler *ValidatingHandler 58 59 func TestAPIs(t *testing.T) { 60 61 RegisterFailHandler(Fail) 62 63 RunSpecs(t, "Controller Suite") 64 } 65 66 var _ = BeforeSuite(func() { 67 logf.SetLogger(zap.New(zap.UseDevMode(true), zap.WriteTo(GinkgoWriter))) 68 By("bootstrapping test environment") 69 var yamlPath string 70 if _, set := os.LookupEnv("COMPATIBILITY_TEST"); set { 71 yamlPath = "../../../../../test/compatibility-test/testdata" 72 } else { 73 yamlPath = filepath.Join("../../../../..", "charts", "vela-core", "crds") 74 } 75 testEnv = &envtest.Environment{ 76 ControlPlaneStartTimeout: time.Minute, 77 ControlPlaneStopTimeout: time.Minute, 78 CRDDirectoryPaths: []string{yamlPath}, 79 } 80 81 var err error 82 cfg, err = testEnv.Start() 83 Expect(err).ToNot(HaveOccurred()) 84 Expect(cfg).ToNot(BeNil()) 85 86 err = v1beta1.SchemeBuilder.AddToScheme(testScheme) 87 Expect(err).NotTo(HaveOccurred()) 88 89 err = scheme.AddToScheme(testScheme) 90 Expect(err).NotTo(HaveOccurred()) 91 // +kubebuilder:scaffold:scheme 92 93 k8sClient, err = client.New(cfg, client.Options{Scheme: testScheme}) 94 Expect(err).ToNot(HaveOccurred()) 95 Expect(k8sClient).ToNot(BeNil()) 96 97 pd, err = packages.NewPackageDiscover(cfg) 98 Expect(err).ToNot(HaveOccurred()) 99 Expect(pd).ToNot(BeNil()) 100 101 handler = &ValidatingHandler{pd: pd} 102 103 decoder, err = admission.NewDecoder(testScheme) 104 Expect(err).Should(BeNil()) 105 Expect(decoder).ToNot(BeNil()) 106 107 ctx := context.Background() 108 ns := corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "vela-system"}} 109 Expect(k8sClient.Create(ctx, &ns)).Should(BeNil()) 110 wd := &v1beta1.ComponentDefinition{} 111 wDDefJson, _ := yaml.YAMLToJSON([]byte(cDDefYaml)) 112 Expect(json.Unmarshal(wDDefJson, wd)).Should(BeNil()) 113 Expect(k8sClient.Create(ctx, wd)).Should(BeNil()) 114 td := &v1beta1.TraitDefinition{} 115 tDDefJson, _ := yaml.YAMLToJSON([]byte(tDDefYaml)) 116 Expect(json.Unmarshal(tDDefJson, td)).Should(BeNil()) 117 Expect(k8sClient.Create(ctx, td)).Should(BeNil()) 118 }) 119 120 var _ = AfterSuite(func() { 121 By("tearing down the test environment") 122 err := testEnv.Stop() 123 Expect(err).ToNot(HaveOccurred()) 124 }) 125 126 const ( 127 cDDefYaml = ` 128 apiVersion: core.oam.dev/v1beta1 129 kind: ComponentDefinition 130 metadata: 131 name: worker 132 namespace: vela-system 133 annotations: 134 definition.oam.dev/description: "Long-running scalable backend worker without network endpoint" 135 spec: 136 workload: 137 definition: 138 apiVersion: apps/v1 139 kind: Deployment 140 extension: 141 template: | 142 output: { 143 apiVersion: "apps/v1" 144 kind: "Deployment" 145 spec: { 146 selector: matchLabels: { 147 "app.oam.dev/component": context.name 148 } 149 150 template: { 151 metadata: labels: { 152 "app.oam.dev/component": context.name 153 } 154 155 spec: { 156 containers: [{ 157 name: context.name 158 image: parameter.image 159 160 if parameter["cmd"] != _|_ { 161 command: parameter.cmd 162 } 163 }] 164 } 165 } 166 167 selector: 168 matchLabels: 169 "app.oam.dev/component": context.name 170 } 171 } 172 173 parameter: { 174 // +usage=Which image would you like to use for your service 175 // +short=i 176 image: string 177 178 cmd?: [...string] 179 }` 180 181 tDDefYaml = ` 182 # Code generated by KubeVela templates. DO NOT EDIT. Please edit the original cue file. 183 # Definition source cue file: vela-templates/definitions/internal/scaler.cue 184 apiVersion: core.oam.dev/v1beta1 185 kind: TraitDefinition 186 metadata: 187 annotations: 188 definition.oam.dev/description: Manually scale K8s pod for your workload which follows the pod spec in path 'spec.template'. 189 name: scaler 190 namespace: vela-system 191 spec: 192 appliesToWorkloads: 193 - deployments.apps 194 - statefulsets.apps 195 podDisruptive: false 196 schematic: 197 cue: 198 template: | 199 parameter: { 200 // +usage=Specify the number of workload 201 replicas: *1 | int 202 } 203 // +patchStrategy=retainKeys 204 patch: spec: replicas: parameter.replicas 205 ` 206 )