diff --git a/awx/ui/static/js/controllers/JobDetail.js b/awx/ui/static/js/controllers/JobDetail.js
index c0239afff3..1334255be4 100644
--- a/awx/ui/static/js/controllers/JobDetail.js
+++ b/awx/ui/static/js/controllers/JobDetail.js
@@ -222,87 +222,92 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
}
scope.removeLoadHosts = scope.$on('LoadHosts', function() {
if (scope.activeTask) {
+
var play = scope.jobData.plays[scope.activePlay],
task = play.tasks[scope.activeTask],
url;
- url = scope.job.related.job_events + '?parent=' + task.id + '&';
- url += 'event__startswith=runner&page_size=' + scope.hostResultsMaxRows + '&order_by=-host__name';
+ if (play && task) {
+ url = scope.job.related.job_events + '?parent=' + task.id + '&';
+ url += 'event__startswith=runner&page_size=' + scope.hostResultsMaxRows + '&order_by=-host__name';
- Rest.setUrl(url);
- Rest.get()
- .success(function(data) {
- var idx, event, status, status_text, item, msg;
- if (data.results.length > 0) {
- lastEventId = data.results[0].id;
- }
- scope.next_host_results = data.next;
- for (idx=data.results.length - 1; idx >= 0; idx--) {
- event = data.results[idx];
- if (event.event === "runner_on_skipped") {
- status = 'skipped';
- }
- else if (event.event === "runner_on_unreachable") {
- status = 'unreachable';
- }
- else {
- status = (event.failed) ? 'failed' : (event.changed) ? 'changed' : 'successful';
- }
- switch(status) {
- case "successful":
- status_text = 'OK';
- break;
- case "changed":
- status_text = "Changed";
- break;
- case "failed":
- status_text = "Failed";
- break;
- case "unreachable":
- status_text = "Unreachable";
- break;
- case "skipped":
- status_text = "Skipped";
+ Rest.setUrl(url);
+ Rest.get()
+ .success(function(data) {
+ var idx, event, status, status_text, item, msg;
+ if (data.results.length > 0) {
+ lastEventId = data.results[0].id;
}
+ scope.next_host_results = data.next;
+ for (idx=data.results.length - 1; idx >= 0; idx--) {
+ event = data.results[idx];
+ if (event.event === "runner_on_skipped") {
+ status = 'skipped';
+ }
+ else if (event.event === "runner_on_unreachable") {
+ status = 'unreachable';
+ }
+ else {
+ status = (event.failed) ? 'failed' : (event.changed) ? 'changed' : 'successful';
+ }
+ switch(status) {
+ case "successful":
+ status_text = 'OK';
+ break;
+ case "changed":
+ status_text = "Changed";
+ break;
+ case "failed":
+ status_text = "Failed";
+ break;
+ case "unreachable":
+ status_text = "Unreachable";
+ break;
+ case "skipped":
+ status_text = "Skipped";
+ }
- if (event.event_data && event.event_data.res) {
- item = event.event_data.res.item;
- if (typeof item === "object") {
- item = JSON.stringify(item);
+ if (event.event_data && event.event_data.res) {
+ item = event.event_data.res.item;
+ if (typeof item === "object") {
+ item = JSON.stringify(item);
+ }
+ }
+
+ msg = '';
+ if (event.event_data && event.event_data.res) {
+ if (typeof event.event_data.res === 'object') {
+ msg = event.event_data.res.msg;
+ } else {
+ msg = event.event_data.res;
+ }
+ }
+
+ if (event.event !== "runner_on_no_hosts") {
+ task.hostResults[event.id] = {
+ id: event.id,
+ status: status,
+ status_text: status_text,
+ host_id: event.host,
+ task_id: event.parent,
+ name: event.event_data.host,
+ created: event.created,
+ msg: msg,
+ item: item
+ };
}
}
-
- msg = '';
- if (event.event_data && event.event_data.res) {
- if (typeof event.event_data.res === 'object') {
- msg = event.event_data.res.msg;
- } else {
- msg = event.event_data.res;
- }
- }
-
- if (event.event !== "runner_on_no_hosts") {
- task.hostResults[event.id] = {
- id: event.id,
- status: status,
- status_text: status_text,
- host_id: event.host,
- task_id: event.parent,
- name: event.event_data.host,
- created: event.created,
- msg: msg,
- item: item
- };
- }
- }
- scope.$emit('LoadHostSummaries');
- })
- .error(function(data, status) {
- ProcessErrors(scope, data, status, null, { hdr: 'Error!',
- msg: 'Call to ' + url + '. GET returned: ' + status });
- });
- }
- else {
+ scope.$emit('LoadHostSummaries');
+ })
+ .error(function(data, status) {
+ ProcessErrors(scope, data, status, null, { hdr: 'Error!',
+ msg: 'Call to ' + url + '. GET returned: ' + status });
+ });
+ } else {
+ console.log('no tasks loaded!');
+ scope.$emit('LoadHostSummaries');
+ }
+ } else {
scope.$emit('LoadHostSummaries');
}
});
@@ -314,98 +319,104 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
if (scope.activePlay) {
var play = scope.jobData.plays[scope.activePlay], url;
- url = scope.job.url + 'job_tasks/?event_id=' + play.id;
- url += '&page_size=' + scope.tasksMaxRows + '&order_by=id';
+ if (play) {
+ url = scope.job.url + 'job_tasks/?event_id=' + play.id;
+ url += '&page_size=' + scope.tasksMaxRows + '&order_by=id';
- Rest.setUrl(url);
- Rest.get()
- .success(function(data) {
- scope.next_tasks = data.next;
- if (data.results.length > 0) {
- lastEventId = data.results[data.results.length - 1].id;
- if (scope.liveEventProcessing) {
- scope.activeTask = data.results[data.results.length - 1].id;
+ Rest.setUrl(url);
+ Rest.get()
+ .success(function(data) {
+ scope.next_tasks = data.next;
+ if (data.results.length > 0) {
+ lastEventId = data.results[data.results.length - 1].id;
+ if (scope.liveEventProcessing) {
+ scope.activeTask = data.results[data.results.length - 1].id;
+ }
+ else {
+ scope.activeTask = data.results[0].id;
+ }
+ scope.selectedTask = scope.activeTask;
}
- else {
- scope.activeTask = data.results[0].id;
- }
- scope.selectedTask = scope.activeTask;
- }
- data.results.forEach(function(event, idx) {
- var end, elapsed, status, status_text;
+ data.results.forEach(function(event, idx) {
+ var end, elapsed, status, status_text;
- if (play.firstTask === undefined || play.firstTask === null) {
- play.firstTask = event.id;
- play.hostCount = (event.host_count) ? event.host_count : 0;
- }
+ if (play.firstTask === undefined || play.firstTask === null) {
+ play.firstTask = event.id;
+ play.hostCount = (event.host_count) ? event.host_count : 0;
+ }
- if (idx < data.length - 1) {
- // end date = starting date of the next event
- end = data[idx + 1].created;
- }
- else {
- // no next event (task), get the end time of the play
- end = scope.jobData.plays[scope.activePlay].finished;
- }
+ if (idx < data.length - 1) {
+ // end date = starting date of the next event
+ end = data[idx + 1].created;
+ }
+ else {
+ // no next event (task), get the end time of the play
+ end = scope.jobData.plays[scope.activePlay].finished;
+ }
- if (end) {
- elapsed = GetElapsed({
- start: event.created,
- end: end
+ if (end) {
+ elapsed = GetElapsed({
+ start: event.created,
+ end: end
+ });
+ }
+ else {
+ elapsed = '00:00:00';
+ }
+
+ status = (event.failed) ? 'failed' : (event.changed) ? 'changed' : 'successful';
+ status_text = (event.failed) ? 'Failed' : (event.changed) ? 'Changed' : 'OK';
+
+ play.tasks[event.id] = {
+ id: event.id,
+ play_id: scope.activePlay,
+ name: event.name,
+ status: status,
+ status_text: status_text,
+ status_tip: "Event ID: " + event.id + "
Status: " + status_text,
+ created: event.created,
+ modified: event.modified,
+ finished: end,
+ elapsed: elapsed,
+ hostCount: (event.host_count) ? event.host_count : 0,
+ reportedHosts: (event.reported_hosts) ? event.reported_hosts : 0,
+ successfulCount: (event.successful_count) ? event.successful_count : 0,
+ failedCount: (event.failed_count) ? event.failed_count : 0,
+ changedCount: (event.changed_count) ? event.changed_count : 0,
+ skippedCount: (event.skipped_count) ? event.skipped_count : 0,
+ unreachableCount: (event.unreachable_count) ? event.unreachable_count : 0,
+ taskActiveClass: '',
+ hostResults: {}
+ };
+ if (play.firstTask !== event.id) {
+ // this is not the first task
+ play.tasks[event.id].hostCount = play.tasks[play.firstTask].hostCount;
+ }
+ if (play.tasks[event.id].reportedHosts === 0 && play.tasks[event.id].successfulCount === 0 &&
+ play.tasks[event.id].failedCount === 0 && play.tasks[event.id].changedCount === 0 &&
+ play.tasks[event.id].skippedCount === 0 && play.tasks[event.id].unreachableCount === 0) {
+ play.tasks[event.id].status = 'no-matching-hosts';
+ play.tasks[event.id].status_text = 'No matching hosts';
+ play.tasks[event.id].status_tip = "Event ID: " + event.id + "
Status: No matching hosts";
+ }
+ play.taskCount++;
+ SetTaskStyles({
+ task: play.tasks[event.id]
});
- }
- else {
- elapsed = '00:00:00';
- }
-
- status = (event.failed) ? 'failed' : (event.changed) ? 'changed' : 'successful';
- status_text = (event.failed) ? 'Failed' : (event.changed) ? 'Changed' : 'OK';
-
- play.tasks[event.id] = {
- id: event.id,
- play_id: scope.activePlay,
- name: event.name,
- status: status,
- status_text: status_text,
- status_tip: "Event ID: " + event.id + "
Status: " + status_text,
- created: event.created,
- modified: event.modified,
- finished: end,
- elapsed: elapsed,
- hostCount: (event.host_count) ? event.host_count : 0,
- reportedHosts: (event.reported_hosts) ? event.reported_hosts : 0,
- successfulCount: (event.successful_count) ? event.successful_count : 0,
- failedCount: (event.failed_count) ? event.failed_count : 0,
- changedCount: (event.changed_count) ? event.changed_count : 0,
- skippedCount: (event.skipped_count) ? event.skipped_count : 0,
- unreachableCount: (event.unreachable_count) ? event.unreachable_count : 0,
- taskActiveClass: '',
- hostResults: {}
- };
- if (play.firstTask !== event.id) {
- // this is not the first task
- play.tasks[event.id].hostCount = play.tasks[play.firstTask].hostCount;
- }
- if (play.tasks[event.id].hostCount === 0) {
- play.tasks[event.id].status_text = 'No matching hosts';
- play.tasks[event.id].status_tip = "Event ID: " + event.id + "
Status: No matching hosts";
- }
- play.taskCount++;
- SetTaskStyles({
- task: play.tasks[event.id]
});
+ if (scope.activeTask && scope.jobData.plays[scope.activePlay] && scope.jobData.plays[scope.activePlay].tasks[scope.activeTask]) {
+ scope.jobData.plays[scope.activePlay].tasks[scope.activeTask].taskActiveClass = 'active';
+ }
+ scope.$emit('LoadHosts');
+ })
+ .error(function(data) {
+ ProcessErrors(scope, data, status, null, { hdr: 'Error!',
+ msg: 'Call to ' + url + '. GET returned: ' + status });
});
- if (scope.activeTask && scope.jobData.plays[scope.activePlay] && scope.jobData.plays[scope.activePlay].tasks[scope.activeTask]) {
- scope.jobData.plays[scope.activePlay].tasks[scope.activeTask].taskActiveClass = 'active';
- }
- scope.$emit('LoadHosts');
- })
- .error(function(data) {
- ProcessErrors(scope, data, status, null, { hdr: 'Error!',
- msg: 'Call to ' + url + '. GET returned: ' + status });
- });
- }
- else {
+ } else {
+ scope.$emit('LoadHostSummaries');
+ }
+ } else {
scope.$emit('LoadHostSummaries');
}
});
@@ -502,6 +513,7 @@ function JobDetailController ($location, $rootScope, $scope, $compile, $routePar
}
if (scope.jobData.plays[event.id].hostCount === 0 && event.unreachable_count === 0) {
+ scope.jobData.plays[event.id].status = 'no-matching-hosts';
scope.jobData.plays[event.id].status_text = 'No matching hosts';
scope.jobData.plays[event.id].status_tip = "Event ID: " + event.id + "
Status: No matching hosts";
}
diff --git a/awx/ui/static/js/helpers/JobDetail.js b/awx/ui/static/js/helpers/JobDetail.js
index 3c117dcf1d..5105f183e9 100644
--- a/awx/ui/static/js/helpers/JobDetail.js
+++ b/awx/ui/static/js/helpers/JobDetail.js
@@ -391,10 +391,11 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
}
else if (play.status !== 'changed' && play.status !== 'failed') {
// once the status becomes 'changed' or 'failed' don't modify it
- play.status = (changed) ? 'changed' : (failed) ? 'failed' : 'successful';
if (no_hosts) {
+ play.status = 'no-matching-hosts';
play.status_text = 'No matching hosts';
} else {
+ play.status = (changed) ? 'changed' : (failed) ? 'failed' : 'successful';
play.status_text = (changed) ? 'Changed' : (failed) ? 'Failed' : 'OK';
}
}
@@ -1259,7 +1260,7 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
filteredListX = [],
filteredListA = [],
filteredListB = [],
- idx, key, keys, newKeys, tasks;
+ idx, key, keys, newKeys, tasks, t;
function listSort(a,b) {
if (parseInt(a,10) < parseInt(b,10))
@@ -1275,7 +1276,9 @@ function($rootScope, $log, UpdatePlayStatus, UpdateHostStatus, AddHostResult, Ge
// Only draw tasks that are in the 'active' list
for (key in tasks) {
- if (tasks[key].reportedHosts > 0 || tasks[key].status === 'no-matching-hosts') {
+ t = tasks[key];
+ if (t.reportedHosts > 0 || t.hostCount > 0 || t.successfulCount >0 || t.failedCount > 0 ||
+ t.changedCount > 0 || t.skippedCount > 0 || t.unreachableCount > 0) {
filteredListX[key] = tasks[key];
}
}