Skip to content

Commit e78aa7a

Browse files
committed
merge main
2 parents c503c92 + 4a1ca8f commit e78aa7a

File tree

11 files changed

+205
-107
lines changed

11 files changed

+205
-107
lines changed

.github/actions/e2e/action.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ inputs:
3131
dr-aws-secret-access-key:
3232
description: 'Disaster Recovery AWS Secret Access Key'
3333
required: true
34+
k0s-version:
35+
description: 'k0s version to expect after upgrades in e2e tests'
36+
required: true
3437

3538
runs:
3639
using: composite
@@ -104,28 +107,29 @@ runs:
104107
export DR_AWS_S3_PREFIX_AIRGAP=${{ inputs.test-name }}-${{ github.run_id }}-${{ github.run_attempt }}-airgap
105108
export DR_AWS_ACCESS_KEY_ID=${{ inputs.dr-aws-access-key-id }}
106109
export DR_AWS_SECRET_ACCESS_KEY=${{ inputs.dr-aws-secret-access-key }}
110+
export K0S_VERSION=${{ inputs.k0s-version }}
107111
make e2e-test TEST_NAME=${{ inputs.test-name }}
108112
- name: Upload Host Support Bundle
109113
uses: actions/upload-artifact@v4
110-
if: ${{ failure() }}
114+
if: ${{ ! cancelled() }}
111115
with:
112116
name: ${{ inputs.test-name }}-support-bundle-host.tar.gz
113117
path: ./e2e/support-bundle-host-*.tar.gz
114118
- name: Upload Cluster Support Bundle
115119
uses: actions/upload-artifact@v4
116-
if: ${{ failure() }}
120+
if: ${{ ! cancelled() }}
117121
with:
118122
name: ${{ inputs.test-name }}-support-bundle-cluster.tar.gz
119123
path: ./e2e/support-bundle-cluster.tar.gz
120124
- name: Upload Playwright Report
121125
id: upload-playwright-report
122126
uses: actions/upload-artifact@v4
123-
if: ${{ failure() }}
127+
if: ${{ ! cancelled() }}
124128
with:
125129
name: ${{ inputs.test-name }}-playwright-report.tar.gz
126130
path: ./e2e/playwright-report.tar.gz
127131
- name: Print instructions to view Playwright report
128-
if: ${{ failure() && steps.upload-playwright-report.outputs.artifact-url != '' }}
132+
if: ${{ ! cancelled() && steps.upload-playwright-report.outputs.artifact-url != '' }}
129133
run: |
130134
echo -e "\e[1;33m┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐\e[0m"
131135
echo -e "\e[1;33m To view the Playwright test report: \e[0m"

.github/workflows/ci.yaml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ jobs:
176176
output/bin/embedded-cluster-original
177177
output/bin/embedded-cluster-previous-k0s
178178
output/bin/embedded-cluster-release-builder
179+
- name: Export K0s Version
180+
run: |
181+
make print-K0S_VERSION
182+
echo "k0s_version=$(make print-K0S_VERSION)" >> "$GITHUB_OUTPUT"
179183
180184
check-images:
181185
name: Check Images
@@ -248,6 +252,12 @@ jobs:
248252
# re-promote a release containing an old version of embedded-cluster to test upgrades
249253
replicated release promote 807 2cHXb1RCttzpR0xvnNWyaZCgDBP --version "appver-${SHORT_SHA}-pre-minio-removal"
250254
255+
# install the previous k0s version to ensure an upgrade occurs
256+
sed -i "s/${SHORT_SHA}/${SHORT_SHA}-previous-k0s/g" e2e/kots-release-install/cluster-config.yaml
257+
replicated release create --yaml-dir e2e/kots-release-install --promote CI --version "appver-${SHORT_SHA}-previous-k0s"
258+
# return the cluster config to the current version
259+
sed -i "s/${SHORT_SHA}-previous-k0s/${SHORT_SHA}/g" e2e/kots-release-install/cluster-config.yaml
260+
251261
replicated release create --yaml-dir e2e/kots-release-install --promote CI --version "appver-${SHORT_SHA}"
252262
replicated release create --yaml-dir e2e/kots-release-install --promote CI --version "appver-${SHORT_SHA}-noop"
253263
replicated release create --yaml-dir e2e/kots-release-upgrade --promote CI --version "appver-${SHORT_SHA}-upgrade"
@@ -260,12 +270,14 @@ jobs:
260270
run: |
261271
export SHORT_SHA=dev-${GITHUB_SHA::7}
262272
echo "${SHORT_SHA}"
263-
replicated release create --yaml-dir e2e/kots-release-install --promote CI-airgap --version "appver-${SHORT_SHA}"
264273
265274
# airgap tests install the previous k0s version to ensure an upgrade occurs
266275
sed -i "s/${SHORT_SHA}/${SHORT_SHA}-previous-k0s/g" e2e/kots-release-install/cluster-config.yaml
267-
268276
replicated release create --yaml-dir e2e/kots-release-install --promote CI-airgap --version "appver-${SHORT_SHA}-previous-k0s"
277+
# return the cluster config to the current version
278+
sed -i "s/${SHORT_SHA}-previous-k0s/${SHORT_SHA}/g" e2e/kots-release-install/cluster-config.yaml
279+
280+
replicated release create --yaml-dir e2e/kots-release-install --promote CI-airgap --version "appver-${SHORT_SHA}"
269281
replicated release create --yaml-dir e2e/kots-release-upgrade --promote CI-airgap --version "appver-${SHORT_SHA}-upgrade"
270282
271283
- name: Create download link message text
@@ -316,6 +328,7 @@ jobs:
316328
- TestCommandsRequireSudo
317329
- TestInstallWithoutEmbed
318330
- TestInstallFromReplicatedApp
331+
- TestUpgradeFromReplicatedApp
319332
- TestResetAndReinstall
320333
- TestResetAndReinstallAirgap
321334
- TestCollectSupportBundle
@@ -367,6 +380,7 @@ jobs:
367380
license: ${{ secrets.STAGING_EMBEDDED_CLUSTER_LICENSE }}
368381
dr-aws-access-key-id: ${{ secrets.TESTIM_AWS_ACCESS_KEY_ID }}
369382
dr-aws-secret-access-key: ${{ secrets.TESTIM_AWS_SECRET_ACCESS_KEY }}
383+
k0s-version: ${{ steps.build.outputs.k0s_version }}
370384

