github.com/oam-dev/kubevela@v1.9.11/pkg/config/provider/provider_test.go (about)

     1  /*
     2  Copyright 2023 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 provider
    18  
    19  import (
    20  	"context"
    21  	"strings"
    22  	"testing"
    23  	"time"
    24  
    25  	monitorContext "github.com/kubevela/pkg/monitor/context"
    26  	. "github.com/onsi/ginkgo/v2"
    27  	. "github.com/onsi/gomega"
    28  	"k8s.io/apimachinery/pkg/runtime"
    29  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    30  	"k8s.io/client-go/rest"
    31  	"k8s.io/utils/pointer"
    32  	"sigs.k8s.io/controller-runtime/pkg/client"
    33  	"sigs.k8s.io/controller-runtime/pkg/envtest"
    34  
    35  	wfContext "github.com/kubevela/workflow/pkg/context"
    36  	"github.com/kubevela/workflow/pkg/cue/model/value"
    37  
    38  	"github.com/oam-dev/kubevela/pkg/config"
    39  )
    40  
    41  var cfg *rest.Config
    42  var k8sClient client.Client
    43  var testEnv *envtest.Environment
    44  var scheme = runtime.NewScheme()
    45  var p *provider
    46  
    47  func TestProvider(t *testing.T) {
    48  	RegisterFailHandler(Fail)
    49  
    50  	RunSpecs(t, "Test Config Suite")
    51  }
    52  
    53  var _ = BeforeSuite(func() {
    54  	By("Bootstrapping test environment")
    55  	testEnv = &envtest.Environment{
    56  		ControlPlaneStartTimeout: time.Minute,
    57  		ControlPlaneStopTimeout:  time.Minute,
    58  		UseExistingCluster:       pointer.Bool(false),
    59  	}
    60  	var err error
    61  	cfg, err = testEnv.Start()
    62  	Expect(err).ToNot(HaveOccurred())
    63  	Expect(cfg).ToNot(BeNil())
    64  	Expect(clientgoscheme.AddToScheme(scheme)).Should(BeNil())
    65  	// +kubebuilder:scaffold:scheme
    66  	By("Create the k8s client")
    67  	k8sClient, err = client.New(cfg, client.Options{Scheme: scheme})
    68  	Expect(err).ToNot(HaveOccurred())
    69  	Expect(k8sClient).ToNot(BeNil())
    70  
    71  	p = &provider{
    72  		factory: config.NewConfigFactory(k8sClient),
    73  	}
    74  })
    75  
    76  var _ = AfterSuite(func() {
    77  	By("Tearing down the test environment")
    78  	err := testEnv.Stop()
    79  	Expect(err).ToNot(HaveOccurred())
    80  })
    81  
    82  var _ = Describe("Test the config provider", func() {
    83  
    84  	It("test creating a config", func() {
    85  		mCtx := monitorContext.NewTraceContext(context.Background(), "")
    86  		v, err := value.NewValue(`
    87  		name: "hub-kubevela"
    88  		namespace: "default"
    89  		template: "default/test-image-registry"
    90  		config: {
    91  			registry: "hub.kubevela.net"
    92  		}
    93  		`, nil, "")
    94  		Expect(err).ToNot(HaveOccurred())
    95  		err = p.Create(mCtx, new(wfContext.WorkflowContext), v, nil)
    96  		Expect(strings.Contains(err.Error(), "the template does not exist")).Should(BeTrue())
    97  
    98  		template, err := p.factory.ParseTemplate("test-image-registry", []byte(templateContent))
    99  		Expect(err).ToNot(HaveOccurred())
   100  		Expect(p.factory.CreateOrUpdateConfigTemplate(context.TODO(), "default", template)).ToNot(HaveOccurred())
   101  
   102  		Expect(p.Create(mCtx, new(wfContext.WorkflowContext), v, nil)).ToNot(HaveOccurred())
   103  	})
   104  
   105  	It("test creating a config without the template", func() {
   106  		mCtx := monitorContext.NewTraceContext(context.Background(), "")
   107  		v, err := value.NewValue(`
   108  		name: "www-kubevela"
   109  		namespace: "default"
   110  		config: {
   111  			url: "kubevela.net"
   112  		}
   113  		`, nil, "")
   114  		Expect(err).ToNot(HaveOccurred())
   115  		Expect(p.Create(mCtx, new(wfContext.WorkflowContext), v, nil)).ToNot(HaveOccurred())
   116  	})
   117  
   118  	It("test listing the config", func() {
   119  		mCtx := monitorContext.NewTraceContext(context.Background(), "")
   120  		v, err := value.NewValue(`
   121  		namespace: "default"
   122  		template: "test-image-registry"
   123  		`, nil, "")
   124  		Expect(err).ToNot(HaveOccurred())
   125  		Expect(p.List(mCtx, new(wfContext.WorkflowContext), v, nil)).ToNot(HaveOccurred())
   126  		configs, err := v.LookupValue("configs")
   127  		Expect(err).ToNot(HaveOccurred())
   128  		var contents []map[string]interface{}
   129  		Expect(configs.UnmarshalTo(&contents)).ToNot(HaveOccurred())
   130  		Expect(len(contents)).To(Equal(1))
   131  		Expect(contents[0]["config"].(map[string]interface{})["registry"]).To(Equal("hub.kubevela.net"))
   132  	})
   133  
   134  	It("test reading the config", func() {
   135  		mCtx := monitorContext.NewTraceContext(context.Background(), "")
   136  		v, err := value.NewValue(`
   137  		name: "hub-kubevela"
   138  		namespace: "default"
   139  		`, nil, "")
   140  		Expect(err).ToNot(HaveOccurred())
   141  		Expect(p.Read(mCtx, new(wfContext.WorkflowContext), v, nil)).ToNot(HaveOccurred())
   142  		registry, err := v.GetString("config", "registry")
   143  		Expect(err).ToNot(HaveOccurred())
   144  		Expect(registry).To(Equal("hub.kubevela.net"))
   145  	})
   146  
   147  	It("test deleting the config", func() {
   148  		mCtx := monitorContext.NewTraceContext(context.Background(), "")
   149  		v, err := value.NewValue(`
   150  		name: "hub-kubevela"
   151  		namespace: "default"
   152  		`, nil, "")
   153  		Expect(err).ToNot(HaveOccurred())
   154  		Expect(p.Delete(mCtx, new(wfContext.WorkflowContext), v, nil)).ToNot(HaveOccurred())
   155  
   156  		configs, err := p.factory.ListConfigs(context.Background(), "default", "", "", false)
   157  		Expect(err).ToNot(HaveOccurred())
   158  		Expect(len(configs)).To(Equal(1))
   159  		Expect(configs[0].Properties["url"]).To(Equal("kubevela.net"))
   160  	})
   161  })
   162  
   163  var templateContent = `
   164  import (
   165  	"encoding/base64"
   166  	"encoding/json"
   167  	"strconv"
   168  )
   169  
   170  metadata: {
   171  	name:        "image-registry"
   172  	alias:       "Image Registry"
   173  	scope:       "project"
   174  	description: "Config information to authenticate image registry"
   175  	sensitive:   false
   176  }
   177  
   178  template: {
   179  	output: {
   180  		apiVersion: "v1"
   181  		kind:       "Secret"
   182  		metadata: {
   183  			name:      context.name
   184  			namespace: context.namespace
   185  			labels: {
   186  				"config.oam.dev/catalog": "velacore-config"
   187  				"config.oam.dev/type":    "image-registry"
   188  			}
   189  		}
   190  		if parameter.auth != _|_ {
   191  			type: "kubernetes.io/dockerconfigjson"
   192  		}
   193  		if parameter.auth == _|_ {
   194  			type: "Opaque"
   195  		}
   196  		stringData: {
   197  			if parameter.auth != _|_ && parameter.auth.username != _|_ {
   198  				".dockerconfigjson": json.Marshal({
   199  					"auths": (parameter.registry): {
   200  						"username": parameter.auth.username
   201  						"password": parameter.auth.password
   202  						if parameter.auth.email != _|_ {
   203  							"email": parameter.auth.email
   204  						}
   205  						"auth": base64.Encode(null, (parameter.auth.username + ":" + parameter.auth.password))
   206  					}
   207  				})
   208  			}
   209  			if parameter.insecure != _|_ {
   210  				"insecure-skip-verify": strconv.FormatBool(parameter.insecure)
   211  			}
   212  			if parameter.useHTTP != _|_ {
   213  				"protocol-use-http": strconv.FormatBool(parameter.useHTTP)
   214  			}
   215  		}
   216  	}
   217  
   218  	parameter: {
   219  		// +usage=Image registry FQDN, such as: index.docker.io
   220  		registry: *"index.docker.io" | string
   221  		// +usage=Authenticate the image registry
   222  		auth?: {
   223  			// +usage=Private Image registry username
   224  			username: string
   225  			// +usage=Private Image registry password
   226  			password: string
   227  			// +usage=Private Image registry email
   228  			email?: string
   229  		}
   230  		// +usage=For the registry server that uses the self-signed certificate
   231  		insecure?: bool
   232  		// +usage=For the registry server that uses the HTTP protocol
   233  		useHTTP?: bool
   234  	}
   235  }
   236  `