From 6cd5552b6abcb7c21d83592ac7479c15af26ef06 Mon Sep 17 00:00:00 2001 From: Chris Houseknecht Date: Wed, 19 Mar 2014 01:39:58 -0400 Subject: [PATCH] More work on new Jobs page. --- awx/ui/static/js/app.js | 3 +- awx/ui/static/js/controllers/Jobs.js | 16 +- awx/ui/static/js/lists/CompletedJobs.js | 9 +- awx/ui/static/js/lists/QueuedJobs.js | 130 +++++++ awx/ui/static/js/lists/RunningJobs.js | 9 +- awx/ui/static/less/ansible-ui.less | 15 +- awx/ui/static/partials/jobs.html | 26 +- .../static/sample/data/jobs/queued/data.json | 343 ++++++++++++++++++ .../static/sample/data/jobs/running/data.json | 26 +- awx/ui/templates/ui/index.html | 1 + 10 files changed, 537 insertions(+), 41 deletions(-) create mode 100644 awx/ui/static/js/lists/QueuedJobs.js create mode 100644 awx/ui/static/sample/data/jobs/queued/data.json diff --git a/awx/ui/static/js/app.js b/awx/ui/static/js/app.js index b45b22086f..d2f63cbae7 100644 --- a/awx/ui/static/js/app.js +++ b/awx/ui/static/js/app.js @@ -91,7 +91,8 @@ angular.module('ansible', [ 'SchedulesListDefinition', 'AngularScheduler', 'Timezones', - 'SchedulesHelper' + 'SchedulesHelper', + 'QueuedJobsDefinition' ]) .constant('AngularScheduler.partials', $basePath + 'lib/angular-scheduler/lib/') diff --git a/awx/ui/static/js/controllers/Jobs.js b/awx/ui/static/js/controllers/Jobs.js index b80d1d60d7..08f300d028 100644 --- a/awx/ui/static/js/controllers/Jobs.js +++ b/awx/ui/static/js/controllers/Jobs.js @@ -10,7 +10,7 @@ 'use strict'; -function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJobsList, CompletedJobsList) { +function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJobsList, CompletedJobsList, QueuedJobsList) { ClearScope(); @@ -25,7 +25,7 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ LoadScope({ scope: completed_scope, list: CompletedJobsList, - id: 'completed_jobs', + id: 'completed-jobs', url: '/static/sample/data/jobs/completed/data.json' }); @@ -33,13 +33,21 @@ function JobsList($scope, $compile, ClearScope, Breadcrumbs, LoadScope, RunningJ LoadScope({ scope: running_scope, list: RunningJobsList, - id: 'running_jobs', + id: 'active-jobs', url: '/static/sample/data/jobs/running/data.json' }); + queued_scope = $scope.$new(); + LoadScope({ + scope: queued_scope, + list: QueuedJobsList, + id: 'queued-jobs', + url: '/static/sample/data/jobs/queued/data.json' + }); + } -JobsList.$inject = ['$scope', '$compile', 'ClearScope', 'Breadcrumbs', 'LoadScope', 'RunningJobsList', 'CompletedJobsList']; +JobsList.$inject = ['$scope', '$compile', 'ClearScope', 'Breadcrumbs', 'LoadScope', 'RunningJobsList', 'CompletedJobsList', 'QueuedJobsList']; diff --git a/awx/ui/static/js/lists/CompletedJobs.js b/awx/ui/static/js/lists/CompletedJobs.js index d99da84d72..caf2082501 100644 --- a/awx/ui/static/js/lists/CompletedJobs.js +++ b/awx/ui/static/js/lists/CompletedJobs.js @@ -23,7 +23,8 @@ angular.module('CompletedJobsDefinition', []) label: 'Job ID', key: true, desc: true, - searchType: 'int' + searchType: 'int', + columnClass: 'col-lg-1 col-md-2 col-sm-2 col-xs-2' }, inventory: { label: 'Inventory ID', @@ -34,7 +35,8 @@ angular.module('CompletedJobsDefinition', []) label: 'Create On', link: false, searchable: false, - filter: "date:'MM/dd HH:mm:ss'" + filter: "date:'MM/dd/yy HH:mm:ss'", + columnClass: "hidden-sm hidden-xs" }, job_template: { label: 'Job Template', @@ -42,7 +44,8 @@ angular.module('CompletedJobsDefinition', []) //ngHref: "{{ '/#/job_templates/?name=' + completed_job.summary_fields.job_template.name }}", ngHref:"{{ '/#/job_templates/' + completed_job.job_template }}", sourceModel: 'job_template', - sourceField: 'name' + sourceField: 'name', + columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-3' }, failed: { label: 'Job failed?', diff --git a/awx/ui/static/js/lists/QueuedJobs.js b/awx/ui/static/js/lists/QueuedJobs.js new file mode 100644 index 0000000000..791ea0adfd --- /dev/null +++ b/awx/ui/static/js/lists/QueuedJobs.js @@ -0,0 +1,130 @@ +/********************************************* + * Copyright (c) 2014 AnsibleWorks, Inc. + * + * QueuedJobs.js + * + * + */ + +'use strict'; + +angular.module('QueuedJobsDefinition', []) + .value( 'QueuedJobsList', { + + name: 'queued_jobs', + iterator: 'queued_job', + editTitle: 'Queued Jobs', + index: false, + hover: true, + well: false, + + fields: { + id: { + label: 'Job ID', + key: true, + desc: true, + searchType: 'int', + columnClass: 'col-lg-1 col-md-2 col-sm-2 col-xs-2' + }, + inventory: { + label: 'Inventory ID', + searchType: 'int', + searchOnly: true + }, + created: { + label: 'Create On', + link: false, + searchable: false, + filter: "date:'MM/dd/yy HH:mm:ss'", + columnClass: 'hidden-sm hidden-xs' + }, + job_template: { + label: 'Job Template', + ngBind: 'queued_job.summary_fields.job_template.name', + //ngHref: "{{ '/#/job_templates/?name=' + queued_job.summary_fields.job_template.name }}", + ngHref:"{{ '/#/job_templates/' + queued_job.job_template }}", + sourceModel: 'job_template', + sourceField: 'name', + columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-3' + }, + failed: { + label: 'Job failed?', + searchSingleValue: true, + searchType: 'boolean', + searchValue: 'true', + searchOnly: true, + nosort: true + }, + status: { + label: 'Status', + "class": 'job-{{ queued_job.status }}', + searchType: 'select', + linkTo: "{{ queued_job.statusLinkTo }}", + 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" } + ], + badgeIcon: 'fa icon-job-{{ queued_job.status }}', + badgePlacement: 'left', + badgeToolTip: "{{ queued_job.statusBadgeToolTip }}", + badgeTipPlacement: 'top', + badgeNgHref: "{{ queued_job.statusLinkTo }}", + awToolTip: "{{ queued_job.statusBadgeToolTip }}", + dataPlacement: 'top' + } + }, + + actions: { + refresh: { + mode: 'all', + awToolTip: "Refresh the page", + ngClick: "refresh()" + } + }, + + fieldActions: { + submit: { + label: 'Relaunch', + icon: 'icon-rocket', + mode: 'all', + ngClick: 'submitJob(queued_job.id, queued_job.summary_fields.job_template.name)', + awToolTip: 'Start the job', + dataPlacement: 'top' + }, + cancel: { + label: 'Stop', + mode: 'all', + ngClick: 'deleteJob(queued_job.id)', + awToolTip: 'Cancel a running or pending job', + ngShow: "queued_job.status == 'pending' || queued_job.status == 'running' || queued_job.status == 'waiting'", + dataPlacement: 'top' + }, + "delete": { + label: 'Delete', + mode: 'all', + ngClick: 'deleteJob(queued_job.id)', + awToolTip: 'Delete the job', + ngShow: "queued_job.status != 'pending' && queued_job.status != 'running' && queued_job.status != 'waiting'", + dataPlacement: 'top' + }, + dropdown: { + type: 'DropDown', + label: 'View', + icon: 'fa-search-plus', + 'class': 'btn-default btn-xs', + options: [ + { ngClick: 'editJob(queued_job.id, queued_job.summary_fields.job_template.name)', label: 'Status' }, + { ngClick: 'viewEvents(queued_job.id, queued_job.summary_fields.job_template.name)', label: 'Events', + ngHide: "queued_job.status == 'new'" }, + { ngClick: 'viewSummary(queued_job.id, queued_job.summary_fields.job_template.name)', label: 'Host Summary', + ngHide: "queued_job.status == 'new'" } + ] + } + } + }); diff --git a/awx/ui/static/js/lists/RunningJobs.js b/awx/ui/static/js/lists/RunningJobs.js index 729297fe2b..ae251c727f 100644 --- a/awx/ui/static/js/lists/RunningJobs.js +++ b/awx/ui/static/js/lists/RunningJobs.js @@ -23,7 +23,8 @@ angular.module('RunningJobsDefinition', []) label: 'Job ID', key: true, desc: true, - searchType: 'int' + searchType: 'int', + columnClass: 'col-lg-1 col-md-2 col-sm-2 col-xs-2' }, inventory: { label: 'Inventory ID', @@ -34,7 +35,8 @@ angular.module('RunningJobsDefinition', []) label: 'Create On', link: false, searchable: false, - filter: "date:'MM/dd HH:mm:ss'" + filter: "date:'MM/dd/yy HH:mm:ss'", + columnClass: 'hidden-sm hidden-xs' }, job_template: { label: 'Job Template', @@ -42,7 +44,8 @@ angular.module('RunningJobsDefinition', []) //ngHref: "{{ '/#/job_templates/?name=' + running_job.summary_fields.job_template.name }}", ngHref:"{{ '/#/job_templates/' + running_job.job_template }}", sourceModel: 'job_template', - sourceField: 'name' + sourceField: 'name', + columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-3' }, failed: { label: 'Job failed?', diff --git a/awx/ui/static/less/ansible-ui.less b/awx/ui/static/less/ansible-ui.less index 3fbf4f67e6..7b3a821edd 100644 --- a/awx/ui/static/less/ansible-ui.less +++ b/awx/ui/static/less/ansible-ui.less @@ -997,8 +997,7 @@ input[type="checkbox"].checkbox-no-label { line-height: 1; } - .job_list { - padding-right: 15px; + .job-list { margin-top: 30px; .row { margin-left: 0; @@ -1010,11 +1009,19 @@ input[type="checkbox"].checkbox-no-label { .title { padding-left: 8px; font-weight: bold; + margin-bottom: 6px; + } + thead >tr >th, tbody >tr >td, .page-row, .title { + color: #666; + } + .pagination li a { + font-size: 12px; } - } - + #completed-jobs-container { + margin-top: 0; + } /* Inventory job status badge */ .failures-true { diff --git a/awx/ui/static/partials/jobs.html b/awx/ui/static/partials/jobs.html index 08eefe9296..8096fa0a71 100644 --- a/awx/ui/static/partials/jobs.html +++ b/awx/ui/static/partials/jobs.html @@ -5,22 +5,22 @@
-
-
- -
+
+
+
Completed
+
-
- -
+
+
Active
+
-
- -
+
+
Queued
+
-
- -
+
+
Scheduled
+
diff --git a/awx/ui/static/sample/data/jobs/queued/data.json b/awx/ui/static/sample/data/jobs/queued/data.json new file mode 100644 index 0000000000..2ff6970dcd --- /dev/null +++ b/awx/ui/static/sample/data/jobs/queued/data.json @@ -0,0 +1,343 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 30, + "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", + "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-06T16:51:04.557Z", + "modified": "2014-03-06T16:51:14.272Z", + "job_template": 3, + "job_type": "playbook_run", + "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", + "status": "pending", + "failed": false, + "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": 31, + "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": "playbook_run", + "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", + "status": "pending", + "failed": false, + "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": 32, + "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": "playbook_run", + "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", + "status": "new", + "failed": false, + "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:" + } + } + ] +} diff --git a/awx/ui/static/sample/data/jobs/running/data.json b/awx/ui/static/sample/data/jobs/running/data.json index 29f188ce01..be5f5f6588 100644 --- a/awx/ui/static/sample/data/jobs/running/data.json +++ b/awx/ui/static/sample/data/jobs/running/data.json @@ -1,5 +1,5 @@ { - "count": 2, + "count": 6, "next": null, "previous": null, "results": [ @@ -61,8 +61,8 @@ "extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}", "job_tags": "", "launch_type": "manual", - "status": "failed", - "failed": true, + "status": "pending", + "failed": false, "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\"]", @@ -173,8 +173,8 @@ "extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}", "job_tags": "", "launch_type": "manual", - "status": "failed", - "failed": true, + "status": "running", + "failed": false, "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\"]", @@ -285,8 +285,8 @@ "extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}", "job_tags": "", "launch_type": "manual", - "status": "failed", - "failed": true, + "status": "running", + "failed": false, "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\"]", @@ -397,8 +397,8 @@ "extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}", "job_tags": "", "launch_type": "manual", - "status": "failed", - "failed": true, + "status": "new", + "failed": false, "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\"]", @@ -509,8 +509,8 @@ "extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}", "job_tags": "", "launch_type": "manual", - "status": "failed", - "failed": true, + "status": "running", + "failed": false, "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\"]", @@ -621,8 +621,8 @@ "extra_vars": "{\n\t\"variable1\": \"some value\",\n\t\"variable2\": \"another value\"\n}", "job_tags": "", "launch_type": "manual", - "status": "failed", - "failed": true, + "status": "running", + "failed": false, "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\"]", diff --git a/awx/ui/templates/ui/index.html b/awx/ui/templates/ui/index.html index b116d40dad..a7d1a9da5f 100644 --- a/awx/ui/templates/ui/index.html +++ b/awx/ui/templates/ui/index.html @@ -109,6 +109,7 @@ +