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  )