From 64288a3766a4309a19e9e1e412781dcc08c49e12 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Wed, 4 Mar 2026 20:01:29 +1100 Subject: [PATCH 01/13] feat: [KSBP-100786] - Introduce parallel deployGraph --- k8s-deployer/src/test-suite-handler.ts | 81 +++++++++++++++++++++----- 1 file changed, 65 insertions(+), 16 deletions(-) diff --git a/k8s-deployer/src/test-suite-handler.ts b/k8s-deployer/src/test-suite-handler.ts index 444c49e..5527f4a 100644 --- a/k8s-deployer/src/test-suite-handler.ts +++ b/k8s-deployer/src/test-suite-handler.ts @@ -40,19 +40,33 @@ export const generatePrefixByDate = (date: Date, env: string): Prefix => { * 2. test app for the graph. */ const deployGraph = async (config: Config, workspace: string, testSuiteId: string, graph: Schema.Graph, namespace: Namespace, testAppDirForRemoteTestSuite?: string): Promise => { - const deployments: Array = new Array() - for (let i = 0; i < graph.components.length; i++) { - const componentSpec = graph.components[i] - logger.info("") - logger.info("Deploying graph component (%s of %s) \"%s\" for suite \"%s\"...", i + 1, graph.components.length, componentSpec.name, testSuiteId) - logger.info("") - const commitSha = await Deployer.deployComponent(config, workspace, componentSpec, namespace) - deployments.push(new DeployedComponent(commitSha, componentSpec)) - } - logger.info("") - - logger.info("%s Deploying test app \"%s\" for suite \"%s\" %s", LOG_SEPARATOR_LINE, graph.testApp.name, testSuiteId, LOG_SEPARATOR_LINE) - logger.info("") + // const deployments: Array = new Array() + // for (let i = 0; i < graph.components.length; i++) { + // const componentSpec = graph.components[i] + // logger.info("") + // logger.info("Deploying graph component (%s of %s) \"%s\" for suite \"%s\"...", i + 1, graph.components.length, componentSpec.name, testSuiteId) + // logger.info("") + // const commitSha = await Deployer.deployComponent(config, workspace, componentSpec, namespace) + // deployments.push(new DeployedComponent(commitSha, componentSpec)) + // } + // logger.info("") + + // logger.info("%s Deploying test app \"%s\" for suite \"%s\" %s", LOG_SEPARATOR_LINE, graph.testApp.name, testSuiteId, LOG_SEPARATOR_LINE) + // logger.info("") + + // if (testAppDirForRemoteTestSuite) { + // // When suite is remote its pitfile is sitting within test app itself. + // // We just downloaded pitfile from remote location into workspace + // logger.info( + // "Overwriting 'graph.testApp.location.path' to '%s' for testApp: '%s'", + // testAppDirForRemoteTestSuite, graph.testApp.name + // ) + // graph.testApp.location.path = testAppDirForRemoteTestSuite + // } + // const params = [ testSuiteId ] + // const testAppCommitSha = await Deployer.deployComponent(config, workspace, graph.testApp, namespace, params) + // logger.info("") + // return new GraphDeploymentResult(deployments, new DeployedComponent(testAppCommitSha, graph.testApp)) if (testAppDirForRemoteTestSuite) { // When suite is remote its pitfile is sitting within test app itself. @@ -63,10 +77,45 @@ const deployGraph = async (config: Config, workspace: string, testSuiteId: strin ) graph.testApp.location.path = testAppDirForRemoteTestSuite } - const params = [ testSuiteId ] - const testAppCommitSha = await Deployer.deployComponent(config, workspace, graph.testApp, namespace, params) + logger.info("") - return new GraphDeploymentResult(deployments, new DeployedComponent(testAppCommitSha, graph.testApp)) + logger.info("Deploying %d component(s) and test app \"%s\" for suite \"%s\" in parallel...", graph.components.length, graph.testApp.name, testSuiteId) + logger.info("") + + // do all component deployments in parallel + const componentPromises = graph.components.map(async (componentSpec, i) => { + logger.info("Deploying graph component (%s of %s) \"%s\" for suite \"%s\"...", i + 1, graph.components.length, componentSpec.name, testSuiteId) + const commitSha = await Deployer.deployComponent(config, workspace, componentSpec, namespace) + logger.info("Graph component (%s of %s) \"%s\" for suite \"%s\" has been deployed.", i + 1, graph.components.length, componentSpec.name, testSuiteId) + return new DeployedComponent(commitSha, componentSpec) + }) + + const testAppPromise = (async () => { + logger.info("%s Deploying test app \"%s\" for suite \"%s\" %s", LOG_SEPARATOR_LINE, graph.testApp.name, testSuiteId, LOG_SEPARATOR_LINE) + const params = [ testSuiteId ] + const testAppCommitSha = await Deployer.deployComponent(config, workspace, graph.testApp, namespace, params) + logger.info("%s Test app \"%s\" for suite \"%s\" has been deployed. %s", LOG_SEPARATOR_LINE, graph.testApp.name, testSuiteId, LOG_SEPARATOR_LINE) + return new DeployedComponent(testAppCommitSha, graph.testApp) + })() + + // Wait for everything to be ready + const [deployments, testApp] = await Promise.all([ + Promise.all(componentPromises), + testAppPromise + ]) + + logger.info("") + logger.info("Deployment of %d component(s) and test app \"%s\" for suite \"%s\" complete.", graph.components.length, graph.testApp.name, testSuiteId) + logger.info("") + + return new GraphDeploymentResult(deployments, testApp) + + + + + ////////////////// SERIAL CODE BELOW (for easier troubleshooting and better logs readability) ////////////////// + + } const downloadPitFile = async (testSuite: Schema.TestSuite, destination: string): Promise => { From d0bc0321bc920838ddd1159462e084fc0a8eb314 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 10:25:02 +1100 Subject: [PATCH 02/13] feat: [KSBP-100786] - Remove sequential deployment code --- k8s-deployer/src/test-suite-handler.ts | 28 -------------------------- 1 file changed, 28 deletions(-) diff --git a/k8s-deployer/src/test-suite-handler.ts b/k8s-deployer/src/test-suite-handler.ts index 5527f4a..903437f 100644 --- a/k8s-deployer/src/test-suite-handler.ts +++ b/k8s-deployer/src/test-suite-handler.ts @@ -40,34 +40,6 @@ export const generatePrefixByDate = (date: Date, env: string): Prefix => { * 2. test app for the graph. */ const deployGraph = async (config: Config, workspace: string, testSuiteId: string, graph: Schema.Graph, namespace: Namespace, testAppDirForRemoteTestSuite?: string): Promise => { - // const deployments: Array = new Array() - // for (let i = 0; i < graph.components.length; i++) { - // const componentSpec = graph.components[i] - // logger.info("") - // logger.info("Deploying graph component (%s of %s) \"%s\" for suite \"%s\"...", i + 1, graph.components.length, componentSpec.name, testSuiteId) - // logger.info("") - // const commitSha = await Deployer.deployComponent(config, workspace, componentSpec, namespace) - // deployments.push(new DeployedComponent(commitSha, componentSpec)) - // } - // logger.info("") - - // logger.info("%s Deploying test app \"%s\" for suite \"%s\" %s", LOG_SEPARATOR_LINE, graph.testApp.name, testSuiteId, LOG_SEPARATOR_LINE) - // logger.info("") - - // if (testAppDirForRemoteTestSuite) { - // // When suite is remote its pitfile is sitting within test app itself. - // // We just downloaded pitfile from remote location into workspace - // logger.info( - // "Overwriting 'graph.testApp.location.path' to '%s' for testApp: '%s'", - // testAppDirForRemoteTestSuite, graph.testApp.name - // ) - // graph.testApp.location.path = testAppDirForRemoteTestSuite - // } - // const params = [ testSuiteId ] - // const testAppCommitSha = await Deployer.deployComponent(config, workspace, graph.testApp, namespace, params) - // logger.info("") - // return new GraphDeploymentResult(deployments, new DeployedComponent(testAppCommitSha, graph.testApp)) - if (testAppDirForRemoteTestSuite) { // When suite is remote its pitfile is sitting within test app itself. // We just downloaded pitfile from remote location into workspace From c310ff572aafd5687ecf645537ba0e56b82bf9da Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 10:27:14 +1100 Subject: [PATCH 03/13] feat: [KSBP-100786] - Remove comments --- k8s-deployer/src/test-suite-handler.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/k8s-deployer/src/test-suite-handler.ts b/k8s-deployer/src/test-suite-handler.ts index 903437f..f84b019 100644 --- a/k8s-deployer/src/test-suite-handler.ts +++ b/k8s-deployer/src/test-suite-handler.ts @@ -81,13 +81,6 @@ const deployGraph = async (config: Config, workspace: string, testSuiteId: strin logger.info("") return new GraphDeploymentResult(deployments, testApp) - - - - - ////////////////// SERIAL CODE BELOW (for easier troubleshooting and better logs readability) ////////////////// - - } const downloadPitFile = async (testSuite: Schema.TestSuite, destination: string): Promise => { From ef9dbb8c72892fdf6163240ca47564d08f0277da Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 10:38:45 +1100 Subject: [PATCH 04/13] feat: [KSBP-100786] - Temporary code to delay tear down and retry start of test suite --- k8s-deployer/src/index.ts | 7 ++++ .../src/test-app-client/test-runner.ts | 35 +++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/k8s-deployer/src/index.ts b/k8s-deployer/src/index.ts index 3de895d..d904c68 100644 --- a/k8s-deployer/src/index.ts +++ b/k8s-deployer/src/index.ts @@ -25,6 +25,13 @@ const main = async () => { logger.info("") logger.info("--------------------- Cleaning up --------------------- ") logger.info("") + + + logger.info("Waiting for 10 minutes before starting the cleanup to allow time for post-test investigation if needed...") + const sleep = new Promise(resolve => setTimeout(resolve, 600_000)) + await sleep + + if (config.enableCleanups) { for (let deployments of artefacts) { await SuiteHandler.undeployAll(config, file, deployments) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index e031c08..152b93a 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -159,14 +159,35 @@ const runSuite = async (config: Config, spec: DeployedTestSuite, schemaValidator reportsNative: { endpoint: `${baseUrl}/reports/native`, options: { method: "GET", headers: { "Accept": "application/zip, application/json" } } } } - const httpResponse = await fetch( - api.start.endpoint, - { ...api.start.options, body: webapi.StartRequest.json(testSuiteId) } - ) + // Retry logic: try every 1s + const maxAttempts = 60 + const retryDelayMs = 1000 + let httpResponse: Response | undefined + let lastError: any + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + logger.info("Attempt %d to start test suite '%s' via %s", attempt, testSuiteId, api.start.endpoint) + httpResponse = await fetch( + api.start.endpoint, + { ...api.start.options, body: webapi.StartRequest.json(testSuiteId) } + ) + if (httpResponse.ok) { + logger.info("Test suite '%s' started successfully on attempt %d", testSuiteId, attempt) + break + } + lastError = new Error(httpResponse.statusText) + logger.warn("Attempt %d failed: %s", attempt, httpResponse.statusText) + } catch (e) { + lastError = e + logger.warn("Attempt %d threw error: %s", attempt, e.message) + } + if (attempt < maxAttempts) { + await new Promise(resolve => setTimeout(resolve, retryDelayMs)) + } + } - if (!httpResponse.ok) { - // TODO: handle http statuses - throw new Error(httpResponse.statusText) + if (!httpResponse || !httpResponse.ok) { + throw lastError || new Error("Failed to start test suite after retries") } const startResult = await httpResponse.json() as webapi.StartResponse From 187e2dd5a0b2705c77fed5b6f0cb585a963a02e1 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 11:07:59 +1100 Subject: [PATCH 05/13] feat: [KSBP-100786] - Remove temporary code to retry start of test suite --- .../src/test-app-client/test-runner.ts | 35 ++++--------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index 152b93a..e031c08 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -159,35 +159,14 @@ const runSuite = async (config: Config, spec: DeployedTestSuite, schemaValidator reportsNative: { endpoint: `${baseUrl}/reports/native`, options: { method: "GET", headers: { "Accept": "application/zip, application/json" } } } } - // Retry logic: try every 1s - const maxAttempts = 60 - const retryDelayMs = 1000 - let httpResponse: Response | undefined - let lastError: any - for (let attempt = 1; attempt <= maxAttempts; attempt++) { - try { - logger.info("Attempt %d to start test suite '%s' via %s", attempt, testSuiteId, api.start.endpoint) - httpResponse = await fetch( - api.start.endpoint, - { ...api.start.options, body: webapi.StartRequest.json(testSuiteId) } - ) - if (httpResponse.ok) { - logger.info("Test suite '%s' started successfully on attempt %d", testSuiteId, attempt) - break - } - lastError = new Error(httpResponse.statusText) - logger.warn("Attempt %d failed: %s", attempt, httpResponse.statusText) - } catch (e) { - lastError = e - logger.warn("Attempt %d threw error: %s", attempt, e.message) - } - if (attempt < maxAttempts) { - await new Promise(resolve => setTimeout(resolve, retryDelayMs)) - } - } + const httpResponse = await fetch( + api.start.endpoint, + { ...api.start.options, body: webapi.StartRequest.json(testSuiteId) } + ) - if (!httpResponse || !httpResponse.ok) { - throw lastError || new Error("Failed to start test suite after retries") + if (!httpResponse.ok) { + // TODO: handle http statuses + throw new Error(httpResponse.statusText) } const startResult = await httpResponse.json() as webapi.StartResponse From eb7c65412e31849718d2a3cbe37425274a349f6e Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 11:09:26 +1100 Subject: [PATCH 06/13] feat: [KSBP-100786] - Remove temporary code to delay teardown --- k8s-deployer/src/index.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/k8s-deployer/src/index.ts b/k8s-deployer/src/index.ts index d904c68..6886894 100644 --- a/k8s-deployer/src/index.ts +++ b/k8s-deployer/src/index.ts @@ -26,12 +26,6 @@ const main = async () => { logger.info("--------------------- Cleaning up --------------------- ") logger.info("") - - logger.info("Waiting for 10 minutes before starting the cleanup to allow time for post-test investigation if needed...") - const sleep = new Promise(resolve => setTimeout(resolve, 600_000)) - await sleep - - if (config.enableCleanups) { for (let deployments of artefacts) { await SuiteHandler.undeployAll(config, file, deployments) From 9e06c588d66993fa2ccc4f82dd0fcf66239d0593 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 11:30:01 +1100 Subject: [PATCH 07/13] feat: [KSBP-100786] - Add logging --- k8s-deployer/src/test-app-client/test-runner.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index e031c08..f4e33a5 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -180,6 +180,8 @@ const runSuite = async (config: Config, spec: DeployedTestSuite, schemaValidator } logger.info("Test suite: '%s' - started using session: %s", testSuiteId, startResult.sessionId) + logger.info("Test suite: '%s' - session: %s, testSuite.timeoutSeconds: %s, config.testTimeoutMs: %s", testSuiteId, startResult.sessionId, spec.testSuite.timeoutSeconds, config.testTimeoutMs) + const testTimeoutMs = spec.testSuite.timeoutSeconds * 1_000 || config.testTimeoutMs await waitUntilFinish(api, testSuiteId, startResult.sessionId, config.testStatusPollFrequencyMs, testTimeoutMs, 1_000) From e587334f05431950b44a13d6a655dd909a05f760 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 11:46:34 +1100 Subject: [PATCH 08/13] feat: [KSBP-100786] - Add logging --- k8s-deployer/src/test-app-client/test-runner.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index f4e33a5..3dff66d 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -258,6 +258,7 @@ const waitUntilFinish = async ( httpResponse = await fetch(statusUrl, api.status.options) } catch (e) { // allow x number of failed polls and then give up + logger.info("Test suite: '%s' - error polling status endpoint %s for session: '%s' ", testSuiteId, statusUrl, sessionId) if (++failuresCount < MAX_TECH_FAILURES) { const sleep = new Promise(resolve => setTimeout(resolve, retryTimeoutMs)) await sleep From 2655c70ddb5fc448bf0047be5115f16fa74a680e Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 11:57:35 +1100 Subject: [PATCH 09/13] feat: [KSBP-100786] - Add logging --- k8s-deployer/src/test-app-client/test-runner.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index 3dff66d..544f932 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -256,6 +256,8 @@ const waitUntilFinish = async ( try { logger.info(statusUrl) httpResponse = await fetch(statusUrl, api.status.options) + const responseBody = await httpResponse.json() + logger.info("Test suite: '%s' - status endpoint %s for session: '%s' returned %s (%s)", testSuiteId, statusUrl, sessionId, httpResponse.statusText, JSON.stringify(responseBody)) } catch (e) { // allow x number of failed polls and then give up logger.info("Test suite: '%s' - error polling status endpoint %s for session: '%s' ", testSuiteId, statusUrl, sessionId) From 97e633a55df5b0105c2d377c8931cb58837e2d6b Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 12:05:06 +1100 Subject: [PATCH 10/13] feat: [KSBP-100786] - Fix double parse bug --- k8s-deployer/src/test-app-client/test-runner.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index 544f932..7f100a8 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -253,11 +253,12 @@ const waitUntilFinish = async ( sessionId }) const statusUrl = `${api.status.endpoint}?${queryParams}` + let response; try { logger.info(statusUrl) httpResponse = await fetch(statusUrl, api.status.options) - const responseBody = await httpResponse.json() - logger.info("Test suite: '%s' - status endpoint %s for session: '%s' returned %s (%s)", testSuiteId, statusUrl, sessionId, httpResponse.statusText, JSON.stringify(responseBody)) + response = await httpResponse.json() + logger.info("Test suite: '%s' - status endpoint %s for session: '%s' returned %s (%s)", testSuiteId, statusUrl, sessionId, httpResponse.statusText, JSON.stringify(response)) } catch (e) { // allow x number of failed polls and then give up logger.info("Test suite: '%s' - error polling status endpoint %s for session: '%s' ", testSuiteId, statusUrl, sessionId) @@ -277,16 +278,14 @@ const waitUntilFinish = async ( throw new Error(`Unable to fetch status of previously started test: '${testSuiteId}'. Error: '${httpResponse.statusText}'`) } - const reponse = await httpResponse.json() - const { schemaValidator, schemaPath } = api.status.validator - const isResponseValid = schemaValidator.validate(getSchemaRef(schemaPath.Response), reponse) + const isResponseValid = schemaValidator.validate(getSchemaRef(schemaPath.Response), response) if (!isResponseValid) { - throw new ApiSchemaValidationError(schemaValidator.errorsText(), statusUrl, JSON.stringify(reponse)) + throw new ApiSchemaValidationError(schemaValidator.errorsText(), statusUrl, JSON.stringify(response)) } - const statusQueryResult = webapi.StatusResponse.create(reponse) + const statusQueryResult = webapi.StatusResponse.create(response) if (statusQueryResult.status === webapi.TestStatus.COMPLETED) break if (statusQueryResult.status === webapi.TestStatus.ERROR) { From bd1f41b57a8f74dba7821ccaac21426292a13d81 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 12:54:15 +1100 Subject: [PATCH 11/13] feat: [KSBP-100786] - Pause before cleanup --- k8s-deployer/src/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/k8s-deployer/src/index.ts b/k8s-deployer/src/index.ts index 6886894..bbae4f5 100644 --- a/k8s-deployer/src/index.ts +++ b/k8s-deployer/src/index.ts @@ -26,6 +26,12 @@ const main = async () => { logger.info("--------------------- Cleaning up --------------------- ") logger.info("") + + logger.info("Waiting for 5 minutes before starting the cleanup to allow time for post-test investigation if needed...") + const sleep = new Promise(resolve => setTimeout(resolve, 300_000)) + await sleep + + if (config.enableCleanups) { for (let deployments of artefacts) { await SuiteHandler.undeployAll(config, file, deployments) From d32addb4baf511d54eac9dc484f8d7e729027db5 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 15:24:28 +1100 Subject: [PATCH 12/13] feat: [KSBP-100786] - Remove pause before cleanup --- k8s-deployer/src/index.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/k8s-deployer/src/index.ts b/k8s-deployer/src/index.ts index bbae4f5..6886894 100644 --- a/k8s-deployer/src/index.ts +++ b/k8s-deployer/src/index.ts @@ -26,12 +26,6 @@ const main = async () => { logger.info("--------------------- Cleaning up --------------------- ") logger.info("") - - logger.info("Waiting for 5 minutes before starting the cleanup to allow time for post-test investigation if needed...") - const sleep = new Promise(resolve => setTimeout(resolve, 300_000)) - await sleep - - if (config.enableCleanups) { for (let deployments of artefacts) { await SuiteHandler.undeployAll(config, file, deployments) From b1f9c593d0903b6073ebd628c33368536ea8a211 Mon Sep 17 00:00:00 2001 From: "James Charters james.charters@kindredgroup.com" Date: Thu, 5 Mar 2026 15:53:31 +1100 Subject: [PATCH 13/13] feat: [KSBP-100786] - Remove logging --- k8s-deployer/src/test-app-client/test-runner.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/k8s-deployer/src/test-app-client/test-runner.ts b/k8s-deployer/src/test-app-client/test-runner.ts index 7f100a8..e031c08 100644 --- a/k8s-deployer/src/test-app-client/test-runner.ts +++ b/k8s-deployer/src/test-app-client/test-runner.ts @@ -180,8 +180,6 @@ const runSuite = async (config: Config, spec: DeployedTestSuite, schemaValidator } logger.info("Test suite: '%s' - started using session: %s", testSuiteId, startResult.sessionId) - logger.info("Test suite: '%s' - session: %s, testSuite.timeoutSeconds: %s, config.testTimeoutMs: %s", testSuiteId, startResult.sessionId, spec.testSuite.timeoutSeconds, config.testTimeoutMs) - const testTimeoutMs = spec.testSuite.timeoutSeconds * 1_000 || config.testTimeoutMs await waitUntilFinish(api, testSuiteId, startResult.sessionId, config.testStatusPollFrequencyMs, testTimeoutMs, 1_000) @@ -253,15 +251,11 @@ const waitUntilFinish = async ( sessionId }) const statusUrl = `${api.status.endpoint}?${queryParams}` - let response; try { logger.info(statusUrl) httpResponse = await fetch(statusUrl, api.status.options) - response = await httpResponse.json() - logger.info("Test suite: '%s' - status endpoint %s for session: '%s' returned %s (%s)", testSuiteId, statusUrl, sessionId, httpResponse.statusText, JSON.stringify(response)) } catch (e) { // allow x number of failed polls and then give up - logger.info("Test suite: '%s' - error polling status endpoint %s for session: '%s' ", testSuiteId, statusUrl, sessionId) if (++failuresCount < MAX_TECH_FAILURES) { const sleep = new Promise(resolve => setTimeout(resolve, retryTimeoutMs)) await sleep @@ -278,14 +272,16 @@ const waitUntilFinish = async ( throw new Error(`Unable to fetch status of previously started test: '${testSuiteId}'. Error: '${httpResponse.statusText}'`) } + const reponse = await httpResponse.json() + const { schemaValidator, schemaPath } = api.status.validator - const isResponseValid = schemaValidator.validate(getSchemaRef(schemaPath.Response), response) + const isResponseValid = schemaValidator.validate(getSchemaRef(schemaPath.Response), reponse) if (!isResponseValid) { - throw new ApiSchemaValidationError(schemaValidator.errorsText(), statusUrl, JSON.stringify(response)) + throw new ApiSchemaValidationError(schemaValidator.errorsText(), statusUrl, JSON.stringify(reponse)) } - const statusQueryResult = webapi.StatusResponse.create(response) + const statusQueryResult = webapi.StatusResponse.create(reponse) if (statusQueryResult.status === webapi.TestStatus.COMPLETED) break if (statusQueryResult.status === webapi.TestStatus.ERROR) {