diff --git a/hack/jenkins/test-flake-chart/flake_chart.js b/hack/jenkins/test-flake-chart/flake_chart.js index d0a18757f8..4f2dfddeac 100644 --- a/hack/jenkins/test-flake-chart/flake_chart.js +++ b/hack/jenkins/test-flake-chart/flake_chart.js @@ -135,6 +135,8 @@ function aggregateRuns(testRuns) { })); } +const hashToLink = (hash, environment) => `https://storage.googleapis.com/minikube-builds/logs/master/${hash.substring(0,7)}/${environment}.html`; + function displayTestAndEnvironmentChart(testData, testName, environmentName) { const data = new google.visualization.DataTable(); data.addColumn('date', 'Date'); @@ -147,8 +149,6 @@ function displayTestAndEnvironmentChart(testData, testName, environmentName) { // Filter to only contain unskipped runs of the requested test and requested environment. .filter(test => test.name === testName && test.environment === environmentName && test.status !== testStatus.SKIPPED); - const hashToLink = (hash, environment) => `https://storage.googleapis.com/minikube-builds/logs/master/${hash.substring(0,7)}/${environment}.html`; - data.addRows( aggregateRuns(testRuns) .map(groupData => [ @@ -191,6 +191,61 @@ function displayTestAndEnvironmentChart(testData, testName, environmentName) { chart.draw(data, options); } +function displayEnvironmentChart(testData, environmentName) { + const testRuns = testData + // Filter to only contain unskipped runs of the requested test and requested environment. + .filter(test => test.environment === environmentName && test.status !== testStatus.SKIPPED) + .groupBy(test => test.name); + + const testNames = testRuns.map(test => test[0].name); + + const data = new google.visualization.DataTable(); + data.addColumn('date', 'Date'); + for (const name of testNames) { + data.addColumn('number', `Flake Percentage - ${name}`); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + } + + const aggregatedRuns = new Map(testRuns.map(test => [ + test[0].name, + new Map(aggregateRuns(test) + .map(runDate => [ runDate.date.getTime(), runDate ]))])); + const uniqueDates = new Set(); + for (const [_, runDateMap] of aggregatedRuns) { + for (const [dateTime, _] of runDateMap) { + uniqueDates.add(dateTime); + } + } + const orderedDates = Array.from(uniqueDates).sort(); + data.addRows( + orderedDates.map(dateTime => [new Date(dateTime)].concat(testNames.map(name => { + const data = aggregatedRuns.get(name).get(dateTime); + return data !== undefined ? [ + data.flakeRate, + `