From c36a4668b6d1277f697d510a287024fdb4e0e3ad Mon Sep 17 00:00:00 2001 From: Marcial Rosales Date: Wed, 28 May 2025 13:01:46 +0200 Subject: [PATCH] Relocate temp folder from /tmp to /var (cherry picked from commit 94cba43e75095d56d193bd20c10910ead1031d50) --- .github/workflows/test-authnz.yaml | 18 +++---- .../workflows/test-management-ui-for-pr.yaml | 13 ++--- .github/workflows/test-management-ui.yaml | 13 ++--- selenium/bin/suite_template | 47 +++++++++++++------ selenium/run-suites.sh | 1 + .../amqp10/sessions-for-monitoring-user.js | 4 +- selenium/test/exchanges/management.js | 4 +- selenium/test/queuesAndStreams/list.js | 4 +- .../queuesAndStreams/view-qq-consumers.js | 20 ++++---- selenium/test/utils.js | 6 +-- selenium/test/vhosts/admin-vhosts.js | 8 ++-- 11 files changed, 76 insertions(+), 62 deletions(-) diff --git a/.github/workflows/test-authnz.yaml b/.github/workflows/test-authnz.yaml index 654dc0142292..6b1ec4f02c14 100644 --- a/.github/workflows/test-authnz.yaml +++ b/.github/workflows/test-authnz.yaml @@ -72,22 +72,22 @@ jobs: docker build -t mocha-test --target test . - name: Run Suites - run: | + id: run-suites + run: | IMAGE_TAG=$(find PACKAGES/rabbitmq-server-generic-unix-*.tar.xz | awk -F 'PACKAGES/rabbitmq-server-generic-unix-|.tar.xz' '{print $2}') - RABBITMQ_DOCKER_IMAGE=pivotalrabbitmq/rabbitmq:$IMAGE_TAG \ - ${SELENIUM_DIR}/run-suites.sh full-suite-authnz-messaging - mkdir -p /tmp/full-suite-authnz-messaging - mv /tmp/selenium/* /tmp/full-suite-authnz-messaging + CONF_DIR_PREFIX="$(mktemp -d)" RABBITMQ_DOCKER_IMAGE=pivotalrabbitmq/rabbitmq:$IMAGE_TAG \ + ${SELENIUM_DIR}/run-suites.sh full-suite-authnz-messaging + echo "SELENIUM_ARTIFACTS=$CONF_DIR_PREFIX" >> "$GITHUB_OUTPUT" - name: Upload Test Artifacts if: always() uses: actions/upload-artifact@v4.3.2 + env: + SELENIUM_ARTIFACTS: ${{ steps.run-suites.outputs.SELENIUM_ARTIFACTS }} with: - name: test-artifacts-${{ matrix.browser }}-${{ matrix.erlang_version }} + name: test-artifacts-${{ matrix.browser }}-${{ matrix.erlang_version }} path: | - logs/* - screens/* - /tmp/selenium/* + $SELENIUM_ARTIFACTS/* summary-selenium: needs: diff --git a/.github/workflows/test-management-ui-for-pr.yaml b/.github/workflows/test-management-ui-for-pr.yaml index 6dd56cd212ca..e5fb4ecb06ae 100644 --- a/.github/workflows/test-management-ui-for-pr.yaml +++ b/.github/workflows/test-management-ui-for-pr.yaml @@ -59,19 +59,16 @@ jobs: - name: Run short UI suites on a standalone rabbitmq server run: | IMAGE_TAG=$(find PACKAGES/rabbitmq-server-generic-unix-*.tar.xz | awk -F 'PACKAGES/rabbitmq-server-generic-unix-|.tar.xz' '{print $2}') - RABBITMQ_DOCKER_IMAGE=pivotalrabbitmq/rabbitmq:$IMAGE_TAG \ + CONF_DIR_PREFIX="$(mktemp -d)" RABBITMQ_DOCKER_IMAGE=pivotalrabbitmq/rabbitmq:$IMAGE_TAG \ ${SELENIUM_DIR}/run-suites.sh short-suite-management-ui - - - name: Prepare logs for upload - if: ${{ failure() && steps.tests.outcome == 'failed' }} - run: | - mkdir -p /tmp/short-suite - mv /tmp/selenium/* /tmp/short-suite + echo "SELENIUM_ARTIFACTS=$CONF_DIR_PREFIX" >> "$GITHUB_OUTPUT" - name: Upload Test Artifacts if: ${{ failure() && steps.tests.outcome == 'failed' }} uses: actions/upload-artifact@v4 + env: + SELENIUM_ARTIFACTS: ${{ steps.run-suites.outputs.SELENIUM_ARTIFACTS }} with: name: test-artifacts-${{ matrix.browser }}-${{ matrix.erlang_version }} path: | - /tmp/short-suite + $SELENIUM_ARTIFACTS/* diff --git a/.github/workflows/test-management-ui.yaml b/.github/workflows/test-management-ui.yaml index 4ab58cb763b5..8a0b9cdc57ff 100644 --- a/.github/workflows/test-management-ui.yaml +++ b/.github/workflows/test-management-ui.yaml @@ -67,19 +67,16 @@ jobs: id: tests run: | IMAGE_TAG=$(find PACKAGES/rabbitmq-server-generic-unix-*.tar.xz | awk -F 'PACKAGES/rabbitmq-server-generic-unix-|.tar.xz' '{print $2}') - RABBITMQ_DOCKER_IMAGE=pivotalrabbitmq/rabbitmq:$IMAGE_TAG \ + CONF_DIR_PREFIX="$(mktemp -d)" RABBITMQ_DOCKER_IMAGE=pivotalrabbitmq/rabbitmq:$IMAGE_TAG \ ${SELENIUM_DIR}/run-suites.sh full-suite-management-ui - - - name: Prepare logs for upload - if: ${{ failure() && steps.tests.outcome == 'failed' }} - run: | - mkdir -p /tmp/full-suite - mv -v /tmp/selenium/* /tmp/full-suite + echo "SELENIUM_ARTIFACTS=$CONF_DIR_PREFIX" >> "$GITHUB_OUTPUT" - name: Upload Test Artifacts if: ${{ failure() && steps.tests.outcome == 'failed' }} uses: actions/upload-artifact@v4.3.2 + env: + SELENIUM_ARTIFACTS: ${{ steps.run-suites.outputs.SELENIUM_ARTIFACTS }} with: name: test-artifacts-${{ matrix.browser }}-${{ matrix.erlang_version }} path: | - /tmp/full-suite + $SELENIUM_ARTIFACTS/* diff --git a/selenium/bin/suite_template b/selenium/bin/suite_template index e9f986e85879..3d46d26ee499 100644 --- a/selenium/bin/suite_template +++ b/selenium/bin/suite_template @@ -30,8 +30,12 @@ find_selenium_dir() { SELENIUM_ROOT_FOLDER=$(find_selenium_dir $SCRIPT) TEST_DIR=$SELENIUM_ROOT_FOLDER/test BIN_DIR=$SELENIUM_ROOT_FOLDER/bin -SCREENS=${SELENIUM_ROOT_FOLDER}/screens/${SUITE} -CONF_DIR=${CONF_DIR_PREFIX:-/tmp}/selenium/${SUITE} +if [[ -z "${CONF_DIR_PREFIX}" ]]; then + CONF_DIR_PREFIX=$(mktemp -d) +fi +CONF_DIR=${CONF_DIR_PREFIX}/selenium/${SUITE} +SCREENS=${CONF_DIR}/screens + LOGS=${CONF_DIR}/logs ENV_FILE=$CONF_DIR/.env OTHER_ENV_FILE=$CONF_DIR/.other.env @@ -116,6 +120,8 @@ init_suite() { begin "Initializing suite $SUITE ..." print "> REQUIRED_COMPONENTS: ${REQUIRED_COMPONENTS[*]}" + print "> CONF_DIR_PREFIX: ${CONF_DIR_PREFIX} " + print "> CONF_DIR: ${CONF_DIR} " print "> TEST_CASES_DIR: ${TEST_CASES_DIR} " print "> TEST_CONFIG_DIR: ${TEST_CONFIG_DIR} " print "> DOCKER_NETWORK: ${DOCKER_NETWORK} " @@ -128,8 +134,8 @@ init_suite() { print "> COMMAND: ${COMMAND}" end "Initialized suite" - mkdir -p ${LOGS}/${SUITE} - mkdir -p ${SCREENS}/${SUITE} + mkdir -p ${LOGS} + mkdir -p ${SCREENS} } build_mocha_image() { @@ -356,8 +362,15 @@ _test() { mocha_test_tag=($(md5sum $SELENIUM_ROOT_FOLDER/package.json)) generate_node_extra_ca_cert - MOUNT_NODE_EXTRA_CA_CERTS=${CONF_DIR}/node_ca_certs.pem - print "> MOUNT_NODE_EXTRA_CA_CERTS: ${MOUNT_NODE_EXTRA_CA_CERTS}" + MOUNT_NODE_EXTRA_CA_CERTS=${CONF_DIR}/node + + EXTRA_ENV_VARS="" + EXTRA_MOUNTS="" + if [[ -f ${MOUNT_NODE_EXTRA_CA_CERTS}/node_ca_certs.pem ]]; then + print "> MOUNT_NODE_EXTRA_CA_CERTS: ${MOUNT_NODE_EXTRA_CA_CERTS}" + EXTRA_ENV_VARS="${EXTRA_ENV_VARS} --env NODE_EXTRA_CA_CERTS=/nodejs/node_ca_certs.pem " + EXTRA_MOUNTS="${EXTRA_MOUNTS} -v ${MOUNT_NODE_EXTRA_CA_CERTS}:/nodejs " + fi docker run \ --rm \ @@ -373,12 +386,12 @@ _test() { --env PROFILES="${PROFILES}" \ --env ENV_FILE="/code/.env" \ --env RABBITMQ_CERTS=/etc/rabbitmq/certs \ - --env NODE_EXTRA_CA_CERTS=/nodejs/ca.pem \ - -v ${MOUNT_NODE_EXTRA_CA_CERTS}:/nodejs/ca.pem \ + ${EXTRA_ENV_VARS} \ -v ${TEST_DIR}:/code/test \ -v ${TEST_CONFIG_DIR}/certs:/etc/rabbitmq/certs \ -v ${SCREENS}:/screens \ -v ${ENV_FILE}:/code/.env \ + ${EXTRA_MOUNTS} \ mocha-test:${mocha_test_tag} test /code/test${TEST_CASES_PATH} TEST_RESULT=$? @@ -674,7 +687,7 @@ test_local() { export SELENIUM_POLLING=${SELENIUM_POLLING:-500} generate_node_extra_ca_cert - MOUNT_NODE_EXTRA_CA_CERTS=${CONF_DIR}/node_ca_certs.pem + MOUNT_NODE_EXTRA_CA_CERTS=${CONF_DIR}/node/node_ca_certs.pem print "> SELENIUM_TIMEOUT: ${SELENIUM_TIMEOUT}" print "> SELENIUM_POLLING: ${SELENIUM_POLLING}" @@ -738,16 +751,22 @@ save_components_logs() { end "Finished saving logs" } generate_node_extra_ca_cert() { - echo "Generating ${CONF_DIR}/node_ca_certs.pem ..." - rm -f ${CONF_DIR}/node_ca_certs.pem + begin "Generating ${CONF_DIR}/node/node_ca_certs.pem ..." + mkdir -p ${CONF_DIR}/node + rm -f ${CONF_DIR}/node/node_ca_certs.pem env | while IFS= read -r line; do value=${line#*=} name=${line%%=*} if [[ $name == *NODE_EXTRA_CA_CERTS ]] then - echo "Adding ${TEST_DIR}/${value} to ${CONF_DIR}/node_ca_certs.pem ..." - cat ${TEST_DIR}/${value} >> ${CONF_DIR}/node_ca_certs.pem + print "Adding ${TEST_DIR}/${value} to ${CONF_DIR}/node/node_ca_certs.pem ..." + cat ${TEST_DIR}/${value} >> ${CONF_DIR}/node/node_ca_certs.pem fi - done + done + if [[ -f ${CONF_DIR}/node/node_ca_certs.pem ]]; then + end "Generated ${CONF_DIR}/node/node_ca_certs.pem" + else + end "Did not generate ${CONF_DIR}/node/node_ca_certs.pem" + fi } \ No newline at end of file diff --git a/selenium/run-suites.sh b/selenium/run-suites.sh index b1d16a519578..7096b3e2ebdf 100755 --- a/selenium/run-suites.sh +++ b/selenium/run-suites.sh @@ -17,6 +17,7 @@ while read SUITE do echo -e "=== Running suite (${TOTAL_SUITES}/${GREEN}${#SUCCESSFUL_SUITES[@]}/${RED}${#FAILED_SUITES[@]}${NC}) $SUITE ============================================" echo " " + ENV_MODES="docker" $SCRIPT/suites/$SUITE TEST_RESULT="$?" TEST_STATUS="${GREEN}Succeeded${NC}" diff --git a/selenium/test/connections/amqp10/sessions-for-monitoring-user.js b/selenium/test/connections/amqp10/sessions-for-monitoring-user.js index 0e6c7865437a..9e2b005a25fd 100644 --- a/selenium/test/connections/amqp10/sessions-for-monitoring-user.js +++ b/selenium/test/connections/amqp10/sessions-for-monitoring-user.js @@ -2,7 +2,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver') require('chromedriver') const assert = require('assert') const { open: openAmqp, once: onceAmqp, on: onAmqp, close: closeAmqp } = require('../../amqp') -const { buildDriver, goToHome, captureScreensFor, teardown, delay, doWhile } = require('../../utils') +const { buildDriver, goToHome, captureScreensFor, teardown, delay, doUntil } = require('../../utils') const LoginPage = require('../../pageobjects/LoginPage') const OverviewPage = require('../../pageobjects/OverviewPage') @@ -98,7 +98,7 @@ describe('Given an amqp10 connection opened, listed and clicked on it', function assert.equal(2, receivedAmqpMessageCount) await delay(5*1000) // wait until page refreshes - let sessions = await doWhile(function() { return connectionPage.getSessions() }, + let sessions = await doUntil(function() { return connectionPage.getSessions() }, function(obj) { return obj != undefined }) let incomingLink = connectionPage.getIncomingLinkInfo(sessions.incoming_links, 0) assert.equal(2, incomingLink.deliveryCount) diff --git a/selenium/test/exchanges/management.js b/selenium/test/exchanges/management.js index 1e7654aa353d..3ec754029320 100644 --- a/selenium/test/exchanges/management.js +++ b/selenium/test/exchanges/management.js @@ -1,7 +1,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver') require('chromedriver') const assert = require('assert') -const { buildDriver, goToHome, captureScreensFor, teardown, doWhile, log } = require('../utils') +const { buildDriver, goToHome, captureScreensFor, teardown, doUntil, log } = require('../utils') const LoginPage = require('../pageobjects/LoginPage') const OverviewPage = require('../pageobjects/OverviewPage') @@ -71,7 +71,7 @@ describe('Exchange management', function () { it('exchange selectable columns', async function () { await overview.clickOnOverviewTab() await overview.clickOnExchangesTab() - await doWhile(async function() { return exchanges.getExchangesTable() }, + await doUntil(async function() { return exchanges.getExchangesTable() }, function(table) { return table.length > 0 }) diff --git a/selenium/test/queuesAndStreams/list.js b/selenium/test/queuesAndStreams/list.js index fea710be18fc..8e7d357623f8 100644 --- a/selenium/test/queuesAndStreams/list.js +++ b/selenium/test/queuesAndStreams/list.js @@ -1,7 +1,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver') require('chromedriver') const assert = require('assert') -const { buildDriver, goToHome, captureScreensFor, teardown, doWhile } = require('../utils') +const { buildDriver, goToHome, captureScreensFor, teardown, doUntil } = require('../utils') const LoginPage = require('../pageobjects/LoginPage') const OverviewPage = require('../pageobjects/OverviewPage') @@ -49,7 +49,7 @@ describe('Queues and Streams management', function () { let queueName = "test_" + Math.floor(Math.random() * 1000) await queuesAndStreams.fillInAddNewQueue({"name" : queueName, "type" : "classic"}) - await doWhile(async function() { return queuesAndStreams.getQueuesTable() }, + await doUntil(async function() { return queuesAndStreams.getQueuesTable() }, function(table) { return table.length > 0 }) diff --git a/selenium/test/queuesAndStreams/view-qq-consumers.js b/selenium/test/queuesAndStreams/view-qq-consumers.js index 652d2d299ae7..fdb061da0b6d 100644 --- a/selenium/test/queuesAndStreams/view-qq-consumers.js +++ b/selenium/test/queuesAndStreams/view-qq-consumers.js @@ -1,7 +1,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver') require('chromedriver') const assert = require('assert') -const { buildDriver, goToHome, captureScreensFor, teardown, doWhile, goToQueue,delay } = require('../utils') +const { buildDriver, goToHome, captureScreensFor, teardown, doUntil, goToQueue,delay } = require('../utils') const { createQueue, deleteQueue, getManagementUrl, basicAuthorization } = require('../mgt-api') const { getAmqpUrl : getAmqpUrl } = require('../amqp') const amqplib = require('amqplib'); @@ -84,7 +84,7 @@ describe('Given a quorum queue configured with SAC', function () { }) it('it should have one consumer as active', async function() { - await doWhile(async function() { + await doUntil(async function() { await queuePage.refresh() await queuePage.isLoaded() return queuePage.getConsumerCount() @@ -94,7 +94,7 @@ describe('Given a quorum queue configured with SAC', function () { assert.equal("1", await queuePage.getConsumerCount()) assert.equal("Consumers (1)", await queuePage.getConsumersSectionTitle()) await queuePage.clickOnConsumerSection() - let consumerTable = await doWhile(async function() { + let consumerTable = await doUntil(async function() { return queuePage.getConsumersTable() }, function(table) { return table[0][6].localeCompare("single active") == 0 && @@ -113,7 +113,7 @@ describe('Given a quorum queue configured with SAC', function () { it('the latter consumer should be active and the former waiting', async function() { - await doWhile(async function() { + await doUntil(async function() { await queuePage.refresh() await queuePage.isLoaded() return queuePage.getConsumerCount() @@ -124,7 +124,7 @@ describe('Given a quorum queue configured with SAC', function () { assert.equal("2", await queuePage.getConsumerCount()) assert.equal("Consumers (2)", await queuePage.getConsumersSectionTitle()) await queuePage.clickOnConsumerSection() - let consumerTable = await doWhile(async function() { + let consumerTable = await doUntil(async function() { return queuePage.getConsumersTable() }, function(table) { return table.length == 2 && table[0][1] != "" && table[1][1] != "" @@ -151,7 +151,7 @@ describe('Given a quorum queue configured with SAC', function () { error("Failed to close amqp091 connection due to " + error); } // ensure there are no more consumers - await doWhile(async function() { + await doUntil(async function() { await queuePage.refresh() await queuePage.isLoaded() return queuePage.getConsumerCount() @@ -178,7 +178,7 @@ describe('Given a quorum queue configured with SAC', function () { }) it('it should have one consumer as active', async function() { - await doWhile(async function() { + await doUntil(async function() { await queuePage.refresh() await queuePage.isLoaded() return queuePage.getConsumerCount() @@ -188,7 +188,7 @@ describe('Given a quorum queue configured with SAC', function () { assert.equal("1", await queuePage.getConsumerCount()) assert.equal("Consumers (1)", await queuePage.getConsumersSectionTitle()) await queuePage.clickOnConsumerSection() - let consumerTable = await doWhile(async function() { + let consumerTable = await doUntil(async function() { return queuePage.getConsumersTable() }, function(table) { return table[0][6].localeCompare("single active") == 0 && @@ -207,7 +207,7 @@ describe('Given a quorum queue configured with SAC', function () { it('the former consumer should still be active and the latter be waiting', async function() { - await doWhile(async function() { + await doUntil(async function() { await queuePage.refresh() await queuePage.isLoaded() return queuePage.getConsumerCount() @@ -218,7 +218,7 @@ describe('Given a quorum queue configured with SAC', function () { assert.equal("2", await queuePage.getConsumerCount()) assert.equal("Consumers (2)", await queuePage.getConsumersSectionTitle()) await queuePage.clickOnConsumerSection() - let consumerTable = await doWhile(async function() { + let consumerTable = await doUntil(async function() { return queuePage.getConsumersTable() }, function(table) { return table.length == 2 && table[0][1] != "" && table[1][1] != "" diff --git a/selenium/test/utils.js b/selenium/test/utils.js index 19987356beb1..555fff3a6590 100644 --- a/selenium/test/utils.js +++ b/selenium/test/utils.js @@ -144,7 +144,7 @@ module.exports = { return new CaptureScreenshot(d.driver, require('path').basename(test)) }, - doWhile: async (doCallback, booleanCallback, delayMs = 1000, message = "doWhile failed") => { + doUntil: async (doCallback, booleanCallback, delayMs = 1000, message = "doUntil failed") => { let done = false let attempts = 10 let ret @@ -156,7 +156,7 @@ module.exports = { + ") with arg " + JSON.stringify(ret) + " ... ") done = booleanCallback(ret) }catch(error) { - module.exports.error("Caught " + error + " on doWhile callback...") + module.exports.error("Caught " + error + " on doUntil callback...") }finally { if (!done) { @@ -184,7 +184,7 @@ module.exports = { + ") with arg " + JSON.stringify(ret) + " ... ") done = booleanCallback(ret) }catch(error) { - module.exports.error("Caught " + error + " on doWhile callback...") + module.exports.error("Caught " + error + " on retry callback...") }finally { if (!done) { diff --git a/selenium/test/vhosts/admin-vhosts.js b/selenium/test/vhosts/admin-vhosts.js index 932d480d8263..40f1f88493f7 100644 --- a/selenium/test/vhosts/admin-vhosts.js +++ b/selenium/test/vhosts/admin-vhosts.js @@ -1,7 +1,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver') require('chromedriver') const assert = require('assert') -const { buildDriver, goToHome, captureScreensFor, teardown, doWhile, log, delay } = require('../utils') +const { buildDriver, goToHome, captureScreensFor, teardown, doUntil, log, delay } = require('../utils') const { getManagementUrl, basicAuthorization, createVhost, deleteVhost } = require('../mgt-api') const LoginPage = require('../pageobjects/LoginPage') @@ -56,7 +56,7 @@ describe('Virtual Hosts in Admin tab', function () { await adminTab.clickOnVhosts() await vhostsTab.isLoaded() await vhostsTab.searchForVhosts("/") - await doWhile(async function() { return vhostsTab.getVhostsTable() }, + await doUntil(async function() { return vhostsTab.getVhostsTable() }, function(table) { return table.length>0 }) @@ -116,7 +116,7 @@ describe('Virtual Hosts in Admin tab', function () { it('vhost is listed with tag', async function () { log("Searching for vhost " + vhost) await vhostsTab.searchForVhosts(vhost) - await doWhile(async function() { return vhostsTab.getVhostsTable()}, + await doUntil(async function() { return vhostsTab.getVhostsTable()}, function(table) { log("table: "+ JSON.stringify(table) + " table[0][0]:" + table[0][0]) return table.length==1 && table[0][0].localeCompare(vhost) == 0 @@ -124,7 +124,7 @@ describe('Virtual Hosts in Admin tab', function () { log("Found vhost " + vhost) await vhostsTab.selectTableColumnsById(["checkbox-vhosts-tags"]) - await doWhile(async function() { return vhostsTab.getVhostsTable() }, + await doUntil(async function() { return vhostsTab.getVhostsTable() }, function(table) { return table.length==1 && table[0][3].localeCompare("selenium-tag") == 0 })