github.com/oam-dev/kubevela@v1.9.11/pkg/addon/versioned_registry_suite_test.go (about) 1 /* 2 Copyright 2021 The KubeVela Authors. 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 http://www.apache.org/licenses/LICENSE-2.0 7 Unless required by applicable law or agreed to in writing, software 8 distributed under the License is distributed on an "AS IS" BASIS, 9 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 See the License for the specific language governing permissions and 11 limitations under the License. 12 */ 13 14 package addon 15 16 import ( 17 "context" 18 "crypto/tls" 19 "fmt" 20 "net/http" 21 "time" 22 23 "github.com/pkg/errors" 24 25 . "github.com/onsi/ginkgo/v2" 26 . "github.com/onsi/gomega" 27 28 "github.com/oam-dev/kubevela/pkg/utils/common" 29 ) 30 31 var _ = Describe("Test Versioned Registry", func() { 32 registries := []Registry{ 33 { 34 Name: "helm-repo", 35 Helm: &HelmSource{URL: "http://127.0.0.1:18083"}, 36 }, 37 { 38 Name: "auth-helm-repo", 39 Helm: &HelmSource{ 40 URL: "http://127.0.0.1:18083", 41 Username: "kubevela", 42 Password: "versioned registry", 43 }, 44 }, 45 { 46 Name: "tls-helm-repo", 47 Helm: &HelmSource{URL: "https://127.0.0.1:18443", InsecureSkipTLS: true}, 48 }, 49 { 50 Name: "auth-tls-helm-repo", 51 Helm: &HelmSource{ 52 URL: "https://127.0.0.1:18443", 53 Username: "kubevela", 54 Password: "versioned registry", 55 InsecureSkipTLS: true, 56 }, 57 }, 58 } 59 60 for _, registry := range registries { 61 registry := registry 62 r := BuildVersionedRegistry(registry.Name, registry.Helm.URL, &common.HTTPOption{ 63 InsecureSkipTLS: registry.Helm.InsecureSkipTLS, 64 Username: registry.Helm.Username, 65 Password: registry.Helm.Password, 66 }) 67 Context(fmt.Sprintf("Test %s", registry.Name), func() { 68 It("list addon", func() { 69 addon, err := r.ListAddon() 70 Expect(err).NotTo(HaveOccurred()) 71 Expect(addon).To(HaveLen(1)) 72 Expect(addon[0].Name).To(Equal("fluxcd")) 73 Expect(addon[0].AvailableVersions).To(HaveLen(1)) 74 }) 75 76 It("get addon ui data", func() { 77 addonUIData, err := r.GetAddonUIData(context.Background(), "fluxcd", "1.0.0") 78 Expect(err).NotTo(HaveOccurred()) 79 Expect(addonUIData).NotTo(BeNil()) 80 Expect(addonUIData.Definitions).NotTo(BeEmpty()) 81 Expect(addonUIData.Icon).NotTo(BeEmpty()) 82 }) 83 84 It("get addon install pkg", func() { 85 addonsInstallPackage, err := r.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0") 86 Expect(err).NotTo(HaveOccurred()) 87 Expect(addonsInstallPackage).NotTo(BeNil()) 88 Expect(addonsInstallPackage.YAMLTemplates).NotTo(BeEmpty()) 89 Expect(addonsInstallPackage.DefSchemas).NotTo(BeEmpty()) 90 }) 91 92 It("get addon detail", func() { 93 addonWholePackage, err := r.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0") 94 Expect(err).NotTo(HaveOccurred()) 95 Expect(addonWholePackage).NotTo(BeNil()) 96 Expect(addonWholePackage.YAMLTemplates).NotTo(BeEmpty()) 97 Expect(addonWholePackage.DefSchemas).NotTo(BeEmpty()) 98 Expect(addonWholePackage.RegistryName).NotTo(BeEmpty()) 99 }) 100 }) 101 } 102 103 errRegistries := []Registry{ 104 { 105 Name: "tls-err-helm-repo", 106 Helm: &HelmSource{URL: "https://127.0.0.1:18443", InsecureSkipTLS: false}, 107 }, 108 { 109 Name: "auth-tls-err-helm-repo", 110 Helm: &HelmSource{ 111 URL: "https://127.0.0.1:18443", 112 Username: "kubevela", 113 Password: "versioned registry", 114 InsecureSkipTLS: false, 115 }, 116 }, 117 } 118 119 for _, registry := range errRegistries { 120 registry := registry 121 r := BuildVersionedRegistry(registry.Name, registry.Helm.URL, &common.HTTPOption{ 122 InsecureSkipTLS: registry.Helm.InsecureSkipTLS, 123 Username: registry.Helm.Username, 124 Password: registry.Helm.Password, 125 }) 126 Context(fmt.Sprintf("Test %s", registry.Name), func() { 127 It("list addon", func() { 128 addon, err := r.ListAddon() 129 Expect(err).To(HaveOccurred()) 130 Expect(addon).To(BeEmpty()) 131 }) 132 133 It("get addon ui data", func() { 134 addonUIData, err := r.GetAddonUIData(context.Background(), "fluxcd", "1.0.0") 135 Expect(err).To(HaveOccurred()) 136 Expect(addonUIData).To(BeNil()) 137 }) 138 139 It("get addon install pkg", func() { 140 addonsInstallPackage, err := r.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0") 141 Expect(err).To(HaveOccurred()) 142 Expect(addonsInstallPackage).To(BeNil()) 143 }) 144 145 It("get addon detail", func() { 146 addonWholePackage, err := r.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0") 147 Expect(err).To(HaveOccurred()) 148 Expect(addonWholePackage).To(BeNil()) 149 }) 150 }) 151 } 152 153 Context("Test multiversion helm repo", func() { 154 const repoName = "multiversion-helm-repo" 155 mr := BuildVersionedRegistry(repoName, "http://127.0.0.1:18083/multi", nil) 156 It("list addon", func() { 157 addons, err := mr.ListAddon() 158 Expect(err).To(Succeed()) 159 Expect(addons).To(HaveLen(2)) 160 }) 161 162 It("get addon ui data", func() { 163 addonUIData, err := mr.GetAddonUIData(context.Background(), "fluxcd", "2.0.0") 164 Expect(err).To(Succeed()) 165 Expect(addonUIData.Definitions).NotTo(BeEmpty()) 166 Expect(addonUIData.Icon).NotTo(BeEmpty()) 167 Expect(addonUIData.Version).To(Equal("2.0.0")) 168 }) 169 170 It("get addon install pkg", func() { 171 addonsInstallPackage, err := mr.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0") 172 Expect(err).To(Succeed()) 173 Expect(addonsInstallPackage).NotTo(BeNil()) 174 Expect(addonsInstallPackage.YAMLTemplates).NotTo(BeEmpty()) 175 Expect(addonsInstallPackage.DefSchemas).NotTo(BeEmpty()) 176 Expect(addonsInstallPackage.SystemRequirements.VelaVersion).To(HaveSuffix("1.3.0")) 177 Expect(addonsInstallPackage.SystemRequirements.KubernetesVersion).To(HaveSuffix("1.10.0")) 178 }) 179 180 It("get addon detail", func() { 181 addonWholePackage, err := mr.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0") 182 Expect(err).To(Succeed()) 183 Expect(addonWholePackage).NotTo(BeNil()) 184 Expect(addonWholePackage.YAMLTemplates).NotTo(BeEmpty()) 185 Expect(addonWholePackage.DefSchemas).NotTo(BeEmpty()) 186 Expect(addonWholePackage.RegistryName).To(Equal(repoName)) 187 Expect(addonWholePackage.SystemRequirements.VelaVersion).To(Equal(">=1.3.0")) 188 Expect(addonWholePackage.SystemRequirements.KubernetesVersion).To(Equal(">=1.10.0")) 189 }) 190 191 It("get addon available version", func() { 192 version, err := mr.GetAddonAvailableVersion("fluxcd") 193 Expect(err).To(Succeed()) 194 Expect(version).To(HaveLen(2)) 195 }) 196 }) 197 }) 198 199 func stepHelmHttpServer() error { 200 handler := &http.ServeMux{} 201 handler.HandleFunc("/", versionedHandler) 202 handler.HandleFunc("/authReg", basicAuthVersionedHandler) 203 handler.HandleFunc("/multi/", multiVersionHandler) 204 205 helmRepoHttpServer := &http.Server{ 206 Addr: fmt.Sprintf(":%d", 18083), 207 Handler: handler, 208 } 209 helmRepoHttpsServer := &http.Server{ 210 Addr: fmt.Sprintf(":%d", 18443), 211 Handler: handler, 212 } 213 214 go func() { 215 err := helmRepoHttpsServer.ListenAndServeTLS("./testdata/tls/local-selfsign.crt", "./testdata/tls/local-selfsign.key") 216 Expect(err).ShouldNot(HaveOccurred()) 217 }() 218 go func() { 219 err := helmRepoHttpServer.ListenAndServe() 220 Expect(err).ShouldNot(HaveOccurred()) 221 }() 222 223 err := checkHelmHttpServer("http://127.0.0.1:18083", 3, time.Second) 224 if err != nil { 225 return err 226 } 227 err = checkHelmHttpServer("http://127.0.0.1:18443", 3, time.Second) 228 if err != nil { 229 return err 230 } 231 return nil 232 } 233 234 func checkHelmHttpServer(url string, maxTryNum int, interval time.Duration) error { 235 client := http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} 236 var err error 237 for cur := 0; cur < maxTryNum; cur++ { 238 _, err = client.Get(url) 239 if err != nil { 240 time.Sleep(interval) 241 continue 242 } 243 } 244 if err != nil { 245 return errors.Wrap(err, "exceeded maximum number of retries.") 246 } 247 return nil 248 }