From 0d7b132e87b869f42900ef4f256e0711a1028fc6 Mon Sep 17 00:00:00 2001 From: NivLipetz Date: Mon, 4 Mar 2019 01:48:43 +0200 Subject: [PATCH] feat(reporter): aggregate reports from multi-distributed runners --- docs/swagger.yaml | 4 + .../3__create_reports_stats_table.cql | 2 +- .../4__create_reports_subscribers_table.cql | 6 ++ ...ew.cql => 5__create_last_reports_view.cql} | 0 ...ies.cql => 6__create_token_activities.cql} | 0 .../{6__dsl_table.cql => 7__dsl_table.cql} | 0 .../database/cassandra/cassandraConnector.js | 56 +++++++++++-- .../database/sequelize/sequelizeConnector.js | 83 +++++++++++++++++-- src/reports/models/databaseConnector.js | 16 +++- src/reports/models/reportsManager.js | 77 +++++++++++++++-- src/reports/models/statsConsumer.js | 18 ++-- src/tests/placeholder | 0 .../reports/helpers/statsGenerator.js | 10 +-- .../reporter/cassandra/cassandra-test.js | 10 +-- .../reporter/models/statsConsumer-test.js | 14 ++-- .../sequelize/sequelizeConnector-test.js | 8 +- 16 files changed, 251 insertions(+), 53 deletions(-) create mode 100644 src/database/cassandra-handler/init-scripts/4__create_reports_subscribers_table.cql rename src/database/cassandra-handler/init-scripts/{4__create_last_reports_view.cql => 5__create_last_reports_view.cql} (100%) rename src/database/cassandra-handler/init-scripts/{5__create_token_activities.cql => 6__create_token_activities.cql} (100%) rename src/database/cassandra-handler/init-scripts/{6__dsl_table.cql => 7__dsl_table.cql} (100%) delete mode 100644 src/tests/placeholder diff --git a/docs/swagger.yaml b/docs/swagger.yaml index b35580eda..dc5a3df73 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -948,6 +948,7 @@ definitions: - test_name - test_description - start_time + - runner_id properties: report_id: type: string @@ -976,6 +977,9 @@ definitions: notes: type: string description: notes about the test + runner_id: + type: string + description: the id of the runner that created the report post_report_response: required: diff --git a/src/database/cassandra-handler/init-scripts/3__create_reports_stats_table.cql b/src/database/cassandra-handler/init-scripts/3__create_reports_stats_table.cql index a02fb88cf..8b500ead2 100644 --- a/src/database/cassandra-handler/init-scripts/3__create_reports_stats_table.cql +++ b/src/database/cassandra-handler/init-scripts/3__create_reports_stats_table.cql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS reports_stats( -container_id text, +runner_id uuid, test_id uuid, report_id text, stats_id uuid, diff --git a/src/database/cassandra-handler/init-scripts/4__create_reports_subscribers_table.cql b/src/database/cassandra-handler/init-scripts/4__create_reports_subscribers_table.cql new file mode 100644 index 000000000..1732c30fb --- /dev/null +++ b/src/database/cassandra-handler/init-scripts/4__create_reports_subscribers_table.cql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS report_subscribers( +test_id uuid, +report_id text, +runner_id uuid, +stage text, +PRIMARY KEY (test_id, report_id, runner_id)); \ No newline at end of file diff --git a/src/database/cassandra-handler/init-scripts/4__create_last_reports_view.cql b/src/database/cassandra-handler/init-scripts/5__create_last_reports_view.cql similarity index 100% rename from src/database/cassandra-handler/init-scripts/4__create_last_reports_view.cql rename to src/database/cassandra-handler/init-scripts/5__create_last_reports_view.cql diff --git a/src/database/cassandra-handler/init-scripts/5__create_token_activities.cql b/src/database/cassandra-handler/init-scripts/6__create_token_activities.cql similarity index 100% rename from src/database/cassandra-handler/init-scripts/5__create_token_activities.cql rename to src/database/cassandra-handler/init-scripts/6__create_token_activities.cql diff --git a/src/database/cassandra-handler/init-scripts/6__dsl_table.cql b/src/database/cassandra-handler/init-scripts/7__dsl_table.cql similarity index 100% rename from src/database/cassandra-handler/init-scripts/6__dsl_table.cql rename to src/database/cassandra-handler/init-scripts/7__dsl_table.cql diff --git a/src/reports/models/database/cassandra/cassandraConnector.js b/src/reports/models/database/cassandra/cassandraConnector.js index bd2717fd8..f6f867716 100644 --- a/src/reports/models/database/cassandra/cassandraConnector.js +++ b/src/reports/models/database/cassandra/cassandraConnector.js @@ -9,8 +9,11 @@ const UPDATE_REPORT_SUMMARY = 'UPDATE reports_summary SET status=?, phase=?, las const GET_REPORT_SUMMARY = 'SELECT * FROM reports_summary WHERE test_id=? AND report_id=? AND report_type=?'; const GET_REPORTS_SUMMARIES = 'SELECT * FROM reports_summary WHERE test_id=? AND report_type=?'; const GET_LAST_SUMMARIES = 'SELECT * FROM last_reports LIMIT ?'; -const INSERT_REPORT_STATS = 'INSERT INTO reports_stats(container_id, test_id, report_id, stats_id, stats_time, phase_index, phase_status, data) values(?,?,?,?,?,?,?,?)'; +const INSERT_REPORT_STATS = 'INSERT INTO reports_stats(runner_id, test_id, report_id, stats_id, stats_time, phase_index, phase_status, data) values(?,?,?,?,?,?,?,?)'; const GET_REPORT_STATS = 'SELECT * FROM reports_stats WHERE test_id=? AND report_id=?'; +const SUBSCRIBE_RUNNER = 'INSERT INTO report_subscribers(test_id, report_id, runner_id, stage) values(?,?,?,?)'; +const UPDATE_SUBSCRIBERS = 'UPDATE report_subscribers SET stage=? WHERE test_id=? AND report_id=? AND runner_id=?'; +const GET_REPORT_SUBSCRIBERS = 'SELECT * FROM report_subscribers WHERE test_id=? AND report_id=?'; module.exports = { init, @@ -20,7 +23,9 @@ module.exports = { getReports, getLastReports, insertStats, - getStats + getStats, + subscribeRunner, + updateSubscribers }; let queryOptions = { @@ -48,24 +53,24 @@ function updateReport(testId, reportId, status, phaseIndex, lastStats, endTime) function getReport(testId, reportId) { let params; params = [testId, reportId, 'basic']; - return executeQuery(GET_REPORT_SUMMARY, params, queryOptions); + return getReportsAndParse(GET_REPORT_SUMMARY, params, queryOptions); } function getReports(testId) { let params; params = [testId, 'basic']; - return executeQuery(GET_REPORTS_SUMMARIES, params, queryOptions); + return getReportsAndParse(GET_REPORTS_SUMMARIES, params, queryOptions); } function getLastReports(limit) { let params; params = [limit]; - return executeQuery(GET_LAST_SUMMARIES, params, queryOptions); + return getReportsAndParse(GET_LAST_SUMMARIES, params, queryOptions); } -function insertStats(containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) { +function insertStats(runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) { let params; - params = [containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data]; + params = [runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data]; return executeQuery(INSERT_REPORT_STATS, params, queryOptions); } @@ -75,6 +80,24 @@ function getStats(testId, reportId) { return executeQuery(GET_REPORT_STATS, params, queryOptions); } +function subscribeRunner(testId, reportId, runnerId) { + let params; + params = [testId, reportId, runnerId, 'initializing']; + return executeQuery(SUBSCRIBE_RUNNER, params, queryOptions); +} + +function updateSubscribers(testId, reportId, runnerId, stage) { + let params; + params = [stage, testId, reportId, runnerId]; + return executeQuery(UPDATE_SUBSCRIBERS, params, queryOptions); +} + +function getReportSubscribers(testId, reportId) { + let params; + params = [testId, reportId]; + return executeQuery(GET_REPORT_SUBSCRIBERS, params, queryOptions); +} + function executeQuery(query, params, queryOptions) { return client.execute(query, params, queryOptions).then((result) => { logger.trace('Query result', { @@ -88,3 +111,22 @@ function executeQuery(query, params, queryOptions) { return Promise.reject(new Error('Error occurred in communication with cassandra')); }); } + +async function getReportsAndParse(query, params, queryOptions) { + let subscribers, report; + const reports = await executeQuery(query, params, queryOptions); + + for (let reportIndex = 0; reportIndex < reports.length; reportIndex++) { + report = reports[reportIndex]; + subscribers = await getReportSubscribers(report.test_id, report.report_id); + subscribers = subscribers.map((subscriber) => { + return { + 'runner_id': subscriber.runner_id, + 'stage': subscriber.stage + }; + }); + report.subscribers = subscribers; + } + + return reports; +} diff --git a/src/reports/models/database/sequelize/sequelizeConnector.js b/src/reports/models/database/sequelize/sequelizeConnector.js index bce6b4153..dfee1a506 100644 --- a/src/reports/models/database/sequelize/sequelizeConnector.js +++ b/src/reports/models/database/sequelize/sequelizeConnector.js @@ -11,7 +11,9 @@ module.exports = { getReport, getReports, getLastReports, - getStats + getStats, + subscribeRunner, + updateSubscribers }; async function init(sequlizeClient) { @@ -35,16 +37,17 @@ async function insertReport(testId, revisionId, reportId, jobId, testType, start notes: notes || '', phase: '0', status: 'initialized', - test_configuration: testConfiguration + test_configuration: testConfiguration, + runners_subscribed: [] }; return report.findOrCreate({ where: { report_id: reportId }, defaults: params }); } -async function insertStats(containerId, testId, reportId, statsId, statsTime, phaseIndex, phaseStatus, data) { +async function insertStats(runnerId, testId, reportId, statsId, statsTime, phaseIndex, phaseStatus, data) { const stats = client.model('stats'); const params = { - container_id: containerId, + runner_id: runnerId, report_id: reportId, test_id: testId, stats_id: statsId, @@ -74,11 +77,57 @@ async function updateReport(testId, reportId, status, phaseIndex, lastStats, end }, options); } +async function subscribeRunner(testId, reportId, runnerId) { + try { + const newSubscriber = { + runner_id: runnerId, + stage: 'initializing' + }; + + const reportModel = client.model('report'); + const options = { + where: { + test_id: testId, + report_id: reportId + } + }; + + let report = await reportModel.findAll(options); + report = report[0]; + + await report.createSubscriber(newSubscriber); + } catch (e) { + console.log(e, `Failed to subscribe runner ${runnerId}`); + } +} + +async function updateSubscribers(testId, reportId, runnerId, stage) { + const reportModel = client.model('report'); + const getReportOptions = { + where: { + test_id: testId, + report_id: reportId + } + }; + + let report = await reportModel.findAll(getReportOptions); + report = report[0]; + + const subscribers = await report.getSubscribers(); + const subscriberToUpdate = await subscribers.find((subscriber) => { + return subscriber.dataValues.runner_id === runnerId; + }); + + await subscriberToUpdate.set('stage', stage); + return subscriberToUpdate.save(); +} + async function getReportsAndParse(query) { const report = client.model('report'); let options = { - attributes: { exclude: ['updated_at', 'created_at'] } + attributes: { exclude: ['updated_at', 'created_at'] }, + include: [report.subscriber] }; Object.assign(options, query); @@ -86,6 +135,14 @@ async function getReportsAndParse(query) { const allReportsRawResponse = await report.findAll(options); let allReports = allReportsRawResponse.map(rawReport => rawReport.dataValues); + allReports.forEach(report => { + report.subscribers = report.subscribers.map((sqlJob) => { + return { + runner_id: sqlJob.dataValues.runner_id, + stage: sqlJob.dataValues.stage + }; + }); + }); return allReports; } @@ -139,8 +196,8 @@ async function initSchemas() { report_id: { type: Sequelize.DataTypes.STRING }, - container_id: { - type: Sequelize.DataTypes.STRING + runner_id: { + type: Sequelize.DataTypes.UUID }, stats_time: { type: Sequelize.DataTypes.DATE @@ -156,6 +213,16 @@ async function initSchemas() { } }); + const subscriber = client.define('subscriber', { + runner_id: { + type: Sequelize.DataTypes.STRING, + primaryKey: true + }, + stage: { + type: Sequelize.DataTypes.STRING + } + }); + const report = client.define('report', { report_id: { type: Sequelize.DataTypes.STRING, @@ -205,6 +272,8 @@ async function initSchemas() { } }); + report.subscriber = report.hasMany(subscriber); await report.sync(); await stats.sync(); + await subscriber.sync(); } \ No newline at end of file diff --git a/src/reports/models/databaseConnector.js b/src/reports/models/databaseConnector.js index b3f706b6a..5db6cdfa1 100644 --- a/src/reports/models/databaseConnector.js +++ b/src/reports/models/databaseConnector.js @@ -12,15 +12,17 @@ module.exports = { getReport, getReports, getLastReports, - getStats + getStats, + subscribeRunner, + updateSubscribers }; function insertReport(testId, revisionId, reportId, jobId, testType, startTime, testName, testDescription, testConfiguration, notes) { return databaseConnector.insertReport(testId, revisionId, reportId, jobId, testType, startTime, testName, testDescription, testConfiguration, notes); } -function insertStats(containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) { - return databaseConnector.insertStats(containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data); +function insertStats(runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) { + return databaseConnector.insertStats(runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data); } function updateReport(testId, reportId, status, phaseIndex, lastStats, endTime) { @@ -41,4 +43,12 @@ function getReport(testId, reportId) { function getStats(testId, reportId) { return databaseConnector.getStats(testId, reportId); +} + +function subscribeRunner(testId, reportId, runnerId) { + return databaseConnector.subscribeRunner(testId, reportId, runnerId); +} + +function updateSubscribers(testId, reportId, runnerId, stage) { + return databaseConnector.updateSubscribers(testId, reportId, runnerId, stage); } \ No newline at end of file diff --git a/src/reports/models/reportsManager.js b/src/reports/models/reportsManager.js index f6af89601..bfde5bf1c 100644 --- a/src/reports/models/reportsManager.js +++ b/src/reports/models/reportsManager.js @@ -1,9 +1,22 @@ 'use strict'; -let databaseConnector = require('./databaseConnector'); -let jobConnector = require('../../jobs/models/jobManager'); -let serviceConfig = require('../../config/serviceConfig'); -let statsConsumer = require('./statsConsumer'); +const _ = require('lodash'); + +const databaseConnector = require('./databaseConnector'); +const jobConnector = require('../../jobs/models/jobManager'); +const serviceConfig = require('../../config/serviceConfig'); +const statsConsumer = require('./statsConsumer'); + +const SUBSCRIBER_DONE_STAGE = 'done'; +const SUBSCRIBER_ABORTED_STAGE = 'aborted'; +const SUBSCRIBER_FAILED_STAGE = 'error'; + +const REPORT_STARTED_STATUS = 'started'; +const REPORT_IN_PROGRESS_STATUS = 'in_progress'; +const REPORT_FINISHED_STATUS = 'finished'; +const REPORT_ABORTED_STATUS = 'aborted'; +const REPORT_FAILED_STATUS = 'failed'; +const REPORT_PARTIALLY_FINISHED_STATUS = 'partially_finished'; module.exports.getReport = async (testId, reportId) => { let reportSummary = await databaseConnector.getReport(testId, reportId); @@ -46,10 +59,12 @@ module.exports.postReport = async (testId, reportBody) => { await databaseConnector.insertReport(testId, reportBody.revision_id, reportBody.report_id, reportBody.job_id, reportBody.test_type, startTime, reportBody.test_name, reportBody.test_description, JSON.stringify(testConfiguration), job.notes); + await databaseConnector.subscribeRunner(testId, reportBody.report_id, reportBody.runner_id); return reportBody; }; module.exports.postStats = async (testId, reportId, stats) => { + await databaseConnector.updateSubscribers(testId, reportId, stats.runner_id, stats.phase_status); await statsConsumer.handleMessage(testId, reportId, stats); return stats; }; @@ -84,7 +99,8 @@ function getReportResponse(summaryRow) { html_report: htmlReportUrl, grafana_report: generateGraphanaUrl(summaryRow), notes: summaryRow.notes, - environment: testConfiguration.environment + environment: testConfiguration.environment, + subscribers: summaryRow.subscribers }; return report; @@ -96,4 +112,55 @@ function generateGraphanaUrl(report) { const grafanaReportUrl = encodeURI(serviceConfig.grafanaUrl + `&var-Name=${report.test_name}&from=${new Date(report.start_time).getTime()}${endTimeGrafanafaQuery}`); return grafanaReportUrl; } +} + +module.exports.updateReport = async (report, status, stats, statsTime) => { + const subscribersStages = getListOfSubscribersStages(report); + const uniqueSubscribersStages = _.uniq(subscribersStages); + + if (status === REPORT_FINISHED_STATUS) { + if (allSubscribersFinished(uniqueSubscribersStages)) { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_FINISHED_STATUS, report.phase, stats.data, statsTime); + } else { + setTimeout(async () => { + await delayedUpdateOfReportStatus(report, stats, statsTime); + }, 30000); + } + } else if (status === REPORT_ABORTED_STATUS && allSubscribersAborted(uniqueSubscribersStages)) { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_ABORTED_STATUS, report.phase, stats.data, statsTime); + } else if (status === REPORT_FAILED_STATUS && allSubscribersFailed(uniqueSubscribersStages)) { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_FAILED_STATUS, report.phase, stats.data, statsTime); + } else if (status === REPORT_IN_PROGRESS_STATUS) { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_IN_PROGRESS_STATUS, report.phase, stats.data, undefined); + } else { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_STARTED_STATUS, report.phase, undefined, undefined); + } +}; + +function getListOfSubscribersStages (report) { + const runnerStates = report.subscribers.map((subscriber) => subscriber.stage); + return runnerStates; +} + +async function delayedUpdateOfReportStatus (report, stats, statsTime) { + const mostUpToDateReportVersion = await module.exports.getReport(report.test_id, report.report_id); + const subscribersStages = getListOfSubscribersStages(mostUpToDateReportVersion); + const uniqueSubscribersStages = _.uniq(subscribersStages); + if (mostUpToDateReportVersion.status !== REPORT_FINISHED_STATUS && uniqueSubscribersStages.length === 1 && uniqueSubscribersStages[0] === SUBSCRIBER_DONE_STAGE) { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_FINISHED_STATUS, report.phase, stats.data, statsTime); + } else { + await databaseConnector.updateReport(report.test_id, report.report_id, REPORT_PARTIALLY_FINISHED_STATUS, report.phase, stats.data, statsTime); + } +} + +function allSubscribersFinished (subscribers) { + return subscribers.length === 1 && subscribers[0] === SUBSCRIBER_DONE_STAGE; +} + +function allSubscribersAborted (subscribers) { + return subscribers.length === 1 && subscribers[0] === SUBSCRIBER_ABORTED_STAGE; +} + +function allSubscribersFailed (subscribers) { + return subscribers.length === 1 && subscribers[0] === SUBSCRIBER_FAILED_STAGE; } \ No newline at end of file diff --git a/src/reports/models/statsConsumer.js b/src/reports/models/statsConsumer.js index 0d249b5ca..034d29742 100644 --- a/src/reports/models/statsConsumer.js +++ b/src/reports/models/statsConsumer.js @@ -47,7 +47,7 @@ module.exports.handleMessage = async (testId, reportId, stats) => { }; async function handleError(report, job, stats, statsTime) { - await databaseConnector.updateReport(report.test_id, report.report_id, 'failed', report.phase, stats.data, statsTime); + await reportsManager.updateReport(report, 'failed', stats, statsTime); const webhookMessage = `😞 *Test with id: ${report.test_id} Failed*.\ntest configuration:\nenvironment: ${report.environment}\n${stats.data}`; if (job.webhooks) { reportWebhookSender.send(report.test_id, report.report_id, webhookMessage, job.webhooks); @@ -63,7 +63,7 @@ async function handleStart(report, job, stats) { webhookMessage = `🤓 *Test ${report.test_name} with id: ${report.test_id} has started*.\n *test configuration:* environment: ${report.environment} duration: ${report.duration} seconds, arrival rate: ${report.arrival_rate} scenarios per second, number of runners: ${parallelism}${rampToMessage}`; } - await databaseConnector.updateReport(report.test_id, report.report_id, reportStatus, stats.phase_index, undefined, undefined); + await reportsManager.updateReport(report, reportStatus, stats); if (job.webhooks && webhookMessage) { reportWebhookSender.send(report.test_id, report.report_id, webhookMessage, job.webhooks); } @@ -71,10 +71,10 @@ async function handleStart(report, job, stats) { async function handleIntermediate(report, job, stats, statsTime, statsData) { let webhookMessage; - await databaseConnector.updateReport(report.test_id, report.report_id, 'in_progress', report.phase, stats.data, undefined); - await databaseConnector.insertStats(stats.container_id, report.test_id, report.report_id, uuidv4(), statsTime, report.phase, 'intermediate', stats.data); + await reportsManager.updateReport(report, 'in_progress', stats, statsTime); + await databaseConnector.insertStats(stats.runner_id, report.test_id, report.report_id, uuidv4(), statsTime, report.phase, 'intermediate', stats.data); - if (report && report.status === ('started')) { + if (report && report.status === 'started') { let htmlReportUrl = serviceConfig.externalAddress + `/tests/${report.test_id}/reports/${report.report_id}/html`; const phaseIndex = report.phase; webhookMessage = `🤔 *Test ${report.test_name} with id: ${report.test_id} first batch of results arrived for phase ${phaseIndex}.*\n${statsFromatter.getStatsFormatted('intermediate', statsData)}\n<${htmlReportUrl}|Track report in html report>\n`; @@ -88,8 +88,8 @@ async function handleIntermediate(report, job, stats, statsTime, statsData) { } async function handleDone(report, job, stats, statsTime, statsData) { - await databaseConnector.insertStats(stats.container_id, report.test_id, report.report_id, uuidv4(), statsTime, report.phase, 'aggregate', stats.data); - await databaseConnector.updateReport(report.test_id, report.report_id, 'finished', report.phase, stats.data, statsTime); + await databaseConnector.insertStats(stats.runner_id, report.test_id, report.report_id, uuidv4(), statsTime, report.phase, 'aggregate', stats.data); + await reportsManager.updateReport(report, 'finished', stats, statsTime); const htmlReportUrl = serviceConfig.externalAddress + `/tests/${report.test_id}/reports/${report.report_id}/html`; let webhookMessage = `😎 *Test ${report.test_name} with id: ${report.test_id} is finished.*\n${statsFromatter.getStatsFormatted('aggregate', statsData)}\n<${htmlReportUrl}|View final html report>\n`; @@ -107,7 +107,7 @@ async function handleDone(report, job, stats, statsTime, statsData) { } async function handleAbort(report, job, stats, statsTime) { - await databaseConnector.updateReport(report.test_id, report.report_id, 'aborted', report.phase, undefined, statsTime); + await reportsManager.updateReport(report, 'aborted', stats, statsTime); if (job.webhooks) { const htmlReportUrl = serviceConfig.externalAddress + `/tests/${report.test_id}/reports/${report.report_id}/html`; @@ -117,4 +117,4 @@ async function handleAbort(report, job, stats, statsTime) { } reportWebhookSender.send(report.test_id, report.report_id, webhookMessage, job.webhooks); } -} \ No newline at end of file +} diff --git a/src/tests/placeholder b/src/tests/placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/integration-tests/reports/helpers/statsGenerator.js b/tests/integration-tests/reports/helpers/statsGenerator.js index a028c2b93..736c06eb9 100644 --- a/tests/integration-tests/reports/helpers/statsGenerator.js +++ b/tests/integration-tests/reports/helpers/statsGenerator.js @@ -8,7 +8,7 @@ module.exports.generateStats = (phaseStatus) => { case 'error': const error = new Error('Error thrown'); stats = { - container_id: uuid(), + runner_id: uuid(), phase_status: 'error', stats_time: Date.now().toString(), data: JSON.stringify({message: error.message}), @@ -23,7 +23,7 @@ module.exports.generateStats = (phaseStatus) => { 'index': 0 }; stats = { - container_id: uuid(), + runner_id: uuid(), phase_index: startedPhaseInfo.index.toString(), phase_status: 'started_phase', stats_time: Date.now().toString(), @@ -69,7 +69,7 @@ module.exports.generateStats = (phaseStatus) => { 'scenariosAvoided': 0 }; stats = { - container_id: uuid(), + runner_id: uuid(), phase_status: 'intermediate', stats_time: Date.now().toString(), data: JSON.stringify(intermediatePhaseInfo) @@ -114,7 +114,7 @@ module.exports.generateStats = (phaseStatus) => { 'scenariosAvoided': 0 }; stats = { - container_id: uuid(), + runner_id: uuid(), phase_status: 'done', stats_time: Date.now().toString(), data: JSON.stringify(donePhaseInfo) @@ -125,7 +125,7 @@ module.exports.generateStats = (phaseStatus) => { }; stats = { - container_id: uuid(), + runner_id: uuid(), phase_status: 'aborted', stats_time: Date.now().toString(), data: JSON.stringify(abortedPhaseInfo) diff --git a/tests/unit-tests/reporter/cassandra/cassandra-test.js b/tests/unit-tests/reporter/cassandra/cassandra-test.js index 84b13fde8..82d0afdfd 100644 --- a/tests/unit-tests/reporter/cassandra/cassandra-test.js +++ b/tests/unit-tests/reporter/cassandra/cassandra-test.js @@ -187,7 +187,7 @@ describe('Cassandra client tests', function() { }); describe('Insert new stats', function(){ - const containerId = uuid(); + const runnerId = uuid(); const statId = uuid(); const statsTime = new Date().getTime(); const phaseIndex = uuid(0); @@ -196,12 +196,12 @@ describe('Cassandra client tests', function() { it('should succeed simple insert', function(){ clientExecuteStub.resolves({ result: { rowLength: 0 } }); - let query = 'INSERT INTO reports_stats(container_id, test_id, report_id, stats_id, stats_time, phase_index, phase_status, data) values(?,?,?,?,?,?,?,?)'; - return cassandraClient.insertStats(containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) + let query = 'INSERT INTO reports_stats(runner_id, test_id, report_id, stats_id, stats_time, phase_index, phase_status, data) values(?,?,?,?,?,?,?,?)'; + return cassandraClient.insertStats(runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) .then(function(){ loggerErrorStub.callCount.should.eql(0); clientExecuteStub.getCall(0).args[0].should.eql(query); - clientExecuteStub.getCall(0).args[1][0].should.eql(containerId); + clientExecuteStub.getCall(0).args[1][0].should.eql(runnerId); clientExecuteStub.getCall(0).args[1][1].should.eql(testId); clientExecuteStub.getCall(0).args[1][2].should.eql(reportId); clientExecuteStub.getCall(0).args[1][3].should.eql(statId); @@ -210,7 +210,7 @@ describe('Cassandra client tests', function() { it('should log error for failing inserting new report', function(){ clientExecuteStub.rejects(); - return cassandraClient.insertStats(containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) + return cassandraClient.insertStats(runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data) .catch(function(){ loggerErrorStub.callCount.should.eql(1); }); diff --git a/tests/unit-tests/reporter/models/statsConsumer-test.js b/tests/unit-tests/reporter/models/statsConsumer-test.js index ffba9ed06..1c6cc4cd0 100644 --- a/tests/unit-tests/reporter/models/statsConsumer-test.js +++ b/tests/unit-tests/reporter/models/statsConsumer-test.js @@ -170,7 +170,7 @@ describe('Stats consumer test', () => { statsFormatterStub.returns('max: 1, min: 0.4, median: 0.7'); - await statsConsumer.handleMessage('test_id', 1, {container_id: 'container_id', stats_time: statsTime, phase_status: 'intermediate', data: JSON.stringify({ report: {reportId: 1} })}); + await statsConsumer.handleMessage('test_id', 1, {runner_id: 'runner_id', stats_time: statsTime, phase_status: 'intermediate', data: JSON.stringify({ report: {reportId: 1} })}); reportWebhookSenderSendStub.callCount.should.equal(1); reportWebhookSenderSendStub.args.should.containDeep([ @@ -190,7 +190,7 @@ describe('Stats consumer test', () => { ]); databaseConnectorInsertStatsStub.callCount.should.eql(1); - databaseConnectorInsertStatsStub.args[0][0].should.eql('container_id'); + databaseConnectorInsertStatsStub.args[0][0].should.eql('runner_id'); databaseConnectorInsertStatsStub.args[0][1].should.eql('test_id'); databaseConnectorInsertStatsStub.args[0][2].should.eql(1); databaseConnectorInsertStatsStub.args[0][3].should.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); @@ -223,7 +223,7 @@ describe('Stats consumer test', () => { statsFormatterStub.returns('max: 1, min: 0.4, median: 0.7'); - await statsConsumer.handleMessage('test_id', 1, {container_id: 'container_id', stats_time: statsTime, phase_status: 'intermediate', data: JSON.stringify({ report: {reportId: 1} })}); + await statsConsumer.handleMessage('test_id', 1, {runner_id: 'runner_id', stats_time: statsTime, phase_status: 'intermediate', data: JSON.stringify({ report: {reportId: 1} })}); reportWebhookSenderSendStub.callCount.should.equal(0); loggerInfoStub.callCount.should.equal(1); @@ -235,7 +235,7 @@ describe('Stats consumer test', () => { ]); databaseConnectorInsertStatsStub.callCount.should.eql(1); - databaseConnectorInsertStatsStub.args[0][0].should.eql('container_id'); + databaseConnectorInsertStatsStub.args[0][0].should.eql('runner_id'); databaseConnectorInsertStatsStub.args[0][1].should.eql('test_id'); databaseConnectorInsertStatsStub.args[0][2].should.eql(1); databaseConnectorInsertStatsStub.args[0][3].should.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); @@ -273,7 +273,7 @@ describe('Stats consumer test', () => { statsFormatterStub.returns('max: 1, min: 0.4, median: 0.7'); - await statsConsumer.handleMessage('test_id', 1, {container_id: 'container_id', stats_time: statsTime, phase_status: 'done', data: JSON.stringify({ report: {reportId: 1} })}); + await statsConsumer.handleMessage('test_id', 1, {runner_id: 'runner_id', stats_time: statsTime, phase_status: 'done', data: JSON.stringify({ report: {reportId: 1} })}); reportWebhookSenderSendStub.callCount.should.equal(1); reportWebhookSenderSendStub.args.should.containDeep([ @@ -304,7 +304,7 @@ describe('Stats consumer test', () => { ]); databaseConnectorInsertStatsStub.callCount.should.eql(1); - databaseConnectorInsertStatsStub.args[0][0].should.eql('container_id'); + databaseConnectorInsertStatsStub.args[0][0].should.eql('runner_id'); databaseConnectorInsertStatsStub.args[0][1].should.eql('test_id'); databaseConnectorInsertStatsStub.args[0][2].should.eql(1); databaseConnectorInsertStatsStub.args[0][3].should.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); @@ -342,7 +342,7 @@ describe('Stats consumer test', () => { statsFormatterStub.returns('max: 1, min: 0.4, median: 0.7'); - await statsConsumer.handleMessage('test_id', 1, {container_id: 'container_id', stats_time: statsTime, phase_status: 'aborted', data: JSON.stringify({revisionId: 'revision_id', webhooks: ['http://www.zooz.com'], testId: 'test_id', runId: 'run_id', environment: 'test'})}); + await statsConsumer.handleMessage('test_id', 1, {runner_id: 'runner_id', stats_time: statsTime, phase_status: 'aborted', data: JSON.stringify({revisionId: 'revision_id', webhooks: ['http://www.zooz.com'], testId: 'test_id', runId: 'run_id', environment: 'test'})}); reportWebhookSenderSendStub.callCount.should.equal(1); reportWebhookSenderSendStub.args.should.containDeep([ diff --git a/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js b/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js index 3be45965c..065eb537d 100644 --- a/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js +++ b/tests/unit-tests/reporter/sequelize/sequelizeConnector-test.js @@ -293,17 +293,17 @@ describe('Sequelize client tests', function () { describe('Insert stats', () => { it('should succeed inserting stats', async () => { await sequelizeConnector.init(sequelizeStub()); - const containerId = uuid(); + const runnerId = uuid(); const statsTime = Date.now(); const statId = uuid(); const phaseIndex = 0; const phaseStatus = 'initiliazed'; const data = JSON.stringify({message: 'started'}); - await sequelizeConnector.insertStats(containerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data); + await sequelizeConnector.insertStats(runnerId, testId, reportId, statId, statsTime, phaseIndex, phaseStatus, data); should(sequelizeInsertStatsStub.args[0][0]).eql({ - 'container_id': containerId, + 'runner_id': runnerId, 'data': data, 'phase_index': 0, 'phase_status': 'initiliazed', @@ -327,7 +327,7 @@ describe('Sequelize client tests', function () { stats_id: statId, test_id: testId, report_id: reportId, - container_id: uuid(), + runner_id: uuid(), stats_time: statsTime, phase_status: uuid(), phase_index: uuid(),