Skip to content

Commit c1d7c81

Browse files
Resolve release markers
1 parent 46412f0 commit c1d7c81

File tree

2 files changed

+122
-24
lines changed

2 files changed

+122
-24
lines changed

test/e2e/config/docker.yaml

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,26 @@ providers:
3535
- name: cluster-api
3636
type: CoreProvider
3737
versions:
38-
- name: v1.0.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
39-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.0.5/core-components.yaml"
38+
- name: "{go://sigs.k8s.io/cluster-api@v1.0}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
39+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.0}/core-components.yaml"
4040
type: "url"
4141
contract: v1beta1
4242
replacements:
4343
- old: --metrics-addr=127.0.0.1:8080
4444
new: --metrics-addr=:8080
4545
files:
4646
- sourcePath: "../data/shared/v1.0/metadata.yaml"
47-
- name: v1.4.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
48-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.4.5/core-components.yaml"
47+
- name: "{go://sigs.k8s.io/cluster-api@v1.4}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
48+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.4}/core-components.yaml"
4949
type: "url"
5050
contract: v1beta1
5151
replacements:
5252
- old: --metrics-addr=127.0.0.1:8080
5353
new: --metrics-addr=:8080
5454
files:
5555
- sourcePath: "../data/shared/v1.4/metadata.yaml"
56-
- name: v1.5.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
57-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.0/core-components.yaml"
56+
- name: "{go://sigs.k8s.io/cluster-api@v1.5}" # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
57+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.5}/core-components.yaml"
5858
type: "url"
5959
contract: v1beta1
6060
replacements:
@@ -73,26 +73,26 @@ providers:
7373
- name: kubeadm
7474
type: BootstrapProvider
7575
versions:
76-
- name: v1.0.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
77-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.0.5/bootstrap-components.yaml"
76+
- name: "{go://sigs.k8s.io/cluster-api@v1.0}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
77+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.0}/bootstrap-components.yaml"
7878
type: "url"
7979
contract: v1beta1
8080
replacements:
8181
- old: --metrics-addr=127.0.0.1:8080
8282
new: --metrics-addr=:8080
8383
files:
8484
- sourcePath: "../data/shared/v1.0/metadata.yaml"
85-
- name: v1.4.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
86-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.4.5/bootstrap-components.yaml"
85+
- name: "{go://sigs.k8s.io/cluster-api@v1.4}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
86+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.4}/bootstrap-components.yaml"
8787
type: "url"
8888
contract: v1beta1
8989
replacements:
9090
- old: --metrics-addr=127.0.0.1:8080
9191
new: --metrics-addr=:8080
9292
files:
9393
- sourcePath: "../data/shared/v1.4/metadata.yaml"
94-
- name: v1.5.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
95-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.0/bootstrap-components.yaml"
94+
- name: "{go://sigs.k8s.io/cluster-api@v1.5}" # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
95+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.5}/bootstrap-components.yaml"
9696
type: "url"
9797
contract: v1beta1
9898
replacements:
@@ -111,26 +111,26 @@ providers:
111111
- name: kubeadm
112112
type: ControlPlaneProvider
113113
versions:
114-
- name: v1.0.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
115-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.0.5/control-plane-components.yaml"
114+
- name: "{go://sigs.k8s.io/cluster-api@v1.0}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
115+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.0}/control-plane-components.yaml"
116116
type: "url"
117117
contract: v1beta1
118118
replacements:
119119
- old: --metrics-addr=127.0.0.1:8080
120120
new: --metrics-addr=:8080
121121
files:
122122
- sourcePath: "../data/shared/v1.0/metadata.yaml"
123-
- name: v1.4.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
124-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.4.5/control-plane-components.yaml"
123+
- name: "{go://sigs.k8s.io/cluster-api@v1.4}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
124+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.4}/control-plane-components.yaml"
125125
type: "url"
126126
contract: v1beta1
127127
replacements:
128128
- old: --metrics-addr=127.0.0.1:8080
129129
new: --metrics-addr=:8080
130130
files:
131131
- sourcePath: "../data/shared/v1.4/metadata.yaml"
132-
- name: v1.5.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
133-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.0/control-plane-components.yaml"
132+
- name: "{go://sigs.k8s.io/cluster-api@v1.5}" # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
133+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.5}/control-plane-components.yaml"
134134
type: "url"
135135
contract: v1beta1
136136
replacements:
@@ -149,8 +149,8 @@ providers:
149149
- name: docker
150150
type: InfrastructureProvider
151151
versions:
152-
- name: v1.0.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
153-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.0.5/infrastructure-components-development.yaml"
152+
- name: "{go://sigs.k8s.io/cluster-api@v1.0}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
153+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.0}/infrastructure-components-development.yaml"
154154
type: "url"
155155
contract: v1beta1
156156
replacements:
@@ -159,8 +159,8 @@ providers:
159159
files:
160160
- sourcePath: "../data/shared/v1.0/metadata.yaml"
161161
- sourcePath: "../data/infrastructure-docker/v1.0/cluster-template.yaml"
162-
- name: v1.4.5 # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
163-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.4.5/infrastructure-components-development.yaml"
162+
- name: "{go://sigs.k8s.io/cluster-api@v1.4}" # supported release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
163+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.4}/infrastructure-components-development.yaml"
164164
type: "url"
165165
contract: v1beta1
166166
replacements:
@@ -171,8 +171,8 @@ providers:
171171
- sourcePath: "../data/infrastructure-docker/v1.4/cluster-template.yaml"
172172
- sourcePath: "../data/infrastructure-docker/v1.4/cluster-template-topology.yaml"
173173
- sourcePath: "../data/infrastructure-docker/v1.4/clusterclass-quick-start.yaml"
174-
- name: v1.5.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
175-
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.5.0/infrastructure-components-development.yaml"
174+
- name: "{go://sigs.k8s.io/cluster-api@v1.5}" # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only.
175+
value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/{go://sigs.k8s.io/cluster-api@v1.5}/infrastructure-components-development.yaml"
176176
type: "url"
177177
contract: v1beta1
178178
replacements:

test/framework/clusterctl/e2e_config.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ package clusterctl
1919
import (
2020
"context"
2121
"fmt"
22+
"io"
23+
"net/http"
2224
"net/url"
2325
"os"
26+
"path"
2427
"path/filepath"
2528
"regexp"
2629
"runtime"
@@ -29,6 +32,7 @@ import (
2932
"strings"
3033
"time"
3134

35+
"github.com/blang/semver/v4"
3236
. "github.com/onsi/gomega"
3337
"github.com/pkg/errors"
3438
"k8s.io/apimachinery/pkg/util/version"
@@ -57,6 +61,7 @@ func LoadE2EConfig(_ context.Context, input LoadE2EConfigInput) *E2EConfig {
5761
config := &E2EConfig{}
5862
Expect(yaml.Unmarshal(configData, config)).To(Succeed(), "Failed to convert the e2e test config file to yaml")
5963

64+
Expect(config.ResolveReleases()).To(Succeed(), "Failed to resolve release markers in e2e test config file")
6065
config.Defaults()
6166
config.AbsPaths(filepath.Dir(input.ConfigPath))
6267

@@ -245,6 +250,99 @@ type Files struct {
245250
TargetName string `json:"targetName,omitempty"`
246251
}
247252

253+
// ResolveReleases convert release markers to release version.
254+
func (c *E2EConfig) ResolveReleases() error {
255+
for i := range c.Providers {
256+
provider := &c.Providers[i]
257+
for j := range provider.Versions {
258+
version := &provider.Versions[j]
259+
if version.Type == "url" {
260+
releaseMarker := strings.TrimLeft(strings.TrimRight(version.Name, "}"), "{")
261+
if !strings.EqualFold(version.Name, releaseMarker) {
262+
ver, err := resolveReleaseMarker(releaseMarker)
263+
if err != nil {
264+
return fmt.Errorf("failed resolving release path %s with error: %v", version.Name, err)
265+
}
266+
ver = "v" + ver
267+
version.Value = strings.Replace(version.Value, version.Name, ver, 1)
268+
version.Name = ver
269+
}
270+
}
271+
}
272+
}
273+
return nil
274+
}
275+
276+
func resolveReleaseMarker(releaseMarker string) (string, error) {
277+
parts := strings.Split(releaseMarker, ":")
278+
if len(parts) < 1 {
279+
return "", errors.Errorf("Invalid release url")
280+
}
281+
282+
host := parts[0]
283+
gomoduleParts := strings.Split(parts[1], "@")
284+
if len(gomoduleParts) < 2 {
285+
return "", errors.Errorf("Invalid release url, go module or version missing")
286+
}
287+
gomodule := gomoduleParts[0]
288+
version := strings.ReplaceAll(gomoduleParts[1], "v", "")
289+
includePrereleases := false
290+
parsedVersion := strings.Split(version, "-")
291+
if len(parsedVersion) > 0 {
292+
if len(parsedVersion) > 1 {
293+
version = parsedVersion[1]
294+
if parsedVersion[0] == "latest" {
295+
includePrereleases = true
296+
}
297+
}
298+
} else {
299+
return "", errors.Errorf("Invalid release url")
300+
}
301+
302+
minSemVersion := semver.MustParse(version + ".0")
303+
maxSemVersion := minSemVersion
304+
maxSemVersion.Minor++
305+
306+
if host == "go" {
307+
host = "proxy.golang.org"
308+
}
309+
rawURL := url.URL{
310+
Scheme: "https",
311+
Host: host,
312+
Path: path.Join(gomodule, "@v", "/list"),
313+
}
314+
315+
resp, err := http.Get(rawURL.String()) //nolint:noctx // NB: as we're just implementing an external interface we won't be able to get a context here.
316+
if err != nil {
317+
return "", err
318+
}
319+
defer resp.Body.Close()
320+
321+
out, err := io.ReadAll(resp.Body)
322+
if err != nil {
323+
return "", err
324+
}
325+
326+
parsedTags := semver.Versions{}
327+
for _, line := range strings.Split(string(out), "\n") {
328+
if strings.HasPrefix(line, "v") {
329+
parsedTags = append(parsedTags, semver.MustParse(strings.TrimPrefix(line, "v")))
330+
}
331+
}
332+
sort.Sort(parsedTags)
333+
334+
var picked semver.Version
335+
for i, tag := range parsedTags {
336+
if !includePrereleases && len(tag.Pre) > 0 {
337+
continue
338+
}
339+
if tag.LT(maxSemVersion) && tag.Minor <= minSemVersion.Minor {
340+
picked = parsedTags[i]
341+
}
342+
}
343+
return picked.String(), nil
344+
}
345+
248346
// Defaults assigns default values to the object. More specifically:
249347
// - ManagementClusterName gets a default name if empty.
250348
// - Providers version gets type KustomizeSource if not otherwise specified.

0 commit comments

Comments
 (0)