Skip to content

Commit aa2df70

Browse files
committed
add tests and update provider_issues.go
1 parent c356333 commit aa2df70

File tree

3 files changed

+166
-30
lines changed

3 files changed

+166
-30
lines changed

hack/tools/release/internal/update_providers/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
export PROVIDER_ISSUES_DRY_RUN="true"
1616
```
1717

18-
- Export `RELEASE_TAG` environment variable to the CAPI release version e.g. `1.6.0`. The suffix `-beta.0` is appended by the utility.
18+
- Export `RELEASE_TAG` environment variable to the CAPI release version e.g. `v1.7.0-beta.0`.
1919
Example:
2020

2121
```sh
22-
export RELEASE_TAG="1.6.0"
22+
export RELEASE_TAG="v1.7.0-beta.0"
2323
```
2424

25-
- Export `RELEASE_DATE` to the targeted CAPI release version date. Fetch the target date from latest [release file](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/releases).
25+
- Export `RELEASE_DATE` to the targeted CAPI release version date. Fetch the target date from latest [release file](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/releases). The `RELEASE_DATE` should be in the format `YYYY-MM-DD`.
2626
Example:
2727

2828
```sh

hack/tools/release/internal/update_providers/provider_issues.go

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232
"strings"
3333
"text/template"
3434
"time"
35+
36+
"github.com/pkg/errors"
3537
)
3638

