figuring out the event_queue flow

This commit is contained in:
John Mitchell 2016-09-30 08:51:26 -04:00 committed by jaredevantabor
parent c4eb6515b1
commit 9f5bec7767
3 changed files with 143 additions and 97 deletions

View File

@ -4,23 +4,135 @@
* All Rights Reserved
*************************************************/
export default [function(){
var val = {
var val = {};
// the playbook_on_stats event returns the count data in a weird format.
// format to what we need!
var getCountsFromStatsEvent = function(event_data) {
var hosts = {},
hostsArr;
// iterate over the event_data and populate an object with hosts
// and their status data
Object.keys(event_data).forEach(key => {
// failed passes boolean not integer
if (key === "failed") {
// array of hosts from failed type
hostsArr = Object.keys(event_data[key]);
hostsArr.forEach(host => {
if (!hosts[host]) {
// host has not been added to hosts object
// add now
hosts[host] = {};
}
hosts[host][key] = event_data[key][host];
});
} else {
// array of hosts from each type ("changed", "dark", etc.)
hostsArr = Object.keys(event_data[key]);
hostsArr.forEach(host => {
if (!hosts[host]) {
// host has not been added to hosts object
// add now
hosts[host] = {};
}
if (!hosts[host][key]) {
// host doesn't have key
hosts[host][key] = 0;
}
hosts[host][key] += event_data[key][host];
});
}
});
// use the hosts data populate above to get the count
var count = {
ok : _.filter(hosts, function(o){
return !o.failures && !o.changed && o.ok > 0;
}),
skipped : _.filter(hosts, function(o){
return o.skipped > 0;
}),
unreachable : _.filter(hosts, function(o){
return o.dark > 0;
}),
failures : _.filter(hosts, function(o){
return o.failed === true;
}),
changed : _.filter(hosts, function(o){
return o.changed > 0;
})
};
// turn the count into an actual count, rather than a list of host
// names
Object.keys(count).forEach(key => {
count[key] = count[key].length;
});
return count;
};
// munge the raw event from the backend into the event_queue's format
var mungeEvent = function(event) {
var mungedEvent = {
id: event.id,
processed: false
};
if (event.event_name === 'playbook_on_start') {
event.count = val.queue.count;
mungedEvent.changes = ['count'];
} else if (event.event_name === 'runner_on_ok' ||
event.event_name === 'runner_on_async_ok') {
val.queue.count.ok++;
event.count = val.queue.count;
mungedEvent.changes = ['count'];
} else if (event.event_name === 'runner_on_skipped') {
val.queue.count.skipped++;
event.count = val.queue.count;
mungedEvent.changes = ['count'];
} else if (event.event_name === 'runner_on_unreachable') {
val.queue.count.unreachable++;
event.count = val.queue.count;
mungedEvent.changes = ['count'];
} else if (event.event_name === 'runner_on_error' ||
event.event_name === 'runner_on_async_failed') {
val.queue.count.failed++;
event.count = val.queue.count;
mungedEvent.changes = ['count'];
} else if (event.event_name === 'playbook_on_stats') {
// get the data for populating the host status bar
val.queue.count = getCountsFromStatsEvent(event.event_data);
event.count = val.queue.count;
mungedEvent.changes = ['count'];
}
return mungedEvent;
};
val = {
queue: {},
// munge the raw event from the backend into the event_queue's format
mungeEvent: function(event) {
event.processed = false;
return event;
},
// reinitializes the event queue value for the job results page
initialize: function() {
val.queue = {};
// initialize the host status counts
val.queue.count = {
ok: 0,
skipped: 0,
unreachable: 0,
failures: 0,
changed: 0
};
},
// populates the event queue
populate: function(event) {
var mungedEvent = val.mungeEvent(event);
var mungedEvent = mungeEvent(event);
val.queue[event.id] = mungedEvent;
return mungedEvent;
},
// the event has been processed in the view and should be marked as
// completed in the queue
@ -28,5 +140,6 @@ export default [function(){
val.queue[event.id].processed = true;
}
};
return val;
}];

View File

@ -1,22 +1,4 @@
export default ['jobData', 'jobDataOptions', 'jobLabels', '$scope', 'ParseTypeChange', 'ParseVariableString', 'jobResultsService', '$rootScope', 'eventQueue', function(jobData, jobDataOptions, jobLabels, $scope, ParseTypeChange, ParseVariableString, jobResultsService, $rootScope, eventQueue) {
// just putting the event queue on scope so it can be inspected in the
// console
$scope.event_queue = eventQueue.queue;
var processEvent = function(event) {
// put the event in the queue
eventQueue.populate(event);
if(event.event_name === "playbook_on_stats"){
// get the data for populating the host status bar
$scope.count = jobResultsService
.getHostStatusBarCounts(event.event_data);
// mark the event as processed in the queue;
eventQueue.markProcessed(event);
}
}
var getTowerLinks = function() {
var getTowerLink = function(key) {
if ($scope.job.related[key]) {
@ -76,9 +58,6 @@ export default ['jobData', 'jobDataOptions', 'jobLabels', '$scope', 'ParseTypeCh
$scope.stdoutFullScreen = !$scope.stdoutFullScreen;
};
// Initially set the count data to have no hosts as finsihed
$scope.count = {ok: 0, skipped: 0, unreachable: 0, failures: 0, changed: 0};
$scope.deleteJob = function() {
jobResultsService.deleteJob($scope.job);
};
@ -87,6 +66,27 @@ export default ['jobData', 'jobDataOptions', 'jobLabels', '$scope', 'ParseTypeCh
jobResultsService.cancelJob($scope.job);
};
// EVENT STUFF BELOW
// just putting the event queue on scope so it can be inspected in the
// console
$scope.event_queue = eventQueue.queue;
var processEvent = function(event) {
// put the event in the queue
var mungedEvent = eventQueue.populate(event);
// make changes to ui based on the event returned from the queue
mungedEvent.changes.forEach(change => {
if (change === 'count') {
$scope.count = mungedEvent.count;
}
});
// the changes have been processed in the ui, mark it in the queue
eventQueue.markProcessed(event);
};
// grab completed event data and process each event
jobResultsService.getEvents($scope.job)
.then(events => {
@ -96,12 +96,11 @@ export default ['jobData', 'jobDataOptions', 'jobLabels', '$scope', 'ParseTypeCh
event.event_name = event.event;
processEvent(event);
});
})
});
// process incoming job events
$rootScope.event_socket.on("job_events-" + $scope.job.id, function(data) {
processEvent(data);
});
// process incoming job status changes

View File

@ -7,72 +7,6 @@
export default ['$q', 'Prompt', '$filter', 'Wait', 'Rest', '$state', 'ProcessErrors', function ($q, Prompt, $filter, Wait, Rest, $state, ProcessErrors) {
var val = {
getHostStatusBarCounts: function(event_data) {
var hosts = {},
hostsArr;
// iterate over the event_data and populate an object with hosts
// and their status data
Object.keys(event_data).forEach(key => {
// failed passes boolean not integer
if (key === "failed") {
// array of hosts from failed type
hostsArr = Object.keys(event_data[key]);
hostsArr.forEach(host => {
if (!hosts[host]) {
// host has not been added to hosts object
// add now
hosts[host] = {};
}
hosts[host][key] = event_data[key][host];
});
} else {
// array of hosts from each type ("changed", "dark", etc.)
hostsArr = Object.keys(event_data[key]);
hostsArr.forEach(host => {
if (!hosts[host]) {
// host has not been added to hosts object
// add now
hosts[host] = {};
}
if (!hosts[host][key]) {
// host doesn't have key
hosts[host][key] = 0;
}
hosts[host][key] += event_data[key][host];
});
}
});
// use the hosts data populate above to get the count
var count = {
ok : _.filter(hosts, function(o){
return !o.failures && !o.changed && o.ok > 0;
}),
skipped : _.filter(hosts, function(o){
return o.skipped > 0;
}),
unreachable : _.filter(hosts, function(o){
return o.dark > 0;
}),
failures : _.filter(hosts, function(o){
return o.failed === true;
}),
changed : _.filter(hosts, function(o){
return o.changed > 0;
})
};
// turn the count into an actual count, rather than a list of host
// names
Object.keys(count).forEach(key => {
count[key] = count[key].length;
});
return count;
},
getEvents: function(job) {
var val = $q.defer();