mirror of
https://github.com/ansible/awx.git
synced 2026-01-21 06:28:01 -03:30
Latest Jobs and scheduling changes.
This commit is contained in:
parent
296e87a632
commit
70be5d9a77
@ -89,10 +89,12 @@ angular.module('ansible', [
|
||||
'ActivityDetailDefinition',
|
||||
'VariablesHelper',
|
||||
'SchedulesListDefinition',
|
||||
'ScheduledJobsDefinition',
|
||||
'AngularScheduler',
|
||||
'Timezones',
|
||||
'SchedulesHelper',
|
||||
'QueuedJobsDefinition'
|
||||
'QueuedJobsDefinition',
|
||||
'JobsListDefinition'
|
||||
])
|
||||
|
||||
.constant('AngularScheduler.partials', $basePath + 'lib/angular-scheduler/lib/')
|
||||
@ -105,7 +107,7 @@ angular.module('ansible', [
|
||||
$routeProvider.
|
||||
when('/jobs', {
|
||||
templateUrl: urlPrefix + 'partials/jobs.html',
|
||||
controller: 'JobsList'
|
||||
controller: 'JobsListController'
|
||||
}).
|
||||
|
||||
when('/jobs/:id', {
|
||||
|
||||
@ -56,15 +56,20 @@ function JobHostSummaryList($scope, $rootScope, $location, $log, $routeParams, R
|
||||
}
|
||||
$scope.removePostRefresh = $scope.$on('PostRefresh', function () {
|
||||
|
||||
// Set status, tooltips, badget icons, etc.
|
||||
for (var i = 0; i < $scope.jobhosts.length; i++) {
|
||||
$scope.jobhosts[i].host_name = $scope.jobhosts[i].summary_fields.host.name;
|
||||
// Set status, tooltips, badges icons, etc.
|
||||
$scope.jobhosts.forEach(function(element, i) {
|
||||
$scope.jobhosts[i].host_name = ($scope.jobhosts[i].summary_fields.host) ? $scope.jobhosts[i].summary_fields.host.name : '';
|
||||
$scope.jobhosts[i].status = ($scope.jobhosts[i].failed) ? 'failed' : 'success';
|
||||
$scope.jobhosts[i].statusBadgeToolTip = JobStatusToolTip($scope.jobhosts[i].status) +
|
||||
" Click to view details.";
|
||||
$scope.jobhosts[i].statusLinkTo = '/#/jobs/' + $scope.jobhosts[i].job + '/job_events/?host=' +
|
||||
encodeURI($scope.jobhosts[i].summary_fields.host.name);
|
||||
}
|
||||
if ($scope.jobhosts[i].summary_fields.host) {
|
||||
$scope.jobhosts[i].statusLinkTo = '/#/jobs/' + $scope.jobhosts[i].job + '/job_events/?host=' +
|
||||
encodeURI($scope.jobhosts[i].summary_fields.host.name);
|
||||
}
|
||||
else {
|
||||
$scope.jobhosts[i].statusLinkTo = '/#/jobs/' + $scope.jobhosts[i].job + '/job_events';
|
||||
}
|
||||
});
|
||||
|
||||
if ($scope.job_id !== null && $scope.job_id !== undefined && $scope.job_id !== '') {
|
||||
// need job_status so we can show/hide refresh button
|
||||
|
||||
@ -10,13 +10,16 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJobsList, CompletedJobsList, QueuedJobsList,
|
||||
GetChoices, GetBasePath, Wait) {
|
||||
function JobsListController ($scope, $compile, ClearScope, Breadcrumbs, LoadBreadCrumbs, LoadScope, RunningJobsList, CompletedJobsList, QueuedJobsList,
|
||||
ScheduledJobsList, GetChoices, GetBasePath, Wait, DeleteJob) {
|
||||
|
||||
ClearScope();
|
||||
|
||||
var e, completed_scope, running_scope, queued_scope, choicesCount = 0, listsCount = 0;
|
||||
// schedule_scope;
|
||||
var e,
|
||||
completed_scope, running_scope, queued_scope, scheduled_scope,
|
||||
choicesCount = 0, listsCount = 0;
|
||||
|
||||
LoadBreadCrumbs();
|
||||
|
||||
// Add breadcrumbs
|
||||
e = angular.element(document.getElementById('breadcrumbs'));
|
||||
@ -45,7 +48,7 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ
|
||||
scope: completed_scope,
|
||||
list: CompletedJobsList,
|
||||
id: 'completed-jobs',
|
||||
url: '/static/sample/data/jobs/completed/data.json'
|
||||
url: GetBasePath('unified_jobs') + '?status__in=(succesful,failed,error,canceled)' ///static/sample/data/jobs/completed/data.json'
|
||||
});
|
||||
running_scope = $scope.$new();
|
||||
LoadScope({
|
||||
@ -53,7 +56,7 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ
|
||||
scope: running_scope,
|
||||
list: RunningJobsList,
|
||||
id: 'active-jobs',
|
||||
url: '/static/sample/data/jobs/running/data.json'
|
||||
url: GetBasePath('unified_jobs') + '?status=running'
|
||||
});
|
||||
queued_scope = $scope.$new();
|
||||
LoadScope({
|
||||
@ -61,8 +64,29 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ
|
||||
scope: queued_scope,
|
||||
list: QueuedJobsList,
|
||||
id: 'queued-jobs',
|
||||
url: '/static/sample/data/jobs/queued/data.json'
|
||||
url: GetBasePath('unified_jobs') + '?status__in(pending,waiting,new)' //'/static/sample/data/jobs/queued/data.json'
|
||||
});
|
||||
scheduled_scope = $scope.$new();
|
||||
LoadScope({
|
||||
parent_scope: $scope,
|
||||
scope: scheduled_scope,
|
||||
list: ScheduledJobsList,
|
||||
id: 'scheduled-jobs',
|
||||
url: GetBasePath('schedules')
|
||||
});
|
||||
|
||||
completed_scope.deleteJob = function(id) {
|
||||
DeleteJob({ scope: completed_scope, id: id });
|
||||
};
|
||||
|
||||
queued_scope.deleteJob = function(id) {
|
||||
DeleteJob({ scope: queued_scope, id: id });
|
||||
};
|
||||
|
||||
running_scope.deleteJob = function(id) {
|
||||
DeleteJob({ scope: running_scope, id: id });
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
if ($scope.removeChoicesReady) {
|
||||
@ -95,8 +119,8 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ
|
||||
|
||||
}
|
||||
|
||||
JobsList.$inject = ['$scope', '$compile', 'ClearScope', 'Breadcrumbs', 'LoadScope', 'RunningJobsList', 'CompletedJobsList',
|
||||
'QueuedJobsList', 'GetChoices', 'GetBasePath', 'Wait'];
|
||||
JobsListController.$inject = ['$scope', '$compile', 'ClearScope', 'Breadcrumbs', 'LoadBreadCrumbs', 'LoadScope', 'RunningJobsList', 'CompletedJobsList',
|
||||
'QueuedJobsList', 'ScheduledJobsList', 'GetChoices', 'GetBasePath', 'Wait', 'DeleteJob'];
|
||||
|
||||
function JobsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, JobForm, JobTemplateForm, GenerateForm, Rest,
|
||||
Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, InventoryList,
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinition', 'InventoryHelper'])
|
||||
angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinition', 'InventoryHelper', 'GeneratorHelpers'])
|
||||
|
||||
.factory('JobStatusToolTip', [
|
||||
function () {
|
||||
@ -166,7 +166,7 @@ angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinitio
|
||||
*
|
||||
*/
|
||||
.factory('LoadScope', ['SearchInit', 'PaginateInit', 'GenerateList', 'PageRangeSetup', 'ProcessErrors', 'Rest',
|
||||
function(SearchInit, PaginateInit, GenerateList, PageRangeSetup, ProcessErrors, Rest) {
|
||||
function(SearchInit, PaginateInit, GenerateList) {
|
||||
return function(params) {
|
||||
var parent_scope = params.parent_scope,
|
||||
scope = params.scope,
|
||||
@ -180,7 +180,7 @@ angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinitio
|
||||
breadCrumbs: false,
|
||||
scope: scope,
|
||||
searchSize: 'col-lg-4 col-md-6 col-sm-12 col-xs-12',
|
||||
showSearch: false
|
||||
showSearch: true
|
||||
});
|
||||
|
||||
SearchInit({
|
||||
@ -197,35 +197,25 @@ angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinitio
|
||||
pageSize: 10
|
||||
});
|
||||
|
||||
scope.iterator = list.iterator;
|
||||
|
||||
|
||||
// The following bits probably don't belong here once the API is available.
|
||||
|
||||
if (scope.removePostRefresh) {
|
||||
scope.removePostRefresh();
|
||||
}
|
||||
scope.$on('PostRefresh', function(e, data){
|
||||
var i, modifier;
|
||||
PageRangeSetup({
|
||||
scope: scope,
|
||||
count: data.count,
|
||||
next: data.next,
|
||||
previous: data.previous,
|
||||
iterator: list.iterator
|
||||
});
|
||||
scope[list.iterator + 'Loading'] = false;
|
||||
for (i = 1; i <= 3; i++) {
|
||||
modifier = (i === 1) ? '' : i;
|
||||
scope[list.iterator + 'HoldInput' + modifier] = false;
|
||||
}
|
||||
scope[list.name] = data.results;
|
||||
window.scrollTo(0, 0);
|
||||
scope.$on('PostRefresh', function(){
|
||||
|
||||
scope[list.name].forEach(function(item, item_idx) {
|
||||
var fld, field,
|
||||
itm = scope[list.name][item_idx];
|
||||
|
||||
// Set the item type label
|
||||
if (list.fields.type) {
|
||||
parent_scope.type_choices.every(function(choice) {
|
||||
if (choice.value === item.type) {
|
||||
scope[list.name][item_idx].type = choice.label;
|
||||
itm.type = choice.label;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -234,33 +224,107 @@ angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinitio
|
||||
// Set the job status label
|
||||
parent_scope.status_choices.every(function(status) {
|
||||
if (status.value === item.status) {
|
||||
scope[list.name][item_idx].status_label = status.label;
|
||||
itm.status_label = status.label;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
if (list.name === 'completed_jobs' || list.name === 'running_jobs') {
|
||||
scope[list.name][item_idx].status_tip = scope[list.name][item_idx].status_label + '. Click for details.';
|
||||
itm.status_tip = itm.status_label + '. Click for details.';
|
||||
}
|
||||
else {
|
||||
scope[list.name][item_idx].status_tip = 'Pending';
|
||||
else if (list.name === 'queued_jobs') {
|
||||
itm.status_tip = 'Pending';
|
||||
}
|
||||
else if (list.name === 'scheduled_jobs') {
|
||||
itm.enabled = (itm.enabled) ? true : false;
|
||||
itm.play_tip = (itm.enabled) ? 'Schedule is Active. Click to temporarily stop.' : 'Schedule is temporarily stopped. Click to activate.';
|
||||
}
|
||||
scope[list.name][item_idx].status_popover_title = scope[list.name][item_idx].status_label;
|
||||
scope[list.name][item_idx].status_popover = "<p>" + scope[list.name][item_idx].job_explanation + "</p>\n";
|
||||
scope[list.name][item_idx].status_popover += "<p><a href=\"/#/jobs/" + scope[list.name][item_idx].id + "\">More...</a></p>\n";
|
||||
});
|
||||
|
||||
// Copy summary_field values
|
||||
for (field in list.fields) {
|
||||
fld = list.fields[field];
|
||||
if (fld.sourceModel) {
|
||||
if (itm.summary_fields[fld.sourceModel]) {
|
||||
itm[field] = itm.summary_fields[fld.sourceModel][fld.sourceField];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
itm.status_popover_title = itm.status_label;
|
||||
itm.status_popover = "<p>" + itm.job_explanation + "</p>\n" +
|
||||
"<p><a href=\"/#/jobs/" + itm.id + "\">More...</a></p>\n" +
|
||||
"<div class=\"popover-footer\"><span class=\"key\">esc</span> or click to close</div>\n";
|
||||
});
|
||||
parent_scope.$emit('listLoaded');
|
||||
});
|
||||
|
||||
Rest.setUrl(url);
|
||||
Rest.get()
|
||||
.success(function(data) {
|
||||
scope.$emit('PostRefresh', data);
|
||||
})
|
||||
.error(function(data, status) {
|
||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||
msg: 'Call to ' + url + ' failed. GET returned: ' + status });
|
||||
});
|
||||
scope.search(list.iterator);
|
||||
};
|
||||
}]);
|
||||
}])
|
||||
|
||||
.factory('DeleteJob', ['Find', 'GetBasePath', 'Rest', 'Wait', 'ProcessErrors', 'Prompt',
|
||||
function(Find, GetBasePath, Rest, Wait, ProcessErrors, Prompt){
|
||||
return function(params) {
|
||||
|
||||
var scope = params.scope,
|
||||
id = params.id,
|
||||
action, jobs, job, url, action_label, hdr;
|
||||
|
||||
if (scope.completed_jobs) {
|
||||
jobs = scope.completed_jobs;
|
||||
}
|
||||
else if (scope.running_jobs) {
|
||||
jobs = scope.running_jobs;
|
||||
}
|
||||
else if (scope.queued_jobs) {
|
||||
jobs = scope.queued_jobs;
|
||||
}
|
||||
job = Find({list: jobs, key: 'id', val: id });
|
||||
|
||||
if (job.status === 'pending' || job.status === 'running' || job.status === 'waiting') {
|
||||
url = job.related.cancel;
|
||||
action_label = 'cancel';
|
||||
hdr = 'Cancel Job';
|
||||
} else {
|
||||
url = GetBasePath('jobs') + id + '/';
|
||||
action_label = 'delete';
|
||||
hdr = 'Delete Job';
|
||||
}
|
||||
|
||||
action = function () {
|
||||
Wait('start');
|
||||
Rest.setUrl(url);
|
||||
if (action_label === 'cancel') {
|
||||
Rest.post()
|
||||
.success(function () {
|
||||
$('#prompt-modal').modal('hide');
|
||||
scope.search(scope.iterator);
|
||||
})
|
||||
.error(function (data, status) {
|
||||
$('#prompt-modal').modal('hide');
|
||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url +
|
||||
' failed. POST returned status: ' + status });
|
||||
});
|
||||
} else {
|
||||
Rest.destroy()
|
||||
.success(function () {
|
||||
$('#prompt-modal').modal('hide');
|
||||
scope.search(scope.iterator);
|
||||
})
|
||||
.error(function (data, status) {
|
||||
$('#prompt-modal').modal('hide');
|
||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url +
|
||||
' failed. DELETE returned status: ' + status });
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Prompt({
|
||||
hdr: hdr,
|
||||
body: "<div class=\"alert alert-info\">Are you sure you want to " + action_label + " job " + id + " <em>" + job.name + "</em>?</div>",
|
||||
action: action
|
||||
});
|
||||
|
||||
};
|
||||
}]);
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ angular.module('RefreshHelper', ['RestServices', 'Utilities', 'PaginationHelpers
|
||||
scope[iterator + 'HoldInput' + modifier] = false;
|
||||
}
|
||||
scope[set] = data.results;
|
||||
window.scrollTo(0, 0);
|
||||
//window.scrollTo(0, 0);
|
||||
Wait('stop');
|
||||
scope.$emit('PostRefresh');
|
||||
})
|
||||
|
||||
@ -234,16 +234,19 @@ angular.module('SearchHelper', ['RestServices', 'Utilities', 'RefreshHelper'])
|
||||
if (scope.removeDoSearch) {
|
||||
scope.removeDoSearch();
|
||||
}
|
||||
scope.removeDoSearch = scope.$on('doSearch', function (e, iterator, page, load) {
|
||||
scope.removeDoSearch = scope.$on('doSearch', function (e, iterator, page, load, calcOnly) {
|
||||
//
|
||||
// Execute the search
|
||||
//
|
||||
scope[iterator + 'Loading'] = (load === undefined || load === true) ? true : false;
|
||||
var url = defaultUrl,
|
||||
var url = (calcOnly) ? '' : defaultUrl,
|
||||
connect;
|
||||
|
||||
if (!calcOnly) {
|
||||
scope[iterator + 'Loading'] = (load === undefined || load === true) ? true : false;
|
||||
scope[iterator + 'Page'] = (page) ? parseInt(page) - 1 : 0;
|
||||
}
|
||||
|
||||
//finalize and execute the query
|
||||
scope[iterator + 'Page'] = (page) ? parseInt(page) - 1 : 0;
|
||||
//finalize and execute the query
|
||||
if (scope[iterator + 'SearchParams']) {
|
||||
if (/\/$/.test(url)) {
|
||||
url += '?' + scope[iterator + 'SearchParams'];
|
||||
@ -261,20 +264,26 @@ angular.module('SearchHelper', ['RestServices', 'Utilities', 'RefreshHelper'])
|
||||
connect = (/\/$/.test(url)) ? '?' : '&';
|
||||
url += connect + scope[iterator + 'ExtraParms'];
|
||||
}
|
||||
url = url.replace(/\&\&/, '&');
|
||||
Refresh({
|
||||
scope: scope,
|
||||
set: set,
|
||||
iterator: iterator,
|
||||
url: url
|
||||
});
|
||||
url = url.replace(/\&\&/g, '&');
|
||||
|
||||
if (calcOnly) {
|
||||
scope.$emit('searchParamsReady', url);
|
||||
}
|
||||
else {
|
||||
Refresh({
|
||||
scope: scope,
|
||||
set: set,
|
||||
iterator: iterator,
|
||||
url: url
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
if (scope.removePrepareSearch) {
|
||||
scope.removePrepareSearch();
|
||||
}
|
||||
scope.removePrepareSearch = scope.$on('prepareSearch', function (e, iterator, page, load, spin) {
|
||||
scope.removePrepareSearch = scope.$on('prepareSearch', function (e, iterator, page, load, calcOnly) {
|
||||
//
|
||||
// Start building the search key/value pairs. This will process each search widget, if the
|
||||
// selected field is an object type (used on activity stream).
|
||||
@ -320,13 +329,13 @@ angular.module('SearchHelper', ['RestServices', 'Utilities', 'RefreshHelper'])
|
||||
}
|
||||
}
|
||||
}
|
||||
scope.$emit('prepareSearch2', iterator, page, load, spin);
|
||||
scope.$emit('prepareSearch2', iterator, page, load, calcOnly);
|
||||
});
|
||||
|
||||
if (scope.removePrepareSearch2) {
|
||||
scope.removePrepareSearch2();
|
||||
}
|
||||
scope.removePrepareSearch2 = scope.$on('prepareSearch2', function (e, iterator, page, load, spin) {
|
||||
scope.removePrepareSearch2 = scope.$on('prepareSearch2', function (e, iterator, page, load, calcOnly) {
|
||||
// Continue building the search by examining the remaining search widgets. If we're looking at activity_stream,
|
||||
// there's more than one.
|
||||
var i, modifier,
|
||||
@ -408,7 +417,7 @@ angular.module('SearchHelper', ['RestServices', 'Utilities', 'RefreshHelper'])
|
||||
scope[iterator + 'SearchParams'] += 'order_by=' + encodeURI(sort_order);
|
||||
}
|
||||
|
||||
scope.$emit('doSearch', iterator, page, load, spin);
|
||||
scope.$emit('doSearch', iterator, page, load, calcOnly);
|
||||
});
|
||||
|
||||
scope.startSearch = function (e, iterator) {
|
||||
@ -418,22 +427,28 @@ angular.module('SearchHelper', ['RestServices', 'Utilities', 'RefreshHelper'])
|
||||
}
|
||||
};
|
||||
|
||||
scope.search = function (iterator, page, load) {
|
||||
// Called to initiate a searh.
|
||||
// Page is optional. Added to accomodate back function on Job Events detail.
|
||||
// Spin optional -set to false if spin not desired.
|
||||
// Load optional -set to false if loading message not desired
|
||||
load = (load === undefined) ? true : false;
|
||||
/**
|
||||
* Initiate a searh.
|
||||
*
|
||||
* @iterator: required, list.iterator value
|
||||
* @Page: optional. Added to accomodate back function on Job Events detail.
|
||||
* @Load: optional, set to false if 'Loading' message not desired
|
||||
* @calcOnly: optiona, set to true when you want to calc or figure out search params without executing the search
|
||||
*/
|
||||
scope.search = function (iterator, page, load, calcOnly) {
|
||||
page = page || null;
|
||||
load = (load) ? true : false;
|
||||
calcOnly = (calcOnly) ? true : false;
|
||||
if (load) {
|
||||
scope[set] = [];
|
||||
scope[set] = []; //clear the list array to make sure 'Loading' is the only thing visible on the list
|
||||
}
|
||||
scope.$emit('prepareSearch', iterator, page, load);
|
||||
scope.$emit('prepareSearch', iterator, page, load, calcOnly);
|
||||
};
|
||||
|
||||
|
||||
scope.sort = function (fld) {
|
||||
// reset sort icons back to 'icon-sort' on all columns
|
||||
// except the one clicked
|
||||
// Reset sort icons back to 'icon-sort' on all columns
|
||||
// except the one clicked.
|
||||
$('.list-header').each(function () {
|
||||
if ($(this).attr('id') !== fld + '-header') {
|
||||
var icon = $(this).find('i');
|
||||
|
||||
@ -14,6 +14,7 @@ angular.module('CompletedJobsDefinition', [])
|
||||
name: 'completed_jobs',
|
||||
iterator: 'completed_job',
|
||||
editTitle: 'Completed Jobs',
|
||||
'class': 'table-condensed',
|
||||
index: false,
|
||||
hover: true,
|
||||
well: false,
|
||||
@ -25,7 +26,12 @@ angular.module('CompletedJobsDefinition', [])
|
||||
key: true,
|
||||
desc: true,
|
||||
searchType: 'int',
|
||||
columnClass: 'col-lg-1 col-md-2 col-sm-2 col-xs-2'
|
||||
columnClass: 'col-md-1 col-sm-2 col-xs-2'
|
||||
},
|
||||
inventory: {
|
||||
label: 'Inventory ID',
|
||||
searchType: 'int',
|
||||
searchOnly: true
|
||||
},
|
||||
modified: {
|
||||
label: 'Completed On',
|
||||
@ -34,6 +40,12 @@ angular.module('CompletedJobsDefinition', [])
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: "col-md-2 hidden-xs"
|
||||
},
|
||||
next_job_run: {
|
||||
label: 'Next Run',
|
||||
searchable: false,
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: "col-md-2 hidden-sm hidden-xs"
|
||||
},
|
||||
type: {
|
||||
label: 'Type',
|
||||
link: false,
|
||||
@ -41,8 +53,10 @@ angular.module('CompletedJobsDefinition', [])
|
||||
},
|
||||
name: {
|
||||
label: 'Name',
|
||||
columnClass: 'col-sm-4 col-xs-5',
|
||||
ngHref: 'nameHref'
|
||||
columnClass: 'col-md-3 col-xs-5',
|
||||
ngHref: 'nameHref',
|
||||
sourceModel: 'template',
|
||||
sourceField: 'name'
|
||||
},
|
||||
failed: {
|
||||
label: 'Job failed?',
|
||||
@ -51,17 +65,29 @@ angular.module('CompletedJobsDefinition', [])
|
||||
searchValue: 'true',
|
||||
searchOnly: true,
|
||||
nosort: true
|
||||
},
|
||||
status: {
|
||||
label: 'Status',
|
||||
searchType: 'select',
|
||||
searchOnly: true,
|
||||
searchOptions: [
|
||||
{ name: "Success", value: "successful" },
|
||||
{ name: "Error", value: "error" },
|
||||
{ name: "Failed", value: "failed" },
|
||||
{ name: "Canceled", value: "canceled" }
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
actions: {
|
||||
columnClass: 'col-md-2 col-sm-3 col-xs-3',
|
||||
refresh: {
|
||||
mode: 'all',
|
||||
awToolTip: "Refresh the page",
|
||||
ngClick: "refresh()"
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
fieldActions: {
|
||||
status: {
|
||||
mode: 'all',
|
||||
@ -79,18 +105,10 @@ angular.module('CompletedJobsDefinition', [])
|
||||
awToolTip: 'Relaunch the job',
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
cancel: {
|
||||
mode: 'all',
|
||||
ngClick: 'deleteJob(completed_job.id)',
|
||||
awToolTip: 'Cancel a running or pending job',
|
||||
ngShow: "completed_job.status == 'pending' || completed_job.status == 'running' || completed_job.status == 'waiting'",
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
"delete": {
|
||||
mode: 'all',
|
||||
ngClick: 'deleteJob(completed_job.id)',
|
||||
awToolTip: 'Delete the job',
|
||||
ngShow: "completed_job.status != 'pending' && completed_job.status != 'running' && completed_job.status != 'waiting'",
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
dropdown: {
|
||||
@ -99,11 +117,9 @@ angular.module('CompletedJobsDefinition', [])
|
||||
icon: 'fa-search-plus',
|
||||
'class': 'btn-default btn-xs',
|
||||
options: [
|
||||
{ ngClick: 'editJob(completed_job.id, completed_job.summary_fields.job_template.name)', label: 'Status' },
|
||||
{ ngClick: 'viewEvents(completed_job.id, completed_job.summary_fields.job_template.name)', label: 'Events',
|
||||
ngHide: "completed_job.status == 'new'" },
|
||||
{ ngClick: 'viewSummary(completed_job.id, completed_job.summary_fields.job_template.name)', label: 'Host Summary',
|
||||
ngHide: "completed_job.status == 'new'" }
|
||||
{ ngHref: '/#/jobs/{{ completed_job.id }}', label: 'Status' },
|
||||
{ ngHref: '/#/jobs/{{ completed_job.id }}/job_events', label: 'Events', ngHide: "completed_job.status == 'new'" },
|
||||
{ ngHref: '/#/jobs/{{ completed_job.id }}/job_host_summaries', label: 'Host Summary' }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
'use strict';
|
||||
|
||||
angular.module('JobsListDefinition', [])
|
||||
.value( 'JobList', {
|
||||
.value( 'JobsList', {
|
||||
|
||||
name: 'jobs',
|
||||
iterator: 'job',
|
||||
@ -39,13 +39,9 @@ angular.module('JobsListDefinition', [])
|
||||
searchable: false,
|
||||
filter: "date:'MM/dd HH:mm:ss'"
|
||||
},
|
||||
job_template: {
|
||||
label: 'Job Template',
|
||||
ngBind: 'job.summary_fields.job_template.name',
|
||||
//ngHref: "{{ '/#/job_templates/?name=' + job.summary_fields.job_template.name }}",
|
||||
ngHref:"{{ '/#/job_templates/' + job.job_template }}",
|
||||
sourceModel: 'job_template',
|
||||
sourceField: 'name'
|
||||
name: {
|
||||
label: 'Name',
|
||||
link: false
|
||||
},
|
||||
failed: {
|
||||
label: 'Job failed?',
|
||||
|
||||
@ -93,36 +93,31 @@ angular.module('ProjectsListDefinition', [])
|
||||
|
||||
fieldActions: {
|
||||
edit: {
|
||||
label: 'Edit',
|
||||
ngClick: "editProject(project.id)",
|
||||
awToolTip: 'Edit project properties',
|
||||
awToolTip: 'Edit the project',
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
scm_update: {
|
||||
label: 'Update',
|
||||
ngClick: 'SCMUpdate(project.id)',
|
||||
awToolTip: "{{ project.scm_update_tooltip }}",
|
||||
ngClass: "project.scm_type_class",
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
cancel: {
|
||||
label: 'Stop',
|
||||
ngClick: "cancelUpdate(project.id, project.name)",
|
||||
awToolTip: 'Cancel a running SCM update process',
|
||||
awToolTip: 'Cancel the SCM update',
|
||||
ngShow: "project.status == 'updating'",
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
schedule: {
|
||||
label: 'Schedule',
|
||||
mode: 'all',
|
||||
ngHref: '#/projects/{{ project.id }}/schedules',
|
||||
awToolTip: 'Schedule future project sync runs',
|
||||
awToolTip: 'Schedule future SCM updates',
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
"delete": {
|
||||
label: 'Delete',
|
||||
ngClick: "deleteProject(project.id, project.name)",
|
||||
awToolTip: 'Permanently remove project from the database',
|
||||
awToolTip: 'Delete the project',
|
||||
ngShow: "project.status !== 'updating'",
|
||||
dataPlacement: 'top'
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@ angular.module('QueuedJobsDefinition', [])
|
||||
name: 'queued_jobs',
|
||||
iterator: 'queued_job',
|
||||
editTitle: 'Queued Jobs',
|
||||
'class': 'table-condensed',
|
||||
index: false,
|
||||
hover: true,
|
||||
well: false,
|
||||
@ -24,7 +25,7 @@ angular.module('QueuedJobsDefinition', [])
|
||||
key: true,
|
||||
desc: true,
|
||||
searchType: 'int',
|
||||
columnClass: 'col-lg-1 col-md-2 col-sm-2 col-xs-2'
|
||||
columnClass: 'col-md-1 col-sm-2 col-xs-2'
|
||||
},
|
||||
inventory: {
|
||||
label: 'Inventory ID',
|
||||
@ -38,6 +39,12 @@ angular.module('QueuedJobsDefinition', [])
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: 'col-md-2 hidden-xs'
|
||||
},
|
||||
next_job_run: {
|
||||
label: 'Next Run',
|
||||
searchable: false,
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: "col-md-2 hidden-sm hidden-xs"
|
||||
},
|
||||
type: {
|
||||
label: 'Type',
|
||||
link: false,
|
||||
@ -45,20 +52,15 @@ angular.module('QueuedJobsDefinition', [])
|
||||
},
|
||||
name: {
|
||||
label: 'Name',
|
||||
columnClass: 'col-sm-4 col-xs-5',
|
||||
ngHref: 'nameHref'
|
||||
},
|
||||
failed: {
|
||||
label: 'Job failed?',
|
||||
searchSingleValue: true,
|
||||
searchType: 'boolean',
|
||||
searchValue: 'true',
|
||||
searchOnly: true,
|
||||
nosort: true
|
||||
columnClass: 'col-sm-3 col-xs-5',
|
||||
ngHref: 'nameHref',
|
||||
sourceModel: 'template',
|
||||
sourceField: 'name'
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
actions: {
|
||||
columnClass: 'col-md-2 col-sm-3 col-xs-3',
|
||||
refresh: {
|
||||
mode: 'all',
|
||||
awToolTip: "Refresh the page",
|
||||
|
||||
@ -14,6 +14,7 @@ angular.module('RunningJobsDefinition', [])
|
||||
name: 'running_jobs',
|
||||
iterator: 'running_job',
|
||||
editTitle: 'Completed Jobs',
|
||||
'class': 'table-condensed',
|
||||
index: false,
|
||||
hover: true,
|
||||
well: false,
|
||||
@ -24,7 +25,7 @@ angular.module('RunningJobsDefinition', [])
|
||||
key: true,
|
||||
desc: true,
|
||||
searchType: 'int',
|
||||
columnClass: 'col-lg-1 col-md-2 col-sm-2 col-xs-2'
|
||||
columnClass: 'col-md-1 col-sm-2 col-xs-2'
|
||||
},
|
||||
inventory: {
|
||||
label: 'Inventory ID',
|
||||
@ -38,6 +39,12 @@ angular.module('RunningJobsDefinition', [])
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: "col-md-2 hidden-xs"
|
||||
},
|
||||
next_job_run: {
|
||||
label: 'Next Run',
|
||||
searchable: false,
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: "col-md-2 hidden-sm hidden-xs"
|
||||
},
|
||||
type: {
|
||||
label: 'Type',
|
||||
link: false,
|
||||
@ -45,33 +52,31 @@ angular.module('RunningJobsDefinition', [])
|
||||
},
|
||||
name: {
|
||||
label: 'Name',
|
||||
columnClass: 'col-sm-4 col-xs-5',
|
||||
ngHref: 'nameHref'
|
||||
},
|
||||
failed: {
|
||||
label: 'Job failed?',
|
||||
searchSingleValue: true,
|
||||
searchType: 'boolean',
|
||||
searchValue: 'true',
|
||||
searchOnly: true,
|
||||
nosort: true
|
||||
columnClass: 'col-md-3 col-xs-5',
|
||||
ngHref: 'nameHref',
|
||||
sourceModel: 'template',
|
||||
sourceField: 'name'
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
actions: {
|
||||
columnClass: 'col-md-2 col-sm-3 col-xs-3',
|
||||
refresh: {
|
||||
mode: 'all',
|
||||
awToolTip: "Refresh the page",
|
||||
ngClick: "refresh()"
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
fieldActions: {
|
||||
status: {
|
||||
mode: 'all',
|
||||
awToolTip: "{{ running_job.status_tip }}",
|
||||
awTipPlacement: "top",
|
||||
dataTitle: "{{ running_job.status_popover_title }}",
|
||||
iconClass: 'fa icon-job-{{ running_job.status }}',
|
||||
awToolTip: "{{ running_job.statusToolTip }}",
|
||||
dataPlacement: 'top'
|
||||
awPopOver: "{{ running_job.status_popover }}",
|
||||
dataPlacement: 'left'
|
||||
},
|
||||
submit: {
|
||||
icon: 'icon-rocket',
|
||||
@ -84,14 +89,6 @@ angular.module('RunningJobsDefinition', [])
|
||||
mode: 'all',
|
||||
ngClick: 'deleteJob(running_job.id)',
|
||||
awToolTip: 'Cancel the job',
|
||||
ngShow: "running_job.status == 'pending' || running_job.status == 'running' || running_job.status == 'waiting'",
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
"delete": {
|
||||
mode: 'all',
|
||||
ngClick: 'deleteJob(running_job.id)',
|
||||
awToolTip: 'Delete the job',
|
||||
ngShow: "running_job.status != 'pending' && running_job.status != 'running' && running_job.status != 'waiting'",
|
||||
dataPlacement: 'top'
|
||||
},
|
||||
dropdown: {
|
||||
@ -100,11 +97,9 @@ angular.module('RunningJobsDefinition', [])
|
||||
icon: 'fa-search-plus',
|
||||
'class': 'btn-default btn-xs',
|
||||
options: [
|
||||
{ ngClick: 'editJob(running_job.id, running_job.summary_fields.job_template.name)', label: 'Status' },
|
||||
{ ngClick: 'viewEvents(running_job.id, running_job.summary_fields.job_template.name)', label: 'Events',
|
||||
ngHide: "running_job.status == 'new'" },
|
||||
{ ngClick: 'viewSummary(running_job.id, running_job.summary_fields.job_template.name)', label: 'Host Summary',
|
||||
ngHide: "running_job.status == 'new'" }
|
||||
{ ngHref: '/#/jobs/{{ running_job.id }}', label: 'Status' },
|
||||
{ ngHref: '/#/jobs/{{ running_job.id }}/job_events', label: 'Events' },
|
||||
{ ngHref: '/#/jobs/{{ running_job.id }}/job_host_summaries', label: 'Host Summary' }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
78
awx/ui/static/js/lists/ScheduledJobs.js
Normal file
78
awx/ui/static/js/lists/ScheduledJobs.js
Normal file
@ -0,0 +1,78 @@
|
||||
/*********************************************
|
||||
* Copyright (c) 2014 AnsibleWorks, Inc.
|
||||
*
|
||||
* ScheduledJobs.js
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
angular.module('ScheduledJobsDefinition', [])
|
||||
.value( 'ScheduledJobsList', {
|
||||
|
||||
name: 'scheduled_jobs',
|
||||
iterator: 'scheduled_job',
|
||||
editTitle: 'Scheduled Jobs',
|
||||
'class': 'table-condensed',
|
||||
index: false,
|
||||
hover: true,
|
||||
well: false,
|
||||
|
||||
fields: {
|
||||
next_run: {
|
||||
label: 'Next Run',
|
||||
link: false,
|
||||
columnClass: "col-md-2"
|
||||
},
|
||||
dtend: {
|
||||
label: 'Ends On',
|
||||
searchable: false,
|
||||
filter: "date:'MM/dd/yy HH:mm:ss'",
|
||||
columnClass: "col-md-2 hidden-xs"
|
||||
},
|
||||
type: {
|
||||
label: 'Type',
|
||||
link: false,
|
||||
columnClass: "col-md-2 hidden-sm hidden-xs"
|
||||
},
|
||||
template_name: {
|
||||
label: 'Name',
|
||||
columnClass: "col-md-4 col-xs-5",
|
||||
sourceModel: "template",
|
||||
sourceField: "name"
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
columnClass: 'col-md-2 col-sm-3 col-xs-3',
|
||||
refresh: {
|
||||
mode: 'all',
|
||||
awToolTip: "Refresh the page",
|
||||
ngClick: "refresh()"
|
||||
}
|
||||
},
|
||||
|
||||
fieldActions: {
|
||||
"play": {
|
||||
mode: "all",
|
||||
ngClick: "toggleSchedule(scheduled_job.id)",
|
||||
awToolTip: "{{ scheduled_job.play_tip }}",
|
||||
dataTipWatch: "scheduled_job.play_tip",
|
||||
iconClass: "{{ 'fa icon-schedule-enabled-' + scheduled_job.enabled }}",
|
||||
dataPlacement: 'top',
|
||||
},
|
||||
"edit": {
|
||||
mode: "all",
|
||||
ngClick: "edit(scheduled_job.id)",
|
||||
awToolTip: "Edit the schedule",
|
||||
dataPlacement: "top"
|
||||
},
|
||||
"delete": {
|
||||
mode: 'all',
|
||||
ngClick: 'deleteJob(completed_job.id)',
|
||||
awToolTip: 'Delete the schedule',
|
||||
dataPlacement: 'top'
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -226,6 +226,7 @@ textarea.allowresize {
|
||||
}
|
||||
.popover {
|
||||
z-index: 2000;
|
||||
min-width: 200px;
|
||||
max-width: 325px;
|
||||
}
|
||||
.popover-footer {
|
||||
@ -889,7 +890,28 @@ input[type="checkbox"].checkbox-no-label {
|
||||
|
||||
.table-hover-inverse tbody tr:hover > td,
|
||||
.table-hover-inverse tbody tr:hover > th {
|
||||
background-color: #dff0d8;
|
||||
background-color: #c6e5e5;
|
||||
}
|
||||
|
||||
.table > thead > tr > td.success,
|
||||
.table > tbody > tr > td.success,
|
||||
.table > tfoot > tr > td.success,
|
||||
.table > thead > tr > th.success,
|
||||
.table > tbody > tr > th.success,
|
||||
.table > tfoot > tr > th.success,
|
||||
.table > thead > tr.success > td,
|
||||
.table > tbody > tr.success > td,
|
||||
.table > tfoot > tr.success > td,
|
||||
.table > thead > tr.success > th,
|
||||
.table > tbody > tr.success > th,
|
||||
.table > tfoot > tr.success > th {
|
||||
background-color: #c6e5e5;
|
||||
}
|
||||
.table-hover > tbody > tr > td.success:hover,
|
||||
.table-hover > tbody > tr > th.success:hover,
|
||||
.table-hover > tbody > tr.success:hover > td,
|
||||
.table-hover > tbody > tr.success:hover > th {
|
||||
background-color: #c6e5e5;
|
||||
}
|
||||
|
||||
.table-summary thead > tr > th,
|
||||
@ -1017,6 +1039,14 @@ input[type="checkbox"].checkbox-no-label {
|
||||
content: "\f111";
|
||||
}
|
||||
|
||||
.icon-schedule-enabled-true:before {
|
||||
content: "\f04c";
|
||||
}
|
||||
|
||||
.icon-schedule-enabled-false:before {
|
||||
content: "\f04b";
|
||||
}
|
||||
|
||||
.badge {
|
||||
padding: 2px 3px 3px 4px;
|
||||
font-size: 10px;
|
||||
@ -1025,20 +1055,12 @@ input[type="checkbox"].checkbox-no-label {
|
||||
}
|
||||
|
||||
.job-list {
|
||||
margin-top: 30px;
|
||||
.row {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.page-row div:first-child {
|
||||
padding-left: 8px;
|
||||
}
|
||||
margin-top: 20px;
|
||||
.title {
|
||||
font-size: 14px;
|
||||
padding-left: 8px;
|
||||
margin-left: 3px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 6px;
|
||||
color: @black;
|
||||
color: #666;
|
||||
}
|
||||
thead >tr >th, .page-row {
|
||||
font-size: 12px;
|
||||
|
||||
@ -291,31 +291,26 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job
|
||||
$(element).popover({ placement: placement, delay: 0, title: title,
|
||||
content: attrs.awPopOver, trigger: trigger, html: true, container: container });
|
||||
$(element).click(function() {
|
||||
var self = $(this).attr('id');
|
||||
var self = $(this);
|
||||
$('.help-link, .help-link-white').each( function() {
|
||||
if (self !== $(this).attr('id')) {
|
||||
if (self.attr('id') !== $(this).attr('id')) {
|
||||
$(this).popover('hide');
|
||||
}
|
||||
});
|
||||
|
||||
$('.popover').each(function() {
|
||||
// remove lingering popover <div>. Seems to be a bug in TB3 RC1
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
$('.tooltip').each( function() {
|
||||
// close any lingering tool tipss
|
||||
$(this).hide();
|
||||
});
|
||||
|
||||
$(this).popover('toggle');
|
||||
|
||||
$('.popover').each(function() {
|
||||
$compile($(this))(scope); //make nested directives work!
|
||||
});
|
||||
|
||||
$('.popover-content, .popover-title').click(function() {
|
||||
$('#' + self).popover('hide');
|
||||
$(self).popover('hide');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
angular.module('GeneratorHelpers', ['GeneratorHelpers'])
|
||||
angular.module('GeneratorHelpers', [])
|
||||
|
||||
.factory('Attr', function () {
|
||||
return function (obj, key, fld) {
|
||||
@ -630,7 +630,8 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
|
||||
//
|
||||
var iterator = params.iterator,
|
||||
form = params.template,
|
||||
useMini = params.mini,
|
||||
size = params.size,
|
||||
includeSize = (params.includeSize === undefined) ? true : params.includeSize,
|
||||
fld,
|
||||
i, html = '',
|
||||
modifier,
|
||||
@ -638,12 +639,14 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
|
||||
|
||||
for (i = 1; i <= searchWidgets; i++) {
|
||||
modifier = (i === 1) ? '' : i;
|
||||
html += "<div class=\"";
|
||||
html += (params.size) ? params.size : "col-lg-4 col-md-6 col-sm-12 col-xs-12";
|
||||
html += "\" id=\"search-widget-container" + modifier + "\">\n";
|
||||
|
||||
if (includeSize) {
|
||||
html += "<div class=\"";
|
||||
html += (size) ? size : "col-lg-4 col-md-6 col-sm-12 col-xs-12";
|
||||
html += "\" id=\"search-widget-container" + modifier + "\">\n";
|
||||
}
|
||||
|
||||
html += "<div class=\"input-group";
|
||||
html += (useMini) ? " input-group-sm" : " input-group-sm";
|
||||
html += "<div class=\"input-group input-group-sm";
|
||||
html += "\">\n";
|
||||
html += "<div class=\"input-group-btn dropdown\">\n";
|
||||
html += "<button type=\"button\" ";
|
||||
@ -707,8 +710,10 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
|
||||
iterator + "HoldInput" + modifier + " || " +
|
||||
iterator + "HideAllStartBtn" + modifier + "\"" +
|
||||
"><i class=\"fa fa-search\"></i></a>\n";
|
||||
|
||||
html += "</div>\n";
|
||||
|
||||
if (includeSize) {
|
||||
html += "</div>\n";
|
||||
}
|
||||
}
|
||||
|
||||
return html;
|
||||
|
||||
@ -164,9 +164,9 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
|
||||
html += "</div>\n";
|
||||
}
|
||||
|
||||
html += "<div class=\"row\">\n";
|
||||
|
||||
|
||||
if (options.showSearch=== undefined || options.showSearch === true) {
|
||||
html += "<div class=\"row\">\n";
|
||||
if (list.name !== 'groups') {
|
||||
if (options.searchSize) {
|
||||
html += SearchWidget({
|
||||
@ -260,7 +260,6 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
|
||||
//lookup
|
||||
html += "<div class=\"col-lg-7\"></div>\n";
|
||||
}
|
||||
|
||||
html += "</div><!-- row -->\n";
|
||||
}
|
||||
|
||||
@ -400,8 +399,8 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
|
||||
action: field_action
|
||||
});
|
||||
}
|
||||
html += (fAction.label) ? "<span class=\"list-action-label\"> " + list.fieldActions[field_action].label +
|
||||
"</span>" : "";
|
||||
//html += (fAction.label) ? "<span class=\"list-action-label\"> " + list.fieldActions[field_action].label +
|
||||
// "</span>" : "";
|
||||
html += "</a>";
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
<div class="tab-pane" id="jobs">
|
||||
<div ng-cloak id="htmlTemplate">
|
||||
<div class="row">
|
||||
<div class="col-lg-12" id="breadcrumbs"></div>
|
||||
<div class="col-md-12" id="breadcrumbs"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="well">
|
||||
<div class="col-md-12">
|
||||
<div class="well">
|
||||
<div class="job-list" id="completed-jobs-container">
|
||||
<div class="title">Completed</div>
|
||||
<div id="completed-jobs"></div>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"count": 5,
|
||||
"count": 15,
|
||||
"next": "/blah/blah/blah",
|
||||
"previous": null,
|
||||
"results": [
|
||||
@ -576,6 +576,580 @@
|
||||
"MAIL": "/var/spool/mail/vagrant",
|
||||
"LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"url": "/api/v1/jobs/1/",
|
||||
"related": {
|
||||
"job_host_summaries": "/api/v1/jobs/1/job_host_summaries/",
|
||||
"activity_stream": "/api/v1/jobs/1/activity_stream/",
|
||||
"job_events": "/api/v1/jobs/1/job_events/",
|
||||
"job_template": "/api/v1/job_templates/3/",
|
||||
"inventory": "/api/v1/inventories/4/",
|
||||
"project": "/api/v1/projects/1/",
|
||||
"credential": "/api/v1/credentials/8/",
|
||||
"start": "/api/v1/jobs/1/start/",
|
||||
"cancel": "/api/v1/jobs/1/cancel/"
|
||||
},
|
||||
"summary_fields": {
|
||||
"credential": {
|
||||
"name": "ssh",
|
||||
"description": "machine creds",
|
||||
"kind": "ssh",
|
||||
"cloud": false
|
||||
},
|
||||
"job_template": {
|
||||
"name": "Hello World",
|
||||
"description": ""
|
||||
},
|
||||
"project": {
|
||||
"name": "Examples",
|
||||
"description": "Ansible example project",
|
||||
"scm_type": "git"
|
||||
},
|
||||
"inventory": {
|
||||
"name": "Rackspace",
|
||||
"description": "",
|
||||
"has_active_failures": true,
|
||||
"total_hosts": 20,
|
||||
"hosts_with_active_failures": 20,
|
||||
"total_groups": 3,
|
||||
"groups_with_active_failures": 3,
|
||||
"has_inventory_sources": true,
|
||||
"total_inventory_sources": 1,
|
||||
"inventory_sources_with_failures": 1
|
||||
}
|
||||
},
|
||||
"created": "2014-03-06T16:51:04.557Z",
|
||||
"modified": "2014-03-06T16:51:14.272Z",
|
||||
"job_template": 3,
|
||||
"job_type": "run",
|
||||
"type": "playbook_run",
|
||||
"name": "Hello World",
|
||||
"job_explanation": "Bad things happened",
|
||||
"status": "failed",
|
||||
"failed": true,
|
||||
"inventory": 4,
|
||||
"project": 1,
|
||||
"playbook": "lamp_simple/site.yml",
|
||||
"credential": 8,
|
||||
"cloud_credential": null,
|
||||
"forks": 0,
|
||||
"limit": "",
|
||||
"verbosity": 0,
|
||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||
"job_tags": "",
|
||||
"launch_type": "manual",
|
||||
"result_traceback": "",
|
||||
"passwords_needed_to_start": [],
|
||||
"job_args": "[\"ssh-agent\", \"sh\", \"-c\", \"ssh-add /tmp/tmp5N437j && ansible-playbook -i /vagrant/ansible-commander/awx/plugins/inventory/awxrest.py -u vagrant -e '{\\\"variable1\\\": \\\"some value\\\", \\\"variable2\\\": \\\"another value\\\"}' lamp_simple/site.yml\"]",
|
||||
"job_cwd": "/vagrant/ansible-commander/awx/projects/_1__examples",
|
||||
"job_env": {
|
||||
"CELERY_LOG_REDIRECT_LEVEL": "WARNING",
|
||||
"ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False",
|
||||
"DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
|
||||
"LESSOPEN": "|/usr/bin/lesspipe.sh %s",
|
||||
"_MP_FORK_LOGFILE_": "",
|
||||
"SSH_CLIENT": "10.0.2.2 61378 22",
|
||||
"CVS_RSH": "ssh",
|
||||
"LOGNAME": "vagrant",
|
||||
"USER": "vagrant",
|
||||
"HOME": "/home/vagrant",
|
||||
"PATH": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin",
|
||||
"REST_API_TOKEN": "**********************************",
|
||||
"CALLBACK_CONSUMER_PORT": "tcp://127.0.0.1:5557",
|
||||
"ANSIBLE_CALLBACK_PLUGINS": "/vagrant/ansible-commander/awx/plugins/callback",
|
||||
"LANG": "en_US.UTF-8",
|
||||
"HISTCONTROL": "ignoredups",
|
||||
"TERM": "xterm",
|
||||
"SHELL": "/bin/bash",
|
||||
"TZ": "America/New_York",
|
||||
"_MP_FORK_LOGFORMAT_": "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
|
||||
"SHLVL": "1",
|
||||
"G_BROKEN_FILENAMES": "1",
|
||||
"HISTSIZE": "1000",
|
||||
"CELERY_LOG_FILE": "",
|
||||
"DJANGO_PROJECT_DIR": "/vagrant/ansible-commander",
|
||||
"ANSIBLE_HOST_KEY_CHECKING": "False",
|
||||
"JOB_ID": "1",
|
||||
"PYTHONPATH": "/vagrant/ansible-commander/awx/lib/site-packages:",
|
||||
"CELERY_LOADER": "djcelery.loaders.DjangoLoader",
|
||||
"_MP_FORK_LOGLEVEL_": "10",
|
||||
"ANSIBLE_NOCOLOR": "1",
|
||||
"JOB_CALLBACK_DEBUG": "1",
|
||||
"REST_API_URL": "http://127.0.0.1:8013",
|
||||
"_": "/usr/bin/nohup",
|
||||
"SSH_CONNECTION": "10.0.2.2 61378 10.0.2.15 22",
|
||||
"INVENTORY_HOSTVARS": "True",
|
||||
"SSH_TTY": "/dev/pts/0",
|
||||
"CELERY_LOG_LEVEL": "10",
|
||||
"HOSTNAME": "vagrant-centos64.vagrantup.com",
|
||||
"INVENTORY_ID": "4",
|
||||
"PWD": "/home/vagrant",
|
||||
"CELERY_LOG_REDIRECT": "1",
|
||||
"DJANGO_SETTINGS_MODULE": "awx.settings.development",
|
||||
"MAIL": "/var/spool/mail/vagrant",
|
||||
"LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"url": "/api/v1/jobs/2/",
|
||||
"related": {
|
||||
"job_host_summaries": "/api/v1/jobs/2/job_host_summaries/",
|
||||
"activity_stream": "/api/v1/jobs/2/activity_stream/",
|
||||
"job_events": "/api/v1/jobs/2/job_events/",
|
||||
"job_template": "/api/v1/job_templates/3/",
|
||||
"inventory": "/api/v1/inventories/4/",
|
||||
"project": "/api/v1/projects/1/",
|
||||
"credential": "/api/v1/credentials/8/",
|
||||
"start": "/api/v1/jobs/2/start/",
|
||||
"cancel": "/api/v1/jobs/2/cancel/"
|
||||
},
|
||||
"summary_fields": {
|
||||
"credential": {
|
||||
"name": "ssh",
|
||||
"description": "machine creds",
|
||||
"kind": "ssh",
|
||||
"cloud": false
|
||||
},
|
||||
"job_template": {
|
||||
"name": "Hello World",
|
||||
"description": ""
|
||||
},
|
||||
"project": {
|
||||
"name": "Examples",
|
||||
"description": "Ansible example project",
|
||||
"status": "successful"
|
||||
},
|
||||
"inventory": {
|
||||
"name": "Rackspace",
|
||||
"description": "",
|
||||
"has_active_failures": true,
|
||||
"total_hosts": 20,
|
||||
"hosts_with_active_failures": 20,
|
||||
"total_groups": 3,
|
||||
"groups_with_active_failures": 3,
|
||||
"has_inventory_sources": true,
|
||||
"total_inventory_sources": 1,
|
||||
"inventory_sources_with_failures": 1
|
||||
}
|
||||
},
|
||||
"created": "2014-03-07T23:28:06.999Z",
|
||||
"modified": "2014-03-07T23:28:16.424Z",
|
||||
"job_template": 3,
|
||||
"job_type": "run",
|
||||
"job_explanation": "AWS access error. Check your credentials.",
|
||||
"status": "failed",
|
||||
"failed": true,
|
||||
"type": "inventory_sync",
|
||||
"name": "AWS Cloud",
|
||||
"inventory": 4,
|
||||
"project": 1,
|
||||
"credential": 8,
|
||||
"cloud_credential": null,
|
||||
"forks": 0,
|
||||
"limit": "",
|
||||
"verbosity": 0,
|
||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||
"job_tags": "",
|
||||
"launch_type": "manual",
|
||||
"result_traceback": "",
|
||||
"passwords_needed_to_start": [],
|
||||
"job_args": "[\"ssh-agent\", \"sh\", \"-c\", \"ssh-add /tmp/tmpoeaDyc && ansible-playbook -i /vagrant/ansible-commander/awx/plugins/inventory/awxrest.py -u vagrant -e '{\\\"variable1\\\": \\\"some value\\\", \\\"variable2\\\": \\\"another value\\\"}' lamp_simple/site.yml\"]",
|
||||
"job_cwd": "/vagrant/ansible-commander/awx/projects/_1__examples",
|
||||
"job_env": {
|
||||
"CELERY_LOG_REDIRECT_LEVEL": "WARNING",
|
||||
"ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False",
|
||||
"DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
|
||||
"LESSOPEN": "|/usr/bin/lesspipe.sh %s",
|
||||
"_MP_FORK_LOGFILE_": "",
|
||||
"SSH_CLIENT": "10.0.2.2 61378 22",
|
||||
"CVS_RSH": "ssh",
|
||||
"LOGNAME": "vagrant",
|
||||
"USER": "vagrant",
|
||||
"HOME": "/home/vagrant",
|
||||
"PATH": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin",
|
||||
"REST_API_TOKEN": "**********************************",
|
||||
"CALLBACK_CONSUMER_PORT": "tcp://127.0.0.1:5557",
|
||||
"ANSIBLE_CALLBACK_PLUGINS": "/vagrant/ansible-commander/awx/plugins/callback",
|
||||
"LANG": "en_US.UTF-8",
|
||||
"HISTCONTROL": "ignoredups",
|
||||
"TERM": "xterm",
|
||||
"SHELL": "/bin/bash",
|
||||
"TZ": "America/New_York",
|
||||
"_MP_FORK_LOGFORMAT_": "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
|
||||
"SHLVL": "1",
|
||||
"G_BROKEN_FILENAMES": "1",
|
||||
"HISTSIZE": "1000",
|
||||
"CELERY_LOG_FILE": "",
|
||||
"DJANGO_PROJECT_DIR": "/vagrant/ansible-commander",
|
||||
"ANSIBLE_HOST_KEY_CHECKING": "False",
|
||||
"JOB_ID": "2",
|
||||
"PYTHONPATH": "/vagrant/ansible-commander/awx/lib/site-packages:",
|
||||
"CELERY_LOADER": "djcelery.loaders.DjangoLoader",
|
||||
"_MP_FORK_LOGLEVEL_": "10",
|
||||
"ANSIBLE_NOCOLOR": "1",
|
||||
"JOB_CALLBACK_DEBUG": "1",
|
||||
"REST_API_URL": "http://127.0.0.1:8013",
|
||||
"_": "/usr/bin/nohup",
|
||||
"SSH_CONNECTION": "10.0.2.2 61378 10.0.2.15 22",
|
||||
"INVENTORY_HOSTVARS": "True",
|
||||
"SSH_TTY": "/dev/pts/0",
|
||||
"CELERY_LOG_LEVEL": "10",
|
||||
"HOSTNAME": "vagrant-centos64.vagrantup.com",
|
||||
"INVENTORY_ID": "4",
|
||||
"PWD": "/home/vagrant",
|
||||
"CELERY_LOG_REDIRECT": "1",
|
||||
"DJANGO_SETTINGS_MODULE": "awx.settings.development",
|
||||
"MAIL": "/var/spool/mail/vagrant",
|
||||
"LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"url": "/api/v1/jobs/2/",
|
||||
"related": {
|
||||
"job_host_summaries": "/api/v1/jobs/2/job_host_summaries/",
|
||||
"activity_stream": "/api/v1/jobs/2/activity_stream/",
|
||||
"job_events": "/api/v1/jobs/2/job_events/",
|
||||
"job_template": "/api/v1/job_templates/3/",
|
||||
"inventory": "/api/v1/inventories/4/",
|
||||
"project": "/api/v1/projects/1/",
|
||||
"credential": "/api/v1/credentials/8/",
|
||||
"start": "/api/v1/jobs/2/start/",
|
||||
"cancel": "/api/v1/jobs/2/cancel/"
|
||||
},
|
||||
"summary_fields": {
|
||||
"credential": {
|
||||
"name": "ssh",
|
||||
"description": "machine creds",
|
||||
"kind": "ssh",
|
||||
"cloud": false
|
||||
},
|
||||
"job_template": {
|
||||
"name": "Hello World",
|
||||
"description": ""
|
||||
},
|
||||
"project": {
|
||||
"name": "Examples",
|
||||
"description": "Ansible example project",
|
||||
"status": "successful"
|
||||
},
|
||||
"inventory": {
|
||||
"name": "Rackspace",
|
||||
"description": "",
|
||||
"has_active_failures": true,
|
||||
"total_hosts": 20,
|
||||
"hosts_with_active_failures": 20,
|
||||
"total_groups": 3,
|
||||
"groups_with_active_failures": 3,
|
||||
"has_inventory_sources": true,
|
||||
"total_inventory_sources": 1,
|
||||
"inventory_sources_with_failures": 1
|
||||
}
|
||||
},
|
||||
"created": "2014-03-07T23:28:06.999Z",
|
||||
"modified": "2014-03-07T23:28:16.424Z",
|
||||
"job_template": 3,
|
||||
"job_type": "run",
|
||||
"job_explanation": "Completed successfully",
|
||||
"status": "successful",
|
||||
"failed": false,
|
||||
"type": "inventory_sync",
|
||||
"inventory": 4,
|
||||
"name": "Rackspace",
|
||||
"project": 1,
|
||||
"playbook": "lamp_simple/site.yml",
|
||||
"credential": 8,
|
||||
"cloud_credential": null,
|
||||
"forks": 0,
|
||||
"limit": "",
|
||||
"verbosity": 0,
|
||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||
"job_tags": "",
|
||||
"launch_type": "manual",
|
||||
"result_traceback": "",
|
||||
"passwords_needed_to_start": [],
|
||||
"job_args": "[\"ssh-agent\", \"sh\", \"-c\", \"ssh-add /tmp/tmpoeaDyc && ansible-playbook -i /vagrant/ansible-commander/awx/plugins/inventory/awxrest.py -u vagrant -e '{\\\"variable1\\\": \\\"some value\\\", \\\"variable2\\\": \\\"another value\\\"}' lamp_simple/site.yml\"]",
|
||||
"job_cwd": "/vagrant/ansible-commander/awx/projects/_1__examples",
|
||||
"job_env": {
|
||||
"CELERY_LOG_REDIRECT_LEVEL": "WARNING",
|
||||
"ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False",
|
||||
"DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
|
||||
"LESSOPEN": "|/usr/bin/lesspipe.sh %s",
|
||||
"_MP_FORK_LOGFILE_": "",
|
||||
"SSH_CLIENT": "10.0.2.2 61378 22",
|
||||
"CVS_RSH": "ssh",
|
||||
"LOGNAME": "vagrant",
|
||||
"USER": "vagrant",
|
||||
"HOME": "/home/vagrant",
|
||||
"PATH": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin",
|
||||
"REST_API_TOKEN": "**********************************",
|
||||
"CALLBACK_CONSUMER_PORT": "tcp://127.0.0.1:5557",
|
||||
"ANSIBLE_CALLBACK_PLUGINS": "/vagrant/ansible-commander/awx/plugins/callback",
|
||||
"LANG": "en_US.UTF-8",
|
||||
"HISTCONTROL": "ignoredups",
|
||||
"TERM": "xterm",
|
||||
"SHELL": "/bin/bash",
|
||||
"TZ": "America/New_York",
|
||||
"_MP_FORK_LOGFORMAT_": "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
|
||||
"SHLVL": "1",
|
||||
"G_BROKEN_FILENAMES": "1",
|
||||
"HISTSIZE": "1000",
|
||||
"CELERY_LOG_FILE": "",
|
||||
"DJANGO_PROJECT_DIR": "/vagrant/ansible-commander",
|
||||
"ANSIBLE_HOST_KEY_CHECKING": "False",
|
||||
"JOB_ID": "2",
|
||||
"PYTHONPATH": "/vagrant/ansible-commander/awx/lib/site-packages:",
|
||||
"CELERY_LOADER": "djcelery.loaders.DjangoLoader",
|
||||
"_MP_FORK_LOGLEVEL_": "10",
|
||||
"ANSIBLE_NOCOLOR": "1",
|
||||
"JOB_CALLBACK_DEBUG": "1",
|
||||
"REST_API_URL": "http://127.0.0.1:8013",
|
||||
"_": "/usr/bin/nohup",
|
||||
"SSH_CONNECTION": "10.0.2.2 61378 10.0.2.15 22",
|
||||
"INVENTORY_HOSTVARS": "True",
|
||||
"SSH_TTY": "/dev/pts/0",
|
||||
"CELERY_LOG_LEVEL": "10",
|
||||
"HOSTNAME": "vagrant-centos64.vagrantup.com",
|
||||
"INVENTORY_ID": "4",
|
||||
"PWD": "/home/vagrant",
|
||||
"CELERY_LOG_REDIRECT": "1",
|
||||
"DJANGO_SETTINGS_MODULE": "awx.settings.development",
|
||||
"MAIL": "/var/spool/mail/vagrant",
|
||||
"LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"url": "/api/v1/jobs/2/",
|
||||
"related": {
|
||||
"job_host_summaries": "/api/v1/jobs/2/job_host_summaries/",
|
||||
"activity_stream": "/api/v1/jobs/2/activity_stream/",
|
||||
"job_events": "/api/v1/jobs/2/job_events/",
|
||||
"job_template": "/api/v1/job_templates/3/",
|
||||
"inventory": "/api/v1/inventories/4/",
|
||||
"project": "/api/v1/projects/1/",
|
||||
"credential": "/api/v1/credentials/8/",
|
||||
"start": "/api/v1/jobs/2/start/",
|
||||
"cancel": "/api/v1/jobs/2/cancel/"
|
||||
},
|
||||
"summary_fields": {
|
||||
"credential": {
|
||||
"name": "ssh",
|
||||
"description": "machine creds",
|
||||
"kind": "ssh",
|
||||
"cloud": false
|
||||
},
|
||||
"job_template": {
|
||||
"name": "Hello World",
|
||||
"description": ""
|
||||
},
|
||||
"project": {
|
||||
"name": "Examples",
|
||||
"description": "Ansible example project",
|
||||
"status": "successful"
|
||||
},
|
||||
"inventory": {
|
||||
"name": "Rackspace",
|
||||
"description": "",
|
||||
"has_active_failures": true,
|
||||
"total_hosts": 20,
|
||||
"hosts_with_active_failures": 20,
|
||||
"total_groups": 3,
|
||||
"groups_with_active_failures": 3,
|
||||
"has_inventory_sources": true,
|
||||
"total_inventory_sources": 1,
|
||||
"inventory_sources_with_failures": 1
|
||||
}
|
||||
},
|
||||
"created": "2014-03-07T23:28:06.999Z",
|
||||
"modified": "2014-03-07T23:28:16.424Z",
|
||||
"job_explanation": "Completed successfully",
|
||||
"status": "successful",
|
||||
"failed": true,
|
||||
"job_template": 3,
|
||||
"job_type": "run",
|
||||
"type": "scm_sync",
|
||||
"name": "Examples",
|
||||
"inventory": 4,
|
||||
"project": 1,
|
||||
"playbook": "lamp_simple/site.yml",
|
||||
"credential": 8,
|
||||
"cloud_credential": null,
|
||||
"forks": 0,
|
||||
"limit": "",
|
||||
"verbosity": 0,
|
||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||
"job_tags": "",
|
||||
"launch_type": "manual",
|
||||
"result_traceback": "",
|
||||
"passwords_needed_to_start": [],
|
||||
"job_args": "[\"ssh-agent\", \"sh\", \"-c\", \"ssh-add /tmp/tmpoeaDyc && ansible-playbook -i /vagrant/ansible-commander/awx/plugins/inventory/awxrest.py -u vagrant -e '{\\\"variable1\\\": \\\"some value\\\", \\\"variable2\\\": \\\"another value\\\"}' lamp_simple/site.yml\"]",
|
||||
"job_cwd": "/vagrant/ansible-commander/awx/projects/_1__examples",
|
||||
"job_env": {
|
||||
"CELERY_LOG_REDIRECT_LEVEL": "WARNING",
|
||||
"ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False",
|
||||
"DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
|
||||
"LESSOPEN": "|/usr/bin/lesspipe.sh %s",
|
||||
"_MP_FORK_LOGFILE_": "",
|
||||
"SSH_CLIENT": "10.0.2.2 61378 22",
|
||||
"CVS_RSH": "ssh",
|
||||
"LOGNAME": "vagrant",
|
||||
"USER": "vagrant",
|
||||
"HOME": "/home/vagrant",
|
||||
"PATH": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin",
|
||||
"REST_API_TOKEN": "**********************************",
|
||||
"CALLBACK_CONSUMER_PORT": "tcp://127.0.0.1:5557",
|
||||
"ANSIBLE_CALLBACK_PLUGINS": "/vagrant/ansible-commander/awx/plugins/callback",
|
||||
"LANG": "en_US.UTF-8",
|
||||
"HISTCONTROL": "ignoredups",
|
||||
"TERM": "xterm",
|
||||
"SHELL": "/bin/bash",
|
||||
"TZ": "America/New_York",
|
||||
"_MP_FORK_LOGFORMAT_": "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
|
||||
"SHLVL": "1",
|
||||
"G_BROKEN_FILENAMES": "1",
|
||||
"HISTSIZE": "1000",
|
||||
"CELERY_LOG_FILE": "",
|
||||
"DJANGO_PROJECT_DIR": "/vagrant/ansible-commander",
|
||||
"ANSIBLE_HOST_KEY_CHECKING": "False",
|
||||
"JOB_ID": "2",
|
||||
"PYTHONPATH": "/vagrant/ansible-commander/awx/lib/site-packages:",
|
||||
"CELERY_LOADER": "djcelery.loaders.DjangoLoader",
|
||||
"_MP_FORK_LOGLEVEL_": "10",
|
||||
"ANSIBLE_NOCOLOR": "1",
|
||||
"JOB_CALLBACK_DEBUG": "1",
|
||||
"REST_API_URL": "http://127.0.0.1:8013",
|
||||
"_": "/usr/bin/nohup",
|
||||
"SSH_CONNECTION": "10.0.2.2 61378 10.0.2.15 22",
|
||||
"INVENTORY_HOSTVARS": "True",
|
||||
"SSH_TTY": "/dev/pts/0",
|
||||
"CELERY_LOG_LEVEL": "10",
|
||||
"HOSTNAME": "vagrant-centos64.vagrantup.com",
|
||||
"INVENTORY_ID": "4",
|
||||
"PWD": "/home/vagrant",
|
||||
"CELERY_LOG_REDIRECT": "1",
|
||||
"DJANGO_SETTINGS_MODULE": "awx.settings.development",
|
||||
"MAIL": "/var/spool/mail/vagrant",
|
||||
"LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"url": "/api/v1/jobs/2/",
|
||||
"related": {
|
||||
"job_host_summaries": "/api/v1/jobs/2/job_host_summaries/",
|
||||
"activity_stream": "/api/v1/jobs/2/activity_stream/",
|
||||
"job_events": "/api/v1/jobs/2/job_events/",
|
||||
"job_template": "/api/v1/job_templates/3/",
|
||||
"inventory": "/api/v1/inventories/4/",
|
||||
"project": "/api/v1/projects/1/",
|
||||
"credential": "/api/v1/credentials/8/",
|
||||
"start": "/api/v1/jobs/2/start/",
|
||||
"cancel": "/api/v1/jobs/2/cancel/"
|
||||
},
|
||||
"summary_fields": {
|
||||
"credential": {
|
||||
"name": "ssh",
|
||||
"description": "machine creds",
|
||||
"kind": "ssh",
|
||||
"cloud": false
|
||||
},
|
||||
"job_template": {
|
||||
"name": "Hello World",
|
||||
"description": ""
|
||||
},
|
||||
"project": {
|
||||
"name": "Examples",
|
||||
"description": "Ansible example project",
|
||||
"status": "successful"
|
||||
},
|
||||
"inventory": {
|
||||
"name": "Rackspace",
|
||||
"description": "",
|
||||
"has_active_failures": true,
|
||||
"total_hosts": 20,
|
||||
"hosts_with_active_failures": 20,
|
||||
"total_groups": 3,
|
||||
"groups_with_active_failures": 3,
|
||||
"has_inventory_sources": true,
|
||||
"total_inventory_sources": 1,
|
||||
"inventory_sources_with_failures": 1
|
||||
}
|
||||
},
|
||||
"created": "2014-03-07T23:28:06.999Z",
|
||||
"modified": "2014-03-07T23:28:16.424Z",
|
||||
"job_template": 3,
|
||||
"job_type": "run",
|
||||
"job_explanation": "Ended in a horrible fireball",
|
||||
"status": "failed",
|
||||
"failed": true,
|
||||
"type": "playbook_run",
|
||||
"name": "Web server restart",
|
||||
"inventory": 4,
|
||||
"project": 1,
|
||||
"playbook": "lamp_simple/site.yml",
|
||||
"credential": 8,
|
||||
"cloud_credential": null,
|
||||
"forks": 0,
|
||||
"limit": "",
|
||||
"verbosity": 0,
|
||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||
"job_tags": "",
|
||||
"launch_type": "manual",
|
||||
"result_traceback": "",
|
||||
"passwords_needed_to_start": [],
|
||||
"job_args": "[\"ssh-agent\", \"sh\", \"-c\", \"ssh-add /tmp/tmpoeaDyc && ansible-playbook -i /vagrant/ansible-commander/awx/plugins/inventory/awxrest.py -u vagrant -e '{\\\"variable1\\\": \\\"some value\\\", \\\"variable2\\\": \\\"another value\\\"}' lamp_simple/site.yml\"]",
|
||||
"job_cwd": "/vagrant/ansible-commander/awx/projects/_1__examples",
|
||||
"job_env": {
|
||||
"CELERY_LOG_REDIRECT_LEVEL": "WARNING",
|
||||
"ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False",
|
||||
"DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
|
||||
"LESSOPEN": "|/usr/bin/lesspipe.sh %s",
|
||||
"_MP_FORK_LOGFILE_": "",
|
||||
"SSH_CLIENT": "10.0.2.2 61378 22",
|
||||
"CVS_RSH": "ssh",
|
||||
"LOGNAME": "vagrant",
|
||||
"USER": "vagrant",
|
||||
"HOME": "/home/vagrant",
|
||||
"PATH": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin",
|
||||
"REST_API_TOKEN": "**********************************",
|
||||
"CALLBACK_CONSUMER_PORT": "tcp://127.0.0.1:5557",
|
||||
"ANSIBLE_CALLBACK_PLUGINS": "/vagrant/ansible-commander/awx/plugins/callback",
|
||||
"LANG": "en_US.UTF-8",
|
||||
"HISTCONTROL": "ignoredups",
|
||||
"TERM": "xterm",
|
||||
"SHELL": "/bin/bash",
|
||||
"TZ": "America/New_York",
|
||||
"_MP_FORK_LOGFORMAT_": "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
|
||||
"SHLVL": "1",
|
||||
"G_BROKEN_FILENAMES": "1",
|
||||
"HISTSIZE": "1000",
|
||||
"CELERY_LOG_FILE": "",
|
||||
"DJANGO_PROJECT_DIR": "/vagrant/ansible-commander",
|
||||
"ANSIBLE_HOST_KEY_CHECKING": "False",
|
||||
"JOB_ID": "2",
|
||||
"PYTHONPATH": "/vagrant/ansible-commander/awx/lib/site-packages:",
|
||||
"CELERY_LOADER": "djcelery.loaders.DjangoLoader",
|
||||
"_MP_FORK_LOGLEVEL_": "10",
|
||||
"ANSIBLE_NOCOLOR": "1",
|
||||
"JOB_CALLBACK_DEBUG": "1",
|
||||
"REST_API_URL": "http://127.0.0.1:8013",
|
||||
"_": "/usr/bin/nohup",
|
||||
"SSH_CONNECTION": "10.0.2.2 61378 10.0.2.15 22",
|
||||
"INVENTORY_HOSTVARS": "True",
|
||||
"SSH_TTY": "/dev/pts/0",
|
||||
"CELERY_LOG_LEVEL": "10",
|
||||
"HOSTNAME": "vagrant-centos64.vagrantup.com",
|
||||
"INVENTORY_ID": "4",
|
||||
"PWD": "/home/vagrant",
|
||||
"CELERY_LOG_REDIRECT": "1",
|
||||
"DJANGO_SETTINGS_MODULE": "awx.settings.development",
|
||||
"MAIL": "/var/spool/mail/vagrant",
|
||||
"LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -108,6 +108,7 @@
|
||||
<script src="{{ STATIC_URL }}js/lists/Credentials.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/JobTemplates.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/Projects.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/Jobs.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/CompletedJobs.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/RunningJobs.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/QueuedJobs.js"></script>
|
||||
@ -120,6 +121,7 @@
|
||||
<script src="{{ STATIC_URL }}js/lists/Groups.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/Hosts.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/Schedules.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/lists/ScheduledJobs.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/helpers/refresh-related.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/helpers/related-search.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/helpers/refresh.js"></script>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user