github.com/oam-dev/kubevela@v1.9.11/pkg/addon/versioned_registry_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 addon
    18  
    19  import (
    20  	"encoding/base64"
    21  	"net/http"
    22  	"net/http/httptest"
    23  	"os"
    24  	"strings"
    25  	"testing"
    26  
    27  	"helm.sh/helm/v3/pkg/chart"
    28  	"helm.sh/helm/v3/pkg/repo"
    29  
    30  	"github.com/stretchr/testify/assert"
    31  
    32  	"github.com/oam-dev/kubevela/pkg/utils/common"
    33  	"github.com/oam-dev/kubevela/pkg/utils/helm"
    34  )
    35  
    36  func TestChooseAddonVersion(t *testing.T) {
    37  	versions := []*repo.ChartVersion{
    38  		{
    39  			Metadata: &chart.Metadata{
    40  				Version: "v1.4.0-beta1",
    41  			},
    42  		},
    43  		{
    44  			Metadata: &chart.Metadata{
    45  				Version: "v1.3.6",
    46  			},
    47  		},
    48  		{
    49  			Metadata: &chart.Metadata{
    50  				Version: "v1.2.0",
    51  			},
    52  		},
    53  	}
    54  	avs := []string{"v1.4.0-beta1", "v1.3.6", "v1.2.0"}
    55  	for _, tc := range []struct {
    56  		name             string
    57  		specifiedVersion string
    58  		wantVersion      string
    59  		wantAVersions    []string
    60  	}{
    61  		{
    62  			name:             "choose specified",
    63  			specifiedVersion: "v1.2.0",
    64  			wantVersion:      "v1.2.0",
    65  			wantAVersions:    avs,
    66  		},
    67  		{
    68  			name:             "choose specified, ignore v prefix",
    69  			specifiedVersion: "1.2.0",
    70  			wantVersion:      "v1.2.0",
    71  			wantAVersions:    avs,
    72  		},
    73  		{
    74  			name:             "not specifying version, choose non-prerelease && highest version",
    75  			specifiedVersion: "",
    76  			wantVersion:      "v1.3.6",
    77  			wantAVersions:    avs,
    78  		},
    79  	} {
    80  		targetVersion, availableVersion := chooseVersion(tc.specifiedVersion, versions)
    81  		assert.Equal(t, availableVersion, tc.wantAVersions)
    82  		assert.Equal(t, targetVersion.Version, tc.wantVersion)
    83  	}
    84  }
    85  
    86  var versionedHandler http.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) {
    87  	switch {
    88  	case strings.Contains(request.URL.Path, "index.yaml"):
    89  		files, err := os.ReadFile("./testdata/helm-repo/index.yaml")
    90  		if err != nil {
    91  			_, _ = writer.Write([]byte(err.Error()))
    92  		}
    93  		writer.Write(files)
    94  	case strings.Contains(request.URL.Path, "fluxcd-1.0.0.tgz"):
    95  		files, err := os.ReadFile("./testdata/helm-repo/fluxcd-1.0.0.tgz")
    96  		if err != nil {
    97  			_, _ = writer.Write([]byte(err.Error()))
    98  		}
    99  		writer.Write(files)
   100  	}
   101  }
   102  
   103  var basicAuthVersionedHandler http.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) {
   104  	authHeader := request.Header.Get("Authorization")
   105  	if len(authHeader) != 0 {
   106  		auth := strings.SplitN(authHeader, " ", 2)
   107  		bs, err := base64.StdEncoding.DecodeString(auth[1])
   108  		pairs := strings.SplitN(string(bs), ":", 2)
   109  		// mock auth, just for test
   110  		if pairs[0] != pairs[1] {
   111  			_, _ = writer.Write([]byte(err.Error()))
   112  		}
   113  
   114  	}
   115  	switch {
   116  	case strings.Contains(request.URL.Path, "index.yaml"):
   117  		files, err := os.ReadFile("./testdata/basicauth-helm-repo/index.yaml")
   118  		if err != nil {
   119  			_, _ = writer.Write([]byte(err.Error()))
   120  		}
   121  		writer.Write(files)
   122  	case strings.Contains(request.URL.Path, "fluxcd-1.0.0.tgz"):
   123  		files, err := os.ReadFile("./testdata/basicauth-helm-repo/fluxcd-1.0.0.tgz")
   124  		if err != nil {
   125  			_, _ = writer.Write([]byte(err.Error()))
   126  		}
   127  		writer.Write(files)
   128  	}
   129  }
   130  
   131  var multiVersionHandler http.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) {
   132  	switch {
   133  	case strings.Contains(request.URL.Path, "index.yaml"):
   134  		files, err := os.ReadFile("./testdata/multiversion-helm-repo/index.yaml")
   135  		if err != nil {
   136  			_, _ = writer.Write([]byte(err.Error()))
   137  		}
   138  		writer.Write(files)
   139  	case strings.Contains(request.URL.Path, "fluxcd-1.0.0.tgz"):
   140  		files, err := os.ReadFile("./testdata/multiversion-helm-repo/fluxcd-1.0.0.tgz")
   141  		if err != nil {
   142  			_, _ = writer.Write([]byte(err.Error()))
   143  		}
   144  		writer.Write(files)
   145  	case strings.Contains(request.URL.Path, "fluxcd-2.0.0.tgz"):
   146  		files, err := os.ReadFile("./testdata/multiversion-helm-repo/fluxcd-2.0.0.tgz")
   147  		if err != nil {
   148  			_, _ = writer.Write([]byte(err.Error()))
   149  		}
   150  		writer.Write(files)
   151  	}
   152  }
   153  
   154  func TestLoadSystemRequirements(t *testing.T) {
   155  	req := LoadSystemRequirements(map[string]string{velaSystemRequirement: ">=1.3.0", kubernetesSystemRequirement: ">=1.10.0"})
   156  	assert.Equal(t, req.VelaVersion, ">=1.3.0")
   157  	assert.Equal(t, req.KubernetesVersion, ">=1.10.0")
   158  
   159  	req = LoadSystemRequirements(nil)
   160  	assert.Empty(t, req)
   161  
   162  	req = LoadSystemRequirements(map[string]string{kubernetesSystemRequirement: ">=1.10.0"})
   163  	assert.Equal(t, req.KubernetesVersion, ">=1.10.0")
   164  
   165  	req = LoadSystemRequirements(map[string]string{velaSystemRequirement: ">=1.4.0"})
   166  	assert.Equal(t, req.VelaVersion, ">=1.4.0")
   167  }
   168  
   169  func TestLoadAddonVersions(t *testing.T) {
   170  	server := httptest.NewServer(multiVersionHandler)
   171  	defer server.Close()
   172  	mr := &versionedRegistry{
   173  		name: "multiversion-helm-repo",
   174  		url:  server.URL,
   175  		h:    helm.NewHelperWithCache(),
   176  		Opts: nil,
   177  	}
   178  	versions, err := mr.loadAddonVersions("not-exist")
   179  	assert.Error(t, err)
   180  	assert.Equal(t, err, ErrNotExist)
   181  	assert.Equal(t, len(versions), 0)
   182  
   183  	mr = &versionedRegistry{
   184  		name: "multiversion-helm-repo",
   185  		url:  server.URL,
   186  		h:    helm.NewHelperWithCache(),
   187  		Opts: nil,
   188  	}
   189  	versions, err = mr.loadAddonVersions("not-exist")
   190  	assert.Error(t, err)
   191  	assert.Equal(t, len(versions), 0)
   192  }
   193  
   194  func TestToVersionedRegistry(t *testing.T) {
   195  	registry := Registry{
   196  		Name: "helm-based-registry",
   197  		Helm: &HelmSource{
   198  			URL:      "http://repo.example",
   199  			Username: "example-user",
   200  			Password: "example-password",
   201  		},
   202  	}
   203  
   204  	// Test case 1: convert a helm-based registry
   205  	actual, err := ToVersionedRegistry(registry)
   206  
   207  	assert.NoError(t, err)
   208  	expected := &versionedRegistry{
   209  		name: registry.Name,
   210  		url:  registry.Helm.URL,
   211  		h:    helm.NewHelperWithCache(),
   212  		Opts: &common.HTTPOption{
   213  			Username: registry.Helm.Username,
   214  			Password: registry.Helm.Password,
   215  		},
   216  	}
   217  	assert.Equal(t, expected, actual)
   218  
   219  	// Test case 2: when converting a git-based registry, return error
   220  	registry = Registry{
   221  		Name: "git-based-registry",
   222  		Git: &GitAddonSource{
   223  			URL: "http://repo.example",
   224  		},
   225  	}
   226  	actual, err = ToVersionedRegistry(registry)
   227  	assert.EqualError(t, err, "registry 'git-based-registry' is not a versioned registry")
   228  	assert.Nil(t, actual)
   229  }