Skip to content

Commit d25e002

Browse files
authored
fix: filter prime releases from testing (rancher#88)
Signed-off-by: matttrach <matt.trachier@suse.com>
1 parent f00468f commit d25e002

10 files changed

Lines changed: 171 additions & 61 deletions

File tree

examples/one/main.tf

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ provider "rancher2" {
2323
}
2424

2525
resource "rancher2_bootstrap" "authenticate" {
26+
depends_on = [
27+
module.rancher,
28+
]
2629
provider = rancher2.authenticate
2730
initial_password = module.rancher.admin_password
2831
password = module.rancher.admin_password
@@ -92,12 +95,11 @@ module "rancher" {
9295
rancher_version = local.rancher_version
9396
}
9497

95-
# test catalog entry
96-
resource "rancher2_catalog" "foo" {
98+
data "rancher2_cluster" "local" {
9799
depends_on = [
98100
module.rancher,
101+
rancher2_bootstrap.authenticate,
99102
]
100103
provider = rancher2.default
101-
name = "test"
102-
url = "http://foo.com:8080"
104+
name = "local"
103105
}

examples/one/outputs.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@ output "admin_password" {
1616
value = module.rancher.admin_password
1717
sensitive = true
1818
}
19+
output "cluster_data" {
20+
value = jsonencode(data.rancher2_cluster.local)
21+
sensitive = true
22+
}

examples/prod/main.tf

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,31 @@ provider "kubernetes" {} # make sure you set the env variable KUBE_CONFIG_PATH t
1616
provider "helm" {} # make sure you set the env variable KUBE_CONFIG_PATH to local_file_path (file_path variable)
1717

1818
provider "rancher2" {
19+
alias = "default"
1920
api_url = "https://${local.domain}.${local.zone}"
2021
token_key = module.this.admin_token
2122
timeout = "300s"
2223
}
2324

25+
provider "rancher2" {
26+
alias = "authenticate"
27+
bootstrap = true
28+
api_url = "https://${local.domain}.${local.zone}"
29+
timeout = "300s"
30+
}
31+
32+
resource "rancher2_bootstrap" "authenticate" {
33+
depends_on = [
34+
module.this,
35+
]
36+
provider = rancher2.authenticate
37+
initial_password = module.this.admin_password
38+
password = module.this.admin_password
39+
token_update = true
40+
token_ttl = 7200 # 2 hours
41+
}
42+
43+
2444
locals {
2545
identifier = var.identifier
2646
example = "prod"
@@ -149,11 +169,11 @@ resource "terraform_data" "get_cert_info" {
149169
}
150170
}
151171

152-
# test catalog entry
153-
resource "rancher2_catalog" "foo" {
172+
data "rancher2_cluster" "local" {
154173
depends_on = [
155174
module.this,
175+
rancher2_bootstrap.authenticate,
156176
]
157-
name = "test"
158-
url = "http://foo.com:8080"
177+
provider = rancher2.default
178+
name = "local"
159179
}

examples/prod/outputs.tf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@ output "admin_password" {
1616
value = module.this.admin_password
1717
sensitive = true
1818
}
19-
19+
output "cluster_data" {
20+
value = jsonencode(data.rancher2_cluster.local)
21+
sensitive = true
22+
}

modules/rancher_bootstrap/rancher/main.tf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,10 @@ resource "helm_release" "rancher" {
150150
chart = "${path.root}/rancher-${local.rancher_version}.tgz" # "${local.rancher_helm_repository}/${local.rancher_channel}/rancher-${local.rancher_version}.tgz"
151151
namespace = "cattle-system"
152152
create_namespace = false
153-
wait = false
154-
wait_for_jobs = false
153+
wait = true
154+
wait_for_jobs = true
155155
force_update = true
156-
timeout = 1800 # 30m
156+
timeout = 3600 # 60m
157157

158158
set {
159159
name = "hostname"

modules/rancher_bootstrap/rancher_externalTLS/main.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ resource "helm_release" "rancher" {
6767
chart = "${path.root}/rancher-${local.rancher_version}.tgz" #"${local.rancher_helm_repository}/${local.rancher_channel}/rancher-${local.rancher_version}.tgz"
6868
namespace = "cattle-system"
6969
create_namespace = false
70-
wait = false
71-
wait_for_jobs = false
70+
wait = true
71+
wait_for_jobs = true
7272
force_update = true
7373
timeout = 1800 # 30m
7474

test/scripts/readyNodes.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ TIMEOUT=5 # 5 minutes
3232
TIMEOUT_MINUTES=$((TIMEOUT * 60))
3333
INTERVAL=10 # 10 seconds
3434
MAX=$((TIMEOUT_MINUTES / INTERVAL))
35-
INDEX=0
35+
ATTEMPTS=0
3636

3737
while notReady; do
38-
if [[ $INDEX -lt $MAX ]]; then
38+
if [[ $ATTEMPTS -lt $MAX ]]; then
3939
echo "Waiting for nodes to be ready..."
40-
INDEX=$((INDEX + 1))
40+
ATTEMPTS=$((ATTEMPTS + 1))
4141
sleep $INTERVAL;
4242
else
4343
echo "Timeout reached. Nodes are not ready..."

test/scripts/runningPods.sh

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
set -x
3+
4+
JSONPATH="'{range .items[*]}
5+
{.metadata.name}{\"\\t\"} \
6+
{.metadata.namespace}{\"\\t\"} \
7+
{.status.phase}{\"\\n\"} \
8+
{end}'"
9+
10+
notReady() {
11+
PODS=$(kubectl get pods -A -o jsonpath="$JSONPATH")
12+
# shellcheck disable=SC2060,SC2140
13+
NOT_READY=$(echo "$PODS" | grep -v "Running" | grep -v "Succeeded" | tr -d ["\t","\n"," ","'"] || true)
14+
if [ -n "$NOT_READY" ]; then
15+
# Some pods aren't running
16+
return 0
17+
else
18+
# All pods are running
19+
return 1
20+
fi
21+
}
22+
23+
readyWait() {
24+
TIMEOUT=10 # 10 minutes
25+
TIMEOUT_MINUTES=$((TIMEOUT * 60))
26+
INTERVAL=30 # 30 seconds
27+
MAX=$((TIMEOUT_MINUTES / INTERVAL))
28+
ATTEMPTS=0
29+
30+
while notReady; do
31+
if [ "$ATTEMPTS" -lt "$MAX" ]; then
32+
ATTEMPTS=$((ATTEMPTS + 1))
33+
sleep "$INTERVAL";
34+
else
35+
return 1
36+
fi
37+
done
38+
return 0
39+
}
40+
41+
SUCCESSES=0
42+
SUCCESSES_NEEDED=3 # require three successes to make sure everything is settled
43+
44+
while readyWait && [ "$SUCCESSES" -lt "$SUCCESSES_NEEDED" ]; do
45+
SUCCESSES=$((SUCCESSES + 1))
46+
echo "succeeeded $SUCCESSES times..."
47+
sleep 30
48+
done
49+
50+
echo "Pods are ready..."
51+
52+
echo "nodes..."
53+
kubectl get nodes || true
54+
55+
echo "all..."
56+
kubectl get all -A || true
57+
58+
echo "pods..."
59+
kubectl get pods -A || true
60+
61+
exit 0

test/tests/one/one_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ func TestOneBasic(t *testing.T) {
103103
t.Fatalf("Error creating cluster: %s", err)
104104
}
105105
util.CheckReady(t, testDir + "/kubeconfig")
106+
util.CheckRunning(t, testDir + "/kubeconfig")
106107
if t.Failed() {
107108
t.Log("Test failed...")
108109
} else {

test/tests/util.go

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ import (
2222
)
2323

2424
func GetRancherReleases() (string, string, string, error) {
25-
releases, err := getRancherReleases()
25+
releases, err := getReleases("rancher", "rancher")
2626
if err != nil {
2727
return "", "", "", err
2828
}
29-
versions := filterPrerelease(releases)
29+
filterPrerelease(&releases)
30+
filterPrimeOnly(&releases)
31+
versions := getVersionsFromReleases(&releases)
3032
if len(versions) == 0 {
3133
return "", "", "", errors.New("no eligible versions found")
3234
}
@@ -46,35 +48,13 @@ func GetRancherReleases() (string, string, string, error) {
4648
return latest, stable, lts, nil
4749
}
4850

49-
func getRancherReleases() ([]*github.RepositoryRelease, error) {
50-
githubToken := os.Getenv("GITHUB_TOKEN")
51-
if githubToken == "" {
52-
fmt.Println("GITHUB_TOKEN environment variable not set")
53-
return nil, errors.New("GITHUB_TOKEN environment variable not set")
54-
}
55-
56-
// Create a new OAuth2 token using the GitHub token
57-
tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: githubToken})
58-
tokenClient := oauth2.NewClient(context.Background(), tokenSource)
59-
60-
// Create a new GitHub client using the authenticated HTTP client
61-
client := github.NewClient(tokenClient)
62-
63-
var releases []*github.RepositoryRelease
64-
releases, _, err := client.Repositories.ListReleases(context.Background(), "rancher", "rancher", &github.ListOptions{})
65-
if err != nil {
66-
return nil, err
67-
}
68-
69-
return releases, nil
70-
}
71-
7251
func GetRke2Releases() (string, string, string, error) {
73-
releases, err := getRke2Releases()
52+
releases, err := getReleases("rancher", "rke2")
7453
if err != nil {
7554
return "", "", "", err
7655
}
77-
versions := filterPrerelease(releases)
56+
filterPrerelease(&releases)
57+
versions := getVersionsFromReleases(&releases)
7858
if len(versions) == 0 {
7959
return "", "", "", errors.New("no eligible versions found")
8060
}
@@ -94,7 +74,7 @@ func GetRke2Releases() (string, string, string, error) {
9474
return latest, stable, lts, nil
9575
}
9676

97-
func getRke2Releases() ([]*github.RepositoryRelease, error) {
77+
func getReleases(org string, repo string) ([]*github.RepositoryRelease, error) {
9878
githubToken := os.Getenv("GITHUB_TOKEN")
9979
if githubToken == "" {
10080
fmt.Println("GITHUB_TOKEN environment variable not set")
@@ -109,30 +89,46 @@ func getRke2Releases() ([]*github.RepositoryRelease, error) {
10989
client := github.NewClient(tokenClient)
11090

11191
var releases []*github.RepositoryRelease
112-
releases, _, err := client.Repositories.ListReleases(context.Background(), "rancher", "rke2", &github.ListOptions{})
92+
releases, _, err := client.Repositories.ListReleases(context.Background(), org, repo, &github.ListOptions{})
11393
if err != nil {
11494
return nil, err
11595
}
96+
11697
return releases, nil
11798
}
11899

119-
func filterReleaseCandidate(v *[]string) {
120-
var fv []string
121-
versions := *v
122-
for i := 1; i < len(versions); i++ {
123-
if strings.Contains(versions[i], "-") != true {
124-
fv = append(fv, versions[i])
100+
func filterPrimeOnly(r *[]*github.RepositoryRelease) {
101+
var fr []*github.RepositoryRelease
102+
releases := *r
103+
for i := 0; i < len(releases); i++ {
104+
if len(releases[i].Assets) > 2 { // source zip and tar are always there
105+
// prime only releases won't have artifacts
106+
// so we only add releases with more than 2 artifacts
107+
fr = append(fr, releases[i])
125108
}
126109
}
127-
*v = fv
110+
*r = fr
111+
}
112+
113+
// this effectively removes release candidates as well as pending releases
114+
func filterPrerelease(r *[]*github.RepositoryRelease) {
115+
var fr []*github.RepositoryRelease
116+
releases := *r
117+
for i := 0; i < len(releases); i++ {
118+
if !releases[i].GetPrerelease() {
119+
fr = append(fr, releases[i])
120+
}
121+
}
122+
*r = fr
128123
}
129124

130-
func filterPrerelease(r []*github.RepositoryRelease) []string {
125+
func getVersionsFromReleases(r *[]*github.RepositoryRelease) []string {
131126
var versions []string
132-
for _, release := range r {
133-
version := release.GetTagName()
134-
if !release.GetPrerelease() {
135-
versions = append(versions, version)
127+
releases := *r
128+
for i := 0; i < len(releases); i++ {
129+
versions = append(versions, *releases[i].TagName)
130+
}
131+
return versions
136132
// [
137133
// "v1.28.14+rke2r1",
138134
// "v1.30.1+rke2r3",
@@ -145,9 +141,6 @@ func filterPrerelease(r []*github.RepositoryRelease) []string {
145141
// "v1.29.5+rke2r1",
146142
// "v1.28.17+rke2r1",
147143
// ]
148-
}
149-
}
150-
return versions
151144
}
152145

153146
func sortVersions(v *[]string) {
@@ -467,3 +460,29 @@ func CheckReady(t *testing.T, kubeconfigPath string) {
467460
}
468461
t.Logf("Ready script output: %s", out)
469462
}
463+
464+
func CheckRunning(t *testing.T, kubeconfigPath string) {
465+
repoRoot, err := filepath.Abs(g.GetRepoRoot(t))
466+
if err != nil {
467+
t.Logf("Error getting git root directory: %v", err)
468+
t.Fail()
469+
}
470+
script, err := os.ReadFile(repoRoot + "/test/scripts/runningPods.sh")
471+
if err != nil {
472+
t.Logf("Error reading script: %v", err)
473+
t.Fail()
474+
}
475+
readyScript := shell.Command{
476+
Command: "bash",
477+
Args: []string{"-c", string(script)},
478+
Env: map[string]string{
479+
"KUBECONFIG": kubeconfigPath,
480+
},
481+
}
482+
out, err := shell.RunCommandAndGetOutputE(t, readyScript)
483+
if err != nil {
484+
t.Logf("Error running script: %s", err)
485+
t.Fail()
486+
}
487+
t.Logf("Ready script output: %s", out)
488+
}

0 commit comments

Comments
 (0)