From 9f5bec7767e72ca3cb333a65edbb665e93536b14 Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Fri, 30 Sep 2016 08:51:26 -0400 Subject: [PATCH] figuring out the event_queue flow --- .../src/job-results/event-queue.service.js | 129 ++++++++++++++++-- .../src/job-results/job-results.controller.js | 45 +++--- .../src/job-results/job-results.service.js | 66 --------- 3 files changed, 143 insertions(+), 97 deletions(-) diff --git a/awx/ui/client/src/job-results/event-queue.service.js b/awx/ui/client/src/job-results/event-queue.service.js index 7d1e29c736..6c72b4432c 100644 --- a/awx/ui/client/src/job-results/event-queue.service.js +++ b/awx/ui/client/src/job-results/event-queue.service.js @@ -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; }]; diff --git a/awx/ui/client/src/job-results/job-results.controller.js b/awx/ui/client/src/job-results/job-results.controller.js index 9c81bda573..63ffe6d2b1 100644 --- a/awx/ui/client/src/job-results/job-results.controller.js +++ b/awx/ui/client/src/job-results/job-results.controller.js @@ -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 diff --git a/awx/ui/client/src/job-results/job-results.service.js b/awx/ui/client/src/job-results/job-results.service.js index 76ee2bca94..c271f7dd3c 100644 --- a/awx/ui/client/src/job-results/job-results.service.js +++ b/awx/ui/client/src/job-results/job-results.service.js @@ -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();