371385
# this job will validate that all the tests passed
372386
# it is used for the github branch protection rule

e2e/install_test.go

Lines changed: 83 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func TestSingleNodeInstallation(t *testing.T) {
4848
}
4949

5050
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
51-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
51+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
5252
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
5353
t.Fatalf("fail to check postupgrade state: %v", err)
5454
}
@@ -104,7 +104,7 @@ func TestSingleNodeInstallationAlmaLinux8(t *testing.T) {
104104
}
105105

106106
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
107-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
107+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
108108
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
109109
t.Fatalf("fail to check postupgrade state: %v", err)
110110
}
@@ -164,7 +164,7 @@ func TestSingleNodeInstallationDebian12(t *testing.T) {
164164
}
165165

166166
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
167-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
167+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
168168
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
169169
t.Fatalf("fail to check postupgrade state: %v", err)
170170
}
@@ -224,7 +224,7 @@ func TestSingleNodeInstallationDebian11(t *testing.T) {
224224
}
225225

226226
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
227-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
227+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
228228
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
229229
t.Fatalf("fail to check postupgrade state: %v", err)
230230
}
@@ -280,7 +280,7 @@ func TestSingleNodeInstallationCentos9Stream(t *testing.T) {
280280
}
281281

282282
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
283-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
283+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
284284
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
285285
t.Fatalf("fail to check postupgrade state: %v", err)
286286
}
@@ -499,7 +499,61 @@ func TestInstallFromReplicatedApp(t *testing.T) {
499499
}
500500

501501
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
502-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
502+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
503+
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
504+
t.Fatalf("fail to check postupgrade state: %v", err)
505+
}
506+
507+
t.Logf("%s: test complete", time.Now().Format(time.RFC3339))
508+
}
509+
510+
func TestUpgradeFromReplicatedApp(t *testing.T) {
511+
t.Parallel()
512+
513+
RequireEnvVars(t, []string{"SHORT_SHA"})
514+
515+
tc := cluster.NewTestCluster(&cluster.Input{
516+
T: t,
517+
Nodes: 1,
518+
Image: "debian/12",
519+
})
520+
defer cleanupCluster(t, tc)
521+
522+
t.Logf("%s: downloading embedded-cluster on node 0", time.Now().Format(time.RFC3339))
523+
line := []string{"vandoor-prepare.sh", fmt.Sprintf("%s-previous-k0s", os.Getenv("SHORT_SHA")), os.Getenv("LICENSE_ID"), "false"}
524+
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
525+
t.Fatalf("fail to download embedded-cluster on node 0 %s: %v", tc.Nodes[0], err)
526+
}
527+
528+
t.Logf("%s: installing embedded-cluster on node 0", time.Now().Format(time.RFC3339))
529+
line = []string{"single-node-install.sh", "ui"}
530+
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
531+
t.Fatalf("fail to install embedded-cluster on node %s: %v", tc.Nodes[0], err)
532+
}
533+
534+
if err := setupPlaywright(t, tc); err != nil {
535+
t.Fatalf("fail to setup playwright: %v", err)
536+
}
537+
if _, _, err := runPlaywrightTest(t, tc, "deploy-app"); err != nil {
538+
t.Fatalf("fail to run playwright test deploy-app: %v", err)
539+
}
540+
541+
t.Logf("%s: checking installation state", time.Now().Format(time.RFC3339))
542+
line = []string{"check-installation-state.sh", fmt.Sprintf("%s-previous-k0s", os.Getenv("SHORT_SHA"))}
543+
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
544+
t.Fatalf("fail to check installation state: %v", err)
545+
}
546+
547+
appUpgradeVersion := fmt.Sprintf("appver-%s-upgrade", os.Getenv("SHORT_SHA"))
548+
testArgs := []string{appUpgradeVersion}
549+
550+
t.Logf("%s: upgrading cluster", time.Now().Format(time.RFC3339))
551+
if _, _, err := runPlaywrightTest(t, tc, "deploy-upgrade", testArgs...); err != nil {
552+
t.Fatalf("fail to run playwright test deploy-app: %v", err)
553+
}
554+
555+
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
556+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
503557
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
504558
t.Fatalf("fail to check postupgrade state: %v", err)
505559
}
@@ -653,7 +707,7 @@ func TestOldVersionUpgrade(t *testing.T) {
653707
}
654708

