mirror of
https://github.com/ansible/awx.git
synced 2026-03-23 03:45:01 -02:30
Jobs page changes. Modified JobsEdit controller to incorporate new fields. Shows/hides job template based on the type of job. Re-ordered fields. Made the stdout textarea resizable. Fixed a bug in the accordions.
This commit is contained in:
@@ -85,34 +85,289 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ
|
|||||||
callback: 'choicesReady'
|
callback: 'choicesReady'
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Use for types later
|
|
||||||
GetChoices({
|
GetChoices({
|
||||||
scope: $scope,
|
scope: $scope,
|
||||||
url: GetBasePath('jobs'),
|
url: '/static/sample/data/types/data.json', //GetBasePath('jobs')
|
||||||
field: 'type',
|
field: 'type',
|
||||||
variable: 'types',
|
variable: 'type_choices',
|
||||||
callback: ''
|
callback: 'choicesReady'
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
|
|
||||||
$scope.type_choices = [{
|
|
||||||
label: 'Inventory sync',
|
|
||||||
value: 'inventory_sync',
|
|
||||||
name: 'inventory_sync'
|
|
||||||
},{
|
|
||||||
label: 'Project sync',
|
|
||||||
value: 'scm_sync',
|
|
||||||
name: 'scm_sync'
|
|
||||||
},{
|
|
||||||
label: 'Playbook run',
|
|
||||||
value: 'playbook_run',
|
|
||||||
name: 'playbook_run'
|
|
||||||
}];
|
|
||||||
$scope.$emit('choicesReady');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JobsList.$inject = ['$scope', '$compile', 'ClearScope', 'Breadcrumbs', 'LoadScope', 'RunningJobsList', 'CompletedJobsList',
|
JobsList.$inject = ['$scope', '$compile', 'ClearScope', 'Breadcrumbs', 'LoadScope', 'RunningJobsList', 'CompletedJobsList',
|
||||||
'QueuedJobsList', 'GetChoices', 'GetBasePath', 'Wait'];
|
'QueuedJobsList', 'GetChoices', 'GetBasePath', 'Wait'];
|
||||||
|
|
||||||
|
function JobsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, JobForm, JobTemplateForm, GenerateForm, Rest,
|
||||||
|
Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, InventoryList,
|
||||||
|
CredentialList, ProjectList, LookUpInit, PromptPasswords, GetBasePath, md5Setup, FormatDate, JobStatusToolTip, Wait, Empty,
|
||||||
|
ParseVariableString, GetChoices) {
|
||||||
|
|
||||||
|
ClearScope();
|
||||||
|
|
||||||
|
var defaultUrl = GetBasePath('jobs'),
|
||||||
|
generator = GenerateForm,
|
||||||
|
id = $routeParams.id,
|
||||||
|
loadingFinishedCount = 0,
|
||||||
|
templateForm = {},
|
||||||
|
choicesCount = 0;
|
||||||
|
|
||||||
|
generator.inject(JobForm, { mode: 'edit', related: true, scope: $scope });
|
||||||
|
|
||||||
|
$scope.job_id = id;
|
||||||
|
$scope.parseType = 'yaml';
|
||||||
|
$scope.statusSearchSpin = false;
|
||||||
|
$scope.disableParseSelection = true;
|
||||||
|
|
||||||
|
function getPlaybooks(project, playbook) {
|
||||||
|
if (!Empty(project)) {
|
||||||
|
var url = GetBasePath('projects') + project + '/playbooks/';
|
||||||
|
Rest.setUrl(url);
|
||||||
|
Rest.get()
|
||||||
|
.success(function (data) {
|
||||||
|
var i;
|
||||||
|
$scope.playbook_options = [];
|
||||||
|
for (i = 0; i < data.length; i++) {
|
||||||
|
$scope.playbook_options.push(data[i]);
|
||||||
|
}
|
||||||
|
for (i = 0; i < $scope.playbook_options.length; i++) {
|
||||||
|
if ($scope.playbook_options[i] === playbook) {
|
||||||
|
$scope.playbook = $scope.playbook_options[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$scope.$emit('jobTemplateLoadFinished');
|
||||||
|
})
|
||||||
|
.error(function () {
|
||||||
|
$scope.$emit('jobTemplateLoadFinished');
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$scope.$emit('jobTemplateLoadFinished');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Retrieve each related set and populate the playbook list
|
||||||
|
if ($scope.jobLoadedRemove) {
|
||||||
|
$scope.jobLoadedRemove();
|
||||||
|
}
|
||||||
|
$scope.jobLoadedRemove = $scope.$on('jobLoaded', function (e, related_cloud_credential, project, playbook) {
|
||||||
|
|
||||||
|
getPlaybooks(project, playbook);
|
||||||
|
if (related_cloud_credential) {
|
||||||
|
//Get the name of the cloud credential
|
||||||
|
Rest.setUrl(related_cloud_credential);
|
||||||
|
Rest.get()
|
||||||
|
.success(function (data) {
|
||||||
|
$scope.cloud_credential_name = data.name;
|
||||||
|
$scope.$emit('jobTemplateLoadFinished');
|
||||||
|
})
|
||||||
|
.error(function (data, status) {
|
||||||
|
ProcessErrors($scope, data, status, null, { hdr: 'Error!',
|
||||||
|
msg: 'Failed to related cloud credential. GET returned status: ' + status });
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$scope.$emit('jobTemplateLoadFinished');
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Turn off 'Wait' after both cloud credential and playbook list come back
|
||||||
|
if ($scope.removeJobTemplateLoadFinished) {
|
||||||
|
$scope.removeJobTemplateLoadFinished();
|
||||||
|
}
|
||||||
|
$scope.removeJobTemplateLoadFinished = $scope.$on('jobTemplateLoadFinished', function () {
|
||||||
|
loadingFinishedCount++;
|
||||||
|
if (loadingFinishedCount >= 2) {
|
||||||
|
// The initial template load finished. Now load related jobs, which
|
||||||
|
// will turn off the 'working' spinner.
|
||||||
|
Wait('stop');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.verbosity_options = [{
|
||||||
|
value: 0,
|
||||||
|
label: 'Default'
|
||||||
|
}, {
|
||||||
|
value: 1,
|
||||||
|
label: 'Verbose'
|
||||||
|
}, {
|
||||||
|
value: 3,
|
||||||
|
label: 'Debug'
|
||||||
|
}];
|
||||||
|
|
||||||
|
$scope.playbook_options = null;
|
||||||
|
$scope.playbook = null;
|
||||||
|
|
||||||
|
function calcRows(content) {
|
||||||
|
var n = content.match(/\n/g),
|
||||||
|
rows = (n) ? n.length : 1;
|
||||||
|
return (rows > 15) ? 15 : rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope.removeLoadJobTemplate) {
|
||||||
|
$scope.removeLoadJobTemplate();
|
||||||
|
}
|
||||||
|
$scope.removeLoadJobTemplate = $scope.$on('loadJobTemplate', function() {
|
||||||
|
// Retrieve the job detail record and prepopulate the form
|
||||||
|
Rest.setUrl(defaultUrl + ':id/');
|
||||||
|
Rest.get({ params: { id: id } })
|
||||||
|
.success(function (data) {
|
||||||
|
|
||||||
|
var i, fld;
|
||||||
|
|
||||||
|
LoadBreadCrumbs();
|
||||||
|
|
||||||
|
$scope.status = data.status;
|
||||||
|
$scope.created = FormatDate(data.created);
|
||||||
|
$scope.modified = FormatDate(data.modified);
|
||||||
|
$scope.result_stdout = data.result_stdout;
|
||||||
|
$scope.result_traceback = data.result_traceback;
|
||||||
|
$scope.stdout_rows = calcRows($scope.result_stdout);
|
||||||
|
$scope.traceback_rows = calcRows($scope.result_traceback);
|
||||||
|
$scope.job_explanation = data.job_explanation || 'Things may have ended badly or gone swimingly well';
|
||||||
|
|
||||||
|
// Now load the job template form
|
||||||
|
templateForm.addTitle = 'Create Job Templates';
|
||||||
|
templateForm.editTitle = '{{ name }}';
|
||||||
|
templateForm.name = 'job_templates';
|
||||||
|
templateForm.twoColumns = true;
|
||||||
|
templateForm.fields = angular.copy(JobTemplateForm.fields);
|
||||||
|
for (fld in templateForm.fields) {
|
||||||
|
templateForm.fields[fld].readonly = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.type === "playbook_run") {
|
||||||
|
$('#ui-accordion-jobs-collapse-0-panel-1').empty();
|
||||||
|
generator.inject(templateForm, {
|
||||||
|
mode: 'edit',
|
||||||
|
id: 'ui-accordion-jobs-collapse-0-panel-1',
|
||||||
|
related: false,
|
||||||
|
scope: $scope,
|
||||||
|
breadCrumbs: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$('#ui-accordion-jobs-collapse-0-header-1').hide();
|
||||||
|
$('#ui-accordion-jobs-collapse-0-panel-1').empty().hide();
|
||||||
|
$('#jobs-collapse-0').accordion( "option", "collapsible", false );
|
||||||
|
}
|
||||||
|
|
||||||
|
for (fld in templateForm.fields) {
|
||||||
|
if (fld !== 'variables' && data[fld] !== null && data[fld] !== undefined) {
|
||||||
|
if (JobTemplateForm.fields[fld].type === 'select') {
|
||||||
|
if ($scope[fld + '_options'] && $scope[fld + '_options'].length > 0) {
|
||||||
|
for (i = 0; i < $scope[fld + '_options'].length; i++) {
|
||||||
|
if (data[fld] === $scope[fld + '_options'][i].value) {
|
||||||
|
$scope[fld] = $scope[fld + '_options'][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$scope[fld] = data[fld];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$scope[fld] = data[fld];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fld === 'variables') {
|
||||||
|
$scope.variables = ParseVariableString(data.extra_vars);
|
||||||
|
}
|
||||||
|
if (JobTemplateForm.fields[fld].type === 'lookup' && data.summary_fields[JobTemplateForm.fields[fld].sourceModel]) {
|
||||||
|
$scope[JobTemplateForm.fields[fld].sourceModel + '_' + JobTemplateForm.fields[fld].sourceField] =
|
||||||
|
data.summary_fields[JobTemplateForm.fields[fld].sourceModel][JobTemplateForm.fields[fld].sourceField];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.id = data.id;
|
||||||
|
$scope.name = (data.summary_fields && data.summary_fields.job_template) ? data.summary_fields.job_template.name : '';
|
||||||
|
$scope.statusToolTip = JobStatusToolTip(data.status);
|
||||||
|
$scope.url = data.url;
|
||||||
|
$scope.project = data.project;
|
||||||
|
$scope.launch_type = data.launch_type;
|
||||||
|
|
||||||
|
// set the type
|
||||||
|
data.type = 'playbook_run'; //temporary
|
||||||
|
$scope.type_choices.every( function(choice) {
|
||||||
|
if (choice.value === data.type) {
|
||||||
|
$scope.type = choice.label;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.$emit('jobLoaded', data.related.cloud_credential, data.project, data.playbook);
|
||||||
|
})
|
||||||
|
.error(function (data, status) {
|
||||||
|
ProcessErrors($scope, data, status, null, { hdr: 'Error!',
|
||||||
|
msg: 'Failed to retrieve job: ' + $routeParams.id + '. GET status: ' + status });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Wait('start');
|
||||||
|
|
||||||
|
if ($scope.removeChoicesReady) {
|
||||||
|
$scope.removeChoicesReady();
|
||||||
|
}
|
||||||
|
$scope.removeChoicesReady = $scope.$on('choicesReady', function() {
|
||||||
|
choicesCount++;
|
||||||
|
if (choicesCount === 2) {
|
||||||
|
$scope.$emit('loadJobTemplate');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
GetChoices({
|
||||||
|
scope: $scope,
|
||||||
|
url: GetBasePath('jobs'),
|
||||||
|
field: 'job_type',
|
||||||
|
variable: 'job_type_options',
|
||||||
|
callback: 'choicesReady'
|
||||||
|
});
|
||||||
|
|
||||||
|
/*GetChoices({
|
||||||
|
scope: $scope,
|
||||||
|
url: GetBasePath('jobs'),
|
||||||
|
field: 'status',
|
||||||
|
variable: 'status_choices',
|
||||||
|
callback: 'choicesReady'
|
||||||
|
});*/
|
||||||
|
|
||||||
|
GetChoices({
|
||||||
|
scope: $scope,
|
||||||
|
url: '/static/sample/data/types/data.json', //GetBasePath('jobs')
|
||||||
|
field: 'type',
|
||||||
|
variable: 'type_choices',
|
||||||
|
callback: 'choicesReady'
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.refresh = function () {
|
||||||
|
Wait('start');
|
||||||
|
Rest.setUrl(defaultUrl + id + '/');
|
||||||
|
Rest.get()
|
||||||
|
.success(function (data) {
|
||||||
|
$scope.status = data.status;
|
||||||
|
$scope.result_stdout = data.result_stdout;
|
||||||
|
$scope.result_traceback = data.result_traceback;
|
||||||
|
$scope.stdout_rows = calcRows($scope.result_stdout);
|
||||||
|
$scope.traceback_rows = calcRows($scope.result_traceback);
|
||||||
|
Wait('stop');
|
||||||
|
})
|
||||||
|
.error(function (data, status) {
|
||||||
|
ProcessErrors($scope, data, status, null, { hdr: 'Error!',
|
||||||
|
msg: 'Attempt to load job failed. GET returned status: ' + status });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.jobSummary = function () {
|
||||||
|
$location.path('/jobs/' + id + '/job_host_summaries');
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.jobEvents = function () {
|
||||||
|
$location.path('/jobs/' + id + '/job_events');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
JobsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobForm', 'JobTemplateForm',
|
||||||
|
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit',
|
||||||
|
'ReturnToCaller', 'ClearScope', 'InventoryList', 'CredentialList', 'ProjectList', 'LookUpInit', 'PromptPasswords',
|
||||||
|
'GetBasePath', 'md5Setup', 'FormatDate', 'JobStatusToolTip', 'Wait', 'Empty', 'ParseVariableString', 'GetChoices'
|
||||||
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -42,13 +42,7 @@ angular.module('JobFormDefinition', [])
|
|||||||
fields: {
|
fields: {
|
||||||
status: {
|
status: {
|
||||||
type: 'custom',
|
type: 'custom',
|
||||||
control: "<div class=\"job-detail-status\"><span style=\"padding-right: 15px; font-weight: bold;\">Status</span> " +
|
control: "<i class=\"fa icon-job-{{ status }}\"></i> {{ job_explanation }}",
|
||||||
"<i class=\"fa icon-job-{{ status }}\"></i> {{ status }}</div>",
|
|
||||||
readonly: true
|
|
||||||
},
|
|
||||||
created: {
|
|
||||||
label: 'Created On',
|
|
||||||
type: 'text',
|
|
||||||
readonly: true
|
readonly: true
|
||||||
},
|
},
|
||||||
result_stdout: {
|
result_stdout: {
|
||||||
@@ -57,7 +51,7 @@ angular.module('JobFormDefinition', [])
|
|||||||
readonly: true,
|
readonly: true,
|
||||||
xtraWide: true,
|
xtraWide: true,
|
||||||
rows: "{{ stdout_rows }}",
|
rows: "{{ stdout_rows }}",
|
||||||
"class": 'nowrap mono-space',
|
"class": 'nowrap mono-space allowresize',
|
||||||
ngShow: "result_stdout != ''"
|
ngShow: "result_stdout != ''"
|
||||||
},
|
},
|
||||||
result_traceback: {
|
result_traceback: {
|
||||||
@@ -66,8 +60,28 @@ angular.module('JobFormDefinition', [])
|
|||||||
xtraWide: true,
|
xtraWide: true,
|
||||||
readonly: true,
|
readonly: true,
|
||||||
rows: "{{ traceback_rows }}",
|
rows: "{{ traceback_rows }}",
|
||||||
"class": 'nowrap mono-space',
|
"class": 'nowrap mono-space allowresize',
|
||||||
ngShow: "result_traceback != ''"
|
ngShow: "result_traceback != ''"
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
label: 'Job Type',
|
||||||
|
type: 'text',
|
||||||
|
readonly: true
|
||||||
|
},
|
||||||
|
launch_type: {
|
||||||
|
label: 'Launch Type',
|
||||||
|
type: 'text',
|
||||||
|
readonly: true
|
||||||
|
},
|
||||||
|
created: {
|
||||||
|
label: 'Created On',
|
||||||
|
type: 'text',
|
||||||
|
readonly: true
|
||||||
|
},
|
||||||
|
modified: {
|
||||||
|
label: 'Last Updated',
|
||||||
|
type: 'text',
|
||||||
|
readonly: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -95,4 +109,5 @@ angular.module('JobFormDefinition', [])
|
|||||||
fields: { }
|
fields: { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -220,8 +220,9 @@ angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinitio
|
|||||||
scope[list.name] = data.results;
|
scope[list.name] = data.results;
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
|
|
||||||
if (list.fields.type) {
|
scope[list.name].forEach(function(item, item_idx) {
|
||||||
scope[list.name].forEach(function(item, item_idx) {
|
// Set the item type label
|
||||||
|
if (list.fields.type) {
|
||||||
parent_scope.type_choices.every(function(choice) {
|
parent_scope.type_choices.every(function(choice) {
|
||||||
if (choice.value === item.type) {
|
if (choice.value === item.type) {
|
||||||
scope[list.name][item_idx].type = choice.label;
|
scope[list.name][item_idx].type = choice.label;
|
||||||
@@ -229,8 +230,26 @@ angular.module('JobsHelper', ['Utilities', 'FormGenerator', 'JobSummaryDefinitio
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
// 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;
|
||||||
|
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.';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
scope[list.name][item_idx].status_tip = 'Pending';
|
||||||
|
}
|
||||||
|
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";
|
||||||
|
});
|
||||||
|
|
||||||
parent_scope.$emit('listLoaded');
|
parent_scope.$emit('listLoaded');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -65,29 +65,12 @@ angular.module('CompletedJobsDefinition', [])
|
|||||||
fieldActions: {
|
fieldActions: {
|
||||||
status: {
|
status: {
|
||||||
mode: 'all',
|
mode: 'all',
|
||||||
//"class": 'job-{{ completed_job.status }}',
|
awToolTip: "{{ completed_job.status_tip }}",
|
||||||
//searchType: 'select',
|
awTipPlacement: "top",
|
||||||
//linkTo: "{{ completed_job.statusLinkTo }}",
|
dataTitle: "{{ completed_job.status_popover_title }}",
|
||||||
//searchOptions: [
|
|
||||||
// { name: "new", value: "new" },
|
|
||||||
// { name: "waiting", value: "waiting" },
|
|
||||||
// { name: "pending", value: "pending" },
|
|
||||||
// { name: "running", value: "running" },
|
|
||||||
// { name: "successful", value: "successful" },
|
|
||||||
// { name: "error", value: "error" },
|
|
||||||
// { name: "failed", value: "failed" },
|
|
||||||
// { name: "canceled", value: "canceled" }
|
|
||||||
//],
|
|
||||||
iconClass: 'fa icon-job-{{ completed_job.status }}',
|
iconClass: 'fa icon-job-{{ completed_job.status }}',
|
||||||
awToolTip: "{{ completed_job.statusToolTip }}",
|
awPopOver: "{{ completed_job.status_popover }}",
|
||||||
dataPlacement: 'top'
|
dataPlacement: 'left'
|
||||||
//badgeIcon: 'fa icon-job-{{ completed_job.status }}',
|
|
||||||
//badgePlacement: 'left',
|
|
||||||
//badgeToolTip: "{{ completed_job.statusBadgeToolTip }}",
|
|
||||||
//badgeTipPlacement: 'top',
|
|
||||||
//badgeNgHref: "{{ completed_job.statusLinkTo }}",
|
|
||||||
//awToolTip: "{{ completed_job.statusBadgeToolTip }}",
|
|
||||||
//dataPlacement: 'top'
|
|
||||||
},
|
},
|
||||||
submit: {
|
submit: {
|
||||||
icon: 'icon-rocket',
|
icon: 'icon-rocket',
|
||||||
|
|||||||
@@ -158,6 +158,10 @@ textarea {
|
|||||||
resize: none;
|
resize: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
textarea.allowresize {
|
||||||
|
resize: both;
|
||||||
|
}
|
||||||
|
|
||||||
/* Working... spinner */
|
/* Working... spinner */
|
||||||
.spinny {
|
.spinny {
|
||||||
display: none;
|
display: none;
|
||||||
@@ -210,7 +214,7 @@ textarea {
|
|||||||
.popover-content {
|
.popover-content {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
h3.popover-title, .popover-content, .popover-content blockquote {
|
h3.popover-title, .popover-content, .popover-content blockquote, .popover-content a {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
.flyout thead> tr> th, .flyout tbody> tr> td, .flyout tbody> tr> td> a {
|
.flyout thead> tr> th, .flyout tbody> tr> td, .flyout tbody> tr> td> a {
|
||||||
@@ -1164,7 +1168,6 @@ input[type="checkbox"].checkbox-no-label {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
font-weight: bold;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*.form-items .search-widget {
|
/*.form-items .search-widget {
|
||||||
|
|||||||
@@ -286,9 +286,10 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job
|
|||||||
return function(scope, element, attrs) {
|
return function(scope, element, attrs) {
|
||||||
var placement = (attrs.placement !== undefined && attrs.placement !== null) ? attrs.placement : 'left',
|
var placement = (attrs.placement !== undefined && attrs.placement !== null) ? attrs.placement : 'left',
|
||||||
title = (attrs.title !== undefined && attrs.title !== null) ? attrs.title : 'Help',
|
title = (attrs.title !== undefined && attrs.title !== null) ? attrs.title : 'Help',
|
||||||
container = (attrs.container !== undefined) ? attrs.container : false;
|
container = (attrs.container !== undefined) ? attrs.container : false,
|
||||||
|
trigger = (attrs.trigger !== undefined) ? attrs.trigger : 'manua';
|
||||||
$(element).popover({ placement: placement, delay: 0, title: title,
|
$(element).popover({ placement: placement, delay: 0, title: title,
|
||||||
content: attrs.awPopOver, trigger: 'manual', html: true, container: container });
|
content: attrs.awPopOver, trigger: trigger, html: true, container: container });
|
||||||
$(element).click(function() {
|
$(element).click(function() {
|
||||||
var self = $(this).attr('id');
|
var self = $(this).attr('id');
|
||||||
$('.help-link, .help-link-white').each( function() {
|
$('.help-link, .help-link-white').each( function() {
|
||||||
|
|||||||
@@ -1308,16 +1308,13 @@ angular.module('FormGenerator', ['GeneratorHelpers', 'ngCookies', 'Utilities'])
|
|||||||
|
|
||||||
if (this.form.collapse && this.form.collapseMode === options.mode) {
|
if (this.form.collapse && this.form.collapseMode === options.mode) {
|
||||||
html += "</div>\n";
|
html += "</div>\n";
|
||||||
//html += "</div>\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((!this.modal) && options.related && this.form.related) {
|
if ((!this.modal) && options.related && this.form.related) {
|
||||||
html += this.buildCollections(options);
|
html += this.buildCollections(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
buildCollections: function (options) {
|
buildCollections: function (options) {
|
||||||
@@ -1339,7 +1336,7 @@ angular.module('FormGenerator', ['GeneratorHelpers', 'ngCookies', 'Utilities'])
|
|||||||
|
|
||||||
for (itm in form.related) {
|
for (itm in form.related) {
|
||||||
if (form.related[itm].type === 'collection') {
|
if (form.related[itm].type === 'collection') {
|
||||||
html += "<h3 class=\"" + itm + "_collapse\">" + form.related[itm].title + "<h3>\n";
|
html += "<h3 class=\"" + itm + "_collapse\">" + form.related[itm].title + "</h3>\n";
|
||||||
html += "<div>\n";
|
html += "<div>\n";
|
||||||
|
|
||||||
if (form.related[itm].instructions) {
|
if (form.related[itm].instructions) {
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
|
|||||||
result += (obj.dataPlacement) ? "data-placement=\"" + obj.dataPlacement + "\" " : "";
|
result += (obj.dataPlacement) ? "data-placement=\"" + obj.dataPlacement + "\" " : "";
|
||||||
result += (obj.dataContainer) ? "data-container=\"" + obj.dataContainer + "\" " : "";
|
result += (obj.dataContainer) ? "data-container=\"" + obj.dataContainer + "\" " : "";
|
||||||
result += (obj.dataTitle) ? "data-title=\"" + obj.dataTitle + "\" " : "";
|
result += (obj.dataTitle) ? "data-title=\"" + obj.dataTitle + "\" " : "";
|
||||||
|
result += (obj.dataTrigger) ? "data-trigger=\"" + obj.dataTrigger + "\" " : "";
|
||||||
result += "class=\"help-link\" ";
|
result += "class=\"help-link\" ";
|
||||||
result += "><i class=\"fa fa-question-circle\"></i></a> ";
|
result += "><i class=\"fa fa-question-circle\"></i></a> ";
|
||||||
break;
|
break;
|
||||||
@@ -271,7 +272,8 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
|
|||||||
html += "<ul class=\"dropdown-menu pull-right\" role=\"menu\" aria-labelledby=\"dropdownMenu1\">\n";
|
html += "<ul class=\"dropdown-menu pull-right\" role=\"menu\" aria-labelledby=\"dropdownMenu1\">\n";
|
||||||
for (i = 0; i < field.options.length; i++) {
|
for (i = 0; i < field.options.length; i++) {
|
||||||
html += "<li role=\"presentation\"><a role=\"menuitem\" tabindex=\"-1\" ";
|
html += "<li role=\"presentation\"><a role=\"menuitem\" tabindex=\"-1\" ";
|
||||||
html += "ng-click=\"" + field.options[i].ngClick + "\" ";
|
html += (field.options[i].ngClick) ? "ng-click=\"" + field.options[i].ngClick + "\" " : "";
|
||||||
|
html += (field.options[i].ngHref) ? "ng-href=\"" + field.options[i].ngHref + "\" " : "";
|
||||||
html += (field.options[i].ngShow) ? "ng-show=\"" + field.options[i].ngShow + "\" " : "";
|
html += (field.options[i].ngShow) ? "ng-show=\"" + field.options[i].ngShow + "\" " : "";
|
||||||
html += (field.options[i].ngHide) ? "ng-hide=\"" + field.options[i].ngHide + "\" " : "";
|
html += (field.options[i].ngHide) ? "ng-hide=\"" + field.options[i].ngHide + "\" " : "";
|
||||||
html += "href=\"\">" + field.options[i].label + "</a></li>\n";
|
html += "href=\"\">" + field.options[i].label + "</a></li>\n";
|
||||||
|
|||||||
@@ -52,7 +52,9 @@
|
|||||||
"job_type": "run",
|
"job_type": "run",
|
||||||
"type": "playbook_run",
|
"type": "playbook_run",
|
||||||
"name": "Hello World",
|
"name": "Hello World",
|
||||||
"job_explanation": "Completed successfully",
|
"job_explanation": "Bad things happened",
|
||||||
|
"status": "failed",
|
||||||
|
"failed": true,
|
||||||
"inventory": 4,
|
"inventory": 4,
|
||||||
"project": 1,
|
"project": 1,
|
||||||
"playbook": "lamp_simple/site.yml",
|
"playbook": "lamp_simple/site.yml",
|
||||||
@@ -64,8 +66,6 @@
|
|||||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||||
"job_tags": "",
|
"job_tags": "",
|
||||||
"launch_type": "manual",
|
"launch_type": "manual",
|
||||||
"status": "failed",
|
|
||||||
"failed": true,
|
|
||||||
"result_traceback": "",
|
"result_traceback": "",
|
||||||
"passwords_needed_to_start": [],
|
"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_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\"]",
|
||||||
@@ -165,7 +165,9 @@
|
|||||||
"modified": "2014-03-07T23:28:16.424Z",
|
"modified": "2014-03-07T23:28:16.424Z",
|
||||||
"job_template": 3,
|
"job_template": 3,
|
||||||
"job_type": "run",
|
"job_type": "run",
|
||||||
"job_explanation": "AWS access error. Check your credentials.",
|
"job_explanation": "AWS access error. Check your credentials.",
|
||||||
|
"status": "failed",
|
||||||
|
"failed": true,
|
||||||
"type": "inventory_sync",
|
"type": "inventory_sync",
|
||||||
"name": "AWS Cloud",
|
"name": "AWS Cloud",
|
||||||
"inventory": 4,
|
"inventory": 4,
|
||||||
@@ -178,8 +180,6 @@
|
|||||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||||
"job_tags": "",
|
"job_tags": "",
|
||||||
"launch_type": "manual",
|
"launch_type": "manual",
|
||||||
"status": "failed",
|
|
||||||
"failed": true,
|
|
||||||
"result_traceback": "",
|
"result_traceback": "",
|
||||||
"passwords_needed_to_start": [],
|
"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_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\"]",
|
||||||
@@ -280,6 +280,8 @@
|
|||||||
"job_template": 3,
|
"job_template": 3,
|
||||||
"job_type": "run",
|
"job_type": "run",
|
||||||
"job_explanation": "Completed successfully",
|
"job_explanation": "Completed successfully",
|
||||||
|
"status": "successful",
|
||||||
|
"failed": false,
|
||||||
"type": "inventory_sync",
|
"type": "inventory_sync",
|
||||||
"inventory": 4,
|
"inventory": 4,
|
||||||
"name": "Rackspace",
|
"name": "Rackspace",
|
||||||
@@ -293,8 +295,6 @@
|
|||||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||||
"job_tags": "",
|
"job_tags": "",
|
||||||
"launch_type": "manual",
|
"launch_type": "manual",
|
||||||
"status": "successful",
|
|
||||||
"failed": false,
|
|
||||||
"result_traceback": "",
|
"result_traceback": "",
|
||||||
"passwords_needed_to_start": [],
|
"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_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\"]",
|
||||||
@@ -392,7 +392,9 @@
|
|||||||
},
|
},
|
||||||
"created": "2014-03-07T23:28:06.999Z",
|
"created": "2014-03-07T23:28:06.999Z",
|
||||||
"modified": "2014-03-07T23:28:16.424Z",
|
"modified": "2014-03-07T23:28:16.424Z",
|
||||||
"job_explanation": "Completed successfully",
|
"job_explanation": "Completed successfully",
|
||||||
|
"status": "successful",
|
||||||
|
"failed": true,
|
||||||
"job_template": 3,
|
"job_template": 3,
|
||||||
"job_type": "run",
|
"job_type": "run",
|
||||||
"type": "scm_sync",
|
"type": "scm_sync",
|
||||||
@@ -408,8 +410,6 @@
|
|||||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||||
"job_tags": "",
|
"job_tags": "",
|
||||||
"launch_type": "manual",
|
"launch_type": "manual",
|
||||||
"status": "successful",
|
|
||||||
"failed": true,
|
|
||||||
"result_traceback": "",
|
"result_traceback": "",
|
||||||
"passwords_needed_to_start": [],
|
"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_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\"]",
|
||||||
@@ -509,7 +509,9 @@
|
|||||||
"modified": "2014-03-07T23:28:16.424Z",
|
"modified": "2014-03-07T23:28:16.424Z",
|
||||||
"job_template": 3,
|
"job_template": 3,
|
||||||
"job_type": "run",
|
"job_type": "run",
|
||||||
"job_explanation": "Completed successfully",
|
"job_explanation": "Ended in a horrible fireball",
|
||||||
|
"status": "failed",
|
||||||
|
"failed": true,
|
||||||
"type": "playbook_run",
|
"type": "playbook_run",
|
||||||
"name": "Web server restart",
|
"name": "Web server restart",
|
||||||
"inventory": 4,
|
"inventory": 4,
|
||||||
@@ -522,9 +524,7 @@
|
|||||||
"verbosity": 0,
|
"verbosity": 0,
|
||||||
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
"extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}",
|
||||||
"job_tags": "",
|
"job_tags": "",
|
||||||
"launch_type": "manual",
|
"launch_type": "manual",
|
||||||
"status": "failed",
|
|
||||||
"failed": true,
|
|
||||||
"result_traceback": "",
|
"result_traceback": "",
|
||||||
"passwords_needed_to_start": [],
|
"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_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\"]",
|
||||||
|
|||||||
249
awx/ui/static/sample/data/types/data.json
Normal file
249
awx/ui/static/sample/data/types/data.json
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
{
|
||||||
|
"name": "Job List",
|
||||||
|
"description": "",
|
||||||
|
"renders": [
|
||||||
|
"application/json",
|
||||||
|
"text/html"
|
||||||
|
],
|
||||||
|
"parses": [
|
||||||
|
"application/json",
|
||||||
|
"application/x-www-form-urlencoded",
|
||||||
|
"multipart/form-data"
|
||||||
|
],
|
||||||
|
"actions": {
|
||||||
|
"GET": {
|
||||||
|
"id": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "ID",
|
||||||
|
"help_text": "Database ID for this job."
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"help_text": "URL for this job."
|
||||||
|
},
|
||||||
|
"related": {
|
||||||
|
"type": "object",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"help_text": "Data structure with URLs of related resources."
|
||||||
|
},
|
||||||
|
"summary_fields": {
|
||||||
|
"type": "object",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"help_text": "Data structure with name/description for related resources."
|
||||||
|
},
|
||||||
|
"created": {
|
||||||
|
"type": "datetime",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"help_text": "Timestamp when this job was created."
|
||||||
|
},
|
||||||
|
"modified": {
|
||||||
|
"type": "datetime",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"help_text": "Timestamp when this job was last modified."
|
||||||
|
},
|
||||||
|
"job_template": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false
|
||||||
|
},
|
||||||
|
"job_type": {
|
||||||
|
"type": "multiple choice",
|
||||||
|
"required": true,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "job type",
|
||||||
|
"choices": [
|
||||||
|
[
|
||||||
|
"run",
|
||||||
|
"Run"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"check",
|
||||||
|
"Check"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "multiple choice",
|
||||||
|
"Required": true,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "Type",
|
||||||
|
"choices": [
|
||||||
|
[
|
||||||
|
"inventory_sync",
|
||||||
|
"Inventory Sync"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"scm_sync",
|
||||||
|
"SCM Sync"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"playbook_run",
|
||||||
|
"Playbook Run"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"inventory": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false
|
||||||
|
},
|
||||||
|
"playbook": {
|
||||||
|
"type": "string",
|
||||||
|
"required": true,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "playbook",
|
||||||
|
"max_length": 1024
|
||||||
|
},
|
||||||
|
"credential": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false
|
||||||
|
},
|
||||||
|
"cloud_credential": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false
|
||||||
|
},
|
||||||
|
"forks": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "forks"
|
||||||
|
},
|
||||||
|
"limit": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "limit",
|
||||||
|
"max_length": 1024
|
||||||
|
},
|
||||||
|
"verbosity": {
|
||||||
|
"type": "integer",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "verbosity"
|
||||||
|
},
|
||||||
|
"extra_vars": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "extra vars"
|
||||||
|
},
|
||||||
|
"job_tags": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": false,
|
||||||
|
"label": "job tags",
|
||||||
|
"max_length": 1024
|
||||||
|
},
|
||||||
|
"launch_type": {
|
||||||
|
"type": "multiple choice",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "launch type",
|
||||||
|
"choices": [
|
||||||
|
[
|
||||||
|
"manual",
|
||||||
|
"Manual"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"callback",
|
||||||
|
"Callback"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"scheduled",
|
||||||
|
"Scheduled"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "multiple choice",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "status",
|
||||||
|
"choices": [
|
||||||
|
[
|
||||||
|
"new",
|
||||||
|
"New"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"pending",
|
||||||
|
"Pending"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"waiting",
|
||||||
|
"Waiting"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"running",
|
||||||
|
"Running"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"successful",
|
||||||
|
"Successful"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"failed",
|
||||||
|
"Failed"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"error",
|
||||||
|
"Error"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"canceled",
|
||||||
|
"Canceled"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"failed": {
|
||||||
|
"type": "boolean",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "failed"
|
||||||
|
},
|
||||||
|
"result_traceback": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "result traceback"
|
||||||
|
},
|
||||||
|
"passwords_needed_to_start": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true
|
||||||
|
},
|
||||||
|
"job_args": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "job args"
|
||||||
|
},
|
||||||
|
"job_cwd": {
|
||||||
|
"type": "string",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true,
|
||||||
|
"label": "job cwd",
|
||||||
|
"max_length": 1024
|
||||||
|
},
|
||||||
|
"job_env": {
|
||||||
|
"type": "field",
|
||||||
|
"required": false,
|
||||||
|
"read_only": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user