169 lines
4.2 KiB
JavaScript
169 lines
4.2 KiB
JavaScript
'use strict';
|
|
|
|
var controllersModule = require('./_index');
|
|
|
|
/**
|
|
* @ngInject
|
|
*/
|
|
function GroupedRunsController(
|
|
$scope, pageTitleService, healthService, viewService, periodsService,
|
|
runMetadataKey, name, $location) {
|
|
|
|
// ViewModel
|
|
var vm = this;
|
|
|
|
vm.searchJob = $location.search().searchJob || '';
|
|
|
|
// decodeURI is needed here because project names contains slash as part
|
|
// of the name. As this come from an URL part and URL can be encoded,
|
|
// this decode call make the project name exhibition properly.
|
|
vm.runMetadataKey = decodeURIComponent(runMetadataKey);
|
|
vm.name = decodeURIComponent(name);
|
|
vm.recentRuns = [];
|
|
vm.loaded = false;
|
|
vm.hold = 0;
|
|
|
|
// update the global grouping key - if we arrived here directly, it will not
|
|
// be set already
|
|
viewService.groupKey(runMetadataKey);
|
|
|
|
// Updates the page title based on the selected runMetadataKey
|
|
pageTitleService.update(vm.runMetadataKey);
|
|
|
|
var configurePeriods = function() {
|
|
vm.hold += 1;
|
|
|
|
var res = viewService.resolution();
|
|
var periods = periodsService.get('grouped-runs', res.key);
|
|
|
|
viewService.periods(periods.min, periods.max, true);
|
|
viewService.preferredDuration(periods.preference);
|
|
|
|
vm.hold -= 1;
|
|
};
|
|
|
|
vm.processData = function(data, regex) {
|
|
// prepare chart data
|
|
var jobs = {};
|
|
var passEntries = [];
|
|
var failEntries = [];
|
|
var failRateEntries = [];
|
|
var pattern = null;
|
|
try {
|
|
pattern = new RegExp(regex);
|
|
} catch (e) {
|
|
pattern = '';
|
|
}
|
|
|
|
if (!data.timedelta) {
|
|
return;
|
|
}
|
|
|
|
data.timedelta.forEach(function(timedelta) {
|
|
var totalPass = 0;
|
|
var totalFail = 0;
|
|
var failRate = 0;
|
|
var DEFAULT_FAIL_RATE = 0;
|
|
|
|
timedelta.job_data.forEach(function(job) {
|
|
if (pattern.test(job.job_name)) {
|
|
|
|
var successfulJobs = 0;
|
|
var failedJobs = 0;
|
|
var jobFailRate = 0;
|
|
|
|
if (!jobs[job.job_name]) {
|
|
var jobMetrics = {
|
|
name: job.job_name,
|
|
passes: 0,
|
|
failures: 0,
|
|
failuresRate: 0
|
|
};
|
|
jobs[job.job_name] = jobMetrics;
|
|
}
|
|
|
|
totalPass += job.pass;
|
|
totalFail += job.fail;
|
|
|
|
jobs[job.job_name].passes += job.pass;
|
|
jobs[job.job_name].failures += job.fail;
|
|
|
|
successfulJobs = jobs[job.job_name].passes;
|
|
failedJobs = jobs[job.job_name].failures;
|
|
jobFailRate = (failedJobs / (failedJobs + successfulJobs)) * 100 || DEFAULT_FAIL_RATE;
|
|
|
|
jobs[job.job_name].failuresRate = jobFailRate;
|
|
}
|
|
});
|
|
|
|
failRate = totalFail / (totalFail + totalPass) || DEFAULT_FAIL_RATE;
|
|
|
|
passEntries.push({
|
|
x: new Date(timedelta.datetime).getTime(),
|
|
y: totalPass
|
|
});
|
|
|
|
failEntries.push({
|
|
x: new Date(timedelta.datetime).getTime(),
|
|
y: totalFail
|
|
});
|
|
|
|
failRateEntries.push({
|
|
x: new Date(timedelta.datetime).getTime(),
|
|
y: failRate * 100
|
|
});
|
|
});
|
|
|
|
vm.passes = passEntries;
|
|
vm.failures = failEntries;
|
|
vm.failRates = failRateEntries;
|
|
|
|
vm.chartDataRate = [
|
|
{ key: '% Failures', values: failRateEntries }
|
|
];
|
|
|
|
vm.jobs = Object.keys(jobs).map(function(name) {
|
|
return jobs[name];
|
|
});
|
|
};
|
|
|
|
vm.loadData = function() {
|
|
if (vm.hold > 0) {
|
|
return;
|
|
}
|
|
|
|
healthService.getRunsForRunMetadataKey(vm.runMetadataKey, vm.name, {
|
|
start_date: viewService.periodStart(),
|
|
stop_date: viewService.periodEnd(),
|
|
datetime_resolution: viewService.resolution().key
|
|
}).then(function(response) {
|
|
vm.processData(response.data, vm.searchJob);
|
|
vm.loaded = true;
|
|
});
|
|
healthService.getRecentGroupedRuns(vm.runMetadataKey, vm.name).then(function(response) {
|
|
vm.recentRuns = response.data;
|
|
});
|
|
};
|
|
|
|
configurePeriods();
|
|
vm.loadData();
|
|
|
|
$scope.$on('view:resolution', function(event, resolution) {
|
|
configurePeriods();
|
|
vm.loadData();
|
|
});
|
|
|
|
$scope.$on('view:period', function(event, corrected) {
|
|
if (vm.loaded && !corrected) {
|
|
vm.loadData();
|
|
}
|
|
});
|
|
|
|
vm.onSearchChange = function() {
|
|
$location.search('searchJob', $scope.groupedRuns.searchJob).replace();
|
|
vm.loadData();
|
|
};
|
|
}
|
|
|
|
controllersModule.controller('GroupedRunsController', GroupedRunsController);
|