655709
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
656-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
710+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
657711
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
658712
t.Fatalf("fail to check postupgrade state: %v", err)
659713
}
@@ -763,7 +817,7 @@ func TestSingleNodeAirgapUpgrade(t *testing.T) {
763817
}
764818

765819
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
766-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
820+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
767821
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
768822
t.Fatalf("fail to check postupgrade state: %v", err)
769823
}
@@ -875,7 +929,7 @@ func TestSingleNodeAirgapUpgradeCustomCIDR(t *testing.T) {
875929
}
876930

877931
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
878-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
932+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
879933
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
880934
t.Fatalf("fail to check postupgrade state: %v", err)
881935
}
@@ -1055,7 +1109,7 @@ func TestMultiNodeAirgapUpgradeSameK0s(t *testing.T) {
10551109
}
10561110

10571111
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
1058-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
1112+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
10591113
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
10601114
t.Fatalf("fail to check postupgrade state: %v", err)
10611115
}
@@ -1219,7 +1273,7 @@ func TestMultiNodeAirgapUpgrade(t *testing.T) {
12191273
}
12201274

12211275
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
1222-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
1276+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
12231277
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
12241278
t.Fatalf("fail to check postupgrade state: %v", err)
12251279
}
@@ -1334,7 +1388,7 @@ func TestMultiNodeHAInstallation(t *testing.T) {
13341388
}
13351389

13361390
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
1337-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
1391+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
13381392
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
13391393
t.Fatalf("fail to check postupgrade state: %v", err)
13401394
}
@@ -1546,7 +1600,7 @@ func TestMultiNodeAirgapHAInstallation(t *testing.T) {
15461600
}
15471601

15481602
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
1549-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
1603+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
15501604
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
15511605
t.Fatalf("fail to check postupgrade state: %v", err)
15521606
}
@@ -1606,7 +1660,7 @@ func TestInstallSnapshotFromReplicatedApp(t *testing.T) {
16061660
}
16071661

