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 }