From 6253defb98dbbad96ae7b6006fdc46cf5c49cf59 Mon Sep 17 00:00:00 2001 From: Ivo Yankov Date: Fri, 27 Sep 2024 12:47:47 +0300 Subject: [PATCH] test: add node-upgrade e2e test CI Signed-off-by: Ivo Yankov --- .github/workflows/flow-build-application.yaml | 16 ++++ .../workflows/flow-pull-request-checks.yaml | 29 ++++--- .github/workflows/templates/config.yaml | 2 + .github/workflows/zxc-code-analysis.yaml | 31 ++++--- .github/workflows/zxc-env-vars.yaml | 8 ++ package.json | 1 + test/e2e/commands/node_upgrade.test.mjs | 85 +++++++++++++++++++ 7 files changed, 148 insertions(+), 24 deletions(-) create mode 100644 test/e2e/commands/node_upgrade.test.mjs diff --git a/.github/workflows/flow-build-application.yaml b/.github/workflows/flow-build-application.yaml index cad5ba428..ec479f30f 100644 --- a/.github/workflows/flow-build-application.yaml +++ b/.github/workflows/flow-build-application.yaml @@ -181,6 +181,19 @@ jobs: coverage-subdirectory: ${{ needs.env-vars.outputs.e2e-node-delete-test-subdir }} coverage-report-name: ${{ needs.env-vars.outputs.e2e-node-delete-coverage-report }} + e2e-node-upgrade-tests: + name: E2E Tests + if: ${{ github.event_name == 'push' || github.event.inputs.enable-e2e-tests == 'true' }} + uses: ./.github/workflows/zxc-e2e-test.yaml + needs: + - env-vars + - code-style + with: + custom-job-label: Node Upgrade + npm-test-script: test-${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} + coverage-subdirectory: ${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} + coverage-report-name: ${{ needs.env-vars.outputs.e2e-node-upgrade-coverage-report }} + e2e-relay-tests: name: E2E Tests if: ${{ github.event_name == 'push' || github.event.inputs.enable-e2e-tests == 'true' }} @@ -209,6 +222,7 @@ jobs: - e2e-node-add-separate-commands-tests - e2e-node-update-tests - e2e-node-delete-tests + - e2e-node-upgrade-tests - e2e-relay-tests if: ${{ (github.event_name == 'push' || github.event.inputs.enable-unit-tests == 'true' || github.event.inputs.enable-e2e-tests == 'true') && !failure() && !cancelled() }} with: @@ -226,6 +240,7 @@ jobs: e2e-node-add-separate-commands-test-subdir: ${{ needs.env-vars.outputs.e2e-node-add-separate-commands-test-subdir }} e2e-node-update-test-subdir: ${{ needs.env-vars.outputs.e2e-node-update-test-subdir }} e2e-node-delete-test-subdir: ${{ needs.env-vars.outputs.e2e-node-delete-test-subdir }} + e2e-node-upgrade-test-subdir: ${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} e2e-relay-test-subdir: ${{ needs.env-vars.outputs.e2e-relay-test-subdir }} e2e-standard-coverage-report: ${{ needs.env-vars.outputs.e2e-standard-coverage-report }} e2e-mirror-node-coverage-report: ${{ needs.env-vars.outputs.e2e-mirror-node-coverage-report }} @@ -236,6 +251,7 @@ jobs: e2e-node-add-separate-commands-coverage-report: ${{ needs.env-vars.outputs.e2e-node-add-separate-commands-coverage-report }} e2e-node-update-coverage-report: ${{ needs.env-vars.outputs.e2e-node-update-coverage-report }} e2e-node-delete-coverage-report: ${{ needs.env-vars.outputs.e2e-node-delete-coverage-report }} + e2e-node-upgrade-coverage-report: ${{ needs.env-vars.outputs.e2e-node-upgrade-coverage-report }} e2e-relay-coverage-report: ${{ needs.env-vars.outputs.e2e-relay-coverage-report }} secrets: snyk-token: ${{ secrets.SNYK_TOKEN }} diff --git a/.github/workflows/flow-pull-request-checks.yaml b/.github/workflows/flow-pull-request-checks.yaml index 9c4dd1edb..5fd16d5e1 100644 --- a/.github/workflows/flow-pull-request-checks.yaml +++ b/.github/workflows/flow-pull-request-checks.yaml @@ -52,16 +52,6 @@ jobs: with: custom-job-label: Standard - update-readme: - name: "Update README.md" - uses: ./.github/workflows/flow-update-readme.yaml - with: - commit-changes: false - secrets: - GH_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} - GH_ACCESS_GPG_KEY: ${{ secrets.GH_ACCESS_GPG_KEY }} - GH_ACCESS_PASSPHRASE: ${{ secrets.GH_ACCESS_PASSPHRASE }} - e2e-standard-tests: name: E2E Tests if: ${{ !cancelled() && always() }} @@ -179,6 +169,19 @@ jobs: coverage-subdirectory: ${{ needs.env-vars.outputs.e2e-node-delete-test-subdir }} coverage-report-name: ${{ needs.env-vars.outputs.e2e-node-delete-coverage-report }} + e2e-node-upgrade-tests: + name: E2E Tests + if: ${{ !cancelled() && always() }} + uses: ./.github/workflows/zxc-e2e-test.yaml + needs: + - env-vars + - code-style + with: + custom-job-label: Node Upgrade + npm-test-script: test-${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} + coverage-subdirectory: ${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} + coverage-report-name: ${{ needs.env-vars.outputs.e2e-node-upgrade-coverage-report }} + e2e-relay-tests: name: E2E Tests if: ${{ !cancelled() && always() }} @@ -207,6 +210,7 @@ jobs: - e2e-node-add-separate-commands-tests - e2e-node-update-tests - e2e-node-delete-tests + - e2e-node-upgrade-tests - e2e-relay-tests if: ${{ github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }} with: @@ -222,6 +226,7 @@ jobs: e2e-node-add-separate-commands-test-subdir: ${{ needs.env-vars.outputs.e2e-node-add-separate-commands-test-subdir }} e2e-node-update-test-subdir: ${{ needs.env-vars.outputs.e2e-node-update-test-subdir }} e2e-node-delete-test-subdir: ${{ needs.env-vars.outputs.e2e-node-delete-test-subdir }} + e2e-node-upgrade-test-subdir: ${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} e2e-relay-test-subdir: ${{ needs.env-vars.outputs.e2e-relay-test-subdir }} e2e-standard-coverage-report: ${{ needs.env-vars.outputs.e2e-standard-coverage-report }} e2e-mirror-node-coverage-report: ${{ needs.env-vars.outputs.e2e-mirror-node-coverage-report }} @@ -232,6 +237,7 @@ jobs: e2e-node-add-separate-commands-coverage-report: ${{ needs.env-vars.outputs.e2e-node-add-separate-commands-coverage-report }} e2e-node-update-coverage-report: ${{ needs.env-vars.outputs.e2e-node-update-coverage-report }} e2e-node-delete-coverage-report: ${{ needs.env-vars.outputs.e2e-node-delete-coverage-report }} + e2e-node-upgrade-coverage-report: ${{ needs.env-vars.outputs.e2e-node-upgrade-coverage-report }} e2e-relay-coverage-report: ${{ needs.env-vars.outputs.e2e-relay-coverage-report }} secrets: codecov-token: ${{ secrets.CODECOV_TOKEN }} @@ -251,6 +257,7 @@ jobs: - e2e-node-add-separate-commands-tests - e2e-node-update-tests - e2e-node-delete-tests + - e2e-node-upgrade-tests - e2e-relay-tests if: ${{ github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }} with: @@ -266,6 +273,7 @@ jobs: e2e-node-add-separate-commands-test-subdir: ${{ needs.env-vars.outputs.e2e-node-add-separate-commands-test-subdir }} e2e-node-update-test-subdir: ${{ needs.env-vars.outputs.e2e-node-update-test-subdir }} e2e-node-delete-test-subdir: ${{ needs.env-vars.outputs.e2e-node-delete-test-subdir }} + e2e-node-upgrade-test-subdir: ${{ needs.env-vars.outputs.e2e-node-upgrade-test-subdir }} e2e-relay-test-subdir: ${{ needs.env-vars.outputs.e2e-relay-test-subdir }} e2e-standard-coverage-report: ${{ needs.env-vars.outputs.e2e-standard-coverage-report }} e2e-mirror-node-coverage-report: ${{ needs.env-vars.outputs.e2e-mirror-node-coverage-report }} @@ -276,6 +284,7 @@ jobs: e2e-node-add-separate-commands-coverage-report: ${{ needs.env-vars.outputs.e2e-node-add-separate-commands-coverage-report }} e2e-node-update-coverage-report: ${{ needs.env-vars.outputs.e2e-node-update-coverage-report }} e2e-node-delete-coverage-report: ${{ needs.env-vars.outputs.e2e-node-delete-coverage-report }} + e2e-node-upgrade-coverage-report: ${{ needs.env-vars.outputs.e2e-node-upgrade-coverage-report }} e2e-relay-coverage-report: ${{ needs.env-vars.outputs.e2e-relay-coverage-report }} secrets: codacy-project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} diff --git a/.github/workflows/templates/config.yaml b/.github/workflows/templates/config.yaml index f987ce09f..1ea0a4c15 100644 --- a/.github/workflows/templates/config.yaml +++ b/.github/workflows/templates/config.yaml @@ -21,5 +21,7 @@ tests: jestPostfix: --testRegex=\".*\\/e2e\\/commands\\/node_update.*\\.test\\.mjs\" - name: Node Delete jestPostfix: --testRegex=\".*\\/e2e\\/commands\\/node_delete.*\\.test\\.mjs\" + - name: Node Upgrade + jestPostfix: --testRegex=\".*\\/e2e\\/commands\\/node_upgrade.*\\.test\\.mjs\" - name: Relay jestPostfix: --testRegex=\".*\\/e2e\\/commands\\/relay\\.test\\.mjs\" diff --git a/.github/workflows/zxc-code-analysis.yaml b/.github/workflows/zxc-code-analysis.yaml index a67243de0..53114dea9 100644 --- a/.github/workflows/zxc-code-analysis.yaml +++ b/.github/workflows/zxc-code-analysis.yaml @@ -100,6 +100,11 @@ on: type: string required: false default: "e2e-node-delete" + e2e-node-upgrade-test-subdir: + description: "E2E Node Upgrade Test Subdirectory:" + type: string + required: false + default: "e2e-node-upgrade" e2e-relay-test-subdir: description: "E2E Relay Test Subdirectory:" type: string @@ -150,6 +155,11 @@ on: type: string required: false default: "E2E Node Delete Tests Coverage Report" + e2e-node-upgrade-coverage-report: + description: "E2E Node Upgrade Coverage Report:" + type: string + required: false + default: "E2E Node Upgrade Tests Coverage Report" e2e-relay-coverage-report: description: "E2E Relay Coverage Report:" type: string @@ -183,7 +193,7 @@ jobs: runs-on: solo-linux-medium steps: - name: Checkout Code - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.workflow_run.head_branch }} fetch-depth: ${{ inputs.enable-sonar-analysis && '0' || '' }} @@ -268,26 +278,19 @@ jobs: name: ${{ inputs.e2e-node-delete-coverage-report }} path: 'coverage/${{ inputs.e2e-node-delete-test-subdir }}' - - name: Download E2E Relay Coverage Report + - name: Download E2E Node Upgrade Coverage Report uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 if: ${{ (inputs.enable-codecov-analysis || inputs.enable-codacy-coverage) && inputs.enable-e2e-coverage-report && !cancelled() && !failure() }} with: - name: ${{ inputs.e2e-relay-coverage-report }} - path: 'coverage/${{ inputs.e2e-relay-test-subdir }}' + name: ${{ inputs.e2e-node-upgrade-coverage-report }} + path: 'coverage/${{ inputs.e2e-node-upgrade-test-subdir }}' - - name: Download E2E Test Report + - name: Download E2E Relay Coverage Report uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 if: ${{ (inputs.enable-codecov-analysis || inputs.enable-codacy-coverage) && inputs.enable-e2e-coverage-report && !cancelled() && !failure() }} with: - pattern: "e2e_test_report_*" - path: "e2e_test_report" - - - name: Publish E2E Test Report - uses: EnricoMi/publish-unit-test-result-action@82082dac68ad6a19d980f8ce817e108b9f496c2a # v2.17.1 - if: ${{ (inputs.enable-codecov-analysis || inputs.enable-codacy-coverage) && inputs.enable-e2e-coverage-report && !cancelled() && !failure() }} - with: - check_name: "E2E Test Report" - files: "e2e_test_report/**/*.xml" + name: ${{ inputs.e2e-relay-coverage-report }} + path: 'coverage/${{ inputs.e2e-relay-test-subdir }}' - name: Publish To Codecov uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 diff --git a/.github/workflows/zxc-env-vars.yaml b/.github/workflows/zxc-env-vars.yaml index ebdadef17..f89a3cb4e 100644 --- a/.github/workflows/zxc-env-vars.yaml +++ b/.github/workflows/zxc-env-vars.yaml @@ -53,6 +53,9 @@ on: e2e-node-delete-test-subdir: description: "E2E Node Delete Test Subdirectory" value: ${{ jobs.env-vars.outputs.e2e_node_delete_test_subdir }} + e2e-node-upgrade-test-subdir: + description: "E2E Node Upgrade Test Subdirectory" + value: ${{ jobs.env-vars.outputs.e2e_node_upgrade_test_subdir }} e2e-relay-test-subdir: description: "E2E Relay Test Subdirectory" value: ${{ jobs.env-vars.outputs.e2e_relay_test_subdir }} @@ -83,6 +86,9 @@ on: e2e-node-delete-coverage-report: description: "E2E Node Delete Tests Coverage Report" value: ${{ jobs.env-vars.outputs.e2e_node_delete_coverage_report }} + e2e-node-upgrade-coverage-report: + description: "E2E Node Upgrade Tests Coverage Report" + value: ${{ jobs.env-vars.outputs.e2e_node_upgrade_coverage_report }} e2e-relay-coverage-report: description: "E2E Relay Tests Coverage Report" value: ${{ jobs.env-vars.outputs.e2e_relay_coverage_report }} @@ -105,6 +111,7 @@ jobs: e2e_node_add_separate_commands_test_subdir: e2e-node-add-separate-commands e2e_node_update_test_subdir: e2e-node-update e2e_node_delete_test_subdir: e2e-node-delete + e2e_node_upgrade_test_subdir: e2e-node-upgrade e2e_relay_test_subdir: e2e-relay e2e_standard_coverage_report: "E2E Standard Tests Coverage Report" e2e_mirror_node_coverage_report: "E2E Mirror Node Tests Coverage Report" @@ -115,6 +122,7 @@ jobs: e2e_node_add_separate_commands_coverage_report: "E2E Node Add - Separate commands Tests Coverage Report" e2e_node_update_coverage_report: "E2E Node Update Tests Coverage Report" e2e_node_delete_coverage_report: "E2E Node Delete Tests Coverage Report" + e2e_node_upgrade_coverage_report: "E2E Node Upgrade Tests Coverage Report" e2e_relay_coverage_report: "E2E Relay Tests Coverage Report" steps: - run: echo "Exposing environment variables to reusable workflows" diff --git a/package.json b/package.json index 8a97a92da..21fe8b003 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "test-e2e-node-add-separate-commands": "NODE_OPTIONS=--experimental-vm-modules JEST_SUITE_NAME='Jest E2E Node Add - Separate commands Tests' JEST_JUNIT_OUTPUT_NAME='junit-e2e-node-add-separate-commands.xml' jest --runInBand --detectOpenHandles --forceExit --coverage --coverageDirectory='coverage/e2e-node-add-separate-commands' --testRegex=\".*\\/e2e\\/commands\\/separate_node_add.*\\.test\\.mjs\"", "test-e2e-node-update": "NODE_OPTIONS=--experimental-vm-modules JEST_SUITE_NAME='Jest E2E Node Update Tests' JEST_JUNIT_OUTPUT_NAME='junit-e2e-node-update.xml' jest --runInBand --detectOpenHandles --forceExit --coverage --coverageDirectory='coverage/e2e-node-update' --testRegex=\".*\\/e2e\\/commands\\/node_update.*\\.test\\.mjs\"", "test-e2e-node-delete": "NODE_OPTIONS=--experimental-vm-modules JEST_SUITE_NAME='Jest E2E Node Delete Tests' JEST_JUNIT_OUTPUT_NAME='junit-e2e-node-delete.xml' jest --runInBand --detectOpenHandles --forceExit --coverage --coverageDirectory='coverage/e2e-node-delete' --testRegex=\".*\\/e2e\\/commands\\/node_delete.*\\.test\\.mjs\"", + "test-e2e-node-upgrade": "NODE_OPTIONS=--experimental-vm-modules JEST_SUITE_NAME='Jest E2E Node Upgrade Tests' JEST_JUNIT_OUTPUT_NAME='junit-e2e-node-upgrade.xml' jest --runInBand --detectOpenHandles --forceExit --coverage --coverageDirectory='coverage/e2e-node-upgrade' --testRegex=\".*\\/e2e\\/commands\\/node_upgrade.*\\.test\\.mjs\"", "test-e2e-relay": "NODE_OPTIONS=--experimental-vm-modules JEST_SUITE_NAME='Jest E2E Relay Tests' JEST_JUNIT_OUTPUT_NAME='junit-e2e-relay.xml' jest --runInBand --detectOpenHandles --forceExit --coverage --coverageDirectory='coverage/e2e-relay' --testRegex=\".*\\/e2e\\/commands\\/relay\\.test\\.mjs\"", "merge-clean": "rm -rf .nyc_output && mkdir .nyc_output && rm -rf coverage/lcov-report && rm -rf coverage/solo && rm coverage/*.*", "merge-e2e": "nyc merge ./coverage/e2e/ .nyc_output/coverage.json", diff --git a/test/e2e/commands/node_upgrade.test.mjs b/test/e2e/commands/node_upgrade.test.mjs new file mode 100644 index 000000000..5a9bab2c7 --- /dev/null +++ b/test/e2e/commands/node_upgrade.test.mjs @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2024 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the ""License""); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an ""AS IS"" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @jest-environment steps + */ +import { afterAll, describe, expect, it } from '@jest/globals' +import { flags } from '../../../src/commands/index.mjs' +import { + accountCreationShouldSucceed, + balanceQueryShouldSucceed, + bootstrapNetwork, + getDefaultArgv, + HEDERA_PLATFORM_VERSION_TAG +} from '../../test_util.js' +import { getNodeLogs, getTmpDir } from '../../../src/core/helpers.mjs' +import { NodeCommand } from '../../../src/commands/node.mjs' +import { HEDERA_HAPI_PATH, ROOT_CONTAINER } from '../../../src/core/constants.mjs' +import fs from 'fs' + +describe('Node upgrade', () => { + const namespace = 'node-upgrade' + const argv = getDefaultArgv() + argv[flags.nodeIDs.name] = 'node1,node2,node3' + argv[flags.generateGossipKeys.name] = true + argv[flags.generateTlsKeys.name] = true + argv[flags.persistentVolumeClaims.name] = true + // set the env variable SOLO_FST_CHARTS_DIR if developer wants to use local FST charts + argv[flags.chartDirectory.name] = process.env.SOLO_FST_CHARTS_DIR ? process.env.SOLO_FST_CHARTS_DIR : undefined + argv[flags.releaseTag.name] = HEDERA_PLATFORM_VERSION_TAG + argv[flags.namespace.name] = namespace + const bootstrapResp = bootstrapNetwork(namespace, argv) + const nodeCmd = bootstrapResp.cmd.nodeCmd + const accountCmd = bootstrapResp.cmd.accountCmd + const k8 = bootstrapResp.opts.k8 + + afterAll(async () => { + await getNodeLogs(k8, namespace) + await k8.deleteNamespace(namespace) + }, 600000) + + it('should succeed with init command', async () => { + const status = await accountCmd.init(argv) + expect(status).toBeTruthy() + }, 450000) + + it('should upgrade all nodes on the network successfully', async () => { + await nodeCmd.prepareUpgrade() + await nodeCmd.downloadGeneratedFiles() + await nodeCmd.freezeUpgrade() + + expect(nodeCmd.getUnusedConfigs(NodeCommand.DELETE_CONFIGS_NAME)).toEqual([ + flags.app.constName, + flags.devMode.constName, + flags.endpointType.constName + ]) + + await nodeCmd.accountManager.close() + }, 600000) + + balanceQueryShouldSucceed(nodeCmd.accountManager, nodeCmd, namespace) + + accountCreationShouldSucceed(nodeCmd.accountManager, nodeCmd, namespace) + + it('config.txt should no longer contain removed nodeid', async () => { + // read config.txt file from first node, read config.txt line by line, it should not contain value of nodeId + const pods = await k8.getPodsByLabel(['fullstack.hedera.com/type=network-node']) + const podName = pods[0].metadata.name + const tmpDir = getTmpDir() + await k8.copyFrom(podName, ROOT_CONTAINER, `${HEDERA_HAPI_PATH}/config.txt`, tmpDir) + const configTxt = fs.readFileSync(`${tmpDir}/config.txt`, 'utf8') + console.log('config.txt:', configTxt) + }, 600000) +})