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  }