16081662
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
1609-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
1663+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
16101664
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
16111665
t.Fatalf("fail to check postupgrade state: %v", err)
16121666
}
@@ -1865,12 +1919,12 @@ func generateAndCopySupportBundle(t *testing.T, tc *cluster.Output) {
18651919
if stdout, stderr, err := RunCommandOnNode(t, tc, 0, line); err != nil {
18661920
t.Logf("stdout: %s", stdout)
18671921
t.Logf("stderr: %s", stderr)
1868-
t.Errorf("fail to generate cluster support from node %s bundle: %v", node, err)
1869-
}
1870-
1871-
t.Logf("%s: copying cluster support bundle from node %s to local machine", time.Now().Format(time.RFC3339), node)
1872-
if err := cluster.CopyFileFromNode(node, "/root/cluster.tar.gz", "support-bundle-cluster.tar.gz"); err != nil {
1873-
t.Errorf("fail to copy cluster support bundle from node %s to local machine: %v", node, err)
1922+
t.Logf("fail to generate cluster support from node %s bundle: %v", node, err)
1923+
} else {
1924+
t.Logf("%s: copying cluster support bundle from node %s to local machine", time.Now().Format(time.RFC3339), node)
1925+
if err := cluster.CopyFileFromNode(node, "/root/cluster.tar.gz", "support-bundle-cluster.tar.gz"); err != nil {
1926+
t.Logf("fail to copy cluster support bundle from node %s to local machine: %v", node, err)
1927+
}
18741928
}
18751929

18761930
for i, node := range tc.Nodes {
@@ -1879,12 +1933,13 @@ func generateAndCopySupportBundle(t *testing.T, tc *cluster.Output) {
18791933
if stdout, stderr, err := RunCommandOnNode(t, tc, i, line); err != nil {
18801934
t.Logf("stdout: %s", stdout)
18811935
t.Logf("stderr: %s", stderr)
1882-
t.Errorf("fail to generate support from node %s bundle: %v", node, err)
1936+
t.Logf("fail to generate support from node %s bundle: %v", node, err)
1937+
continue
18831938
}
18841939

18851940
t.Logf("%s: copying host support bundle from node %s to local machine", time.Now().Format(time.RFC3339), node)
18861941
if err := cluster.CopyFileFromNode(node, "/root/host.tar.gz", fmt.Sprintf("support-bundle-host-%s.tar.gz", node)); err != nil {
1887-
t.Errorf("fail to copy host support bundle from node %s to local machine: %v", node, err)
1942+
t.Logf("fail to copy host support bundle from node %s to local machine: %v", node, err)
18881943
}
18891944
}
18901945
}
@@ -1894,29 +1949,27 @@ func copyPlaywrightReport(t *testing.T, tc *cluster.Output) {
18941949
if tc.Proxy != "" {
18951950
t.Logf("%s: compressing playwright report on proxy node", time.Now().Format(time.RFC3339))
18961951
if _, _, err := RunCommandOnProxyNode(t, tc, line); err != nil {
1897-
t.Errorf("fail to compress playwright report on node %s: %v", tc.Proxy, err)
1952+
t.Logf("fail to compress playwright report on node %s: %v", tc.Proxy, err)
18981953
return
18991954
}
19001955
t.Logf("%s: copying playwright report to local machine", time.Now().Format(time.RFC3339))
19011956
if err := cluster.CopyFileFromNode(tc.Proxy, "/root/playwright-report.tar.gz", "playwright-report.tar.gz"); err != nil {
1902-
t.Errorf("fail to copy playwright report to local machine: %v", err)
1957+
t.Logf("fail to copy playwright report to local machine: %v", err)
19031958
}
19041959
} else {
19051960
t.Logf("%s: compressing playwright report on node 0", time.Now().Format(time.RFC3339))
19061961
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
1907-
t.Errorf("fail to compress playwright report on node %s: %v", tc.Nodes[0], err)
1962+
t.Logf("fail to compress playwright report on node %s: %v", tc.Nodes[0], err)
19081963
return
19091964
}
19101965
t.Logf("%s: copying playwright report to local machine", time.Now().Format(time.RFC3339))
19111966
if err := cluster.CopyFileFromNode(tc.Nodes[0], "/root/playwright-report.tar.gz", "playwright-report.tar.gz"); err != nil {
1912-
t.Errorf("fail to copy playwright report to local machine: %v", err)
1967+
t.Logf("fail to copy playwright report to local machine: %v", err)
19131968
}
19141969
}
19151970
}
19161971

19171972
func cleanupCluster(t *testing.T, tc *cluster.Output) {
1918-
if t.Failed() {
1919-
generateAndCopySupportBundle(t, tc)
1920-
copyPlaywrightReport(t, tc)
1921-
}
1973+
generateAndCopySupportBundle(t, tc)
1974+
copyPlaywrightReport(t, tc)
19221975
}

e2e/restore_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ func TestSingleNodeAirgapDisasterRecovery(t *testing.T) {
390390
}
391391

392392
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
393-
line = []string{"check-postupgrade-state.sh"}
393+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
394394
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
395395
t.Fatalf("fail to check postupgrade state: %v", err)
396396
}
@@ -591,7 +591,7 @@ func TestMultiNodeHADisasterRecovery(t *testing.T) {
591591
}
592592

593593
t.Logf("%s: checking installation state after upgrade", time.Now().Format(time.RFC3339))
594-
line = []string{"check-postupgrade-state.sh", os.Getenv("SHORT_SHA")}
594+
line = []string{"check-postupgrade-state.sh", k8sVersion()}
595595
if _, _, err := RunCommandOnNode(t, tc, 0, line); err != nil {
596596
t.Fatalf("fail to check postupgrade state: %v", err)
597597
}

e2e/scripts/check-postupgrade-state.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ function check_nginx_version {
1212
}
1313

1414
main() {
15+
local k8s_version="$1"
16+
1517
echo "ensure that installation is installed"
1618
wait_for_installation
1719

@@ -102,6 +104,12 @@ main() {
102104
echo "no charts had an order of '110'"
103105
exit 1
104106
fi
107+
108+
echo "ensure that all nodes are running k8s $k8s_version"
109+
if ! ensure_nodes_match_kube_version "$k8s_version"; then
110+
echo "not all nodes are running k8s $k8s_version"
111+
exit 1
112+
fi
105113
}
106114

107115
export EMBEDDED_CLUSTER_METRICS_BASEURL="https://staging.replicated.app"

0 commit comments

Comments
 (0)