openstack-health/app/js/controllers/grouped-runs.js

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);