3739
const (
@@ -72,15 +74,16 @@ type IssueResponse struct {
7274

7375
// releaseDetails is the struct for the release details.
7476
type releaseDetails struct {
75-
ReleaseTag string
76-
BetaTag string
77-
ReleaseLink string
78-
ReleaseDate string
77+
ReleaseTag string
78+
BetaTag string
79+
ReleaseLink string
80+
ReleaseDate string
81+
ReleaseNotesLink string
7982
}
8083

8184
// Example command:
8285
//
83-
// GITHUB_ISSUE_OPENER_TOKEN="fake" RELEASE_TAG="1.6.0" RELEASE_DATE="2023-11-28" PROVIDER_ISSUES_DRY_RUN="true" make release-provider-issues-tool
86+
// GITHUB_ISSUE_OPENER_TOKEN="fake" RELEASE_TAG="v1.6.0-beta.0" RELEASE_DATE="2023-11-28" PROVIDER_ISSUES_DRY_RUN="true" make release-provider-issues-tool
8487
func main() {
8588
githubToken, keySet := os.LookupEnv("GITHUB_ISSUE_OPENER_TOKEN")
8689
if !keySet || githubToken == "" {
@@ -108,7 +111,12 @@ func main() {
108111
fmt.Println("-", strings.Join(repoList, "\n- "))
109112
fmt.Printf("\n")
110113

111-
details := getReleaseDetails()
114+
// get release details
115+
details, releaseDetailsErr := getReleaseDetails()
116+
if releaseDetailsErr != nil {
117+
fmt.Println(releaseDetailsErr.Error())
118+
os.Exit(1)
119+
}
112120

113121
// generate title
114122
titleBuffer := bytes.NewBuffer([]byte{})
@@ -249,43 +257,56 @@ func continueOrAbort() {
249257
}
250258

251259
// getReleaseDetails returns the release details from the environment variables.
252-
func getReleaseDetails() releaseDetails {
260+
func getReleaseDetails() (releaseDetails, error) {
261+
// Parse the release tag
253262
releaseSemVer, keySet := os.LookupEnv("RELEASE_TAG")
254263
if !keySet || releaseSemVer == "" {
255-
fmt.Println("RELEASE_TAG is a required environmental variable.")
256-
fmt.Println("Refer to README.md in folder for more information.")
257-
os.Exit(1)
264+
return releaseDetails{}, errors.New("release tag is a required. Refer to README.md in folder for more information")
258265
}
259266

260-
match, err := regexp.Match("\\d\\.\\d\\.\\d", []byte(releaseSemVer))
267+
// allow patterns like v1.7.0-beta.0
268+
pattern := `^v\d+\.\d+\.\d+-beta\.\d+$`
269+
match, err := regexp.MatchString(pattern, releaseSemVer)
261270
if err != nil || !match {
262-
fmt.Println("RELEASE_TAG must be in format `\\d\\.\\d\\.\\d` e.g. 1.5")
263-
os.Exit(1)
271+
return releaseDetails{}, errors.New("release tag must be in format `^v\\d+\\.\\d+\\.\\d+-beta\\.\\d+$` e.g. v1.7.0-beta.0")
264272
}
265273

274+
major, minor, patch := "", "", ""
275+
majorMinorPatchPattern := `v(\d+)\.(\d+)\.(\d+)`
276+
re := regexp.MustCompile(majorMinorPatchPattern)
277+
releaseSemVerMatch := re.FindStringSubmatch(releaseSemVer)
278+
if len(releaseSemVerMatch) > 3 {
279+
major = releaseSemVerMatch[1]
280+
minor = releaseSemVerMatch[2]
281+
patch = releaseSemVerMatch[3]
282+
} else {
283+
return releaseDetails{}, errors.New("release tag contains invalid Major.Minor.Patch SemVer. It must be in format v(\\d+)\\.(\\d+)\\.(\\d+) e.g. v1.7.0")
284+
}
285+
286+
// Parse the release date
266287
releaseDate, keySet := os.LookupEnv("RELEASE_DATE")
267288
if !keySet || releaseDate == "" {
268-
fmt.Println("RELEASE_DATE is a required environmental variable.")
269-
fmt.Println("Refer to README.md in folder for more information.")
270-
os.Exit(1)
289+
return releaseDetails{}, errors.New("release date is a required environmental variable. Refer to README.md in folder for more information")
271290
}
272291

273292
formattedReleaseDate, err := formatDate(releaseDate)
274293
if err != nil {
275-
fmt.Println("Unable to parse the date.", err)
276-
fmt.Println("Refer to README.md in folder for more information.")
294+
return releaseDetails{}, errors.New("unable to parse the date")
277295
}
278296

279-
releaseTag := fmt.Sprintf("v%s", releaseSemVer)
280-
betaTag := fmt.Sprintf("v%s%s", releaseSemVer, "-beta.0")
281-
releaseLink := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/releases/release-%s.md#timeline", releaseSemVer)
297+
majorMinorWithoutPrefixV := fmt.Sprintf("%s.%s", major, minor) // e.g. 1.7 . Note that there is no "v" in the majorMinor
298+
releaseTag := fmt.Sprintf("v%s.%s.%s", major, minor, patch) // e.g. v1.7.0
299+
betaTag := fmt.Sprintf("%s%s", releaseTag, "-beta.0") // e.g. v1.7.0-beta.0
300+
releaseLink := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/releases/release-%s.md#timeline", majorMinorWithoutPrefixV)
301+
releaseNotesLink := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/releases/tag/%s", betaTag)
282302

283303
return releaseDetails{
284-
ReleaseDate: formattedReleaseDate,
285-
ReleaseTag: releaseTag,
286-
BetaTag: betaTag,
287-
ReleaseLink: releaseLink,
288-
}
304+
ReleaseDate: formattedReleaseDate,
305+
ReleaseTag: releaseTag,
306+
BetaTag: betaTag,
307+
ReleaseLink: releaseLink,
308+
ReleaseNotesLink: releaseNotesLink,
309+
}, nil
289310
}
290311

291312
// formatDate takes a date in ISO format i.e "2006-01-02" and returns it in the format "Monday 2nd January 2006".
@@ -324,7 +345,7 @@ Looking forward to your feedback before {{.ReleaseTag}} release!
324345
## For quick reference
325346
326347
<!-- body -->
327-
- [CAPI {{.BetaTag}} release notes](https://github.com/kubernetes-sigs/cluster-api/releases/tag/{{.BetaTag}})
348+
- [CAPI {{.BetaTag}} release notes]({{.ReleaseNotesLink}})
328349
- [Shortcut to CAPI git issues](https://github.com/kubernetes-sigs/cluster-api/issues)
329350
330351
## Following are the planned dates for the upcoming releases
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
//go:build tools
2+
// +build tools
3+
4+
/*
5+
Copyright 2022 The Kubernetes Authors.
6+
7+
Licensed under the Apache License, Version 2.0 (the "License");
8+
you may not use this file except in compliance with the License.
9+
You may obtain a copy of the License at
10+
11+
http://www.apache.org/licenses/LICENSE-2.0
12+
13+
Unless required by applicable law or agreed to in writing, software
14+
distributed under the License is distributed on an "AS IS" BASIS,
15+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
See the License for the specific language governing permissions and
17+
limitations under the License.
18+
*/
19+
20+
package main
21+
22+
import (
23+
"os"
24+
"testing"
25+
26+
. "github.com/onsi/gomega"
27+
)
28+
29+
func Test_GetReleaseDetails(t *testing.T) {
30+
tests := []struct {
31+
name string
32+
releaseTag string
33+
releaseDate string
34+
want releaseDetails
35+
expectErr bool
36+
err string
37+
}{
38+
{
39+
name: "Correct RELEASE_TAG and RELEASE_DATE are set",
40+
releaseTag: "v1.7.0-beta.0",
41+
releaseDate: "2024-04-16",
42+
want: releaseDetails{
43+
ReleaseDate: "Tuesday, 16th April 2024",
44+
ReleaseTag: "v1.7.0",
45+
BetaTag: "v1.7.0-beta.0",
46+
ReleaseLink: "https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/releases/release-1.7.md#timeline",
47+
ReleaseNotesLink: "https://github.com/kubernetes-sigs/cluster-api/releases/tag/v1.7.0-beta.0",
48+
},
49+
expectErr: false,
50+
},
51+
{
52+
name: "RELEASE_TAG is not in the format ^v\\d+\\.\\d+\\.\\d+-beta\\.\\d+$",
53+
releaseTag: "v1.7.0.1",
54+
releaseDate: "2024-04-16",
55+
expectErr: true,
56+
err: "release tag must be in format `^v\\d+\\.\\d+\\.\\d+-beta\\.\\d+$` e.g. v1.7.0-beta.0",
57+
},
58+
{
59+
name: "RELEASE_TAG does not have prefix 'v' in its semver",
60+
releaseTag: "1.7.0-beta.0",
61+
releaseDate: "2024-04-16",
62+
expectErr: true,
63+
err: "release tag must be in format `^v\\d+\\.\\d+\\.\\d+-beta\\.\\d+$` e.g. v1.7.0-beta.0",
64+
},
65+
{
66+
name: "RELEASE_TAG contains invalid Major.Minor.Patch SemVer",
67+
releaseTag: "v1.x.0-beta.0",
68+
releaseDate: "2024-04-16",
69+
expectErr: true,
70+
err: "release tag must be in format `^v\\d+\\.\\d+\\.\\d+-beta\\.\\d+$` e.g. v1.7.0-beta.0",
71+
},
72+
{
73+
name: "invalid yyyy-dd-mm RELEASE_DATE entered",
74+
releaseTag: "v1.7.0-beta.0",
75+
releaseDate: "2024-16-4",
76+
expectErr: true,
77+
err: "unable to parse the date",
78+
},
79+
{
80+
name: "invalid yyyy/dd/mm RELEASE_DATE entered",
81+
releaseTag: "v1.7.0-beta.0",
82+
releaseDate: "2024/16/4",
83+
expectErr: true,
84+
err: "unable to parse the date",
85+
},
86+
{
87+
name: "invalid yyyy/mm/dd RELEASE_DATE entered",
88+
releaseTag: "v1.7.0-beta.0",
89+
releaseDate: "2024/4/16",
90+
expectErr: true,
91+
err: "unable to parse the date",
92+
},
93+
}
94+
95+
for _, tt := range tests {
96+
t.Run(tt.name, func(t *testing.T) {
97+
g := NewWithT(t)
98+
99+
_ = os.Setenv("RELEASE_TAG", tt.releaseTag)
100+
_ = os.Setenv("RELEASE_DATE", tt.releaseDate)
101+
102+
got, err := getReleaseDetails()
103+
if tt.expectErr {
104+
g.Expect(err.Error()).To(Equal(tt.err))
105+
} else {
106+
g.Expect(got.ReleaseDate).To(Equal(tt.want.ReleaseDate))
107+
g.Expect(got.ReleaseTag).To(Equal(tt.want.ReleaseTag))
108+
g.Expect(got.BetaTag).To(Equal(tt.want.BetaTag))
109+
g.Expect(got.ReleaseLink).To(Equal(tt.want.ReleaseLink))
110+
}
111+
_ = os.Unsetenv("RELEASE_TAG")
112+
_ = os.Unsetenv("RELEASE_DATE")
113+
})
114+
}
115+
}

0 commit comments

Comments
 (0)