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 `