Compare commits

...

2631 Commits
1.0.6 ... 3.0.1

Author SHA1 Message Date
softwarefactory-project-zuul[bot]
b9b2affe44 Merge pull request #3202 from Spredzy/fix_3200
awx.main.tasks: Remove reference to unimport six

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-11 14:42:08 +00:00
Yanis Guenane
f61b6f9615 awx.main.tasks: Remove reference to unimport six
d4c3c08 re:introduced the use of six that has been removed by daeeaf4.
This lead to ""NameError: name 'six' is not defined"". This commit fixes
the issue.

Signed-off-by: Yanis Guenane <yguenane@redhat.com>
2019-02-11 09:41:09 +01:00
softwarefactory-project-zuul[bot]
3b259de200 Merge pull request #3192 from chrismeyersfsu/awx-3.0.1
AWX 3.0.1

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-08 19:38:37 +00:00
chris meyers
63e3e733e0 AWX 3.0.1 2019-02-08 14:17:33 -05:00
softwarefactory-project-zuul[bot]
844b0f86b8 Merge pull request #3187 from chrismeyersfsu/fix-schedule_too_damn_fast_devel
fix scheduled jobs race condition

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-08 14:39:43 +00:00
chris meyers
d4c3c089df fix scheduled jobs race condition
* The periodic scheduler that runs and spawns jobs from Schedule()'s can
end up spawning more jobs than intended, for a single Schedule.
Specifically, when tower clustering is involed. This change adds a
"global" database lock around this critical code. If another process is
already doing the scheduling, short circuit.
2019-02-08 08:43:11 -05:00
softwarefactory-project-zuul[bot]
1328fb80a0 Merge pull request #3181 from mabashian/notif-related-tab
Show notification tab to notif admin users on jt/wf/project/inv source forms

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-07 21:39:33 +00:00
softwarefactory-project-zuul[bot]
1fbcd1b10b Merge pull request #3183 from mabashian/3018-wf-save
Cancel node form when user deletes node being edited

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-07 20:59:45 +00:00
softwarefactory-project-zuul[bot]
11b26c199b Merge pull request #3173 from mabashian/workflow-403
Adds proper error handling to workflow save related promises

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-07 19:25:40 +00:00
softwarefactory-project-zuul[bot]
463c4c1f7e Merge pull request #3182 from kialam/artifacts-code-mirror
Artifacts Code Mirror

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-07 16:46:20 +00:00
kialam
76a16b329e Conditionally show the Artifacts field. 2019-02-07 08:59:44 -07:00
mabashian
123f646cea Cancel node form when user deletes node being edited 2019-02-07 10:47:21 -05:00
softwarefactory-project-zuul[bot]
d99c9c8dce Merge pull request #3179 from ryanpetrello/failed_to_change
don't update parent event changed|failed in bulk (it's expensive for large tables)

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-07 15:16:22 +00:00
mabashian
4f3a8ef766 Show notification tab to notif admin users on jt/wf/project/inv source forms 2019-02-07 10:02:05 -05:00
kialam
c114243082 Add artifacts as a subscriber to job details status service.
- This will emerge the artifacts field values if they become available to the UI from the API once a job has completed successfully.
2019-02-07 07:59:45 -07:00
Ryan Petrello
229e997e7e don't update parent event changed|failed in bulk (it's expensive) 2019-02-06 20:02:52 -05:00
kialam
dc7ec9dfe0 Adjust WF results to account for codemirror changes. 2019-02-06 12:11:15 -07:00
kialam
07aae8cefc Add Artifacts CodeMirror field to job details. 2019-02-06 10:52:18 -07:00
softwarefactory-project-zuul[bot]
902fb83493 Merge pull request #3172 from bverschueren/fix_inventory_sync_virtualenv
use source_project custom_virtualenv if configured

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-06 16:55:49 +00:00
softwarefactory-project-zuul[bot]
1ef2d4cdad Merge pull request #3175 from ryanpetrello/exact_ansible_facts
fix a subtle bug in ansible_facts lookup filtering

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-06 16:51:13 +00:00
Ryan Petrello
a6b362e455 fix a subtle bug in ansible_facts lookup filtering 2019-02-06 11:02:47 -05:00
mabashian
2c3549331c Adds proper error handling to worklfow save related promises. Fixes bug watching for prompt changes after the node has been edited once. 2019-02-06 10:35:00 -05:00
Bram Verschueren
016fc7f6bf use source_project custom_virtualenv if configured
Signed-off-by: Bram Verschueren <verschueren.bram@gmail.com>
2019-02-06 10:51:52 +01:00
softwarefactory-project-zuul[bot]
e8eda28ce5 Merge pull request #3162 from wenottingham/cady-heron-was-right
Remove limit on `limit` field.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-06 01:22:34 +00:00
softwarefactory-project-zuul[bot]
83c232eb20 Merge pull request #3112 from saito-hideki/pr/fix_ui-test-ci
Fix chrome can not be started with unit-tests due to missing shared libraries

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-06 01:20:19 +00:00
softwarefactory-project-zuul[bot]
c30639c4e6 Merge pull request #3166 from ryanpetrello/old-ansible-inventory-error-msg
provide a better ansible-inventory fallback error message old ansibles

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-05 22:32:13 +00:00
Ryan Petrello
5e84782b9c provide a better ansible-inventory fallback error message old ansibles
see: https://github.com/ansible/awx/issues/3139
2019-02-05 17:12:48 -05:00
softwarefactory-project-zuul[bot]
d134291097 Merge pull request #3123 from elyezer/users-crud-e2e
Add e2e tests for user creating and editing

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-05 18:54:49 +00:00
Bill Nottingham
4b669fb16d Remove limit on limit field.
This allows 'relaunch-on-failed' on an arbitrary number of failed hosts.
2019-02-05 13:30:51 -05:00
softwarefactory-project-zuul[bot]
b53621e74c Merge pull request #3152 from ryanpetrello/jsonb_prevent_field_lookups
prevent field lookups on Host.ansible_facts keys (it doesn't work)

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-05 17:24:06 +00:00
Elyézer Rezende
925c6543c4 Add users CRUD e2e tests 2019-02-05 14:59:59 -02:00
Ryan Petrello
bb5312f4fc prevent field lookups on Host.ansible_facts keys (it doesn't work)
under the hood, Host.ansible_facts is a postgres jsonb field which
performs match operations using the JSON containment operator (@>)

this operator _only_ works on exact matches on containment (i.e.,
"does the `ansible_distribution` jsonb value contain _this exact_ JSON
structure"):

SELECT ...
FROM main_host
WHERE ansible_facts @> '{"ansible_distribution": "centos"}'

SELECT ...
FROM main_host
WHERE ansible_facts @> '{"packages": {"dnsmasq": [{"version": 2}]}}'

postgres does _not_ expose any operator for fuzzy or lookup-based
matches with this operator, so host filter values like these don't
really make sense (postgres can't _filter_ in the way intended in these
examples):

ansible_distribution__startswith=\"Cent\"
ansible_distribution__icontains=\"CentOS\"
ansible_facts__packages__dnsmasq[]__version__startswith=\"2\"
2019-02-05 10:43:51 -05:00
softwarefactory-project-zuul[bot]
7333e55748 Merge pull request #3156 from Spredzy/schedule_max_jobs_conditiion
jt, wfjt: Ensure SCHEDULE_MAX_JOBS is accurately respect

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-05 13:35:35 +00:00
Yanis Guenane
5e20dcb6ca jt, wfjt: Ensure SCHEDULE_MAX_JOBS is accurately respect
Currently SCHEDULE_MAX_JOBS+1 can be scheduled rather than
SCHEDULE_MAX_JOBS. This is due to the fact that we using strictly
greater rather than greater or equal.

Imagine we set SCHEDULE_MAX_JOBS=1, current logic:

  * First time (count = 0), count < 1 -> proceed
  * Second time (count = 1), count =< 1 -> proceed
  * Third time (count = 2), count > 1 -> prevented

Imagine we set SCHEDULE_MAX_JOBS=1, new logic:

  * First time (count = 0), count < 1 -> proceed
  * Second time (count = 1), count =< 1 -> prevented

Signed-off-by: Yanis Guenane <yguenane@redhat.com>
2019-02-05 13:44:39 +01:00
softwarefactory-project-zuul[bot]
cab6b8b333 Merge pull request #3147 from jbradberry/become_method_list
Expose the known privilege escalation methods in the API config view

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2019-02-04 17:12:28 +00:00
Jeff Bradberry
46020379aa Expose the known privilege escalation methods in the API config view
so that the UI can obtain them and make use of them for an autocomplete widget.
2019-02-04 11:45:27 -05:00
softwarefactory-project-zuul[bot]
e23fb31a4a Merge pull request #3140 from AlanCoding/isolate_venv
Use custom venv in inventory proot-ing

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-02 12:17:25 +00:00
Marliana Lara
17c95f200a Merge pull request #3136 from marshmalien/fix-inv-host-tab
Disable hosts toggle in smart inventory hosts tab
2019-02-01 16:36:02 -05:00
AlanCoding
7676ccdbac use custom venv in inventory prooting 2019-02-01 13:29:45 -05:00
softwarefactory-project-zuul[bot]
4626aa0144 Merge pull request #3093 from jbradberry/become_plugins
Support become plugins

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-01 17:48:09 +00:00
Marliana Lara
fb7596929f Disable hosts toggle in smart inventory hosts tab 2019-02-01 11:28:00 -05:00
softwarefactory-project-zuul[bot]
d63518d789 Merge pull request #3005 from b0urn3/devel
Add SCHEDULE_MAX_JOBS implementation for WFJTs for #2975

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-02-01 13:54:21 +00:00
Robert Zahradníček
6f1cbac324 Add SCHEDULE_MAX_JOBS implementation for WFJTs for #2975 2019-01-31 21:52:36 +01:00
softwarefactory-project-zuul[bot]
2b80f0f7b6 Merge pull request #3121 from ryanpetrello/busted-isolated
properly detect ansible-playbook vs ansible runs in bwrap arg building

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
             https://github.com/kdelee
2019-01-31 16:27:06 +00:00
Ryan Petrello
10945faba1 properly detect ansible-playbook vs ansible runs in bwrap arg building
a recent change (65641c7) made it so that we call
ansible-playbook using its _absolute path_ (i.e.,
/usr/bin/ansible-playbook, /var/lib/venv/xyz/bin/ansible-playbook), so
this logic is no longer correct
2019-01-31 11:06:50 -05:00
softwarefactory-project-zuul[bot]
d4ccb00338 Merge pull request #3118 from ryanpetrello/fix-3108
work around a bug in Django that breaks the stdout HTML view in py3

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-31 14:43:42 +00:00
Ryan Petrello
d10d5f1539 work around a bug in Django that breaks the stdout HTML view in py3
see: https://github.com/ansible/awx/issues/3108
2019-01-31 01:01:40 -05:00
Hideki Saito
3e5f328b52 Fix chrome can not be started with unit-tests due to missing shared libraries
- Added installation packages conforming to the unit-tests/Dockerfile

Signed-off-by: Hideki Saito <saito@fgrep.org>
2019-01-31 13:02:23 +09:00
Hideki Saito
d558ffd699 Fix chrome can not be started with unit-tests due to missing shared libraries
- Modify Dockerfile to install necesarry shared libraries for chrome

Signed-off-by: Hideki Saito <saito@fgrep.org>
2019-01-31 09:54:55 +09:00
softwarefactory-project-zuul[bot]
b64d401e74 Merge pull request #3086 from kialam/fix-3081-duplicate-template-expanded
Fix expanded view not persisting when a user copies a JT/WF.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-30 18:46:24 +00:00
softwarefactory-project-zuul[bot]
0a3f131adc Merge pull request #3100 from ryanpetrello/die_settings_migration_die
remove awx-manage migrate_to_database_settings

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-30 18:33:14 +00:00
Kia Lam
6f9cf6a649 Fix expanded view not persisting when a user copies a JT/WF. 2019-01-30 13:23:21 -05:00
softwarefactory-project-zuul[bot]
5db43b8283 Merge pull request #3101 from jakemcdermott/bump-prompt-credential-type-page-size
increase request page size for credential types in launch prompts

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-30 18:05:53 +00:00
softwarefactory-project-zuul[bot]
aa9e60c508 Merge pull request #3087 from kialam/fix-3082-sidenav-on-resize
Some sidebar nav fixes.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-30 17:40:46 +00:00
softwarefactory-project-zuul[bot]
2162e8e0cc Merge pull request #3109 from ryanpetrello/overindent
fix overindent lint failures

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-30 17:36:52 +00:00
Ryan Petrello
1eeffe4ae2 remove awx-manage migrate_to_database_settings 2019-01-30 12:23:36 -05:00
Ryan Petrello
2927803a82 fix overindent lint failures 2019-01-30 12:12:39 -05:00
Jake McDermott
1b50b26901 support up to 200 credential types in launch prompts 2019-01-29 20:10:13 -05:00
softwarefactory-project-zuul[bot]
44819987f7 Merge pull request #3097 from ansible/jakemcdermott-sanitize-jdetails
sanitize reflected user input on job details page

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-29 21:34:32 +00:00
softwarefactory-project-zuul[bot]
9bf0d052ab Merge pull request #3089 from marshmalien/2330-execution-node
Add execution node field to job details panel

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-29 21:17:37 +00:00
Marliana Lara
5c98d04e09 Update execution node field from job status subscriber 2019-01-29 15:48:18 -05:00
Jeff Bradberry
6560ab0fab Migrated the inputs schema on existing CredentialTypes
to convert the custom become_method into a plain string.

related #2630

Signed-off-by: Jeff Bradberry <jeff.bradberry@gmail.com>
2019-01-29 15:04:35 -05:00
softwarefactory-project-zuul[bot]
efb7a729c7 Merge pull request #3091 from beeankha/dupe_logout_msg
Remove error message for regular logout

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-29 19:51:52 +00:00
Jeff Bradberry
6e1deed79e Removed the special-case logic for maintaining the schema of the become_method field
related #2630

Signed-off-by: Jeff Bradberry <jeff.bradberry@gmail.com>
2019-01-29 14:06:26 -05:00
beeankha
ad3721bdb2 Ensure all other error messages don't double up with the logout message 2019-01-29 13:09:28 -05:00
Jake McDermott
ca64630740 sanitize reflected user input on job details page
This makes sure we're applying the 'sanitize' filter to reflected user input for some of the new information we're displaying on the job details page.
2019-01-29 09:35:57 -05:00
softwarefactory-project-zuul[bot]
8686575311 Merge pull request #3092 from ansible/jakemcdermott-patch-1
Install dependencies for Chromium in unit test image

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-28 22:26:59 +00:00
Jeff Bradberry
0ecd6542bf Changed the become_method field into one that takes arbitrary input
related #2630

Signed-off-by: Jeff Bradberry <jeff.bradberry@gmail.com>
2019-01-28 16:53:54 -05:00
beeankha
5e3d47683d Ensure error messages are showing up, but not doubled 2019-01-28 16:12:20 -05:00
Jake McDermott
73f617d811 Install dependencies for Chromium in unit test image 2019-01-28 15:57:17 -05:00
beeankha
ea7e15bfc4 Remove error message for regular logout 2019-01-28 15:16:28 -05:00
Marliana Lara
eca530c788 Add execution node field to job details panel 2019-01-28 13:48:50 -05:00
Kia Lam
c1b48e2c9c Some sidebar nav fixes.
- Set isExpanded state to false when window width is < 700px.
- Set `pointer-events` to `none` for logo to allow users to easily click on hamburger icon.
2019-01-28 13:25:44 -05:00
softwarefactory-project-zuul[bot]
9d501327fc Merge pull request #3078 from shawnmolnar/fixtypos
Fixed role download typo in help text

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-28 17:53:23 +00:00
Molnar, Shawn
31b3bad658 Fixed role download typo in help text 2019-01-25 16:37:51 -08:00
softwarefactory-project-zuul[bot]
155c214df0 Merge pull request #3077 from mabashian/i18n-sweep
Mark strings for translation

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 21:11:30 +00:00
mabashian
5931c13b04 Mark strings for translation 2019-01-25 14:21:35 -05:00
softwarefactory-project-zuul[bot]
5d7b7d5888 Merge pull request #3074 from kialam/projects-expand-collapse
Add expand/collapse toolbar to Projects List.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 17:41:01 +00:00
softwarefactory-project-zuul[bot]
53ad819d65 Merge pull request #3068 from kialam/job-template-expand-collapse
Add expand/collapse toolbar for Job Templates list.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 17:40:54 +00:00
softwarefactory-project-zuul[bot]
3ce3786303 Merge pull request #3071 from saito-hideki/pr/fix_doc_saml_team_attr_map
Fixed incorrect setting item name for SAML Team Attribute Mapping

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 16:45:29 +00:00
softwarefactory-project-zuul[bot]
46bc146e26 Merge pull request #3076 from ryanpetrello/test-data-cleanup
move awx.main.utils.ansible tests data into the correct location

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 16:38:38 +00:00
Ryan Petrello
88eaf1154a move awx.main.utils.ansible tests data into the correct location 2019-01-25 11:11:12 -05:00
Kia Lam
5421c243d7 Add expand/collapse toolbar to Projects List.
Add some responsive styling.
2019-01-25 10:31:38 -05:00
softwarefactory-project-zuul[bot]
5cdab1b57a Merge pull request #3070 from ryanpetrello/bye-bye-six
clean up unnecessary usage of the six library (awx only supports py3)

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 15:20:38 +00:00
softwarefactory-project-zuul[bot]
2a86c5b944 Merge pull request #3061 from jakemcdermott/inventory-scm-job-linkage
add linked status indicator for scm inventory project updates

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-25 13:05:36 +00:00
Ryan Petrello
daeeaf413a clean up unnecessary usage of the six library (awx only supports py3) 2019-01-25 00:19:48 -05:00
Hideki Saito
2d119f7b02 Fixed incorrect setting item name for SAML Team Attribute Mapping 2019-01-25 09:24:12 +09:00
softwarefactory-project-zuul[bot]
68950d56ca Merge pull request #3065 from ryanpetrello/dispatcher-reap-refactor
clean up some unnecessary dispatcher reaping code

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-24 22:30:45 +00:00
Jake McDermott
477c5df022 add linked status indicator for scm inventory project updates
Signed-off-by: Jake McDermott <yo@jakemcdermott.me>
2019-01-24 16:24:42 -05:00
softwarefactory-project-zuul[bot]
4c8f4f4cc5 Merge pull request #3067 from mabashian/2264-custom-venv
Adds environment to output details for jts and inv syncs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-24 20:35:49 +00:00
softwarefactory-project-zuul[bot]
6726e203b9 Merge pull request #3050 from jlmitch5/jobTimeoutInUi
Job timeout in ui

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-24 19:16:48 +00:00
Kia Lam
9a10811366 Add expand/collapse toolbar for Job Templates list. 2019-01-24 13:50:32 -05:00
mabashian
62bffaa7e6 Make environment subscribe-able 2019-01-24 13:08:19 -05:00
mabashian
14423c4f3f Add param to getEnvironmentDetails allowing us to pass in a value rather than pulling it from the model 2019-01-24 12:58:29 -05:00
mabashian
8037cddfe5 Adds environment to output details for jts and inv syncs 2019-01-24 12:19:24 -05:00
softwarefactory-project-zuul[bot]
be4b3c75b4 Merge pull request #3052 from jakemcdermott/inputs_enc
explicitly handle .inputs in decrypt_field, encrypt_field

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2019-01-24 17:04:30 +00:00
softwarefactory-project-zuul[bot]
818b261bea Merge pull request #3057 from kialam/add-list-toolbar
Expand and Collapse Jobs List

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-24 16:45:57 +00:00
Ryan Petrello
4707dc2a05 clean up some unnecessary dispatcher reaping code 2019-01-24 11:11:05 -05:00
Kia Lam
ebc2b821be Only show toolbar if the job list is not empty. 2019-01-24 10:44:58 -05:00
Kia Lam
85a875bbfe Styling changes. 2019-01-24 10:44:58 -05:00
Kia Lam
a9663c2900 Add expand/collapse toolbar to Jobs List view. 2019-01-24 10:44:58 -05:00
Kia Lam
05c24df9e3 Add list toolbar component. 2019-01-24 10:44:58 -05:00
Ryan Petrello
1becd4c39d Merge pull request #3066 from ryanpetrello/frosted-flakes-are-more-than-good
clean up some minor linting issues
2019-01-24 10:40:37 -05:00
Ryan Petrello
9817ab14d0 clean up some minor linting issues 2019-01-24 10:23:56 -05:00
softwarefactory-project-zuul[bot]
51b51a9bf7 Merge pull request #3051 from ryanpetrello/record-venv-usage
record the virtualenv used when a job or inventory sync runs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-23 21:33:31 +00:00
softwarefactory-project-zuul[bot]
55c5dd06cf Merge pull request #3058 from ryanpetrello/ansible-inventory-custom-venv
use the correct ansible-inventory executable for custom venvs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-23 19:30:13 +00:00
Ryan Petrello
0e5e23372d use the correct ansible-inventory executable for custom venvs 2019-01-23 14:07:48 -05:00
softwarefactory-project-zuul[bot]
1e44d5c833 Merge pull request #2899 from AlanCoding/copy_created_by
Copy WFJT created_by to jobs it spawns

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-23 16:53:49 +00:00
Ryan Petrello
f7bc8fb662 record the virtualenv used when a job or inventory sync runs
see: https://github.com/ansible/awx/issues/2264
2019-01-23 11:48:06 -05:00
softwarefactory-project-zuul[bot]
416dcc83c9 Merge pull request #3020 from beeankha/fix_unicode_error
Fix unicode error

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2019-01-23 15:26:07 +00:00
AlanCoding
13ed656506 Copy WFJT created_by to jobs it spawns 2019-01-23 09:33:14 -05:00
softwarefactory-project-zuul[bot]
f683f87ce3 Merge pull request #3053 from girishramnani/bug/jt-patch
resolved the error message for JT Patch

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-23 13:39:09 +00:00
Girish Ramnani
c15cbe0f6e resolved the error message for JT Patch
Signed-off-by: Girish Ramnani <girishramnani95@gmail.com>
2019-01-23 11:53:27 +05:30
Jake McDermott
a8728670e1 handle credential.inputs in decryption utils 2019-01-22 22:56:24 -05:00
softwarefactory-project-zuul[bot]
cf9dffbaf8 Merge pull request #3035 from ansible/e2e-websockets
E2E tests for websockets (and other things)

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-23 02:34:19 +00:00
Daniel Sami
3d1b32c72f websocket tests and fixture updates 2019-01-23 11:06:42 +09:00
John Mitchell
e95da84e5a make forks fill for value of 0 and update timeout help text based on docs feedback 2019-01-22 13:48:57 -05:00
John Mitchell
fcd759fa1f add timeout field to ui 2019-01-22 13:33:51 -05:00
softwarefactory-project-zuul[bot]
6772c81927 Merge pull request #3047 from jakemcdermott/npm-ci
use npm ci to install ui dependencies

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-22 17:28:40 +00:00
softwarefactory-project-zuul[bot]
774ec40989 Merge pull request #3048 from matburt/schema_detector_regex
Make schema generator handle alternative iso 8601 datetimes

Reviewed-by: awxbot
             https://github.com/awxbot
2019-01-22 17:09:23 +00:00
softwarefactory-project-zuul[bot]
b7ba280da3 Merge pull request #3040 from jiuka/709-support-ssl-connections-for-postgresql
Add pg_sslmode option to access PostgreSQL by ssl

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-22 16:51:41 +00:00
Matthew Jones
058e2c0d81 Make schema generator handle alternative iso 8601 datetimes 2019-01-22 11:44:56 -05:00
Marius Rieder
072919040b Omit DATABASE_SSLMODE if not set. 2019-01-22 17:24:44 +01:00
softwarefactory-project-zuul[bot]
91ae343e3b Merge pull request #2847 from marshmalien/testing-smart-inv-host-filter
Fix host_filter smart search bug when searching by "or" operator

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-22 16:10:26 +00:00
Jake McDermott
5afabc7a19 use npm ci to install ui dependencies 2019-01-22 11:04:58 -05:00
softwarefactory-project-zuul[bot]
4788f0814f Merge pull request #3045 from jakemcdermott/regenerate-package-lock
updating package-lock.json

Reviewed-by: Shane McDonald <me@shanemcd.com>
             https://github.com/shanemcd
2019-01-22 15:01:43 +00:00
softwarefactory-project-zuul[bot]
c528ece5df Merge pull request #3046 from shanemcd/3.0.0
AWX 3.0.0

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-22 14:58:33 +00:00
Jake McDermott
a1c03cd6a1 update license files 2019-01-22 09:33:13 -05:00
Shane McDonald
42fbb81337 AWX 3.0.0 2019-01-22 09:32:39 -05:00
softwarefactory-project-zuul[bot]
5286e24721 Merge pull request #3044 from ryanpetrello/dispatcher-reap-db-error
detect dead DB connections in the dispatcher when reaping jobs

Reviewed-by: Chris Meyers
             https://github.com/chrismeyersfsu
2019-01-22 14:32:34 +00:00
Jake McDermott
0bde309d23 updating package-lock.json 2019-01-22 09:04:27 -05:00
Ryan Petrello
b2442d42a3 detect dead DB connections in the dispatcher when reaping jobs 2019-01-22 08:40:26 -05:00
softwarefactory-project-zuul[bot]
18409f89c5 Merge pull request #3042 from ryanpetrello/py3-sso-complete
fix a py3 bug that breaks the SSO complete endpoint

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-22 13:12:41 +00:00
softwarefactory-project-zuul[bot]
88d5fb0420 Merge pull request #3039 from AlanCoding/inventory_venv
Use custom virtual environment in inventory updates

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2019-01-22 13:12:37 +00:00
softwarefactory-project-zuul[bot]
1cc0f81913 Merge pull request #3034 from rooftopcellist/upgrade_social_auth_core
upgrade social-auth-core to v3.0.0

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-21 22:10:50 +00:00
Ryan Petrello
8cb8e63db5 fix a py3 bug that breaks the SSO complete endpoint 2019-01-21 17:04:13 -05:00
Christian Adams
8597670299 upgrade social-auth-core to v3.0.0 2019-01-21 16:35:47 -05:00
softwarefactory-project-zuul[bot]
c0ff4dad59 Merge pull request #3021 from jakemcdermott/credential_input_access_methods
add input access methods to credentials

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-21 21:10:12 +00:00
Marliana Lara
9b2ca04118 Fix host_filter smart search bug when searching by "or" operator 2019-01-21 15:50:33 -05:00
softwarefactory-project-zuul[bot]
d98c60519e Merge pull request #2895 from AlanCoding/scm_vars
Allow SCM overwrite vars in the UI

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-21 19:13:47 +00:00
Marius Rieder
589531163a Add pg_sslmode option.
Allows to use PostgreSQL over SSL #709
2019-01-21 19:47:34 +01:00
AlanCoding
5dd8c3ace2 Allow SCM overwrite vars in the UI 2019-01-21 13:27:57 -05:00
softwarefactory-project-zuul[bot]
d021c253aa Merge pull request #2959 from crab86/devel
Add Grafana notification type

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-21 17:21:14 +00:00
softwarefactory-project-zuul[bot]
c48c8c04f4 Merge pull request #3038 from Spredzy/x_frame_options
Nginx: Specify X-Frame-Options "DENY" header

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-21 15:31:44 +00:00
softwarefactory-project-zuul[bot]
a2102c92ec Merge pull request #3030 from ryanpetrello/fix-non-utf8-scm
add robust handling of non-UTF8 when detecting inventory/playbooks

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2019-01-21 13:52:55 +00:00
AlanCoding
99288a5e18 Use custom virtual environment in inventory updates 2019-01-21 06:45:55 -05:00
Yanis Guenane
44c48d1d66 Nginx: Specify X-Frame-Options "DENY" header
Adding the X-Frame-Options "DENY"; header to avoid possible clickjacking
attack.

More info of the why available here:
https://www.owasp.org/index.php/Testing_for_Clickjacking_(OTG-CLIENT-009)

Signed-off-by: Yanis Guenane <yguenane@redhat.com>
2019-01-21 12:34:17 +01:00
Daniel Sami
c785c38748 websocket tests initial commit 2019-01-21 13:54:03 +09:00
Sebastian
ebe0ded9c2 Add grafana notification type unit tests 2019-01-20 22:42:03 +01:00
Jake McDermott
2dadfbcc14 use credential input access methods in injectors.py 2019-01-20 14:02:01 -05:00
Jake McDermott
3a58a5b772 use credential input access methods in views/__init__.py 2019-01-20 13:08:41 -05:00
Jake McDermott
5010e98b8f use credential input access methods in projects.py 2019-01-20 13:08:38 -05:00
Jake McDermott
3ef4cc9bfa use credential input access methods in serializers.py 2019-01-20 13:08:34 -05:00
Jake McDermott
c01c671642 use credential input access methods in tasks.py 2019-01-20 13:08:30 -05:00
Jake McDermott
a86e270905 add credential input access methods 2019-01-20 13:08:23 -05:00
Sebastian
4058d18593 Add grafana notification type 2019-01-20 13:51:23 +01:00
Ryan Petrello
caa55f112f add robust handling of non-UTF8 when detecting inventory/playbooks 2019-01-19 13:25:41 -05:00
softwarefactory-project-zuul[bot]
d0af952685 Merge pull request #3027 from rooftopcellist/amend_auth_code_help_txt
correct authorization code expiration help-text

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-18 20:37:21 +00:00
softwarefactory-project-zuul[bot]
fbc7f496c5 Merge pull request #3024 from ryanpetrello/ldap-gc-deadlock
fix a deadlock when Python garbage collects LDAPBackend objects

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-18 19:25:11 +00:00
John Mitchell
bb19a4234e Merge pull request #3003 from jlmitch5/newSettingsInUI
add new settings to ui
2019-01-18 14:20:31 -05:00
softwarefactory-project-zuul[bot]
11f7e90f6a Merge pull request #3025 from ryanpetrello/django-cors-headers
add Django CORS middleware

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-18 18:47:14 +00:00
Christian Adams
5c080678a6 correct authorization code expiration help-text 2019-01-18 13:27:01 -05:00
John Mitchell
2df51a923d change grant reference to code in ui help text 2019-01-18 13:13:15 -05:00
Tyler Cross
0da0a8e67b CORS Support
Added the django-cors-headers app and middleware to make CORS possible.
2019-01-18 12:49:00 -05:00
John Mitchell
b75ba7ebea remove auth misc form and move fields under system misc form 2019-01-18 12:43:21 -05:00
John Mitchell
24de951f6c add access token and authorization code expiration settings to ui 2019-01-18 12:43:21 -05:00
John Mitchell
974306541e add isolated settings to ui 2019-01-18 12:43:21 -05:00
softwarefactory-project-zuul[bot]
d2fa5cc182 Merge pull request #3013 from ryanpetrello/ansible-py3-venv
add support for custom py3 ansible virtualenvs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-18 16:29:27 +00:00
Ryan Petrello
e45e4b3cda fix a deadlock when Python garbage collects LDAPBackend objects
we shouldn't call signal.disconnect in __del__ because it can lead to
deadlocks in Django signal dispatch code

The Signal.connect, Signal.disconnect, and Signal._live_receivers
methods all share a threading.Lock():

22a60f8d0b/django/dispatch/dispatcher.py (L49)

It's possible for this to lead to a deadlock:

1.  Have code that calls Signal._live_receivers and enter the critical
    path inside the shared threading.Lock()
2.  Python garbage collection occurs and finds one or more LDAPBackend
    objects with no more references
3.  This __del__ is called, which calls Signal.disconnect
4.  Code in Signal._disconnect attempts to obtain the (already held)
    threading.Lock
5.  Python hangs forever while attempting to garbage collect
2019-01-18 11:27:50 -05:00
Ryan Petrello
65641c7edd add support for custom py3 ansible virtualenvs 2019-01-18 10:55:53 -05:00
softwarefactory-project-zuul[bot]
5f01c3f5a8 Merge pull request #2994 from coreywan/pod-limits
Add POD Limits

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-18 04:28:11 +00:00
softwarefactory-project-zuul[bot]
7b39198f26 Merge pull request #2995 from coreywan/postgres_helm
adds persistence.storageClass and limits to postgress helm install

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-18 04:24:18 +00:00
Bianca
f1e3be5ec8 Removing unicode fix-related lines in ha.py 2019-01-17 14:42:38 -05:00
Bianca
bf5657a06a Update register_queue.py file to enable registration of instance groups with unicode 2019-01-17 14:36:46 -05:00
softwarefactory-project-zuul[bot]
f583dd73e8 Merge pull request #3008 from AlanCoding/inv_cleanup2
Remove deprecated logic & components from inventory import command

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-17 19:23:02 +00:00
softwarefactory-project-zuul[bot]
57b8aa4892 Merge pull request #3002 from themr0c/pg_password_10_character_limit
pg_password should be random 10 character alphanumeric string, when p…

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-17 18:15:38 +00:00
softwarefactory-project-zuul[bot]
474876872e Merge pull request #2999 from themr0c/issue-2991
related #2991 - Helm creation of postgreql on multiple namespaces

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-17 14:28:05 +00:00
softwarefactory-project-zuul[bot]
3eaed52b83 Merge pull request #3017 from ryanpetrello/beat-shelve-error
close the persistent shelve when we're done checking it

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2019-01-17 13:46:09 +00:00
AlanCoding
28822d891c remove unneeded steps in inventory import
Delete some cases that directly loads scripts due
to ansible-inventory group_vars problem (now fixed)

Delete intermediate method that was a go-between the
command and the loader class

Change return type of loader from MemInventory to
a simple python dict

remove backport script and star imports
2019-01-17 08:44:55 -05:00
Ryan Petrello
37dbfa88f9 close the persistent shelve when we're done checking it
this code was added to detect celerybeat shelve .db corruption, but it caused a different issue; opening the shelve in this way puts a write lock on it, which means that when we attempt to open it _again_ moments later, we can't.

when we're done checking the validity of the file, we need to close it
2019-01-17 08:20:21 -05:00
Fabrice Flore-Thebault
b6c30e8ef5 it's a limitation of the official postgres helm chart
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-17 12:56:17 +01:00
Fabrice Flore-Thebault
d938c96a76 pg_password should be random 10 character alphanumeric string, when postgresql is running on kubernetes
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-17 12:56:06 +01:00
softwarefactory-project-zuul[bot]
4ce18618cb Merge pull request #3014 from jakemcdermott/skip-ui-release-chromium-download
skip chromium download when using ui-release make target

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-17 04:58:22 +00:00
Jake McDermott
6c7f11395b skip chromium download when building release 2019-01-16 20:48:12 -05:00
softwarefactory-project-zuul[bot]
134950ade1 Merge pull request #3006 from ansible/documentation
Documentation of E2E test fixtures, etc.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-16 23:43:46 +00:00
Daniel Sami
7258a43bad rewording, typo corrections 2019-01-17 08:28:22 +09:00
Ryan Petrello
27f98163ff Merge pull request #3012 from ryanpetrello/fix-swagger-key-ordering
enforce key order when writing swagger docs JSON
2019-01-16 16:43:43 -05:00
Ryan Petrello
6d04bd34ce enforce key order when writing swagger docs JSON 2019-01-16 16:00:27 -05:00
softwarefactory-project-zuul[bot]
584ec9cf75 Merge pull request #2538 from ryanpetrello/py3
port awx to run natively on python3.6+

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-16 19:39:14 +00:00
Corey Wanless
aebeeb170e adds pod limits
Signed-off-by: Corey Wanless <corey.wanless@wwt.com>
2019-01-16 09:23:18 -06:00
Fabrice Flore-Thebault
c434d38876 adding helm chart version for postgresql
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-16 09:40:49 +01:00
Daniel Sami
ae3ab89515 lint fix 2019-01-16 11:06:25 +09:00
Daniel Sami
0c250cd6af Updated parameter info 2019-01-16 10:44:22 +09:00
Ryan Petrello
33c1416f6c work around a py3 bug in celerybeat 2019-01-15 15:19:02 -05:00
Ryan Petrello
3d7fcb3835 fix a few isolated issues related to the py2 -> py3 move 2019-01-15 14:09:05 -05:00
Shane McDonald
04da4503db Python 3 / Upstream Kubernetes 2019-01-15 14:09:05 -05:00
Ryan Petrello
2016798e0f fix a few UTF-8 bugs on Ubuntu related to stdout text downloads 2019-01-15 14:09:05 -05:00
Ryan Petrello
39d119534c support isolated runs in py2 *and* py3 (for now)
once we merge in runner support for isolated environments, we can
revert this commit (because we'll always run isolated code using python3
executables)
2019-01-15 14:09:05 -05:00
Shane McDonald
d273472927 Enable py3 SCL if needed 2019-01-15 14:09:05 -05:00
Shane McDonald
5aa99b2ca1 Dependency updates for Python 3 2019-01-15 14:09:05 -05:00
Ryan Petrello
96b9bd6ab6 make py3 packaging work for k8s 2019-01-15 14:09:05 -05:00
Author: Jim Ladd
2c5bdf3611 fix some isolated py3 bugs 2019-01-15 14:09:05 -05:00
Ryan Petrello
af4234556e remove dm.xmlsec.binding
python-saml uses dm.xmlsec.binding only supports python2
by moving to py3, we now use python3-saml (which uses python-xmlsec
instead)

see: https://github.com/onelogin/python-saml/issues/145#issuecomment-222021691
2019-01-15 14:09:05 -05:00
Ryan Petrello
c6482137d1 parametrize PYTHON for Ubuntu py35 support 2019-01-15 14:09:05 -05:00
Ryan Petrello
f223df303f convert py2 -> py3 2019-01-15 14:09:01 -05:00
Ryan Petrello
f132ce9b64 switch image builds to py3 2019-01-15 13:25:13 -05:00
softwarefactory-project-zuul[bot]
f22fd58392 Merge pull request #3007 from AlanCoding/test_logging
Updates to logging, specifically for unit tests

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-15 18:19:58 +00:00
AlanCoding
cccc038600 Updates to logging, specifically for unit tests 2019-01-15 11:34:54 -05:00
softwarefactory-project-zuul[bot]
b9607dd415 Merge pull request #2983 from mabashian/upgrade-jquery-mabashian
Upgrades jQuery and Bootstrap

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-15 14:06:33 +00:00
Fabrice Flore-Thebault
7b32262f75 revert pg_hostname
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-15 14:59:17 +01:00
Fabrice Flore-Thebault
d69f6acf64 add helm repo update and fix helm upgrade
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-15 14:48:26 +01:00
mabashian
66a859872e Fixes for numerous bootstrap upgrade bugs, uses variables for colors in bootstrap override style file 2019-01-15 08:40:35 -05:00
Fabrice Flore-Thebault
ef3aab1357 related #2991 - unify postgresql_service_name
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-15 11:44:08 +01:00
Daniel Sami
62ebf85b96 Documentation of functions 2019-01-14 19:18:47 -05:00
Corey Wanless
0c074e0988 * adds persistence.storageClass and limits to postgress helm install
* adds new variables to the inventory

Signed-off-by: Corey Wanless <corey.wanless@wwt.com>
2019-01-14 11:28:21 -06:00
softwarefactory-project-zuul[bot]
32c705a62a Merge pull request #2996 from coreywan/setup-postgress-activation-wait
adds wait time for postgres setup as a variable

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-14 17:22:54 +00:00
mabashian
7194338653 Reduces flake on launch job e2e test 2019-01-14 10:54:37 -05:00
Fabrice Flore-Thebault
d43521bb77 fix #2991 - make Helm creation of postgreql succeed when installing multiple AWX on different namespaces on same kubernetes
Signed-off-by: Fabrice Flore-Thebault <themr0c@users.noreply.github.com>
2019-01-14 10:32:21 +01:00
Corey Wanless
b1710f9523 adds wait time for postgres setup as a variable 2019-01-11 22:23:43 -06:00
mabashian
3b456d3e72 Fix credential list e2e test 2019-01-11 16:44:59 -05:00
softwarefactory-project-zuul[bot]
12a04a6da6 Merge pull request #2956 from ansible/swap-diff-order-schema-change
swap file order so diff of schema makes more sense

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-11 20:11:42 +00:00
mabashian
99205fde16 Fixes linting errors 2019-01-11 13:06:52 -05:00
mabashian
8539eae114 Fixes for e2e tests 2019-01-11 12:50:01 -05:00
softwarefactory-project-zuul[bot]
3e2dd4f86b Merge pull request #2993 from ryanpetrello/fix-ctint-db-failure
catch _all_ types of django.db.utils.Error on CTinT key lookups

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-11 14:56:11 +00:00
Ryan Petrello
32c14d6eab catch _all_ types of django.db.utils.Error on CTinT key lookups 2019-01-11 08:49:47 -05:00
softwarefactory-project-zuul[bot]
4f9901db38 Merge pull request #2867 from AlanCoding/supervisor_names
Make docker environment interoperable with supervisorctl commands

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-11 13:28:35 +00:00
softwarefactory-project-zuul[bot]
a77c981e0c Merge pull request #2992 from AlanCoding/opt_dashboard
Optimize dashboard using Django annotation for sum

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2019-01-11 13:15:42 +00:00
AlanCoding
77d2364022 Make docker environment interoperable with supervisorctl commands 2019-01-10 13:41:15 -05:00
AlanCoding
d1b42fd583 Optimize dashboard using Django annotation for sum 2019-01-10 12:22:39 -05:00
mabashian
2dfb0abb69 Fixes jshint errors 2019-01-09 11:45:51 -05:00
mabashian
7bcbaabd71 Removed extraneous comments 2019-01-09 11:03:51 -05:00
mabashian
9c20e1b494 Upgrades jquery and bootstrap 2019-01-09 11:03:51 -05:00
softwarefactory-project-zuul[bot]
2b5210842d Merge pull request #2977 from MarBra/devel
Fix typo in ca_trust_dir

Reviewed-by: Bill Nottingham
             https://github.com/wenottingham
2019-01-07 19:42:50 +00:00
marcel
0b3e51458d Fix typo in ca_trust_dir
The correct path is used in docker-compose template:
- "{{ ca_trust_dir +':/etc/pki/ca-trust/source/anchors:ro' }}"
2019-01-07 19:29:34 +01:00
Chris Meyers
d57fc998d5 Merge pull request #2972 from wwitzel3/devel
update to the latest asgi-amqp
2019-01-03 08:22:05 -05:00
Wayne Witzel III
1079051b12 update to the latest asgi-amqp 2019-01-03 07:52:16 -05:00
Chris Meyers
4641056829 Merge pull request #2942 from chrismeyersfsu/doc-tm_affinity
add docs for task manager node decider
2019-01-02 13:57:58 -05:00
chris meyers
db2bb19d65 add docs for task manager node decider 2019-01-02 12:17:28 -05:00
Elijah DeLee
e5ad2e44fb swap file order so diff of schema makes more sense
This way we will get +'s next to new content :)
2018-12-20 15:05:01 -05:00
softwarefactory-project-zuul[bot]
aa8cda0001 Merge pull request #2801 from ryanpetrello/more-robust-isolated-capacity
collect isolated capacity using a cache plugin, not stdout parsing

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-20 20:01:00 +00:00
softwarefactory-project-zuul[bot]
949f383564 Merge pull request #2947 from wenottingham/spelling-is-gud
Fix 'credential' typo.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-19 13:54:47 +00:00
Bill Nottingham
479ad13630 Fix some more typos while here. 2018-12-18 16:23:17 -05:00
Bill Nottingham
23c2e1be31 Fix 'credential' typo. 2018-12-18 16:12:10 -05:00
softwarefactory-project-zuul[bot]
7628ef01f1 Merge pull request #2938 from mabashian/wf-details-click
Updates to workflow node details link

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-18 12:06:33 +00:00
mabashian
c0730aa562 Prevent mousedown on details link from triggering pan functionality 2018-12-17 15:20:34 -05:00
mabashian
67d6a9f9ea Fixes display of wf node details link in FF by adding height and width 2018-12-17 14:33:48 -05:00
mabashian
f9854abfa1 Fixed linting error 2018-12-17 10:40:20 -05:00
mabashian
2697615dbf Undo GET request that was made for workflow node jobs missing a type and instead leverage the redirect route. The workflow node results redirect now works for all job types. 2018-12-17 10:26:01 -05:00
softwarefactory-project-zuul[bot]
a131250dc1 Merge pull request #2917 from AlanCoding/relaunch_sjt
Fx bug where some SJs could not be relaunched

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-17 15:07:32 +00:00
Michael Abashian
2d237b6dbb Merge pull request #2 from jakemcdermott/wf-details-click
add output redirect route for workflow playbook nodes
2018-12-17 09:41:41 -05:00
Jake McDermott
c8b15005b4 link to workflow playbook node route from workflow viewer 2018-12-14 19:22:23 -05:00
Jake McDermott
a5c4350695 add redirect route for workflow viewer 2018-12-14 19:20:01 -05:00
mabashian
9f18f8dbdb Fixes split job inside workflow details link bug 2018-12-14 18:04:39 -05:00
mabashian
a8e1c8960f Remove details function 2018-12-14 16:27:35 -05:00
mabashian
7f66053654 Changed workflow node details link to href so that i can be opened in new tab 2018-12-14 14:59:19 -05:00
softwarefactory-project-zuul[bot]
1d6c88b7e2 Merge pull request #2933 from ryanpetrello/openshift-ha-policy
configure an HA policy for openshift/k8s installs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-14 19:45:26 +00:00
softwarefactory-project-zuul[bot]
049f85f3c9 Merge pull request #2937 from mabashian/2932-schedule-prompts
Fixes bug scheduling jt where first survey question is optional

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-14 19:37:03 +00:00
Ryan Petrello
4858868428 configure an HA policy for openshift/k8s installs 2018-12-14 14:08:30 -05:00
mabashian
4e37076955 Fixes bug scheduling jt where first survey question is optional 2018-12-14 14:08:06 -05:00
softwarefactory-project-zuul[bot]
e6f654b568 Merge pull request #2924 from AlanCoding/run_as_root
Catch python error when unable to find user

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-13 18:01:55 +00:00
AlanCoding
65e110cdbf catch python error when unable to find user 2018-12-13 11:47:54 -05:00
softwarefactory-project-zuul[bot]
10e99c76a8 Merge pull request #2921 from GitStorm/patch-1
tower-cli config: host value needs to be URL

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-13 13:13:42 +00:00
GitStorm
b0e3bc96dd tower-cli config: host value needs to be URL
Since the key name "host" is slightly misleading, it would help to point out in this documentation, that in fact an URL is required for that key/value pair "host" in the tower-cli config. Failing to do so drops the follwing error:

Error: There was a network error of some kind trying to connect to Tower.
The most common  reason for this is a settings issue; is your "host" value in `tower-cli config` correct?
2018-12-13 11:52:56 +01:00
softwarefactory-project-zuul[bot]
59df54b363 Merge pull request #2919 from ryanpetrello/dispatcher-task-import-hardening
only allow the task dispatch worker to import and run decorated tasks

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-13 01:12:48 +00:00
Ryan Petrello
5950f26c69 only allow the task dispatch worker to import and run decorated tasks
this _technically_ prevents a remote code exploit where a user who has
access to publish AMQP messages to the dispatch queue could craft
a special message that would import and run arbitrary Python functions;
that said, the types of user with this privilege level are generally
_already_ the awx user (so they can already do this by hand if they
want)
2018-12-12 17:46:41 -05:00
AlanCoding
a3a5c6bf9f fix bug where some SJs could not be relaunched 2018-12-12 11:56:57 -05:00
softwarefactory-project-zuul[bot]
ca16787e7c Merge pull request #2697 from ryanpetrello/smarter-websocket-expiry
stop various async background requests from bumping the session expiry

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-12 15:39:20 +00:00
softwarefactory-project-zuul[bot]
271bd10b47 Merge pull request #2907 from shanemcd/devel
Bump version to 2.1.2

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-11 17:59:17 +00:00
Shane McDonald
e3872ebd58 Bump version to 2.1.2 2018-12-11 12:30:10 -05:00
softwarefactory-project-zuul[bot]
eee716644b Merge pull request #2875 from MrMEEE/patch-1
Bumped Version to 2.1.1

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-11 17:25:26 +00:00
Ryan Petrello
c2660af60d stop various async background requests from bumping the session expiry
if a user has an active session that just sits on the dashboard or job
list, websocket messages that come in (for e.g., job status changes)
will trigger AJAX requests for more data; this process causes a user
with an idle login to continue to generate API requests, which in turn
ticks their expiry timer.  As a result, users with active sessions
sitting on these two (popular) pages will never be automatically logged
out via SESSION_MAX_AGE.

this change introduces a special header that the UI can use to signify
that a request shouldn't bump the expiry timer
2018-12-11 09:15:58 -05:00
softwarefactory-project-zuul[bot]
2758a38485 Merge pull request #2898 from mabashian/2851-perms
Fixes bug where admin/member roles weren't showing up when adding user to org

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-10 16:51:03 +00:00
softwarefactory-project-zuul[bot]
9104f485e6 Merge pull request #2856 from wenottingham/one-small-step-foreman
Update foreman.py from Ansible devel, primarily for unicode fixes.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-10 16:27:52 +00:00
mabashian
ae7361f82d Fixes bug where admin/member roles weren't showing up when adding user to org 2018-12-10 11:12:09 -05:00
softwarefactory-project-zuul[bot]
42562e86e4 Merge pull request #2888 from mabashian/sanitize-app-token-list
Sanitize username and description in application tokens list

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-07 21:42:38 +00:00
softwarefactory-project-zuul[bot]
982ed37b06 Merge pull request #2890 from mabashian/3198-survey
Fixes bug launching jt where first survey question is optional and empty

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-07 20:40:07 +00:00
mabashian
c0c666cc87 Fixes bug launching jt where first survey question is optional and empty 2018-12-07 15:12:22 -05:00
softwarefactory-project-zuul[bot]
8a284889f5 Merge pull request #2889 from mabashian/2887-workflow-cred
Properly POST credentials to workflow nodes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-07 20:08:36 +00:00
mabashian
b891e2c204 Properly POST credentials to workflow nodes 2018-12-07 14:37:56 -05:00
mabashian
a8bf7366cf Sanitize username and description in application tokens list 2018-12-07 14:24:12 -05:00
softwarefactory-project-zuul[bot]
e517f81b8f Merge pull request #2880 from AlanCoding/fix_v1_links
Fix links to some resources that lack v1 pages

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-07 14:33:15 +00:00
softwarefactory-project-zuul[bot]
c4c99332fc Merge pull request #2873 from ansible/related_slices
Show type in related_jobs, link based on type

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-06 20:51:00 +00:00
AlanCoding
40b5ce4b2e link v1 pages to v2 credential type page 2018-12-06 15:41:26 -05:00
AlanCoding
d2cd337c1f fix links to some resources that lack v1 pages 2018-12-06 08:29:23 -05:00
softwarefactory-project-zuul[bot]
b9913fb4f9 Merge pull request #2877 from chrismeyersfsu/improvement-better_default_loggers
more sane default log handlers

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-05 15:59:12 +00:00
chris meyers
d1705dd0cc more sane default log handlers
* Removed the emailing of admins on request error. When turned on, the
handler will include all django settings in the email. This is not
desirable from a security standpoint.
2018-12-05 09:38:27 -05:00
Martin Juhl
816cc29132 Bumped Version to 2.1.1 2018-12-05 00:33:04 +01:00
AlanCoding
f09b8efa87 tests and optimizations for UJT list with non-joblet recent_jobs 2018-12-04 16:16:05 -05:00
softwarefactory-project-zuul[bot]
6ebc6809eb Merge pull request #2869 from AlanCoding/syncs_do_not_update_project
Do not update project details after sync jobs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-04 20:10:01 +00:00
AlanCoding
4b31367945 Do not update project details after sync jobs 2018-12-04 13:00:23 -05:00
kialam
2a62e300a2 UI update to check recent job type for routing to detail pages. 2018-12-04 11:19:25 -05:00
softwarefactory-project-zuul[bot]
f6b075843e Merge pull request #2845 from marshmalien/fix-org-ig-modal
Fix instance group modal selection

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-04 15:42:49 +00:00
Marliana Lara
4723773354 Fix instance group modal selection 2018-12-04 10:15:38 -05:00
softwarefactory-project-zuul[bot]
70be95cec5 Merge pull request #2861 from wenottingham/tighten-up-the-slack
Fix tooltip for slack channel list to note '#' is required.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-04 04:23:20 +00:00
softwarefactory-project-zuul[bot]
201b17012d Merge pull request #2865 from ansible/output-search-docslink
point output search doc link to latest

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-04 04:17:57 +00:00
Jake McDermott
47264b0809 point output search doc link to latest 2018-12-03 17:09:00 -05:00
Bill Nottingham
c51f235fab Fix tooltip for slack channel list to note '#' is required. 2018-12-03 14:22:59 -05:00
Bill Nottingham
f1b1224a27 Update foreman.py from Ansible devel, primarily for unicode fixes. 2018-12-03 10:23:28 -05:00
softwarefactory-project-zuul[bot]
63b0796738 Merge pull request #2852 from jlmitch5/updateOrgCardsCountWhenDatasetChanges
update org cards count when dataset chnages

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-02 20:05:19 +00:00
softwarefactory-project-zuul[bot]
5961e3ef2e Merge pull request #2846 from kialam/fix-3016-missing-job-events
Fix 3016 missing job events

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-12-01 05:12:05 +00:00
softwarefactory-project-zuul[bot]
246d80f177 Merge pull request #2850 from jlmitch5/addUserTokenPagination
add pagination to user tokens list

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-30 21:29:10 +00:00
softwarefactory-project-zuul[bot]
8005b47c14 Merge pull request #2849 from ryanpetrello/fix-custom-cred-encryption-nit
allow encrypted fields in custom credentials to be empty

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-30 21:07:30 +00:00
John Mitchell
1317572979 update org cards count when dataset chnages 2018-11-30 15:54:15 -05:00
AlanCoding
b763c51f8a add type to recent_jobs 2018-11-30 15:16:09 -05:00
softwarefactory-project-zuul[bot]
e70055a333 Merge pull request #2848 from wenottingham/more-fields-for-the-fields-god
Add timeout & slice count to the job field whitelist.

Reviewed-by: Bill Nottingham
             https://github.com/wenottingham
2018-11-30 20:02:38 +00:00
John Mitchell
52f86a206a add pagination to user tokens list 2018-11-30 14:27:23 -05:00
Ryan Petrello
7252883094 allow encrypted fields in custom credentials to be empty 2018-11-30 14:07:56 -05:00
kialam
afa7c2d69f Update unit tests. 2018-11-30 13:58:13 -05:00
Bill Nottingham
9c44d1f526 Add timeout & slice count to the job field whitelist. 2018-11-30 13:43:21 -05:00
kialam
473ce95c86 Fix failing unit tests. 2018-11-30 12:16:28 -05:00
kialam
3e1e068013 Add boundary checks for getReadyCount method. 2018-11-30 12:03:26 -05:00
kialam
746a154f2b Address missing job events.
- Fix off by one error.
- Add unit tests for Stream Service.
2018-11-30 11:23:15 -05:00
softwarefactory-project-zuul[bot]
28733800c4 Merge pull request #2842 from mabashian/2839-workflow-key
Changes workflow key icon from fa-key to fa-compass

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-30 13:21:45 +00:00
softwarefactory-project-zuul[bot]
cf2deefa41 Merge pull request #2843 from ansible/update-e2e-tests-2
Updating e2e tests to match change in order layout

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-30 02:04:21 +00:00
John Hill
e5645dd798 one more 2018-11-29 19:35:11 -05:00
John Hill
6205a5db83 Updating to fix linting error 2018-11-29 19:11:27 -05:00
John Hill
e50dd92425 Cannot depend on the id and order, reverting to workflow node names 2018-11-29 18:16:53 -05:00
softwarefactory-project-zuul[bot]
4955fc8bc4 Merge pull request #2840 from ryanpetrello/project-update-bug
resolve a nuanced traceback for JTs that run w/ a failed project

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-29 22:35:59 +00:00
mabashian
15adb1e828 Changes workflow key icon from fa-key to fa-compass 2018-11-29 17:16:25 -05:00
Ryan Petrello
c90d81b914 resolve a nuanced traceback for JTs that run w/ a failed project
related: https://github.com/ansible/awx/pull/2719
2018-11-29 17:10:23 -05:00
softwarefactory-project-zuul[bot]
8e9c28701e Merge pull request #2836 from ryanpetrello/better-dispatch-retries
add additional DB retry logic to the callback receiver

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-29 21:18:24 +00:00
softwarefactory-project-zuul[bot]
abc74fc9b8 Merge pull request #2824 from chrismeyersfsu/workflow-convergence_enforce2
enforce 1 edge between 2 nodes constraint

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-29 19:34:25 +00:00
chris meyers
21fce00102 python3 compliance
* This ones for you rydog
2018-11-29 14:07:43 -05:00
chris meyers
d347a06e3d do not deny existing workflow node relationships 2018-11-29 13:29:16 -05:00
Ryan Petrello
0391dbc292 add additional DB retry logic to the callback receiver
initially, I implemented this for _only_ the task worker, but it's
probably needed for callback event workers, too
2018-11-29 11:57:46 -05:00
softwarefactory-project-zuul[bot]
349c7efa69 Merge pull request #2792 from AlanCoding/how_many_slices
Prohibit relaunching sliced jobs with changed count

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-29 15:57:40 +00:00
softwarefactory-project-zuul[bot]
0f451595d7 Merge pull request #2826 from ryanpetrello/remove-deprovision-node
remove the deprecated `awx-manage deprovision_node` command

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-29 15:52:13 +00:00
Ryan Petrello
fcb6ce2907 remove a few deprecated awx-manage commands 2018-11-29 10:09:57 -05:00
softwarefactory-project-zuul[bot]
273d7a83f2 Merge pull request #2825 from ryanpetrello/dont-fear-the-reaper
don't reap jobs that aren't running

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-29 14:31:37 +00:00
chris meyers
916c92ffc7 save state 2018-11-29 08:53:46 -05:00
Ryan Petrello
38bf174bda don't reap jobs that aren't running
this is a simple sanity check, but it should help us avoid shooting
ourselves in the foot in complicated scenarios, such as:

1.  A dispatcher worker is running a job, and it's killed with `kill -9`
2.  The dispatcher attempts to reap jobs with a matching celery_task_id
3.  The associated sync project update has the *same* celery_task_id
    (an implementation detail of how we implemented that), and it ends
    up getting reaped _even though_ it's already finished and has
    status=successful
2018-11-28 18:11:12 -05:00
chris meyers
09dff99340 enforce 1 edge between 2 nodes constraint 2018-11-28 16:57:50 -05:00
softwarefactory-project-zuul[bot]
7f178ef28b Merge pull request #2822 from ansible/workflow-e2e-update
Small update to the node order to reflect e2e test workflow changes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 21:08:36 +00:00
softwarefactory-project-zuul[bot]
68328109d7 Merge pull request #2807 from AlanCoding/yuck_artifacts
Do not pass artifacts to non-job nodes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 21:05:24 +00:00
John Hill
d573a9a346 Small update to the node order to reflect workflow changes 2018-11-28 15:37:30 -05:00
AlanCoding
d6e89689ae do not pass artifacts to non-job nodes 2018-11-28 15:19:47 -05:00
softwarefactory-project-zuul[bot]
d1d97598e2 Merge pull request #2821 from AlanCoding/clean_nodes
Clean up unwanted data in activity stream of nodes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 19:13:45 +00:00
softwarefactory-project-zuul[bot]
f57fa9d1fb Merge pull request #2810 from chrismeyersfsu/feature-replay_job_status
emit job status lifecycle in event replayer

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 18:57:56 +00:00
chris meyers
83760deb9d align tests with new replay get_job interface 2018-11-28 13:33:44 -05:00
softwarefactory-project-zuul[bot]
3893e29a33 Merge pull request #2815 from ryanpetrello/fix-iso-nodes-dev
fix isolated nodes in the dev environment

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 17:06:16 +00:00
softwarefactory-project-zuul[bot]
feeaa0bf5c Merge pull request #2747 from kialam/remove-md5
Remove MD5 usage and dependency from UI

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 16:15:59 +00:00
kialam
22802e7a64 Update README to include needed npm version. 2018-11-28 10:43:53 -05:00
Ryan Petrello
1ac5bc5e2b remove angular-md5 license 2018-11-28 10:43:53 -05:00
kialam
362a3753d0 Remove 'angular-md5' from our dependencies. 2018-11-28 10:43:53 -05:00
kialam
71ee9d28b9 Add link to original gist and rename file. 2018-11-28 10:43:53 -05:00
kialam
d8d89d253d Remove instances of "md5" from the UI. 2018-11-28 10:43:53 -05:00
Ryan Petrello
a72f3d2f2f generate host_config_key using random UUIDs, not a time-based md5 hash 2018-11-28 10:43:45 -05:00
AlanCoding
1adeb833fb clean up unwanted data in activity stream of nodes 2018-11-28 10:41:32 -05:00
Ryan Petrello
a810aaf319 fix isolated nodes in the dev environment 2018-11-28 09:54:39 -05:00
softwarefactory-project-zuul[bot]
d9866c35b4 Merge pull request #2819 from ryanpetrello/fix-busted-tests
mock an HTTP call to fix busted unit tests

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 14:50:38 +00:00
Ryan Petrello
4e45c3a66c mock an HTTP call to fix busted unit tests 2018-11-28 09:17:50 -05:00
softwarefactory-project-zuul[bot]
87b55dc413 Merge pull request #2816 from ansible/jakemcdermott-smoke-break
update expected color vals of active tab in smoke test

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
             https://github.com/jakemcdermott
2018-11-28 04:02:31 +00:00
Jake McDermott
2e3949d612 update expected color vals of active tab in smoke test 2018-11-27 22:46:16 -05:00
softwarefactory-project-zuul[bot]
d928ccd922 Merge pull request #2799 from ansible/jakemcdermott-readonly-viz
don't conditionally hide workflow viz templates list button

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-28 03:39:51 +00:00
softwarefactory-project-zuul[bot]
a9c51b737c Merge pull request #2389 from ansible/workflow-convergence
Workflow convergence

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-27 22:04:50 +00:00
mabashian
51669c9765 Fixes hint/lint errors in workflow viz test 2018-11-27 16:12:42 -05:00
mabashian
17cc82d946 Ensure that selected row is cleared when adding new node after editing existing node 2018-11-27 16:12:42 -05:00
mabashian
10de5b6866 Fixes clicking on a wf in wf node. Also fixes editing wf in wf node with inv prompt 2018-11-27 16:12:42 -05:00
mabashian
55dc27f243 Set active tab to jobs when initially clicking a workflow_job_template type node 2018-11-27 16:12:42 -05:00
mabashian
6fc2ba3495 Fixes delete node shifting e2e test 2018-11-27 16:12:42 -05:00
mabashian
7bad01e193 Fixes e2e workflow visualizer tests 2018-11-27 16:12:42 -05:00
mabashian
62a1f10c42 Fix node pagination for project/inv 2018-11-27 16:12:42 -05:00
mabashian
3975a2ecdb fix linkpath class 2018-11-27 16:12:42 -05:00
Jake McDermott
bfa361c87f hide prompt button when not on jobs tab 2018-11-27 16:12:42 -05:00
Jake McDermott
d5f07a9652 hide inventory help message when not on jobs tab 2018-11-27 16:12:42 -05:00
Jake McDermott
65ec1d18ad skip missing inventory prompt value check when selecting workflow node 2018-11-27 16:12:42 -05:00
Jake McDermott
7b4521f980 workflow node prompt fixup
* use workflow model and endpoint when node is workflow
* always include template type in prompt data
* skip missing inventory checks when node is workflow
* skip checks for required credential fields when node is workflow
2018-11-27 16:12:42 -05:00
John Mitchell
3762ba7b24 add back in workflow_nodes in order to be able to use it for count of nodes 2018-11-27 16:12:42 -05:00
John Mitchell
762c882cd7 consume workflow maker total nodes label change 2018-11-27 16:12:42 -05:00
John Mitchell
343639d4b7 fix workflow maker total templates header to total nodes 2018-11-27 16:12:42 -05:00
John Mitchell
38dc0b8e90 fix workflow total jobs header to total nodes 2018-11-27 16:12:42 -05:00
mabashian
ed40ba6267 Fix searching on related fields 2018-11-27 16:12:42 -05:00
mabashian
54d56f2284 Fix node jobs column sorting. Adds arrows to potential workflow node links 2018-11-27 16:12:42 -05:00
mabashian
1477bbae30 Fixed error Cannot read property 'type' of undefined in console when selecting a project or inventory node 2018-11-27 16:12:42 -05:00
mabashian
625c6c30fc Fixed edge dropdown id 2018-11-27 16:12:42 -05:00
chris meyers
228e412478 simplify workflow job failure reason
* Log the more detailed reason for a workflow job failing but expose a
simplified reason to users via job_explanation
2018-11-27 16:12:42 -05:00
chris meyers
f8f2e005ba better comment for deciding parent's status 2018-11-27 16:12:42 -05:00
chris meyers
d8bf82a8cb add help_text to do_not_run workflow field 2018-11-27 16:12:41 -05:00
chris meyers
2eeca3cfd7 add example workflow run to docs 2018-11-27 16:12:41 -05:00
mabashian
28a4bbbe8a Fixed jshint errors that fell out of merge conflict 2018-11-27 16:12:41 -05:00
mabashian
1cfcaa72ad Fixed editNodeHelpMessage logic that was broken during merge conflict 2018-11-27 16:12:41 -05:00
AlanCoding
4c14727762 bump migration number 2018-11-27 16:12:41 -05:00
chris meyers
0c8dde9718 fix dfs_run_nodes()
* Tried to re-use the topological sort order to crawl the graph to find
the next node(s) to run. This is incorrect, we need to take into account
the fail/success of jobs and directionally crawl the graph.
2018-11-27 16:12:41 -05:00
chris meyers
febf051748 do not mark ujt None nodes dnr
* Leave workflow nodes with no related unified job template nodes
do_not_run = False. If we mark it True, we can't differentiate between
the actual want to not take that path vs. do not run this because I do
not have a valid related unified job template.
2018-11-27 16:12:41 -05:00
mabashian
56885a5da1 Remove reference to isStartNode and just check the id of the node to determine if it's our start node or not 2018-11-27 16:12:41 -05:00
mabashian
623cf54766 Added dagre and graphlib licenses 2018-11-27 16:12:41 -05:00
mabashian
a804c854bf Fix test failures and jshint errors 2018-11-27 16:12:41 -05:00
chris meyers
7b087d4a6c loop over dnr nodes by topological sort
* Perform topological sort on graph nodes before looping over them to
mark do not run. This guarantees that parent nodes will be processed
before calling dependent child nodes. The complexity of the sorting is
N. The complexity of marking the the nodes is N*V
2018-11-27 16:12:41 -05:00
chris meyers
cfa098479e Revert "optimize mark dnr nodes algorithm"
This reverts commit 6372c52772.
2018-11-27 16:12:41 -05:00
mabashian
3c510e6344 Fixed bug where root link became clickable. Fix workflow key on results page. 2018-11-27 16:12:41 -05:00
chris meyers
4c9a1d6b90 optimize mark dnr nodes algorithm
* Compute largest depth of each node and traverse graph by depth. This
allows us to check a node once, and only once, to determine if it needs
to be marked for do not run.
2018-11-27 16:12:41 -05:00
chris meyers
d1aa52a2a6 fix up mark dnr logic 2018-11-27 16:12:41 -05:00
chris meyers
f30f52a0a8 handle missing unified job template in workflow
* Workflow Node without unified_job_template is treated as a job marked
as failure; when deciding what path to execute.
* Remove optimization of marking dnr nodes due to it making the
algorithm incorrect.
2018-11-27 16:12:41 -05:00
mabashian
5b459e3c5d Code cleanup. Fixed bugs with workflow results page including details links 2018-11-27 16:12:41 -05:00
chris meyers
676c068b71 add job_description to failed workflow node
* When workflow job fails because a workflow job node doesn't have a
related unified_job_template note that with an error on the workflow
job's job_description
* When a workflow job fails because a failure path isn't defined, note
that on the workflow job job_description
2018-11-27 16:12:41 -05:00
chris meyers
00d71cea50 detect workflow nodes without job templates
* Fail workflow job run when encountering a Workflow Job Nodes with
no related job templates.
2018-11-27 16:12:41 -05:00
mabashian
72263c5c7b Addresses a number of workflow related bugs 2018-11-27 16:12:41 -05:00
chris meyers
281345dd67 flake8 fix 2018-11-27 16:12:41 -05:00
chris meyers
1a85fcd2d5 update docs to include workflow failure semantic 2018-11-27 16:12:41 -05:00
chris meyers
c1171fe4ff treat canceled nodes as failed when processing wf
* When deciding what jobs to run next, treat canceled as failed.
* Also add tests.
2018-11-27 16:12:41 -05:00
chris meyers
d6a8ad0b33 treat canceled jobs in wf the same as failed jobs
* Also fix spelling mistake that caused workflows to be falsely marked
successful in the case of a canceled job.
2018-11-27 16:12:41 -05:00
mabashian
4a6a3b27fa Fixed a number of workflow visualizer bugs. Added loading spinners while data is being loaded/processed. 2018-11-27 16:12:41 -05:00
chris meyers
266831e26d add cycle unit test 2018-11-27 16:12:41 -05:00
chris meyers
a6e20eeaaa update wf done and failed tests 2018-11-27 16:12:41 -05:00
chris meyers
6529c1bb46 update done and fail detection for workflow
* Instead of traversing the workflow graph to determine if a workflow is
done or has failed; instead, loop through all the nodes in the graph and
grab only the relevant nodes.
2018-11-27 16:12:41 -05:00
mabashian
ae0d0db62c Added dagre to handle our workflow graph layout. Fixed various workflow related bugs. 2018-11-27 16:12:41 -05:00
chris meyers
b81d795c00 fix up dot graph generator
* Update graph dot generator to use the new efficient graph
2018-11-27 16:12:41 -05:00
chris meyers
1b87e11d8f flake8 2018-11-27 16:12:41 -05:00
chris meyers
8bb9cfd62a add dag tests 2018-11-27 16:12:41 -05:00
chris meyers
a176a4b8cf remove unused code 2018-11-27 16:12:41 -05:00
chris meyers
3f4d14e48d crawl entire graph when marking DNR
* From the root, the code was only going down the did run path to find
nodes to mark DNR. This is incorrect, Now, we traverse the entire graph
each time to find nodes to mark DNR.
2018-11-27 16:12:41 -05:00
chris meyers
0499d419c3 more efficient graph processing
* Getting parent nodes from child was inefficient. Optimize it with a
hash table like we did for the getting of children.
* Getting leaf nodes was inefficient. Optimize it like we did getting
root nodes. A node is assumed to be a leaf node until it gets a child.
2018-11-27 16:12:41 -05:00
mabashian
700860e040 Fix long name tooltip. Fixed bug adding new node before finishing adding new link.
Fixed template list column layout.  Ensure that we're getting 200 workflow nodes per GET request
2018-11-27 16:12:41 -05:00
chris meyers
3dadeb3037 remove print statements 2018-11-27 16:12:41 -05:00
chris meyers
16a60412cf optimization fix
* WorkflowDAG accepts workflow job template and workflow jobs for which
to build a graph out of the nodes. The optimized query for each is
different. This changeset adds the differing queries for a workflow job.
2018-11-27 16:12:41 -05:00
chris meyers
9f3e272665 optimize cycle detection 2018-11-27 16:12:41 -05:00
mabashian
b84fc3b111 Fixes for post-rebase bugs 2018-11-27 16:12:41 -05:00
chris meyers
e1e8d3b372 bump migration 2018-11-27 16:12:40 -05:00
mabashian
05f4d94db2 Fixed serveral bugs including credential prompting. Added logic to bring links/nodes to the forefront when you hover over them in case there's some overlap 2018-11-27 16:12:40 -05:00
mabashian
61fb3eb390 First pass at implementing better node placement in the workflow graph 2018-11-27 16:12:40 -05:00
mabashian
7b95d2114d Implements workflow convergence without proper layout 2018-11-27 16:12:40 -05:00
chris meyers
07db7a41b3 more flake8 2018-11-27 16:12:40 -05:00
chris meyers
1120f8b1e1 try2 at the devil flake8 2018-11-27 16:12:40 -05:00
chris meyers
17b3996568 fix flake8 anyway I can 2018-11-27 16:12:40 -05:00
chris meyers
584b3f4e3d remove workflow test
* We now handle workflows with jobs that have errored. We treat them the
same as a failure result. Before, we would abort the workflow when we
encountered an error.
2018-11-27 16:12:40 -05:00
chris meyers
f8c53f4933 handle job error state in convergence 2018-11-27 16:12:40 -05:00
chris meyers
6e40e9c856 handle edge case ring cycle 2018-11-27 16:12:40 -05:00
chris meyers
2f9dc4d075 remove relationship in view if cycle detected 2018-11-27 16:12:40 -05:00
chris meyers
9afc38b714 fixup migrations 2018-11-27 16:12:40 -05:00
chris meyers
dfccc9e07d rework wf cycle detection for convergence 2018-11-27 16:12:40 -05:00
chris meyers
7b22d1b874 cycle detection when multiple parents 2018-11-27 16:12:40 -05:00
mabashian
29b4979736 Completed work necessary to support editing workflow links and nodes separately. Added hover and tooltip to links 2018-11-27 16:12:40 -05:00
mabashian
87d6253176 Decouple editing a wf node with editing a node link 2018-11-27 16:12:40 -05:00
chris meyers
1e10d4323f update docs 2018-11-27 16:12:40 -05:00
chris meyers
4111e53113 correctly name migration to align with 3.4.0 2018-11-27 16:12:40 -05:00
chris meyers
02df0c29e9 merge artifacts deterministically 2018-11-27 16:12:40 -05:00
chris meyers
475c90fd00 prevent job launching twice 2018-11-27 16:12:40 -05:00
chris meyers
2742b00a65 flake8 2018-11-27 16:12:40 -05:00
chris meyers
ea29e66a41 fix workflow finish state detector
* Take into account the new do_not_run field when finding if a workflow
is finished. If do_not_run is True then the node is considered finished.
2018-11-27 16:12:40 -05:00
chris meyers
6ef6b649e8 cleaner code 2018-11-27 16:12:40 -05:00
chris meyers
9bf2a49e0f save state 2018-11-27 16:12:40 -05:00
chris meyers
914892c3ac all parents should finish before start child 2018-11-27 16:12:40 -05:00
chris meyers
77661c6032 short circuit performance optimization 2018-11-27 16:12:40 -05:00
chris meyers
b4fc585495 stop DNR propogation on always path
* This makes sure DNR propogation stops when a job is successful, down
an always path
2018-11-27 16:12:40 -05:00
chris meyers
ff6db37a95 correct stop DNR propogation
* If a child has a parent that is not in the finished state then do not
propogate the DNR to the child in question.
* If a parent is in a finished state; do not propogate the DNR to the
child if the path to the child is traversed (based on the parent job
status).
2018-11-27 16:12:40 -05:00
chris meyers
1a064bdc59 satisfy flake8 2018-11-27 16:12:40 -05:00
chris meyers
ebabec0dad always find and mark dnr nodes 2018-11-27 16:12:40 -05:00
chris meyers
3506b9a7d8 Revert "mark dnr field read only"
This reverts commit 3dbc52d91223167683fd01174222bd6c22813dbd.

Workflow Job Nodes are read only already
2018-11-27 16:12:40 -05:00
chris meyers
cc374ca705 update debug dot graph to output dnr data 2018-11-27 16:12:40 -05:00
chris meyers
ad56a27cc0 mark dnr field read only 2018-11-27 16:12:40 -05:00
chris meyers
779e1a34db remove dnr field from jt wf node 2018-11-27 16:12:40 -05:00
chris meyers
447dfbb64d only visit nodes once for dnr 2018-11-27 16:12:40 -05:00
chris meyers
a9365a3967 code cleanup 2018-11-27 16:12:40 -05:00
chris meyers
f5c10f99b0 support workflow convergence nodes
* remove convergence restriction in API
* change task manager logic to be aware of and support convergence nodes
2018-11-27 16:12:40 -05:00
softwarefactory-project-zuul[bot]
c53ccc8d4a Merge pull request #2813 from shanemcd/update-translation-templates
Extract latest strings from source code for translations

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-27 17:53:49 +00:00
chris meyers
e214dcac85 add slowdown, final status delay, and debug
* slowdown by using --speed 0.1 <-- decimal
* optionally specify a delay between the event and the final status
* debug mode where you can step through emitting the job events
2018-11-27 12:45:49 -05:00
softwarefactory-project-zuul[bot]
de77f6bd1f Merge pull request #2809 from jlmitch5/fixManagmentJobScheduleEditLink
fix management job schedule edit link button

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-27 17:33:07 +00:00
Shane McDonald
18c4771a38 Extract latest strings from source code for translations 2018-11-27 12:31:52 -05:00
chris meyers
042c7ffe5b emit job status lifecycle in event replayer 2018-11-27 11:54:39 -05:00
John Mitchell
f25c6effa3 fix management job schedule edit link button 2018-11-27 11:35:13 -05:00
softwarefactory-project-zuul[bot]
46d303ceee Merge pull request #2805 from ryanpetrello/wcag
raise contrast on a few key page elements to pass WCAG contrast checks

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-27 15:45:15 +00:00
Ryan Petrello
b1bd87bcd2 raise contrast on a few key page elements to pass WCAG contrast checks 2018-11-27 10:20:24 -05:00
softwarefactory-project-zuul[bot]
50b0a5a54d Merge pull request #2756 from wenottingham/logged-out-damn-spot
Add a message to the resulting login dialog when a user explicitly logs out.

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2018-11-27 15:13:45 +00:00
Ryan Petrello
d5c6c589b2 add an AWX_ISOLATED_VERBOSITY setting for debugging isolated connections 2018-11-26 23:47:16 -05:00
Ryan Petrello
fc0a039097 collect isolated capacity using a cache plugin, not stdout parsing
reading capacity values using the jsonfile cache plugin is more robust
in scenarios where ansible-playbook may print non-JSON output (such as
-vvv or when a custom callback plugin like timer is enabled)
2018-11-26 17:08:42 -05:00
Jake McDermott
4f731017ea don't conditionally hide workflow viz templates list button 2018-11-26 16:21:44 -05:00
softwarefactory-project-zuul[bot]
9eb2c02e92 Merge pull request #2788 from AlanCoding/container_names
Set fixed container names

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-26 18:53:41 +00:00
softwarefactory-project-zuul[bot]
55e5432027 Merge pull request #2794 from shanemcd/devel
Add a note about `—force-with-lease` to contributing documentation.

Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
             https://github.com/marshmalien
2018-11-26 16:55:31 +00:00
Shane McDonald
a9ae4dc5a8 Clean up after yourselves, people! 2018-11-26 11:31:58 -05:00
Shane McDonald
0398b744a1 Add a note about —force-with-lease to contributing documentation. 2018-11-26 11:31:36 -05:00
AlanCoding
012511e4f0 prohibit relaunching sliced jobs with changed count 2018-11-26 10:54:19 -05:00
softwarefactory-project-zuul[bot]
4483d0320f Merge pull request #2791 from ryanpetrello/fix-iso-installs
only override django for FIPS in environments where Django is installed

Reviewed-by: Yanis Guenane
             https://github.com/Spredzy
2018-11-26 15:36:23 +00:00
Ryan Petrello
32e7ddd43a only override django for FIPS in environments where Django is installed
isolated awx installs don't have this tooling, and so they don't need
this specific monkey-patch
2018-11-26 09:17:48 -05:00
AlanCoding
0b32733dc8 set fixed container names 2018-11-26 08:26:57 -05:00
Christian Adams
d310c48988 Merge pull request #2758 from rooftopcellist/secure_current_user
make current_user ck secure and httponly
2018-11-21 15:26:35 -05:00
softwarefactory-project-zuul[bot]
5a6eefaf2c Merge pull request #2780 from kialam/update-readme-install-exact
Update README to include saving exact dependencies using npm.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-21 19:12:50 +00:00
kialam
8c5a94fa64 Update readme to include saving exact dependencies using npm. 2018-11-21 13:35:56 -05:00
adamscmRH
05d988349c make current_user ck secure and httponly 2018-11-21 10:36:35 -05:00
softwarefactory-project-zuul[bot]
bb1473f67f Merge pull request #2762 from kialam/fix-2554-converted-jts-from-sjt
UI WF results relaunch: handle any relaunch errors.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-21 15:01:17 +00:00
softwarefactory-project-zuul[bot]
79f483a66d Merge pull request #2772 from ansible/jakemcdermott-update
add package uninstall example to readme

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-21 03:11:45 +00:00
Jake McDermott
1b09a0230d Update README.md 2018-11-20 21:26:11 -05:00
kialam
f3344e9816 Fix failing tests. 2018-11-20 18:35:29 -05:00
softwarefactory-project-zuul[bot]
554e4d45aa Merge pull request #2763 from kialam/add-npm-precheck-script
Add precheck script.

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2018-11-20 21:12:58 +00:00
softwarefactory-project-zuul[bot]
bfe86cbc95 Merge pull request #2753 from jlmitch5/fixInstanceGroupLookup
fix instance group lookup in orgs scrolling behavior

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 20:05:14 +00:00
softwarefactory-project-zuul[bot]
29e4160d3e Merge pull request #2764 from ryanpetrello/dispatcher-sos
add dispatcher status to the sosreport

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2018-11-20 18:06:05 +00:00
Ryan Petrello
b4f906ceb1 add dispatcher status to the sosreport 2018-11-20 12:12:02 -05:00
kialam
e099fc58c7 Add precheck script. 2018-11-20 11:48:25 -05:00
softwarefactory-project-zuul[bot]
e342ef5cfa Merge pull request #2719 from AlanCoding/project_is_failed
Fail job run if project is failed

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 16:45:56 +00:00
John Mitchell
8997fca457 add sanitize 2018-11-20 11:41:58 -05:00
kialam
435ab4ad67 Handle any relaunch errors. 2018-11-20 11:25:36 -05:00
softwarefactory-project-zuul[bot]
d7a28dcea4 Merge pull request #2755 from kialam/fix-invalid-start-date
Scheduler: Start Date begins 1 day ahead.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 15:36:47 +00:00
softwarefactory-project-zuul[bot]
5f3024d395 Merge pull request #2703 from kialam/fix-2552-org-jt-list-websocket
Fix Organizations TemplateList websockets

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 15:01:05 +00:00
softwarefactory-project-zuul[bot]
3126480d1e Merge pull request #2754 from kdelee/rename-schema-change-detector
Rename schema job to be more clear about its purpose

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 14:22:08 +00:00
Elijah DeLee
ca84d312ce Rename schema job to be more clear about its purpose
The make target fails when it detects schema changes, not when schema is invalid.

Also update CONTRIBUTING.md to include information about zuul jobs.
2018-11-20 07:42:10 -06:00
AlanCoding
b790b50a1a Fail job run if project is failed
provide message in traceback and explanation fields

add log messages for dependency spawns
2018-11-20 07:55:37 -05:00
softwarefactory-project-zuul[bot]
6df26eb7a3 Merge pull request #2750 from ryanpetrello/timeout-modal-remove-close-button
remove the x icon on the session timeout modal (it doesn't work)

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 08:50:49 +00:00
softwarefactory-project-zuul[bot]
fccaebdc8e Merge pull request #2342 from ansible/workflow_inventory
Workflow level inventory

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-20 03:19:40 +00:00
Jake McDermott
45728dc1bb update workflow docs 2018-11-19 17:35:52 -05:00
AlanCoding
9cd8aa1667 further update of workflow docs for inventory feature 2018-11-19 17:35:39 -05:00
Jake McDermott
b74597f4dd fix bug when reverting non-default inventory prompts 2018-11-19 17:35:26 -05:00
Bill Nottingham
ce3d3c3490 Add a message to the resulting login dialog when a user explicitly logs out. 2018-11-19 17:16:55 -05:00
kialam
a9fe1ad9c1 Start Date begins 1 day ahead. 2018-11-19 16:20:46 -05:00
John Mitchell
22e7083d71 fix instance group lookup 2018-11-19 15:38:11 -05:00
Jake McDermott
951515da2f disable next and show warning when default workflow inventory is removed 2018-11-19 15:16:46 -05:00
Ryan Petrello
9e2f4cff08 remove the x icon on the session timeout modal (it doesn't work) 2018-11-19 14:37:49 -05:00
softwarefactory-project-zuul[bot]
0c1a4439ba Merge pull request #2745 from mabashian/2428-workflow-edit-patch
Use patch instead of put when updating a wfjt

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 19:23:26 +00:00
John Mitchell
c2a1603a56 Merge pull request #2746 from jlmitch5/navColorContrast
fix color contrast of nav
2018-11-19 13:50:04 -05:00
Jake McDermott
13e715aeb9 handle null inventory value on workflow launch 2018-11-19 12:53:21 -05:00
Jake McDermott
2bc75270e7 dry up org permissions test 2018-11-19 12:53:18 -05:00
Jake McDermott
fabe56088d fix workflow e2e tests again 2018-11-19 12:53:14 -05:00
Jake McDermott
0e3bf6db09 open workflow visualizer from form 2018-11-19 12:53:10 -05:00
Jake McDermott
c6a7d0859d add workflow jobs to inventory list status popup 2018-11-19 12:53:05 -05:00
Jake McDermott
fed00a18ad show workflow jobs on inventory completed jobs view 2018-11-19 12:53:02 -05:00
Jake McDermott
ecbdc55955 show related workflow counts on inventory deletion warning prompt 2018-11-19 12:52:57 -05:00
AlanCoding
bca9bcf6dd fix prompts contradiction: should be non-functional change 2018-11-19 12:52:54 -05:00
Jake McDermott
018a8e12de fix lookup message 2018-11-19 12:52:50 -05:00
AlanCoding
e0a28e32eb Tweak of error message wording for model-specific name 2018-11-19 12:52:47 -05:00
AlanCoding
c105885c7b Do not count template variables as prompted 2018-11-19 12:52:43 -05:00
Jake McDermott
89a0be64af fix bug with opening visualizer from list page 2018-11-19 12:52:38 -05:00
AlanCoding
c1d85f568c fix survey vars bug and inventory defaults display 2018-11-19 12:52:35 -05:00
Jake McDermott
75566bad39 fix workflow e2e tests 2018-11-19 12:52:32 -05:00
Jake McDermott
75c2d1eda1 add inventory help messages for workflow node edit 2018-11-19 12:52:29 -05:00
Jake McDermott
9a4667c6c7 add static messages to workflow inventory lookups 2018-11-19 12:52:26 -05:00
Jake McDermott
9917841585 open and close workflow visualizer from list 2018-11-19 12:52:23 -05:00
Jake McDermott
fbc3cd3758 redirect to workflow visualizer on workflow creation 2018-11-19 12:52:19 -05:00
Jake McDermott
d65687f14a add workflow inventory prompt to scheduler 2018-11-19 12:52:16 -05:00
Jake McDermott
4ea7511ae8 make workflow prompt inventory step optional 2018-11-19 12:52:12 -05:00
Jake McDermott
a8d22b9459 show correct ask_inventory state 2018-11-19 12:52:08 -05:00
Jake McDermott
f8453ffe68 accept inventory_id in workflow launch requests 2018-11-19 12:52:05 -05:00
Jake McDermott
38f43c147a fix exploding unit test 2018-11-19 12:52:01 -05:00
Jake McDermott
38fbcf8ee6 add missing api fields 2018-11-19 12:51:58 -05:00
Jake McDermott
2bd25b1fba add inventory prompt to wf editor 2018-11-19 12:51:54 -05:00
AlanCoding
7178fb83b0 migration number bumped again 2018-11-19 12:51:51 -05:00
Jake McDermott
2376013d49 add prompt on launch for workflow inventory 2018-11-19 12:51:47 -05:00
Jake McDermott
a94042def5 display inventory on workflow job details 2018-11-19 12:51:44 -05:00
Jake McDermott
2d2164a4ba add inventory lookup to workflow detail view 2018-11-19 12:51:41 -05:00
AlanCoding
3c980d373c bump migration number 2018-11-19 12:51:37 -05:00
AlanCoding
5b3ce1e999 add test for WFJT schedule inventory prompting 2018-11-19 12:51:33 -05:00
AlanCoding
6d4469ebbd handle inventory for WFJT editing RBAC 2018-11-19 12:51:29 -05:00
AlanCoding
eb58a6cc0e add test for launching with deleted inventory 2018-11-19 12:51:26 -05:00
AlanCoding
a60401abb9 fix bug with WFJT launch validation 2018-11-19 12:51:22 -05:00
AlanCoding
1203c8c0ee feature docs for workflow-level inventory 2018-11-19 12:51:18 -05:00
AlanCoding
0c52d17951 fix bug, handle RBAC, add test 2018-11-19 12:51:13 -05:00
AlanCoding
44fa3b18a9 Adjust prompt logic and views to accept workflow inventory 2018-11-19 12:50:57 -05:00
AlanCoding
33328c4ad7 initial model changes for workflow inventory 2018-11-19 12:50:29 -05:00
John Mitchell
11adcb9800 fix color contrast of nav 2018-11-19 12:35:55 -05:00
softwarefactory-project-zuul[bot]
932a1c6386 Merge pull request #2743 from ryanpetrello/survey_spec_stream
include survey_spec in activity stream

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 17:33:33 +00:00
softwarefactory-project-zuul[bot]
d1791fc48c Merge pull request #2585 from wenottingham/licensed-to-illegibility
Add a test that checks the included license files against included dependencies

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 17:22:49 +00:00
AlanCoding
5b274cfc2a include survey_spec in activity stream 2018-11-19 12:07:48 -05:00
mabashian
1d7d2820fd Use patch instead of put when updating a wfjt 2018-11-19 12:04:35 -05:00
Bill Nottingham
605c1355a8 Add updates to UI license grabber from jlmitch5. 2018-11-19 12:00:00 -05:00
Bill Nottingham
a6e00df041 Clean up included licenses such that tests pass.
Rename ui licenses to '.txt' for consistency.
Update bundled code as appropriate.
Remove dead licenses and dev-only UI licenses.
Add additional python licenses from Azure & related updates.
2018-11-19 12:00:00 -05:00
Bill Nottingham
67219e743f Add a test that we are including proper license files for all requirements. 2018-11-19 11:59:59 -05:00
softwarefactory-project-zuul[bot]
67273ff8c3 Merge pull request #2742 from jlmitch5/fixScrollTop
fix scroll top

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 16:56:27 +00:00
softwarefactory-project-zuul[bot]
a3bbe308a8 Merge pull request #2741 from matburt/fix_project_admin_add
Fix a bug that did not allow project_admin's to create a project.

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-19 16:53:16 +00:00
kialam
f1b5bbb1f6 Add websocket listener to Org > JT list view. 2018-11-19 11:46:07 -05:00
Matthew Jones
7330102961 Remove a warning message for dispatcher pool for tests 2018-11-19 11:19:57 -05:00
Matthew Jones
61916b86b5 Fix a bug that did not allow project_admin's to create a project.
This was a regression from previous functionality
2018-11-19 11:05:48 -05:00
John Mitchell
35d5bde690 fix scroll top 2018-11-19 11:03:03 -05:00
softwarefactory-project-zuul[bot]
b17c477af7 Merge pull request #2737 from AlanCoding/death_to_groups
Implement deprecation of groups_with_active_failures

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 15:31:26 +00:00
softwarefactory-project-zuul[bot]
01d891cd6e Merge pull request #2738 from ryanpetrello/inv-update-as
don't send activity stream create for unregistered models

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 15:02:33 +00:00
Ryan Petrello
e36335f68c only send activity stream create for registered unified jobs
see https://github.com/ansible/awx/issues/2733
2018-11-19 09:44:12 -05:00
softwarefactory-project-zuul[bot]
39369c7721 Merge pull request #2702 from kdelee/schema_validation
Pre-Merge Schema validation

Reviewed-by: Matthew Jones <mat@matburt.net>
             https://github.com/matburt
2018-11-19 14:26:42 +00:00
softwarefactory-project-zuul[bot]
4fbc39991d Merge pull request #2730 from AlanCoding/slice_license
License check for slicing >1

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 14:18:10 +00:00
softwarefactory-project-zuul[bot]
91075e8332 Merge pull request #2732 from AlanCoding/middle
Include migration middleware in timings and profiling

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-19 13:59:34 +00:00
AlanCoding
0ed50b380a Implement deprecation of groups_with_active_failures 2018-11-19 08:29:46 -05:00
AlanCoding
53716a4c5a include migration middleware in timings and profiling 2018-11-18 10:55:37 -05:00
AlanCoding
f30bbad07d License check for slicing >1 2018-11-17 22:48:46 -05:00
softwarefactory-project-zuul[bot]
b923efad37 Merge pull request #2717 from wenottingham/make-that-network-work
Add ncclient for use by networking modules.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-16 22:02:29 +00:00
softwarefactory-project-zuul[bot]
3b36372880 Merge pull request #2716 from ryanpetrello/insights-user-agent
add a user agent for requests to Insights

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-16 21:39:15 +00:00
Ryan Petrello
661cc896a9 add a user agent for requests to Insights 2018-11-16 16:25:08 -05:00
Bill Nottingham
e9c3623dfd specify a version 2018-11-16 15:34:42 -05:00
Bill Nottingham
c65b362841 Add ncclient for use by networking modules. 2018-11-16 15:21:04 -05:00
softwarefactory-project-zuul[bot]
6a0e11a233 Merge pull request #2713 from AlanCoding/system_env_vars
Minor cleanup of task environment vars

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-16 19:35:05 +00:00
AlanCoding
7417f9925f Minor cleanup of task environment vars 2018-11-16 13:28:42 -05:00
softwarefactory-project-zuul[bot]
2f669685d8 Merge pull request #2707 from ryanpetrello/min-max-workers
prevent the dispatcher from using a nonsensical max_workers value

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-16 15:41:42 +00:00
softwarefactory-project-zuul[bot]
86510029e1 Merge pull request #2692 from kialam/fix-2586-ldap-dropdown-fix
Fix LDAP and TACACS+ dropdowns

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-16 15:28:09 +00:00
Ryan Petrello
37234ca66e prevent the dispatcher from using a nonsensical max_workers value 2018-11-16 10:16:39 -05:00
Elijah DeLee
4ae1fdef05 Ignore differences in whitespace for schema validation 2018-11-16 09:47:33 -05:00
kialam
95e94a8ab5 Some styling changes; fix Server dropdown.
- Left align first dropdown on Github and LDAP tabs.
- Add border to give some whitespace
2018-11-15 20:46:34 -05:00
kialam
ea35d9713a Fix empty dropdowns for both LDAP and TACACS tabs. 2018-11-15 20:46:34 -05:00
Elijah DeLee
949cf53b89 Use r in front of regex string to make flake8 happy
This means we should not escape the \ character in the same way
2018-11-15 17:29:27 -05:00
Elijah DeLee
a68e22b114 Add tox target to detect schema changes
Fetches reference schema from public bucket
Still need define method for updating reference schema on merge.
2018-11-15 16:25:13 -05:00
Elijah DeLee
d70cd113e1 Reduce duplicated logic for genschema target 2018-11-15 15:29:35 -05:00
Matthew Jones
f737fc066f Generate schema suitable for comparing for schema changes 2018-11-15 15:29:35 -05:00
softwarefactory-project-zuul[bot]
9b992c971e Merge pull request #2672 from AlanCoding/sliceanator
Fix bug with non-sliced JT job spawn

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-15 20:16:19 +00:00
softwarefactory-project-zuul[bot]
e0d59766e0 Merge pull request #2696 from AlanCoding/bulk_del_inv
Pre-delete bulk delete related, fix parallel request conflicts

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-15 19:58:49 +00:00
AlanCoding
a9d88f728d Pre-delete bulk delete related, fix parallel request conflicts 2018-11-15 11:39:48 -05:00
softwarefactory-project-zuul[bot]
e24d63ea9a Merge pull request #2665 from ryanpetrello/fips
add support for running awx w/ FIPS enabled

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-15 15:18:07 +00:00
softwarefactory-project-zuul[bot]
1833a5b78b Merge pull request #2667 from saito-hideki/issue/admin_with_docker-compose
Fixed issue where admin_user and password change are not reflected

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-15 14:24:43 +00:00
softwarefactory-project-zuul[bot]
4213a00548 Merge pull request #2686 from AlanCoding/fast_workflows
Add task manager rescheduling hooks, de-duplication, lifecycle tests

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-15 14:19:09 +00:00
softwarefactory-project-zuul[bot]
7345512785 Merge pull request #2690 from ryanpetrello/ldap-long-name
truncate user first/last name if it exceeds 30 chars on LDAP auth

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-14 22:29:43 +00:00
Ryan Petrello
d3dc126d45 truncate user first/last name if it exceeds 30 chars on LDAP auth 2018-11-14 15:51:43 -05:00
AlanCoding
758a488aee Add task manager rescheduling hooks, de-duplication, lifecycle tests 2018-11-14 11:31:34 -05:00
softwarefactory-project-zuul[bot]
c0c358b640 Merge pull request #2682 from ryanpetrello/job-m2m-activity-stream
include M2M labels and credentials in Job creation activity stream

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-14 16:05:30 +00:00
Ryan Petrello
49f4ed10ca include M2M labels and credentials in Job creation activity stream 2018-11-14 10:36:01 -05:00
softwarefactory-project-zuul[bot]
5e18eccd19 Merge pull request #2671 from wenottingham/you-want-to-change-things---well---you-can't
Fix tooltip referring to PROJECTS_ROOT.

Reviewed-by: Bill Nottingham
             https://github.com/wenottingham
2018-11-13 21:01:19 +00:00
softwarefactory-project-zuul[bot]
c4e9daca4e Merge pull request #2669 from paradegoat/issue-2370
Updated JT project-related error message

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-13 20:22:31 +00:00
AlanCoding
5443e10697 Fix bug with non-sliced JT job spawn 2018-11-13 15:20:40 -05:00
Ryan Petrello
a3f9c0b012 warn about FIPS mode if the Django version changes 2018-11-13 15:04:36 -05:00
Geoff Humphreys
8517053934 Updated JT project-related error message
Signed-off-by: Geoff Humphreys <humphreys.geoff@gmail.com>
2018-11-13 14:56:22 -05:00
Bill Nottingham
0506968d4f Fix tooltip referring to PROJECTS_ROOT.
This can't be changed in AWX settings; it needs to be done in settings.py
either on the filesystem, or overridden in a k8s/openshift configmap.
2018-11-13 12:14:24 -05:00
softwarefactory-project-zuul[bot]
3bb91b20d0 Merge pull request #2663 from AlanCoding/unified_jobs_flake
Get rid of star import in unified_jobs.py

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-13 15:37:04 +00:00
softwarefactory-project-zuul[bot]
268b1ff436 Merge pull request #2662 from wwitzel3/devel
move root views new file

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-13 15:33:23 +00:00
Hideki Saito
f16a72081a Fixed issue where admin_user and password change are not reflected
- No effect of changing admin_user and admin_password when using docker-compose #2666
2018-11-13 18:21:18 +09:00
Ryan Petrello
cceac8d907 support PKCS8-formatted keys to enable FIPS compliance
see: https://access.redhat.com/solutions/1519083
2018-11-12 16:21:57 -05:00
adamscmRH
8d012de3e2 monkey-patch _digest for fips 2018-11-12 15:32:23 -05:00
AlanCoding
cee7ac9511 get rid of star import in unified_jobs.py 2018-11-12 13:38:58 -05:00
softwarefactory-project-zuul[bot]
36faaf4720 Merge pull request #2656 from iplaman/fix-postgres96
Fix default Postgresql version to 9.6

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-12 18:34:48 +00:00
Wayne Witzel III
33b8e7624b move root views new file 2018-11-12 12:36:16 -05:00
Idan Bidani
a213e01491 updating default Postgresql version to 9.6 2018-11-10 18:27:22 -05:00
softwarefactory-project-zuul[bot]
a00ed8e297 Merge pull request #2646 from jlmitch5/fixCredentialKindTranslation
Fix credential kind translation

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-10 03:06:38 +00:00
softwarefactory-project-zuul[bot]
aeaebcd81a Merge pull request #2572 from AlanCoding/coalesce
Coalesce host and group Activity Stream deletion entries

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-09 21:04:07 +00:00
softwarefactory-project-zuul[bot]
b5849f3712 Merge pull request #2639 from ansible/enhancement-inv_summary
Update UJT with inv summary field and update schedule base route to include object to be scheduled

Reviewed-by: Chris Meyers
             https://github.com/chrismeyersfsu
2018-11-09 19:06:36 +00:00
AlanCoding
658f87953e coalesce data without setting 2018-11-09 14:00:45 -05:00
AlanCoding
5562e636ea Coalesce host and group A.S. deletion entries 2018-11-09 13:58:31 -05:00
John Mitchell
80fcdae50b update credential type usage to kind instead of name 2018-11-09 10:36:09 -05:00
softwarefactory-project-zuul[bot]
2c5f209996 Merge pull request #2631 from kialam/fix/2533-dashboard-hover
Fix Dashboard hover-over action so it shows the correct info

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-09 05:27:11 +00:00
softwarefactory-project-zuul[bot]
692b55311e Merge pull request #2645 from ryanpetrello/unbound
fix an unbound variable

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-08 20:40:57 +00:00
Ryan Petrello
10667fc855 fix an unbound variable
see: https://github.com/ansible/awx/issues/2642j
2018-11-08 15:14:47 -05:00
softwarefactory-project-zuul[bot]
1fc33b551d Merge pull request #2643 from kialam/fix/2606
Fix DETAILS link in WF viz not working until after job has ran

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-08 20:14:45 +00:00
kialam
729256c3d1 Fix DETAILS link in WF viz not working until after job has ran
- Make additional GET request if we need it in order to surface the job type so that we can properly redirect the user to the detail page.
2018-11-08 13:23:32 -05:00
chris meyers
23e1feba96 fill in summary inv for sched only when needed
* If scheduler inv exists then the inv summary will be filled in with
our generic summary filler inner. Else, if the related unified job has
an inventory, fill in the inv summary with that, explicitly.
2018-11-08 12:43:47 -05:00
John Mitchell
e3614c3012 update to using new inventory id from summary fields of UJT if applicable 2018-11-08 12:22:02 -05:00
chris meyers
f37391397e add inventory to schedule summary fields
* Use the same logic that related inventory uses. If there is an
inventory that overrides the inventory on the unified job  template then
summarize that field. Else, use the inventory on the unified job template
being scheduled.
2018-11-08 11:47:31 -05:00
softwarefactory-project-zuul[bot]
6a8454f748 Merge pull request #2352 from ansible/workflows_squared
[Feature] Allow use of workflows inside of workflows

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-08 16:28:37 +00:00
softwarefactory-project-zuul[bot]
d1328c7625 Merge pull request #2044 from cdvv7788/AWX-2030
Add command to revoke tokens (https://github.com/ansible/awx/issues/2030)

Reviewed-by: Cristian Vargas
             https://github.com/cdvv7788
2018-11-08 15:15:44 +00:00
John Mitchell
d1cce109fb update schedule base route to include resource being scheduled 2018-11-08 09:41:06 -05:00
kialam
32bd8b6473 Fix Dashboard hover-over action so it shows the correct info.
- Refactor our Dashboard directive to display the dashboard graph's x-axis according to the new changes in NVD3 v1.8.1. See https://github.com/nvd3-community/nvd3/blob/gh-pages/examples/lineChart.html for reference.
2018-11-08 09:15:54 -05:00
Ryan Petrello
001bd4ca59 resolve a few token revocation issues, and add tests 2018-11-08 08:15:24 -05:00
softwarefactory-project-zuul[bot]
541b503e06 Merge pull request #2634 from wwitzel3/views-inventory
inventory views

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-08 12:31:14 +00:00
Cristian Vargas
093c29e315 Add command to revoke tokens
Signed-off-by: Cristian Vargas <cristian@swapps.co>
2018-11-08 07:28:21 -05:00
softwarefactory-project-zuul[bot]
eec7d7199b Merge pull request #2614 from stokkie90/devel
Fixed bug where all group variables are not included

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-08 12:27:30 +00:00
Rick Stokkingreef
7dbb862673 Fixed test cases 2018-11-08 12:07:07 +01:00
softwarefactory-project-zuul[bot]
be1422d021 Merge pull request #2629 from ansible/org-view-ui-tests
Org view ui tests

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-08 06:32:59 +00:00
Wayne Witzel III
459ac0e5d9 inventory views 2018-11-07 22:06:33 -05:00
Wayne Witzel III
16c9d043c0 Merge pull request #2344 from wwitzel3/views-organization
organization views
2018-11-07 21:33:14 -05:00
Wayne Witzel III
1b465c4ed9 remove duplicate BaseUsersList 2018-11-07 18:18:41 -05:00
Wayne Witzel III
198a0db808 move organization views to their own file 2018-11-07 18:18:41 -05:00
softwarefactory-project-zuul[bot]
91dda0a164 Merge pull request #2625 from abedwardsw/feature/vmware_groupby_custom_field_excludes
update to latest vmware_inventory.py support for groupby_custom_field_excludes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-07 21:03:05 +00:00
softwarefactory-project-zuul[bot]
9341480209 Merge pull request #2627 from jakemcdermott/fix-form-cred-lookups
fix project and adhoc command form lookups when many credential types exist

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-07 20:43:36 +00:00
Adam Edwards
21877b3378 update to latest vmware_inventory.py with support for groupby_custom_field_excludes
e364d717cb/contrib/inventory/vmware_inventory.py

Signed-off-by: Adam Edwards <adam@middleware360.com>
2018-11-07 15:43:15 -05:00
softwarefactory-project-zuul[bot]
03169a96ef Merge pull request #2626 from jakemcdermott/fix-multicred
always recompile multicredential lists

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-07 20:27:20 +00:00
Marliana Lara
ebc3dbe7b6 Add source WF label to job details template
* Change label from "Parent WF" to "Source WF"
* Fix WF job result Firefox responsive style bugs
2018-11-07 13:22:41 -05:00
AlanCoding
1bed5d4af2 avoid nested on_commit use 2018-11-07 13:22:41 -05:00
AlanCoding
0783d86c6c adjust recursion error text 2018-11-07 13:22:41 -05:00
Marliana Lara
a3d5705cea Fix bug with workflow maker templates pagination and smart search 2018-11-07 13:22:40 -05:00
Marliana Lara
2ae8583a86 Fix Firefox labels bug 2018-11-07 13:22:40 -05:00
Marliana Lara
edda4bb265 Address PR review 2018-11-07 13:22:40 -05:00
AlanCoding
d068481aec link workflow job node based on job type, not UJT type 2018-11-07 13:22:40 -05:00
Marliana Lara
e20d8c8e81 Show workflow badge
Add Workflow tags

Hookup workflow details link

Add parent workflow and job explanation fields

Add workflow key icon to WF maker and WF results

Hookup wf prompting

Add wf key dropdown and hide wf info badge
2018-11-07 13:22:39 -05:00
Marliana Lara
f6cc351f7f Format workflow-chart directive code 2018-11-07 13:22:39 -05:00
Marliana Lara
c2d4887043 Include workflow jobs in workflow maker job templates list 2018-11-07 13:22:39 -05:00
AlanCoding
4428dbf1ff Allow use of role_level filter in UJT list 2018-11-07 13:22:39 -05:00
AlanCoding
e225489f43 workflows-in-workflows add docs and tests 2018-11-07 13:22:39 -05:00
AlanCoding
5169fe3484 safeguard against infinite loop if jobs have cycles 2018-11-07 13:22:38 -05:00
AlanCoding
01d1470544 workflow variables processing, recursion detection 2018-11-07 13:22:38 -05:00
AlanCoding
faa6ee47c5 allow use of workflows in workflows 2018-11-07 13:22:38 -05:00
softwarefactory-project-zuul[bot]
aa1d71148c Merge pull request #2583 from AlanCoding/superusers_manage
Do not block superusers with MANAGE_ORGANIZATION_AUTH setting

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-07 17:38:04 +00:00
Daniel Sami
e86ded6c68 removed namespace from user fixture 2018-11-07 09:02:00 -05:00
Daniel Sami
365bf4eb53 UI tests for org permission views 2018-11-07 09:01:23 -05:00
Jake McDermott
ceb9bfe486 fix adhoc command cred lookup when many credential types exist 2018-11-06 22:47:07 -05:00
Jake McDermott
0f85c867a0 fix project cred lookups when many credential types exist 2018-11-06 22:46:50 -05:00
Jake McDermott
f8a8186bd1 always recompile multicred lists 2018-11-06 20:58:08 -05:00
softwarefactory-project-zuul[bot]
33dfb6bf76 Merge pull request #2623 from ryanpetrello/this-is-the-end
properly validate cert data that happens to contain an END substring

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 21:14:26 +00:00
Ryan Petrello
28cd762dd7 properly validate cert data that happens to contain an END substring 2018-11-06 15:57:35 -05:00
softwarefactory-project-zuul[bot]
217cca47f5 Merge pull request #2620 from ansible/chrismeyersfsu-patch-1
Update saml.md

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 20:16:20 +00:00
softwarefactory-project-zuul[bot]
8faa5d8b7a Merge pull request #2591 from AlanCoding/no_more_ask
Implement deprecation of duplicated ask_ fields in job view

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 20:13:30 +00:00
softwarefactory-project-zuul[bot]
2c6711e183 Merge pull request #2618 from ryanpetrello/json-activity-stream-changes
send activity stream changes as raw JSON, not a JSON-ified string

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 19:45:19 +00:00
Chris Meyers
45328b6e6d Update saml.md 2018-11-06 14:45:10 -05:00
Ryan Petrello
1523feee91 send activity stream changes as raw JSON, not a JSON-ified string
see: https://github.com/ansible/awx/issues/2005
2018-11-06 14:28:57 -05:00
softwarefactory-project-zuul[bot]
856dc3645e Merge pull request #2605 from jakemcdermott/fix-2601
remove admin and member roles from organization->team permissions 

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 17:08:43 +00:00
Jake McDermott
5e4dd54112 remove admin and member roles from organization->team role assignment options 2018-11-06 11:52:19 -05:00
softwarefactory-project-zuul[bot]
5860689619 Merge pull request #2596 from jlmitch5/fixPermIssue
fix permission issue with regular user jt admins

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 16:40:58 +00:00
John Mitchell
da7834476b remove inadverdent scope variable that was added 2018-11-06 10:52:16 -05:00
John Mitchell
d5ba981515 remove inadverdent log statement 2018-11-06 10:50:15 -05:00
softwarefactory-project-zuul[bot]
afe07bd874 Merge pull request #2595 from ryanpetrello/fix-gce-json-creds
move from GCE_PEM_FILE_PATH to GCE_CREDENTIALS_FILE_PATH

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 15:09:11 +00:00
Rick Stokkingreef
f916bd7994 Fixed bug when all group vars are not included 2018-11-06 14:26:36 +01:00
softwarefactory-project-zuul[bot]
3fef7acaa8 Merge pull request #2457 from jakemcdermott/output-line-fixup
dont render blank output lines for some event types + adjust line wrapping

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-06 01:54:38 +00:00
Jake McDermott
95190c5509 remove unused constants 2018-11-05 20:13:00 -05:00
Jake McDermott
76e887f46d highlight entire row on hover 2018-11-05 20:12:52 -05:00
Jake McDermott
0c2b1b7747 don't compile html in real time 2018-11-05 20:12:44 -05:00
Jake McDermott
4c74c8c40c delete contents of slide array before reassigning 2018-11-05 20:12:37 -05:00
Jake McDermott
3a929919a3 enable expanded details for dynamic host events 2018-11-05 20:12:29 -05:00
Jake McDermott
c25af96c56 don't render events if stdout is zero-length string 2018-11-05 20:12:21 -05:00
Jake McDermott
f28f1e434d adjust output line wrapping 2018-11-05 20:12:12 -05:00
Jake McDermott
b3c5df193a don't render playbook_on_notify or runner_on_ok events if they have no stdout 2018-11-05 20:11:53 -05:00
John Mitchell
8645602b0a fix permission issue where regular users assigned jt admin could not add user jt roles they couldn't edit 2018-11-05 16:45:35 -05:00
Ryan Petrello
05156a5991 move from GEC_PEM_FILE_PATH to GCE_CREDENTIALS_FILE_PATH 2018-11-05 15:44:31 -05:00
softwarefactory-project-zuul[bot]
049d642df8 Merge pull request #1894 from AlanCoding/rm_sdonu
Remove unused project field

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-05 16:14:56 +00:00
AlanCoding
951ebf146a remove unused project field 2018-11-05 10:40:53 -05:00
AlanCoding
7a67e0f3d6 Implement deprecation of duplicated ask_ fields in job view 2018-11-05 10:38:55 -05:00
softwarefactory-project-zuul[bot]
37def8cf7c Merge pull request #2587 from jakemcdermott/fix-2563
remove admin and member roles from team->organizations role assignment options

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-05 15:13:18 +00:00
Jake McDermott
e4c28fed03 remove admin and member roles from team->organizations role assignment options 2018-11-04 22:59:03 -05:00
softwarefactory-project-zuul[bot]
f8b7259d7f Merge pull request #2543 from westfood/fix-helm-postgresql
Using new Helm parameters for PostgreSQL access.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-02 18:56:15 +00:00
AlanCoding
6ae1e156c8 do not block superusers with MANAGE_ORGANIZATION_AUTH setting 2018-11-02 14:13:05 -04:00
softwarefactory-project-zuul[bot]
9a055dbf78 Merge pull request #2550 from matburt/runner_on_start
Add support for runner_on_start

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2018-11-02 15:10:07 +00:00
Matthew Jones
80ac44565a Make sure we reference the actual hostname 2018-11-02 10:37:58 -04:00
softwarefactory-project-zuul[bot]
a338199198 Merge pull request #2577 from AlanCoding/fix_grandparents
Fix bug where grandparent groups were excluded

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-02 14:36:48 +00:00
AlanCoding
47fc0a759f fix bug where grandparent groups were excluded 2018-11-02 10:10:38 -04:00
softwarefactory-project-zuul[bot]
5eb4b35508 Merge pull request #2547 from AlanCoding/decorator
Get rid of decorator dependency

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-01 20:39:30 +00:00
softwarefactory-project-zuul[bot]
d93eedaedb Merge pull request #2571 from ryanpetrello/devel
Merge remote-tracking branch 'release_3.3.1' into devel

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-01 16:48:46 +00:00
Ryan Petrello
a748a272fb Merge remote-tracking branch 'tower/release_3.3.1' into devel 2018-11-01 12:07:02 -04:00
softwarefactory-project-zuul[bot]
a28f8c43cb Merge pull request #2569 from shanemcd/devel
Bump version to 2.1.0

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-01 15:53:59 +00:00
Shane McDonald
fbec6a60bf Bump version to 2.1.0 2018-11-01 11:37:28 -04:00
softwarefactory-project-zuul[bot]
6a4f3c8758 Merge pull request #2566 from shanemcd/devel
Bump version to 2.0.2

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-11-01 14:12:00 +00:00
Shane McDonald
04625f566b Bump version to 2.0.2 2018-11-01 09:50:02 -04:00
softwarefactory-project-zuul[bot]
895a567ed1 Merge pull request #2558 from ansible/org-view-ui
updated fixtures to use proper organization linking

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-31 18:13:40 +00:00
Daniel Sami
e152b30fc1 linting fixes 2018-10-31 13:55:50 -04:00
softwarefactory-project-zuul[bot]
a1fe60da78 Merge pull request #2174 from matburt/jobtemplate_sharding
Implement Job Template Sharding/Splitting/Slicing

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-31 15:49:51 +00:00
AlanCoding
d8d710a83d get rid of decorator dependency 2018-10-31 11:37:10 -04:00
softwarefactory-project-zuul[bot]
92f0893764 Merge pull request #2555 from ryanpetrello/old-access-cleanup
remove an old, unused migration file

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-31 15:33:37 +00:00
Ryan Petrello
479448ff09 remove an old, unused migration file 2018-10-31 11:15:09 -04:00
Jake McDermott
62a36e3704 update job slice count help text 2018-10-31 11:04:14 -04:00
kialam
2d286c5f68 Redirect to WF Details page after prompt for slice JT. 2018-10-31 11:04:14 -04:00
AlanCoding
f435e577b2 Adjust slicing tooltip text 2018-10-31 11:04:14 -04:00
AlanCoding
236b332a8b bump migration number 2018-10-31 11:04:13 -04:00
kialam
a7028df828 Fix one failing unit test. 2018-10-31 11:04:13 -04:00
kialam
a59017ceef Fix eslint errors. 2018-10-31 11:04:13 -04:00
AlanCoding
affacb8ab5 revert change of including slice wfj ids in recent_jobs list 2018-10-31 11:04:13 -04:00
AlanCoding
37f9024940 fix slicing task_impact and script gen bugs 2018-10-31 11:04:13 -04:00
kialam
f72fca5fcf Fix unit tests after "slice" rename.
- Update Jobs List unit tests with new schema and test cases.
- Update Job Details unit tests with new schema and test cases.
- Test both for expected behavior when handling a regular non-sliced job.
2018-10-31 11:04:13 -04:00
kialam
21aeda0f45 Add unit tests for Job Details
- Test `getSplitJobDetails` method.
- Fix failing tests.
- Rename unit tests.
2018-10-31 11:04:12 -04:00
kialam
65a0e5ed45 Fix failing tests. 2018-10-31 11:04:12 -04:00
kialam
571e34bf79 Begin adding unit tests for split jobs
- Test split job tag method within Jobs List Controller.
2018-10-31 11:04:12 -04:00
AlanCoding
6dc58af8e1 slicing rename test cleanup and bugfix 2018-10-31 11:04:12 -04:00
AlanCoding
bbd3edba47 rename to slicing and schema tweaks 2018-10-31 11:04:12 -04:00
Matthew Jones
46d6dce738 Mass rename of shard -> split 2018-10-31 11:04:12 -04:00
AlanCoding
475a701f78 Allow use of credential password prompting with split JTs
also
*update test to work with new JT callback call pattern
*fix spelling in template
2018-10-31 11:04:11 -04:00
AlanCoding
dccd7f2e9d do not split JT callback jobs 2018-10-31 11:04:11 -04:00
kialam
47711bc007 add package-lock.json to gitignore 2018-10-31 11:04:11 -04:00
kialam
04eec61387 Redirect to WF details page when a Split Job is launched 2018-10-31 11:04:11 -04:00
kialam
ef4a2cbebb Add Job Splitting feature to UI 2018-10-31 11:04:11 -04:00
AlanCoding
c8d76dbe78 update migration after rebase 2018-10-31 11:04:11 -04:00
Matthew Jones
61a706274b Adding architecture doc for job sharding 2018-10-31 11:04:10 -04:00
AlanCoding
20226f8984 Polish split jobs API info & add fields to UI
*clarify help text and squash migrations
*adds new internal_limit field to Job model for faster reference
*if field is non-blank, populate shard params in summary_fields
*add summary information to UI job/wfj details, JT selector
2018-10-31 11:04:10 -04:00
AlanCoding
7ff04dafd3 Fix IntegrityError deleting job splitting JT
misc:
*show sharded jobs in recent_jobs
*test updates
2018-10-31 11:04:10 -04:00
AlanCoding
f9bdb1da15 Job splitting access logic and more feature development
*allow sharding with prompts and schedules
*modify create_unified_job contract to pass class & parent_field name
*make parent field name instance method & set sharded UJT field
*access methods made compatible with job sharding
*move shard job special logic from task manager to workflows
*save sharded job prompts to workflow job exclusively
*allow using sharded jobs in workflows
2018-10-31 11:04:10 -04:00
AlanCoding
dab678c5cc Implement splitting logic in inventory & job task code 2018-10-31 11:04:10 -04:00
Matthew Jones
44ffcf86de Properly take prompted inventory into account
This also will rename shard jobs to add an index to the job name
2018-10-31 11:04:10 -04:00
Matthew Jones
8a18984be1 Spawn concrete workflow jobs from a job template launch 2018-10-31 11:04:09 -04:00
Matthew Jones
0b1776098b Implement model/view/launch paradigm for shard/split job templates 2018-10-31 11:04:09 -04:00
Daniel Sami
5da13683ce updated fixtures to use proper organization linking 2018-10-31 11:03:44 -04:00
Ryan Petrello
89c2038ea3 Merge pull request #2557 from ryanpetrello/fix-busted-docker-compose
pin docker-compose to a working version
2018-10-31 11:01:50 -04:00
Ryan Petrello
a1012b365c pin docker-compose to a working version 2018-10-31 10:47:45 -04:00
Matthew Jones
673068464a Add support for runner_on_start
This will be available in ansible 2.8
2018-10-30 13:23:55 -04:00
softwarefactory-project-zuul[bot]
484ef1b6a8 Merge pull request #2548 from wenottingham/mark-it-zero
Re-add markdown, which is used for rendering API help.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-30 16:47:46 +00:00
Bill Nottingham
7fc269b65a Re-add markdown, which is used for rendering API help. 2018-10-30 12:10:00 -04:00
westfood
694e494484 Using new Helm parameters for PostgreSQL access. 2018-10-28 11:55:36 +01:00
softwarefactory-project-zuul[bot]
ddda6b3d21 Merge pull request #2542 from jakemcdermott/fix-smoke
fix smoke test

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-28 00:32:26 +00:00
Jake McDermott
80adbf9c03 fix smoke test 2018-10-27 02:09:18 -04:00
softwarefactory-project-zuul[bot]
264f35d259 Merge pull request #2239 from AlanCoding/multi_pass_cancel
Do 2-pass cancel for workflow jobs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-26 14:43:14 +00:00
AlanCoding
e513f8fe31 do 2-pass cancel for workflow jobs 2018-10-26 10:28:30 -04:00
softwarefactory-project-zuul[bot]
b9f35e5b50 Merge pull request #2536 from ryanpetrello/deprecated_auth_token_middleware
remove DeprecatedAuthTokenMiddleware

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-26 14:27:29 +00:00
softwarefactory-project-zuul[bot]
002f463ffd Merge pull request #2274 from AlanCoding/callback_debugging
Reduce default verbosity of dev-specific callback logging

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-26 14:23:24 +00:00
Ryan Petrello
28512e042b remove DeprecatedAuthTokenMiddleware 2018-10-26 10:11:53 -04:00
AlanCoding
482395eb6a reduce default verbosity of devel-specific callback logging 2018-10-26 10:03:46 -04:00
softwarefactory-project-zuul[bot]
e1d44d6d14 Merge pull request #2529 from AlanCoding/split_personality
Apply docker-compose fix to cluster target too

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-26 13:52:32 +00:00
AlanCoding
19030b9d5f apply docker-compose fix to cluster target too 2018-10-26 09:36:11 -04:00
softwarefactory-project-zuul[bot]
3e4738d948 Merge pull request #2430 from dmt/devel
Fix installer volume definitions

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 22:12:25 +00:00
softwarefactory-project-zuul[bot]
94083f55c7 Merge pull request #2510 from Intermax-Cloudsourcing/awx-web-dockerfile-tmp
Empties /tmp in awx_web Dockerfile

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 21:59:42 +00:00
Daniel Temme
6ecd18b2e2 make volume concatenation work
The second list gets interpreted as part of the else block, effectively
dropping it. Separating both list definitions with braces seems to work.

# Conflicts:
#	installer/roles/local_docker/tasks/standalone.yml
2018-10-25 17:54:10 -04:00
Daniel Temme
4e9c705997 Partial revert for "Bugfix for ca_trust_dir"
# Conflicts:
#	installer/roles/local_docker/tasks/standalone.yml

# Conflicts:
#	installer/roles/local_docker/tasks/standalone.yml
2018-10-25 17:53:12 -04:00
softwarefactory-project-zuul[bot]
1803a76a4d Merge pull request #2485 from wwt/fix-tiller-namespace
Pass tiller namespace down to helm task

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 21:40:08 +00:00
softwarefactory-project-zuul[bot]
86ca1875f1 Merge pull request #2486 from wwt/remove-rabbit-cluster-name
Remove .cluster.local from service name for rabbitmq

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 21:37:54 +00:00
wilmardo
bf5c259d92 Empties /tmp in web Dockerfile 2018-10-25 17:12:26 -04:00
softwarefactory-project-zuul[bot]
9bca937fad Merge pull request #2287 from AlanCoding/files_are_in_the_computer
automatically delete project files in entire cluster

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 20:53:20 +00:00
AlanCoding
526ca3ae42 automatically delete project files in entire cluster 2018-10-25 16:36:58 -04:00
softwarefactory-project-zuul[bot]
695c7ade86 Merge pull request #2523 from ivuk/fix-variable-names
Update variable names for local Docker daemon installation

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 17:30:44 +00:00
Igor Vuk
c133b35162 Update variable names for local Docker daemon installation
Signed-off-by: Igor Vuk <parcijala@gmail.com>
2018-10-25 12:47:25 -04:00
softwarefactory-project-zuul[bot]
afb3c0e31e Merge pull request #2498 from AlanCoding/relaunch_fix
Fix bug with relaunching with changed JT

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-25 16:40:16 +00:00
AlanCoding
8965f1934e fix bug with relaunching with changed JT 2018-10-25 11:45:47 -04:00
softwarefactory-project-zuul[bot]
556040fb8b Merge pull request #2497 from AlanCoding/fix_two_creds2
Fix server error using 2 creds of same type

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-24 19:14:32 +00:00
AlanCoding
8b3e49cb24 fix server error using 2 creds of same type 2018-10-24 14:59:01 -04:00
softwarefactory-project-zuul[bot]
331e272be0 Merge pull request #2504 from kialam/scheduler-template-fix-datepicker
Restore Date Picker field in Scheduler template.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-24 18:46:16 +00:00
kialam
9e7808f2c9 Restore Date Picker field in Scheduler template. 2018-10-24 14:29:46 -04:00
softwarefactory-project-zuul[bot]
0bb2de24f3 Merge pull request #2513 from AlanCoding/filter_things
Allow UI to filter by type again

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-24 17:57:49 +00:00
AlanCoding
72ce7b194f allow UI to filter by type again 2018-10-24 13:35:04 -04:00
softwarefactory-project-zuul[bot]
85958c51a8 Merge pull request #2517 from dmsimard/preload_data
Let users disable create_preload_data if it isn't necessary

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-24 15:53:57 +00:00
David Moreau Simard
1dd44df471 Let users disable create_preload_data if it isn't necessary
The demo things might not be desirable in a production environment.
2018-10-24 11:36:33 -04:00
softwarefactory-project-zuul[bot]
b132f855a0 Merge pull request #2508 from shanemcd/devel
Fix permissions when running dev container as non-root user

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-24 14:56:33 +00:00
Shane McDonald
a361b5da6e Fix permissions when running dev container as non-root user
I wanted to pass `—user` to `docker-compose` up, but that option doesnt exist. To get around this, I had to record the uid on the host (CURRENT_UID), interpolate the variable in tools/docker-compose.yml, and detect that inside the container. I then piggy-backed on the /etc/passwd hack we use for scenarios with unpredictable uids.
2018-10-24 10:30:04 -04:00
Shane McDonald
7df63830ed Remove reference to file that doesnt exist anymore 2018-10-24 10:30:03 -04:00
softwarefactory-project-zuul[bot]
b3cf93256b Merge pull request #2520 from ryanpetrello/fix-flake8
fix flake8

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-24 14:28:32 +00:00
Ryan Petrello
c695ba2e10 fix flake8 2018-10-24 10:11:53 -04:00
softwarefactory-project-zuul[bot]
c44160933d Merge pull request #2514 from farcaller/patch-1
Fix a typo

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-23 17:24:39 +00:00
Vladimir Pouzanov
9ae3e1c40f Fix a typo 2018-10-23 18:01:00 +01:00
softwarefactory-project-zuul[bot]
c7c5a9d2f7 Merge pull request #2512 from wenottingham/some-less-assembly-required
Remove some obsolete requirements.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-23 15:24:55 +00:00
Bill Nottingham
a56a231869 Remove some obsolete requirements.
Bump cryptography to latest.
2018-10-23 10:37:36 -04:00
softwarefactory-project-zuul[bot]
5087ca7f62 Merge pull request #2494 from ryanpetrello/drop-old-celery-tables
drop old celery/djcelery tables we no longer need

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2018-10-22 19:26:46 +00:00
Ryan Petrello
3b7336c570 drop old celery/djcelery tables we no longer need 2018-10-22 09:20:10 -04:00
softwarefactory-project-zuul[bot]
9b413afb2e Merge pull request #2492 from ansible/workflow-visualizer-search
fix to search for exact search matches

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-19 14:49:58 +00:00
Daniel Sami
eec05eac3c Merge branch 'devel' into workflow-visualizer-search 2018-10-19 10:33:51 -04:00
softwarefactory-project-zuul[bot]
41671b5868 Merge pull request #2493 from ryanpetrello/celery-inventory-delete-retry
implement simple retries for wayward inventory deletes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-19 14:30:04 +00:00
Daniel Sami
0bbf1d7014 Merge branch 'devel' into workflow-visualizer-search 2018-10-19 10:26:12 -04:00
Daniel Sami
c5ce62e11d added functionality to validate that search is complete before continuing 2018-10-19 10:23:50 -04:00
Ryan Petrello
9316c9ea3e implement simple retries for wayward inventory deletes 2018-10-19 10:10:52 -04:00
Daniel Sami
427b8bdabb lint fix 2018-10-19 10:01:50 -04:00
softwarefactory-project-zuul[bot]
cce470a5f8 Merge pull request #2487 from ryanpetrello/improved-amqp-cancel
fix a bug that breaks job cancellation on single node jobs

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-19 13:53:57 +00:00
Daniel Sami
92baea2ee6 fix to search for exact search matches 2018-10-19 09:43:13 -04:00
Ryan Petrello
3be9113d6b fix a bug that breaks job cancel on single node jobs
1.  Install awx w/ a single node.
2.  Start a long-running job.
3.  Forcibly kill the `awx-manage run_dispatcher` process (e.g.,
    SIGKILL) and do not start it again.
4.  The job remains in running - without a second cluster to discover
    the job, it is never reaped.
5.  This PR allows you to cancel the job from the UI+API.
2018-10-19 09:10:33 -04:00
softwarefactory-project-zuul[bot]
785c6fe846 Merge pull request #2475 from ryanpetrello/more-celery-hardening
make the dispatcher more fault-tolerant to prolonged database outages

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-19 00:22:56 +00:00
Ryan Petrello
0d29bbfdc6 make the dispatcher more fault-tolerant to prolonged database outages 2018-10-18 20:00:07 -04:00
softwarefactory-project-zuul[bot]
ce8117ef19 Merge pull request #2356 from ansible/updateProjectList
Update project list

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 21:43:13 +00:00
John Mitchell
bb921af146 fix badge updating and xss e2e test for projects list updates 2018-10-18 17:23:52 -04:00
John Mitchell
5e0ecc7f43 fix projects list search selectors 2018-10-18 17:23:52 -04:00
John Mitchell
73dc58e810 update project badge selector 2018-10-18 17:23:52 -04:00
John Mitchell
89344c2eee update project list selectors 2018-10-18 17:23:52 -04:00
John Mitchell
d61cd519d7 fix panel title and badge for new projects list 2018-10-18 17:23:51 -04:00
John Mitchell
8057438c67 add back in old-style project list json and relevant factories 2018-10-18 17:23:51 -04:00
John Mitchell
110671532d fix lint error with projects list route 2018-10-18 17:23:51 -04:00
Haokun-Chen
92ac3054c6 refactor projects list, clean up dependencies and old list generators and factory methods 2018-10-18 17:23:49 -04:00
softwarefactory-project-zuul[bot]
c95c2a4580 Merge pull request #2455 from wenottingham/into-the-deep-azure-yonder
Update Azure deps in Ansible venv to match Ansible 2.7 requirements.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 21:05:32 +00:00
Bill Nottingham
2c01476eca Don't explicitly remove certifi. 2018-10-18 16:41:33 -04:00
Bill Nottingham
8adbc8a026 Update Azure requirements to match Ansible 2.7 requirements.
Add comments for Ansible requirements to note where they're used.

Remove our custom docutils fork, as the fix was merged upstream.
2018-10-18 16:41:33 -04:00
softwarefactory-project-zuul[bot]
98b8d7fb69 Merge pull request #2483 from ansible/workflow-visualizer-search
added search for visualizer nodes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 19:48:10 +00:00
Daniel Sami
477551325d Merge branch 'workflow-visualizer-search' of https://github.com/ansible/awx into workflow-visualizer-search 2018-10-18 15:07:08 -04:00
Daniel Sami
fdedc472d1 lint fix 2018-10-18 15:06:37 -04:00
James Evans
88819ada6b Remove .cluster.local from service name for rabbitmq
FQDNs are not required for service discovery, and having the FQDN in the
name prevents the discovery from working in clusters not named
cluster.local.
2018-10-18 14:00:05 -05:00
Daniel Sami
f3ee93b67f Merge branch 'devel' into workflow-visualizer-search 2018-10-18 14:48:36 -04:00
Daniel Sami
b4549e5581 added search for visualizer nodes 2018-10-18 14:38:10 -04:00
softwarefactory-project-zuul[bot]
3afed6adb7 Merge pull request #2383 from ansible/updateSettingsNav
add additional settings sub navigation

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 17:55:26 +00:00
John Mitchell
1bc78fd429 fix selectors for settings sub pane 2018-10-18 13:37:45 -04:00
John Mitchell
6ce1b50751 update config e2e tests to fix syntax and linting issues 2018-10-18 13:37:45 -04:00
John Hill
6c87b88e2c Updating configuration/settings page 2018-10-18 13:37:45 -04:00
John Hill
10f21b8817 Updating e2e tests to match new settings nav 2018-10-18 13:37:45 -04:00
John Mitchell
0d1b25131d fix scope location of json fields of settings auth form 2018-10-18 13:37:45 -04:00
John Mitchell
d2118b8d25 fix activity stream settings links 2018-10-18 13:37:44 -04:00
John Mitchell
b852caaaa3 update configuration controllers to fix syntax warnings 2018-10-18 13:37:44 -04:00
John Mitchell
b0dd10b538 sidenav sub pane feedback
make height the same as side nav items
no tooltip for collapsed settings
2018-10-18 13:37:44 -04:00
John Mitchell
8f4aa5511b update side nav settings pane show hide hover logic 2018-10-18 13:37:44 -04:00
John Mitchell
4b26ac06ba fix open/close on settings nav item hover 2018-10-18 13:37:44 -04:00
John Mitchell
4dc6452dea updating suit name and variabilize colors for sub nav pane 2018-10-18 13:37:43 -04:00
John Mitchell
5a17acb131 working commit 2018-10-18 13:37:43 -04:00
Haokun-Chen
6cfd9dbfe4 refactor configuration (settings)
sub-nav added
2018-10-18 13:37:41 -04:00
softwarefactory-project-zuul[bot]
110c5a8e84 Merge pull request #2431 from Numblesix/devel
Added some Doc for ca_trust_dir

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 16:15:46 +00:00
Yanis Guenane
b185c1e0a2 Merge branch 'devel' into devel 2018-10-18 18:00:16 +02:00
softwarefactory-project-zuul[bot]
f1a4a62304 Merge pull request #2432 from Numblesix/ldap-doc
Added some Doc for FREEipa

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 14:53:14 +00:00
Yanis Guenane
9f3e3bad54 Merge branch 'devel' into ldap-doc 2018-10-18 16:38:31 +02:00
James Evans
4198227116 Pass tiller namespace down to helm task 2018-10-18 09:34:13 -05:00
softwarefactory-project-zuul[bot]
56525bc34f Merge pull request #2476 from AlanCoding/rm_changelog
Remove changelog

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 14:15:21 +00:00
Yanis Guenane
3f2068e74e Merge branch 'devel' into ldap-doc 2018-10-18 15:53:34 +02:00
AlanCoding
6117f8297e remove changelog 2018-10-18 09:52:08 -04:00
softwarefactory-project-zuul[bot]
8953d06905 Merge pull request #2456 from wenottingham/insert-obvious-unchained-joke-here
Update to latest django subminor to pick up assorted fixes.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-18 13:50:55 +00:00
Numblesix
bf39a2a747 Added some Doc for FREEipa 2018-10-18 09:31:24 -04:00
Bill Nottingham
f27ec8cd89 Update Django version in version check. 2018-10-18 09:23:59 -04:00
Bill Nottingham
aec3244f52 Update to latest django subminor to pick up assorted fixes. 2018-10-18 09:23:57 -04:00
Wayne Witzel III
c8e208dea7 Merge pull request #3074 from wwitzel3/release_3.3.1
fix typo in length
2018-10-17 17:10:41 -04:00
Wayne Witzel III
f2cec03900 fix typo in length 2018-10-17 16:34:24 -04:00
softwarefactory-project-zuul[bot]
07aaad53aa Merge pull request #2037 from ikke-t/ikke-t-selinux-fix
fixes selinux permissions for awx data.

Reviewed-by: Shane McDonald <me@shanemcd.com>
             https://github.com/shanemcd
2018-10-17 19:05:21 +00:00
Ilkka Tengvall
42a0192425 Merge branch 'devel' into ikke-t-selinux-fix 2018-10-17 21:44:48 +03:00
softwarefactory-project-zuul[bot]
ac08033d3e Merge pull request #2472 from ryanpetrello/callback-receiver-log
use the proper logger for the callback receiver

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-17 15:35:32 +00:00
Numblesix
6d0fed6d9a Added some Doc for ca_trust_dir 2018-10-17 11:32:26 -04:00
Ryan Petrello
53ae05094e use the proper logger for the callback receiver 2018-10-17 10:56:29 -04:00
softwarefactory-project-zuul[bot]
78c4d5005e Merge pull request #2461 from ryanpetrello/upgrade-celery-and-kombu
upgrade to the latest kombu + celery

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-17 13:49:37 +00:00
Wayne Witzel III
0b4e0678e9 Merge pull request #3070 from wwitzel3/release_3.3.1
better error handling when over limit
2018-10-17 09:09:01 -04:00
Ryan Petrello
79002ae563 upgrade to the latest kombu + celery 2018-10-16 16:14:58 -04:00
softwarefactory-project-zuul[bot]
6c868c7552 Merge pull request #2449 from ryanpetrello/noisy-check-migrations
silence the noisy error that's printed w/ `awx-manage check_migrations`

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-16 18:04:05 +00:00
Ryan Petrello
6e4f3efc4b silence the noisy error that's printed w/ awx-manage check_migrations 2018-10-16 13:48:03 -04:00
softwarefactory-project-zuul[bot]
ce9da4edb7 Merge pull request #2454 from ryanpetrello/more-celery-cleanup
allow users to specify BROKER_URL with passwords that contain : and @

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-16 16:30:33 +00:00
Ryan Petrello
6ff1fe8548 allow users to specify BROKER_URL with passwords that contain : and @ 2018-10-16 11:56:57 -04:00
softwarefactory-project-zuul[bot]
140b85688f Merge pull request #2451 from matburt/fixup_test_userlaunch
Force openshift user behavior for uids over 2500

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-16 15:47:20 +00:00
Matthew Jones
0477581dea Fix up flake8 2018-10-16 11:30:07 -04:00
Matthew Jones
d5c557c639 Proper parameterization for scm tests 2018-10-16 11:30:06 -04:00
Matthew Jones
8e60cb1270 Purge an unneeded ansible 2.4 version check 2018-10-16 11:30:05 -04:00
chris meyers
906eb98d8e fixes dispatcher test that inadvertently access db
* Logger inadvertently triggered by dispatcher tests that do not need DB
access. Mock settings to sidestep DB access.
2018-10-16 11:30:04 -04:00
Matthew Jones
119b9475ea Force openshift user behavior for uids over 2500 2018-10-16 11:30:04 -04:00
softwarefactory-project-zuul[bot]
12c8994faf Merge pull request #2450 from ryanpetrello/iso-deprovision-fix
don't call rabbitmqctl forget_cluster_node for isolated instances

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-16 14:10:35 +00:00
Ryan Petrello
f3e73bbed8 don't call rabbitmqctl forget_cluster_node for isolated instances 2018-10-16 09:47:53 -04:00
softwarefactory-project-zuul[bot]
e2a1b7902c Merge pull request #2439 from jmferrer/change_openshift_vars_path
Change openshift vars path.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-16 12:17:51 +00:00
jmferrer
d65a3fa037 Restore per-deployment requirements. 2018-10-16 09:59:11 +02:00
jmferrer
f6600887bc Merge branch 'devel' of https://github.com/jmferrer/awx into change_openshift_vars_path 2018-10-16 09:55:05 +02:00
Michael Abashian
96c18fa311 Merge pull request #2141 from mabashian/remove-system-tracking
Removes system tracking code from the UI
2018-10-15 18:55:34 -06:00
mabashian
9645e5bcd3 Remove portalMode accidental portalMode inclusion that resulted from merge conflict 2018-10-15 18:50:58 -04:00
mabashian
0a09d98fe8 Removes system tracking code from the UI. Moves import of shared out to app.js 2018-10-15 18:50:58 -04:00
Ryan Petrello
1224e2c889 Merge pull request #2440 from ryanpetrello/fix-list-based-survey-choices
remove over-eager survey choices validation
2018-10-15 17:05:06 -04:00
softwarefactory-project-zuul[bot]
c8e6fa3bb3 Merge pull request #2438 from ryanpetrello/dispatcher-quit-race
don't attempt to recover special QUIT messages in the worker pool recovery code

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-15 20:40:20 +00:00
Ryan Petrello
00cae104b3 remove over-eager survey choices validation
it looks like choices can also be a list and _maybe_ comma delimited;
clearly there's a lot of history here; let's verify and test what's _really_ supported and _then_ add any necessary validation
2018-10-15 16:40:17 -04:00
Wayne Witzel III
6e3b2a5c2d better error handling when over limit 2018-10-15 16:07:14 -04:00
Ryan Petrello
3d378077d9 Merge pull request #3066 from saito-hideki/issue/3064
[3.3.1] Add files and output of commands to gather with sosreport
2018-10-15 12:28:08 -04:00
jmferrer
f27a34cd1c Change openshift vars path. 2018-10-15 18:27:49 +02:00
Ryan Petrello
720a634702 don't attempt to recover special QUIT messages in the worker pool
when `--reload` is sent to the dispatcher, it sends a special QUIT
message to each worker in the pool so that it will exit gracefully at
the next opportunity

when a worker process exits unexpectedly, the dispatcher attempts to
recover its queued messages and sends them to another worker in the
pool; in this scenario, we should _never_ re-enqueue these special
QUIT messages (because the process doesn't need to quit, it's already
gone)

To reproduce this race condition:

1.  Launch an adhoc that does `sleep 60`
2.  Run `awx-manage run_dispatcher --reload` to enqueue a `QUIT` message
    into the worker's queue
3.  Find the pid of the worker running the `sleep 60` and `SIGKILL` it.
4.  Observe that dispatcher attempts to requeue the `QUIT` message and
    logs a confusing error.
2018-10-15 12:17:52 -04:00
Chris Meyers
c722e50595 Merge pull request #2425 from chrismeyersfsu/fix-ldap_group_type
fix issue with ldap queries containing unicode
2018-10-15 10:49:43 -05:00
Ryan Petrello
716d440a76 Merge pull request #3068 from ryanpetrello/fix-3039
fix a typo on the JT add page that breaks the custom venv field
2018-10-15 11:40:33 -04:00
Ryan Petrello
9d81727d16 fix a typo on the JT add page that breaks the custom venv field 2018-10-15 11:19:58 -04:00
softwarefactory-project-zuul[bot]
1cecfd9771 Merge pull request #2437 from ryanpetrello/fix-3039
fix a typo on the JT add page that breaks the custom venv field

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-15 15:19:08 +00:00
Ryan Petrello
011c8ae822 fix a typo on the JT add page that breaks the custom venv field 2018-10-15 11:04:31 -04:00
Hideki Saito
d5626a4f3e [3.3.1] Add files and output of commands to gather with sosreport
- Fixed issue #3064
2018-10-15 11:40:51 +09:00
softwarefactory-project-zuul[bot]
73f54b2237 Merge pull request #2373 from marshmalien/always_nodes_ui
Display WF always nodes in conjunction with success and failure

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-12 22:43:32 +00:00
Ryan Petrello
6073e8e3b6 Merge pull request #3062 from ryanpetrello/fix-3043
minor nit for https://github.com/ansible/tower/pull/3060
2018-10-12 16:56:23 -04:00
Ryan Petrello
867ff5da71 minor nit for https://github.com/ansible/tower/pull/3060 2018-10-12 16:17:14 -04:00
Ryan Petrello
c8b2ca7fed Merge pull request #3060 from ryanpetrello/fix-3043
properly handle AnsibleVaultEncryptedUnicode objects in the callback
2018-10-12 15:42:11 -04:00
softwarefactory-project-zuul[bot]
0a964b2bf6 Merge pull request #2266 from ansible/celery-tastes-bad
replace the celery-based task queue with a kombu-based implementation

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-12 18:40:54 +00:00
Ryan Petrello
d4e3127fb4 properly handle AnsibleVaultEncryptedUnicode objects in the callback 2018-10-12 12:29:46 -04:00
softwarefactory-project-zuul[bot]
fa18b94725 Merge pull request #2429 from ryanpetrello/more-shippable-cleanup
more shippable -> zuul cleanup

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-12 16:10:53 +00:00
softwarefactory-project-zuul[bot]
5ab6255c67 Merge pull request #2424 from ryanpetrello/oauth-toolkit-upgrade
update to the latest stable 1.1 django-oauth-toolkit

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-12 15:54:36 +00:00
Ryan Petrello
ac80bc874a more shippable -> zuul cleanup 2018-10-12 11:50:29 -04:00
chris meyers
2e98446394 fix issue with ldap queries containing unicode 2018-10-12 10:33:01 -04:00
softwarefactory-project-zuul[bot]
c4afbbc2ca Merge pull request #2420 from dmt/devel
fix indentation for register variable

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-12 14:27:19 +00:00
Ryan Petrello
517043e209 update to the latest stable 1.1 django-oauth-toolkit
see: https://github.com/jazzband/django-oauth-toolkit/pull/629
2018-10-12 10:21:57 -04:00
Marliana Lara
e7c52bc5e7 Merge pull request #8 from dsesami/always_nodes_ui_tests
Always nodes ui tests
2018-10-12 10:20:10 -04:00
Daniel Sami
c25d208465 added browser close at end, waits for spinners 2018-10-12 10:18:49 -04:00
Chris Meyers
503a47c509 Merge pull request #3054 from chrismeyersfsu/fix-ldap_posix_group_type
fix issue with ldap queries containing unicode
2018-10-12 09:14:09 -05:00
Daniel Temme
921231fe3d fix indentation for register variable 2018-10-12 11:13:42 +02:00
softwarefactory-project-zuul[bot]
6721ea54e9 Merge pull request #1956 from droopy4096/devel
allow nginx config extension

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 22:38:36 +00:00
softwarefactory-project-zuul[bot]
99a42e91fe Merge pull request #2235 from ChrisRo89/devel
Extracted more variables which a related to rabbitmq/postgresql from tasks to defaults

Reviewed-by: Shane McDonald <me@shanemcd.com>
             https://github.com/shanemcd
2018-10-11 21:54:38 +00:00
softwarefactory-project-zuul[bot]
9a580ba644 Merge pull request #2416 from fantashley/fix-openshift-auth
Fix openshift auth broken by undefined vars

Reviewed-by: Ashley Nelson <fantashley@gmail.com>
             https://github.com/fantashley
2018-10-11 21:51:20 +00:00
softwarefactory-project-zuul[bot]
74fcdabc22 Merge pull request #2156 from Decstasy/patch-1
Bugfix for ca_trust_dir

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 21:31:45 +00:00
Ashley Nelson
9bec7cf3b0 Fix openshift auth broken by undefined vars
Signed-off-by: Ashley Nelson <fantashley@gmail.com>
2018-10-11 16:25:55 -05:00
softwarefactory-project-zuul[bot]
f9e402658b Merge pull request #2414 from ryanpetrello/readme-updates
some minor README updates

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:53:19 +00:00
softwarefactory-project-zuul[bot]
9570981c7f Merge pull request #2351 from jakemcdermott/enhancement-2515
add views for organization permissions and roles

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:41:08 +00:00
softwarefactory-project-zuul[bot]
f79debac42 Merge pull request #2164 from atgreen/devel
Fix token based openshift logins during installation - fixes #489

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:36:39 +00:00
softwarefactory-project-zuul[bot]
a9f3eeef05 Merge pull request #2131 from walkafwalka/docker_install_awx_hostnames
Add inventory vars to set docker install hostnames

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:29:32 +00:00
softwarefactory-project-zuul[bot]
6eb1feffcd Merge pull request #2117 from walkafwalka/allow_awx_login_autocomplete
Allow autocomplete on the AWX login page

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:23:37 +00:00
softwarefactory-project-zuul[bot]
6f55cde6d3 Merge pull request #2091 from stoned/force_boolean_eval
force boolean evaluation

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:17:48 +00:00
softwarefactory-project-zuul[bot]
48511b6c33 Merge pull request #2281 from AlanCoding/consistent2
Always allow resource creation via global list

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:12:39 +00:00
softwarefactory-project-zuul[bot]
771daefcfd Merge pull request #2411 from fantashley/statefulset_servicename
Add serviceName to Kubernetes StatefulSet spec

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 20:06:50 +00:00
Ryan Petrello
1167361128 some minor README updates 2018-10-11 16:05:29 -04:00
softwarefactory-project-zuul[bot]
3a4cc0d464 Merge pull request #1911 from AlanCoding/spec_it_out
Much more comprehensive validation of survey specs

Reviewed-by: Shane McDonald <me@shanemcd.com>
             https://github.com/shanemcd
2018-10-11 20:00:43 +00:00
Jake McDermott
78901ab48e add organization permissions view 2018-10-11 14:21:44 -04:00
Jake McDermott
938bf1b531 add organizations tab to team permissions screen 2018-10-11 14:21:29 -04:00
Marliana Lara
27da141889 Address review comments 2018-10-11 13:13:01 -04:00
Ashley Nelson
2bf2412759 Add serviceName to Kubernetes StatefulSet spec
Signed-off-by: Ashley Nelson <fantashley@gmail.com>
2018-10-11 11:49:08 -05:00
Daniel Sami
1e3c229460 lint fixes 2018-10-11 12:24:55 -04:00
AlanCoding
cfa93b52b7 Always allow resource creation via global list 2018-10-11 12:21:45 -04:00
Christian.Rohr
96ad2b2b28 Extracted more variables which a related to rabbitmq 2018-10-11 12:16:01 -04:00
softwarefactory-project-zuul[bot]
f53a1fedf6 Merge pull request #2410 from ryanpetrello/update-azure-inv-script
update Azure inventory script to latest from Ansible

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 16:15:15 +00:00
Daniel Sami
8fceaf8810 Tests for UI workflow always nodes 2018-10-11 12:14:00 -04:00
Anthony Green
c39370dbd0 Fix token based openshift logins 2018-10-11 12:10:41 -04:00
AlanCoding
bdc7efb274 humble beginnings of survey question type validation 2018-10-11 12:10:40 -04:00
Ryan Petrello
10c76e2337 update Azure inventory script to latest from Ansible
rebased version of https://github.com/ansible/awx/pull/2234
2018-10-11 11:47:55 -04:00
Ryan Petrello
ff1e8cc356 replace celery task decorators with a kombu-based publisher
this commit implements the bulk of `awx-manage run_dispatcher`, a new
command that binds to RabbitMQ via kombu and balances messages across
a pool of workers that are similar to celeryd workers in spirit.
Specifically, this includes:

- a new decorator, `awx.main.dispatch.task`, which can be used to
  decorate functions or classes so that they can be designated as
  "Tasks"
- support for fanout/broadcast tasks (at this point in time, only
  `conf.Setting` memcached flushes use this functionality)
- support for job reaping
- support for success/failure hooks for job runs (i.e.,
  `handle_work_success` and `handle_work_error`)
- support for auto scaling worker pool that scale processes up and down
  on demand
- minimal support for RPC, such as status checks and pool recycle/reload
2018-10-11 10:53:30 -04:00
Ryan Petrello
da74f1d01f refactor and test the callback receiver as a base for a task dispatcher 2018-10-11 10:53:26 -04:00
softwarefactory-project-zuul[bot]
8ad46436df Merge pull request #2125 from wenottingham/the-first-purge
Purge inventory script requirements from the AWX virtual environment.

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-11 14:14:36 +00:00
Bill Nottingham
be01bed34b Purge inventory script requirements from the AWX virtual environment.
boto is still used by AWX itself.
2018-10-11 09:45:41 -04:00
Ryan Petrello
71577bb00d Merge pull request #3052 from wwitzel3/bump-asgi_amqp
Use latest version of asgi_amqp
2018-10-10 16:07:57 -04:00
softwarefactory-project-zuul[bot]
8a763d6cf8 Merge pull request #2372 from rooftopcellist/update_version
update awx version to 2.0.1

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 16:59:43 +00:00
chris meyers
cfb58eb145 fix issue with ldap queries containing unicode 2018-10-10 12:32:27 -04:00
adamscmRH
1165dcfa07 update awx version to 2.0.1 2018-10-10 12:31:14 -04:00
softwarefactory-project-zuul[bot]
f9928eef70 Merge pull request #2395 from shanemcd/devel
Fix fallout from #2392

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 16:29:45 +00:00
Shane McDonald
ee1d5e43b9 Fix fallout from https://github.com/ansible/awx/pull/2392
There were some upstream changes that I overwrote but shouldn’t have.
2018-10-10 11:41:34 -04:00
Wayne Witzel III
5994c35975 Use latest version of asgi_amqp 2018-10-10 11:33:11 -04:00
softwarefactory-project-zuul[bot]
e94e79d57a Merge pull request #2400 from ryanpetrello/swagger-job
build swagger docs as part of CI

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 14:52:30 +00:00
Ryan Petrello
f87a09c46a build swagger docs as part of CI 2018-10-10 10:27:54 -04:00
softwarefactory-project-zuul[bot]
535e16c6cf Merge pull request #2396 from jakemcdermott/update-npm-install
don't update package lock file by default, update readmes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 14:03:10 +00:00
Jake McDermott
5ae19fd9c2 update development documentation 2018-10-10 09:23:47 -04:00
Jake McDermott
7d5f6aa49d don't update lock file by default 2018-10-10 09:23:37 -04:00
softwarefactory-project-zuul[bot]
c0fc3a74ee Merge pull request #2393 from ansible/non-root-docker-tests
Run tests in Docker as non-root user

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 13:20:00 +00:00
Yanis Guenane
22c831ff31 Merge branch 'devel' into non-root-docker-tests 2018-10-10 14:22:09 +02:00
softwarefactory-project-zuul[bot]
17dc6bf5a1 Merge pull request #2394 from wenottingham/ocean's-node-8
update node requirements in CONTRIBUTING.md to match INSTALL.md

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 10:07:50 +00:00
Yanis Guenane
e7fb82ffe7 Merge branch 'devel' into ocean's-node-8 2018-10-10 11:47:27 +02:00
softwarefactory-project-zuul[bot]
70ae546dee Merge pull request #2391 from wwitzel3/devel
use latest asgi_amqp version

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-10 09:40:21 +00:00
Yanis Guenane
5d22fc2bd7 Merge branch 'devel' into non-root-docker-tests 2018-10-10 09:44:01 +02:00
Ilkka Tengvall
b4919f9ebd Merge branch 'devel' into ikke-t-selinux-fix 2018-10-10 08:23:46 +03:00
Bill Nottingham
9033b3f2a5 update node requirements in CONTRIBUTING.md to match INSTALL.md 2018-10-09 19:54:05 -04:00
Shane McDonald
de60165a49 Fix broken defaults in awx installer 2018-10-09 19:15:32 -04:00
Daniel Sami
b02677a8d0 Initial commit for UI tests for always nodes 2018-10-09 16:32:24 -04:00
Wayne Witzel III
b8c1724880 use latest asgi_amqp version 2018-10-09 15:34:07 -04:00
softwarefactory-project-zuul[bot]
6baa2a109d Merge pull request #2392 from shanemcd/devel
Port downstream installer changes

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-09 19:18:24 +00:00
Shane McDonald
7a5cfd05a3 Run tests in Docker as non-root user 2018-10-09 15:16:01 -04:00
Shane McDonald
b9279ebd5e Port downstream installer changes 2018-10-09 14:39:39 -04:00
Marliana Lara
1b25dd0127 Fix ui-lint error 2018-10-09 14:21:59 -04:00
softwarefactory-project-zuul[bot]
49396178ca Merge pull request #2363 from AlanCoding/validate_env_vars
Validate ANSIBLE_ injectors on save and increase verbosity

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-09 18:11:47 +00:00
AlanCoding
a4dfd96a8d Validate ANSIBLE_ injectors on save and increase verbosity 2018-10-09 13:46:51 -04:00
Marliana Lara
a2f4e36e47 Show all wf options when node is not a root node
* Edge type of root node is always "always"
* If node is not a root node, show all options: always, success, fail
* Remove edge conflict logic
2018-10-09 11:30:53 -04:00
adamscmRH
ad566cc651 tests for always_nodes 2018-10-09 11:30:53 -04:00
adamscmRH
4d9523afa4 lift always node mutex restriction 2018-10-09 11:30:49 -04:00
softwarefactory-project-zuul[bot]
40602875e0 Merge pull request #2381 from msurovcak/patch-1
trivial: update teardown command

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-09 15:12:31 +00:00
Martin Surovcak
d0572cf170 trivial: update teardown command 2018-10-08 16:29:07 +02:00
softwarefactory-project-zuul[bot]
1edede213e Merge pull request #2309 from matburt/zuul_job_configuration
Add an initial check and gate job configuration for zuul

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
2018-10-08 13:09:24 +00:00
Matthew Jones
e0c7a7bece Mention zuul in contributing 2018-10-05 14:32:47 -04:00
Matthew Jones
640f9474fc Remove shippable configuration 2018-10-05 14:26:03 -04:00
Ryan Petrello
29b90b700e minor docker-compose fix 2018-10-05 13:40:10 -04:00
Matthew Jones
f7c5289195 Clean up CI compose test invocation 2018-10-05 13:40:09 -04:00
Ryan Petrello
ee11341430 more make clean tinkering 2018-10-05 13:40:08 -04:00
Matthew Jones
56263a5fea Force ui cleanup in the test environment
Also allow using the system make
2018-10-05 13:40:07 -04:00
Jake McDermott
89e41f7524 replace phantomjs with headless chrome 2018-10-05 13:40:06 -04:00
Matthew Jones
3a8bacb8ef Add an initial check and gate job configuration for zuul
Updates for running ui tests and linters
2018-10-05 13:39:59 -04:00
Ryan Petrello
f328f8cad4 Merge pull request #2375 from ryanpetrello/fix-busted-notifications
fix busted notification tests
2018-10-05 09:39:35 -05:00
Ryan Petrello
7752446067 fix busted notification tests 2018-10-05 10:18:27 -04:00
Michael Abashian
96bc0f1578 Merge pull request #2348 from mabashian/2316-wf-width
Ensure workflow graph width is 100% of container
2018-10-05 08:00:56 -05:00
mabashian
9f25fdd079 Ensure workflow graph width is 100% of container 2018-10-05 06:42:53 -06:00
Shane McDonald
7249b21214 Merge pull request #2368 from backeby/fix
Fixed typo Ansbile->Ansible
2018-10-04 16:04:43 -05:00
Alan Rominger
2d642b95ae Merge pull request #2369 from AlanCoding/flake8_setup
Fix flake8 errors in setup.py
2018-10-04 12:45:34 -04:00
AlanCoding
b94d5c7f20 fix flake8 errors in setup.py 2018-10-04 12:25:07 -04:00
André Backeby
02c23fc1c6 Fixed typo Ansbile->Ansible 2018-10-04 15:07:52 +02:00
Shane McDonald
b75f8ceca6 Do not default to pulling latest from DockerHub 2018-10-03 17:50:07 -05:00
Shane McDonald
bfc74497b0 Fix error in image_build role
I think I derped up and commited something in an old stash.
2018-10-03 14:44:26 -05:00
Matthew Jones
c8c982428d Merge pull request #2332 from shanemcd/devel
Updates to versioning system.
2018-10-03 14:28:05 -04:00
Matthew Jones
e6dbf71252 Merge pull request #2341 from wwitzel3/views-breakout
Views breakout
2018-10-01 10:14:53 -04:00
Shane McDonald
3701567ad7 Revert "first-parent requires git >= 1.8.4"
This reverts commit 1af0ee2f8c.

# Conflicts:
#	installer/roles/image_build/templates/Dockerfile.j2
2018-09-28 15:48:33 -04:00
Shane McDonald
86140dec08 Revert "Fix sdist builder image"
This reverts commit 97472cb91b.

# Conflicts:
#	installer/roles/image_build/tasks/main.yml
2018-09-28 15:48:33 -04:00
Shane McDonald
50fe0392ed Updates to versioning system.
https://github.com/ansible/awx/issues?q=%22--first-parent%22
2018-09-28 15:48:33 -04:00
Wayne Witzel III
f18c965a8a fix test patches 2018-09-28 15:18:59 -04:00
Wayne Witzel III
f874e55051 split out mixins in views 2018-09-28 12:48:06 -04:00
Wayne Witzel III
1dcd2b1883 make views.py a directory based module 2018-09-28 12:29:12 -04:00
Ryan Petrello
7684579464 Merge pull request #2336 from ryanpetrello/fix-notification-race
send test notifications after the transaction closes to avoid a race
2018-09-28 10:02:02 -04:00
Ryan Petrello
16e89ed081 send test notifications after the transaction closes to avoid a race 2018-09-28 09:43:10 -04:00
Michael Abashian
3aa07baf26 Merge pull request #3035 from mabashian/3010-extra-vars
Fixes bug where schedule extra vars were not being displayed in the edit form
2018-09-28 09:24:41 -04:00
Chris Meyers
f1c53fcd85 Merge pull request #3034 from chrismeyersfsu/fix-ldap_params
at migration time, validate ldap group type params
2018-09-28 08:53:42 -04:00
mabashian
6c98e6c3a0 Actually fix extra vars on edit schedule. This commit takes into account survey question answers which need to get pulled out of extra vars and displayed in the prompt. 2018-09-27 16:49:23 -04:00
mabashian
8aec4ed72e Fixes bug where schedule extra vars were not being displayed in the edit form 2018-09-27 16:30:10 -04:00
chris meyers
0a0cdc2e21 at migration time, validate ldap group type params
* Previously, we have logic in the API to ensure that ldap group type
params, when changed, align with ldap group type Class init
expectations. However, we did not have this logic in the migrations.
This PR adds the validation check to migrations.
2018-09-27 12:18:39 -04:00
Shane McDonald
62e3b9e3b6 Driveby cleanup: use built-in Make variable 2018-09-26 21:27:07 -04:00
Ryan Petrello
dc3f81920e Merge pull request #2302 from AlanCoding/verbose_data
create_preload_data: log no-op operation, remove unnecessary credential
2018-09-26 16:35:18 -04:00
Ryan Petrello
f0776d6838 Merge pull request #3026 from ryanpetrello/fix-3004
properly support deprecated `Authorization: Token xyz`
2018-09-24 15:33:56 -04:00
Ryan Petrello
9de63832ce properly support deprecated Authorization: Token xyz 2018-09-24 15:16:09 -04:00
Ryan Petrello
8a66213dbe Merge pull request #2298 from ryanpetrello/fix-oauth2-deprecated-token-header
properly support deprecated `Authorization: Token xyz`
2018-09-24 15:15:13 -04:00
Ryan Petrello
23d4122574 properly support deprecated Authorization: Token xyz 2018-09-24 14:50:33 -04:00
AlanCoding
5900af726b log no-op operation and changed status 2018-09-21 15:23:02 -04:00
Shane McDonald
9fc4c03e5b Merge pull request #2197 from Spredzy/minor_fixes_contributing.md
CONTRIBUTING.md: Fixing ToC indendation and wrong links
2018-09-20 17:51:00 -04:00
Dmytro Makovey
f8d2a32756 merge and resolve conflict 2018-09-18 11:35:35 -07:00
Shane McDonald
0bb1b0ed45 Merge pull request #2272 from ansible/delete-shrinkwrap
delete old npm-shrinkwrap lock file
2018-09-18 14:01:16 -04:00
John Mitchell
3b11219fff delete old npm-shrinkwrap lock file 2018-09-18 13:42:02 -04:00
Shane McDonald
1b4c3f56fa Merge pull request #2113 from kialam/upgrade-node-lts
Upgrade Node and NPM to LTS
2018-09-18 12:46:30 -04:00
Shane McDonald
6c5334c7d3 Update docs for new Node and NPM version requirements 2018-09-18 12:37:41 -04:00
Shane McDonald
1371e394de Update Node version in dev container image 2018-09-18 12:37:20 -04:00
Shane McDonald
ec67feef2f Bump npm version in package.json
This is what’s served out of the 8.x LTS yum repos.
2018-09-18 12:18:21 -04:00
Shane McDonald
89e656b2a4 Update Node version in sdist builder 2018-09-18 12:17:52 -04:00
Ryan Petrello
5910b8c562 Merge pull request #2265 from shanemcd/devel
Merge remote-tracking branch 'downstream/release_3.3.0' into devel
2018-09-18 08:37:02 -04:00
Shane McDonald
580004b395 Merge remote-tracking branch 'downstream/release_3.3.0' into devel
# Conflicts:
#	awx/main/notifications/slack_backend.py
2018-09-18 08:11:50 -04:00
John Mitchell
70629ef7f3 Merge pull request #2997 from jlmitch5/fixPageSelector
fix filter page size selector
2018-09-13 10:42:50 -04:00
John Mitchell
1d8bb47726 fix filter page size selector 2018-09-12 17:31:10 -04:00
Matthew Jones
5e16c72d30 Merge pull request #2988 from mabashian/2982-wfjt-list-select
Fixes bug in wfjt node form where rows weren't remaining selected after being clicked
2018-09-12 14:00:32 -04:00
Matthew Jones
02f709f8d1 Merge pull request #2995 from jlmitch5/lodashFindUpdate
update syntax of lodash find call
2018-09-12 13:59:59 -04:00
Shane McDonald
90bd27f5a8 Whitespace fix
I’m not actually this pedantic, I just need something to tag.
2018-09-12 13:41:56 -04:00
John Mitchell
593ab90f92 update syntax of lodash find call 2018-09-12 10:54:17 -04:00
mabashian
27c06a7285 Fixes bug in wfjt node form where rows weren't remaining selected after being clicked 2018-09-11 16:34:02 -04:00
Ryan Petrello
b2c755ba76 Merge pull request #2980 from rooftopcellist/amend_changelog_networkui
rm network ui from changelog
2018-09-11 10:03:00 -04:00
Ryan Petrello
c88cab7d31 Merge pull request #2983 from ansible/deprecated_facts
deprecate fact endpoints
2018-09-11 10:02:25 -04:00
chris meyers
f82f4a9993 deprecate fact endpoints and commands 2018-09-07 17:46:33 -04:00
adamscmRH
5a6f1a342f rm network ui from changelog 2018-09-07 15:04:34 -04:00
Ryan Petrello
910663764f Merge pull request #2979 from ryanpetrello/celery-init-race
consolidate celery init signals to avoid an instance registration race
2018-09-07 09:46:06 -04:00
Ryan Petrello
43aa0fc741 consolidate celery init signals to avoid an instance registration race 2018-09-07 09:29:53 -04:00
Jake McDermott
b9b9fc1934 Merge pull request #2974 from jakemcdermott/fix-2968
delete text nodes when removing output lines
2018-09-06 13:25:53 -04:00
Jake McDermott
093f453073 don't render playbook_on_start events 2018-09-06 13:17:39 -04:00
Jake McDermott
0e696d0515 add destroy hook to index controller 2018-09-06 13:17:30 -04:00
Jake McDermott
c4a29ded1c use el.contents() to remove lines 2018-09-06 13:17:20 -04:00
Bill Nottingham
f402ff0ee7 Merge pull request #2972 from wenottingham/awx-apache
Add a license file for awx, for completeness purposes.
2018-09-05 13:04:35 -04:00
Bill Nottingham
b982793a3a Add a license file for awx, for completeness purposes. 2018-09-05 11:19:41 -04:00
Shane McDonald
b3f2f7efe5 Fix broken file ref 2018-09-05 00:06:11 -04:00
kialam
19f9a3f918 Merge pull request #2970 from kialam/fix/2969-empty-stdout
Detect if `stdout` field is null or undefined.
2018-09-04 14:11:44 -04:00
Bill Nottingham
4b2e709e8d Merge pull request #2967 from wenottingham/legal-beagles
Remove stale licenses, fix some name typos.
2018-09-04 11:53:46 -04:00
kialam
146590d0c2 Detect if stdout field is null or undefined. 2018-09-04 11:05:13 -04:00
Bill Nottingham
247ee4ddac Remove stale licenses, fix some name typos. 2018-08-31 13:32:25 -04:00
Ryan Petrello
2f2294b65a Merge pull request #2966 from ryanpetrello/fix-2950
fix LicenseForbids 401/402 precendence for other features
2018-08-31 12:00:50 -04:00
Ryan Petrello
ec873dd28c fix LicenseForbids 401/402 precendence for other features 2018-08-31 11:23:11 -04:00
Ryan Petrello
c2bd36e580 Merge pull request #2965 from ryanpetrello/fix-2950
workflow endpoints should return 401 on invalid credentials
2018-08-31 11:16:18 -04:00
Ryan Petrello
1f8736ce1d workflow endpoints should return 401 on invalid credentials
if you have a license that doesn't allow use of workflows, invalid
credentials yielded an HTTP 402; this commit changes the precedence

see: https://github.com/ansible/tower/issues/2950
2018-08-31 10:57:27 -04:00
Alan Rominger
50a9f0be6b Merge pull request #2960 from AlanCoding/bad_locks
Put atomic block inside lock block
2018-08-30 14:53:01 -04:00
Ryan Petrello
8f3c5be04e Merge pull request #2962 from ryanpetrello/fix-2952
fix a subtle bug in awx.main.access.OAuth2ApplicationAccess.can_read
2018-08-30 14:42:28 -04:00
Ryan Petrello
34ceaf4551 fix a subtle bug in awx.main.access.OAuth2ApplicationAccess.can_read
see: https://github.com/ansible/tower/issues/2952
2018-08-30 14:21:03 -04:00
AlanCoding
786e907e3b put atomic block inside lock block 2018-08-30 12:54:53 -04:00
Ryan Petrello
c5aa9ee12b Merge pull request #2959 from ryanpetrello/fix-2957
don't access the database in our custom route_for_task
2018-08-30 11:54:32 -04:00
Ryan Petrello
24f8cb49b5 don't access the database in our custom route_for_task
If database connectivity is lost/interrupted in this block of celery
internals, beat is *not* smart enough to recover, and it gets stuck in
an endless fail loop.  We don't _need_ to talk to the database here
anyways; just use settings.CLUSTER_HOST_ID to get what we need.

see: https://github.com/ansible/tower/issues/2957
2018-08-30 11:40:43 -04:00
Jake McDermott
54d967af0d Merge pull request #2947 from jakemcdermott/job-results/colormap
add basic colormap for output lines
2018-08-30 11:40:37 -04:00
Ryan Petrello
3c91370cab Merge pull request #2955 from ryanpetrello/fix-2951
write custom inventory scripts to AWX_PRIVATE_DATA_DIR
2018-08-30 09:25:42 -04:00
Bill Nottingham
e22dc3dc7b Merge pull request #2941 from wenottingham/come-to-the-source
Update sources to match versions... add a few missing LGPL ones.
2018-08-30 09:21:17 -04:00
Ryan Petrello
9ae41dc3ba write custom inventory scripts to AWX_PRIVATE_DATA_DIR
this makes it so that custom inventory scripts can access credential
files laid down in `/tmp/awx_N_<xyz>`

see: https://github.com/ansible/tower/issues/2951
2018-08-30 08:32:27 -04:00
Alan Rominger
f175d6dfae Merge pull request #2931 from AlanCoding/more_licenses_yay
Add missing API licenses
2018-08-30 08:09:51 -04:00
Ryan Petrello
34c659d8b6 Merge pull request #2945 from ryanpetrello/improved-instance-list
make awx-manage instance_list easier to read and more useful
2018-08-29 15:11:38 -04:00
Ryan Petrello
6eb406ac39 make awx-manage instance_list easier to read and more useful 2018-08-29 15:00:05 -04:00
Jake McDermott
cddceb0e06 add basic colormap for output lines 2018-08-29 13:28:05 -04:00
John Mitchell
a549bea815 Merge pull request #2944 from jlmitch5/uiGetLicenseScriptUpdate
Ui get license script update
2018-08-29 12:14:27 -04:00
Jake McDermott
860fbdad02 Merge pull request #2880 from jakemcdermott/fix-2828
add event discard with interactive discontinuities for high volume jobs
2018-08-29 04:01:04 -04:00
Jake McDermott
f639e46718 advance ready counter by an entire batch when event limit is reached 2018-08-29 03:03:24 -04:00
Michael Abashian
56dc08683e Merge pull request #2943 from mabashian/2930-notif-admin-v2
Exposes organization notification list to users with notification admin role
2018-08-28 17:25:44 -04:00
mabashian
148daec49b Remove console.log 2018-08-28 16:14:53 -04:00
John Mitchell
2d03938451 remove dev dependencies from docs/licenses/ui folder 2018-08-28 15:49:57 -04:00
John Mitchell
bc7b586803 updated automated ui get license script to only look for nondev deps 2018-08-28 15:49:06 -04:00
mabashian
1408200927 Exposes organization notification list to users with notification admin role 2018-08-28 15:47:28 -04:00
Bill Nottingham
3576e192f4 Update sources to match versions... add a few missing LGPL ones. 2018-08-28 14:47:20 -04:00
Ryan Petrello
70d930e019 Merge pull request #2940 from ryanpetrello/more-i18n
more UI i18n
2018-08-28 13:57:24 -04:00
Ryan Petrello
c69e41b261 more UI i18n
see: https://github.com/ansible/tower/issues/1383
2018-08-28 12:47:18 -04:00
Michael Abashian
2949efd6ec Merge pull request #2939 from mabashian/2930-notif-admin
Handle notification admin user type in the UI
2018-08-28 11:22:46 -04:00
mabashian
2592613bde Fixes unit test failures 2018-08-28 11:01:04 -04:00
Yanis Guenane
aa717a2728 CONTRIBUTING.md: Fixing ToC indendation and wrong links
The Table of Contents list indentation was wrongly indented for 'Running
the environment'.

Also, some links pointed to anchor that did not exist. The commit fixes
that.

Signed-off-by: Yanis Guenane <yguenane@redhat.com>
2018-08-28 10:53:17 +02:00
mabashian
de158cb41d Removes console.log 2018-08-27 17:33:35 -04:00
mabashian
f7737e2f94 Handle notification admin user type in the UI 2018-08-27 17:32:17 -04:00
Jake McDermott
4e45b6ba6d fix missing line styling 2018-08-27 17:17:48 -04:00
Ryan Petrello
5885654405 Merge pull request #2202 from rooftopcellist/pin_pluggy_awx
pin pluggy at 0.6.0
2018-08-27 17:15:29 -04:00
adamscmRH
227960e3ea pin pluggy at 0.6.0 2018-08-27 16:55:40 -04:00
Christian Adams
d6ba3e1fc2 Merge pull request #2938 from rooftopcellist/pin_pluggy
pin pluggy at 0.6.0
2018-08-27 16:46:55 -04:00
adamscmRH
2643a1b3d6 pin pluggy at 0.6.0 2018-08-27 16:13:24 -04:00
Ryan Petrello
6afb47789a Merge pull request #2936 from ryanpetrello/fix-1775
properly sanitize long event keys
2018-08-27 13:44:19 -04:00
Ryan Petrello
2acc488adf properly sanitize long event keys
see: https://github.com/ansible/tower/issues/1775
2018-08-27 13:40:26 -04:00
Michael Abashian
d0598e720d Merge pull request #2934 from mabashian/2933-search
Makes search filters additive again
2018-08-27 11:09:23 -04:00
Ryan Petrello
162ef08cef Merge pull request #2935 from mabashian/2873-first-last
Fixes bug removing first/last name from a user
2018-08-27 10:15:27 -04:00
Jake McDermott
aa0d2cff5c handle response data with discontinuities when using that data to fill other discontinuities 2018-08-27 01:38:02 -04:00
Jake McDermott
d608402dc1 refactor render service 2018-08-27 01:37:47 -04:00
Jake McDermott
04dbc2fcc4 add basic click handler for fetching and showing missing events 2018-08-27 01:37:36 -04:00
Jake McDermott
0bc9b1d431 render missing lines instead of auto-unfollowing 2018-08-27 01:37:28 -04:00
Jake McDermott
138f8a45ae moving render/record keeping and scroll functionality out of pagers 2018-08-27 01:37:18 -04:00
Jake McDermott
ee348b7169 add handling for discontinuities in render service 2018-08-27 01:37:11 -04:00
Jake McDermott
38b9b47e6b add max event count and discarding to stream service 2018-08-27 01:37:02 -04:00
Jake McDermott
2187655c68 move buffer mgmt to stream service 2018-08-27 01:36:52 -04:00
Jake McDermott
13203af353 Merge pull request #2921 from jakemcdermott/job-results/event-replay-skip-range
add option to job replay tool for skipping a range of job events
2018-08-25 22:54:46 -04:00
mabashian
4781df62ec Fixes bug removing first/last name from a user 2018-08-25 14:25:49 -04:00
mabashian
72372b3810 Makes search filters additive again 2018-08-25 14:00:24 -04:00
Alan Rominger
b742746e5d Merge pull request #2928 from AlanCoding/even_more_diff
Prefetch prior list of instances at start of policy calc task
2018-08-24 16:44:08 -04:00
AlanCoding
74fc0fef04 Manually pin reference list at start of pg_lock block 2018-08-24 15:28:28 -04:00
AlanCoding
bb8025c1af add missing API licenses 2018-08-24 15:16:56 -04:00
Michael Abashian
d824508cfb Merge pull request #2875 from mabashian/2868-lodash
Upgrades lodash to ~4.17.10
2018-08-24 13:27:07 -04:00
Ryan Petrello
077e541876 Merge pull request #2926 from ryanpetrello/deprecated-auth-token-helper
fix an auth-related typo in a docstring
2018-08-24 12:15:47 -04:00
Ryan Petrello
4561fd7270 fix an auth-related typo in a docstring 2018-08-24 11:56:11 -04:00
Ryan Petrello
50786f201f Merge pull request #2922 from ryanpetrello/deprecated-auth-token-helper
emulate /api/v2/authtoken/ to help customers transition to OAuth2.0
2018-08-24 11:40:47 -04:00
Ryan Petrello
5561eb30f7 emulate /api/v2/authtoken/ to help customers transition to OAuth2.0 2018-08-24 11:05:41 -04:00
Jake McDermott
e2c4fd5ebb add option for skipping counter slice range of events 2018-08-23 18:12:57 -04:00
John Mitchell
7226acb2b6 Merge pull request #2903 from jlmitch5/ui33Licenseifyer
add license grabbing script for ui deps
2018-08-23 16:53:12 -04:00
John Mitchell
7ef8e147f4 add license info about ui packages generated from script 2018-08-23 15:49:35 -04:00
John Mitchell
45db305e69 add script for generating ui license info in docs/licenses/ui 2018-08-23 15:49:01 -04:00
Ryan Petrello
52abb29091 Merge pull request #2919 from ryanpetrello/more-workflow-editor-i18n
sprinkle in more i18n translation for the workflow editor
2018-08-23 14:37:31 -04:00
Ryan Petrello
d564a268fd sprinkle in more i18n translation for the workflow editor
see: https://github.com/ansible/tower/issues/775
2018-08-23 14:07:15 -04:00
kialam
8280aff612 Merge pull request #2909 from kialam/fix/2836-part2
Fix Job Detail Stats Panel Title and Badge Whitespace with CSS modifier
2018-08-23 12:41:18 -04:00
Alan Rominger
b35d6b7425 Merge pull request #2911 from AlanCoding/mo_text
Document inventory script towervars
2018-08-23 09:18:36 -04:00
Ryan Petrello
7b692b0c31 Merge pull request #2913 from ryanpetrello/fix-2907
set the session cookie expiry *properly* on each request
2018-08-22 16:08:13 -04:00
Ryan Petrello
a271837007 set the session cookie expiry *properly* on each request
see: https://github.com/ansible/tower/issues/2907
2018-08-22 15:26:03 -04:00
AlanCoding
a3d0e10f51 remove added-in tags that reference old AWX 2018-08-22 15:17:47 -04:00
AlanCoding
5e8f7b76f1 document inventory script towervars 2018-08-22 15:16:39 -04:00
kialam
c67e9143fb Contain margins for stats panel with modifier
- Create CSS `—inline` modifier so that other areas where
`at-Panel-headingTitleBadge` are not affected.
2018-08-22 11:51:27 -04:00
Ryan Petrello
5abe045e6c Merge pull request #2908 from ryanpetrello/fix-2187
fix a bug that broke bot avatars for Slack notifications
2018-08-22 11:35:02 -04:00
Ryan Petrello
4bc63cc37e fix a bug that broke bot avatars for Slack notifications
when a *color* is specified for a Slack notification template, we use
the *web* not the RTM API; when you use a bot with the web API, you have
to specify the `as_user=True` argument to have the message use the bot's
name and avatar

see: https://github.com/ansible/tower/issues/2883
see: https://github.com/ansible/awx/issues/2187
2018-08-22 10:57:13 -04:00
Ryan Petrello
5cdd947196 Merge pull request #2870 from ryanpetrello/fix-2839
enforce 0 <= Instance.capacity_adjustment
2018-08-21 15:49:28 -04:00
Ryan Petrello
67d1267d98 enforce 0 <= Instance.capacity_adjustment
see: https://github.com/ansible/tower/issues/2839
2018-08-21 15:34:19 -04:00
Jake McDermott
66db615c0c Merge pull request #2888 from kialam/fix/2836
Adjust title and badge spacing on job output stats section.
2018-08-21 14:12:15 -04:00
Alan Rominger
598449c2ce Merge pull request #2882 from AlanCoding/just_credential2
[option2] move inventory source vault credential validation from view to model
2018-08-21 13:24:50 -04:00
kialam
4119c1dd0b Adjust title and badge spacing on job output stats section. 2018-08-21 10:51:31 -04:00
Ryan Petrello
2acf055f6a Merge pull request #2885 from ryanpetrello/fix-2874
apply sensitive field filtering to /api/v2/hosts/?host_filter
2018-08-21 10:43:52 -04:00
Ryan Petrello
4eeb62766e apply sensitive field filtering to /api/v2/hosts/?host_filter
see: https://github.com/ansible/tower/issues/2874
see: https://github.com/ansible/tower/issues/2889
2018-08-21 08:17:14 -04:00
Ryan Petrello
d995068396 Merge pull request #2895 from ryanpetrello/release_3.3.0
fix failing unit tests
2018-08-21 08:16:29 -04:00
Alan Rominger
ee139b306c Merge pull request #2881 from AlanCoding/log_cul_de_sacs
Change loggers from non-propagating to INFO filter
2018-08-21 07:36:52 -04:00
Ryan Petrello
a36b0061fa fix failing unit tests 2018-08-20 19:57:28 -04:00
Jake McDermott
eb0cf945cf Merge pull request #2860 from jakemcdermott/fix-2228
make line expand / collapse work for paginated scrollup
2018-08-20 13:12:52 -04:00
Jake McDermott
2e7ab57645 Merge pull request #2886 from jakemcdermott/job-results/line-search
enable output filtering by start / end line
2018-08-20 13:02:29 -04:00
Michael Abashian
d8f6c0aebc Merge pull request #2822 from mabashian/2819-prompt
Properly show prompt button when re-selecting a node with promptable fields
2018-08-20 12:45:38 -04:00
Jake McDermott
f8e5e38614 enable output filtering by start / end line 2018-08-20 12:40:27 -04:00
AlanCoding
3f841180da Change loggers from non-propagating to INFO filter 2018-08-20 09:02:55 -04:00
AlanCoding
9a85578925 move inv src vault cred validation from view to model 2018-08-20 08:53:55 -04:00
mabashian
f1e0c1e977 Upgrades lodash to ~4.17.10 2018-08-17 15:59:27 -04:00
Shane McDonald
1b8cb45024 Update translations 2018-08-17 13:56:34 -04:00
Bill Nottingham
fb9e508b6b Merge pull request #2857 from shanemcd/release_3.3.0
Fix / improve minishift dev env playbook
2018-08-17 13:19:24 -04:00
Ryan Petrello
0868f97335 Merge pull request #2866 from ryanpetrello/ci-for-missing-migrations
fail CI if the change includes model changes that are missing migrations
2018-08-17 08:41:46 -04:00
Ryan Petrello
30fbeb43bb fail CI if the change includes model changes that are missing migrations 2018-08-16 17:43:32 -04:00
mabashian
d2aea30d3d Add check for ask_variables_on_launch when determining whether to show prompt button 2018-08-16 15:41:15 -04:00
mabashian
cdb347cba5 Properly show prompt button when re-selecting a node with promptable fields 2018-08-16 15:41:15 -04:00
Ryan Petrello
c95c7c8b18 Merge pull request #2865 from ryanpetrello/fix-mystery-migrations
fix up remaining Django migrations
2018-08-16 15:03:36 -04:00
Ryan Petrello
14043f792a fix up remaining Django migrations
these don't really change anything in the schema; they just look like
Django ORM idiosyncrancies that `makemigrations` needs to be happy

see: https://github.com/ansible/tower/issues/2203
2018-08-16 13:59:06 -04:00
Christian Adams
9632f3b69e Merge pull request #2847 from rooftopcellist/fix_actstream_migration
Fix a variety of missing migrations
2018-08-16 13:32:53 -04:00
adamscmRH
da1da6f530 Fix oauth and std out mystery migrations 2018-08-16 13:08:45 -04:00
Jared Tabor
5b93007ba1 Merge pull request #2838 from jaredevantabor/fix-765
Checking for undefined default survey answers
2018-08-16 09:20:42 -07:00
Ryan Petrello
e87633f1d8 Merge pull request #2859 from ryanpetrello/shhhhhhhhhhhhhhhhhhhhhhhhhh
make inventory updates considerably less verbose by default
2018-08-16 09:34:14 -04:00
Jake McDermott
ca35eb39d2 make line expand / collapse work for paginated scrollup 2018-08-15 21:24:44 -04:00
Jared Tabor
5d84863237 Merge pull request #2856 from Haokun-Chen/2831
add max-height to job output console at breakpoint
2018-08-15 15:05:46 -07:00
Jared Tabor
f4728149d9 Changes max height of stdout panel for skinny browser widths 2018-08-15 14:44:03 -07:00
Ryan Petrello
4c7c8b6db3 make inventory updates considerably less verbose by default
see: https://github.com/ansible/tower/issues/2858
2018-08-15 16:04:15 -04:00
Ryan Petrello
db8ee2810a Merge pull request #2854 from ryanpetrello/more-custom-venv-help
provide friendlier help messages if you set up custom venvs wrong
2018-08-15 15:57:15 -04:00
Ryan Petrello
5ba8bbb08b Merge pull request #2855 from ryanpetrello/what-the-fork
close DB and cache sockets _immediately_ before we fork callback workers
2018-08-15 15:56:18 -04:00
Ryan Petrello
87adfe5889 close DB and cache sockets _immediately_ before we fork callback workers 2018-08-15 15:10:08 -04:00
Shane McDonald
07cb2aa9bb Fix / improve minishift dev env playbook
- Redo how we detect / set the minishift path
- Log into the correct admin account, once.
- Make sure commands that fail cause tasks to fail (s/;/&&/)
2018-08-15 15:01:40 -04:00
Shane McDonald
19c5564ec8 Update translation strings 2018-08-15 14:56:58 -04:00
Haokun-Chen
e05d071dab add max-height to job output console at breakpoint 2018-08-15 14:29:32 -04:00
Ryan Petrello
6ba1b170d2 provide friendlier help messages if you set up custom venvs wrong 2018-08-15 14:11:48 -04:00
Ryan Petrello
63d7abc7e4 Merge pull request #2853 from ryanpetrello/fix-2852
show a better error when a custom venv doesn't exist on an isolated node
2018-08-15 13:59:11 -04:00
Ryan Petrello
b318fa7814 Merge pull request #2851 from ryanpetrello/fix-2843
show custom_virtualenvs at /api/v2/config if you have Project/Org access
2018-08-15 13:40:44 -04:00
Ryan Petrello
5f6907ba83 show a better error when a custom venv doesn't exist on an isolated node
see: https://github.com/ansible/tower/issues/2852
2018-08-15 13:31:25 -04:00
Ryan Petrello
cffa324762 show custom_virtualenvs at /api/v2/config if you have Project/Org access
see: https://github.com/ansible/tower/issues/2843
2018-08-15 13:12:12 -04:00
Yunfan Zhang
b690e61576 Merge pull request #2849 from YunfanZhang42/release_3.3.0
Prevent implicit project updates from blocking jobs.
2018-08-15 12:13:11 -04:00
Shane McDonald
ae207b5f33 Merge pull request #2175 from shanemcd/kubernetes-fun
Pull in downstream k8s installer changes
2018-08-15 11:51:42 -04:00
Yunfan Zhang
5c23c63e6d Prevent implicit project updates from blocking jobs.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-08-15 11:48:58 -04:00
Haokun Chen
3a133836dc Merge pull request #2833 from Haokun-Chen/2829
fixed build anchor for application in activity stream
2018-08-15 10:40:06 -04:00
Ryan Petrello
ab7cc88caf Merge pull request #2845 from ryanpetrello/remove-named-url-note
remove extraneous OPTIONS content re: the new named URL feature
2018-08-15 10:23:32 -04:00
Ryan Petrello
3b997cdd3a remove extraneous OPTIONS content re: the new named URL feature 2018-08-15 10:22:42 -04:00
Ryan Petrello
59f246d297 Merge pull request #2841 from ryanpetrello/indexes-for-new-events
add indexes for new events
2018-08-14 22:41:39 -04:00
Jake McDermott
14a8258835 Merge pull request #2842 from jakemcdermott/fix-2837
hide counter badges for output only jobs
2018-08-14 17:13:45 -04:00
Jake McDermott
897fb96f94 hide counter badges for output only jobs 2018-08-14 17:12:50 -04:00
Ryan Petrello
79a29ebcc8 add indexes for new event types
not sure why this didn't happen in the original migration that was
generated - may be related to differences in behavior across Django
versions?
2018-08-14 16:57:13 -04:00
Jared Tabor
950e4dab04 Checking for undefined default survey answers 2018-08-14 13:23:06 -07:00
Haokun-Chen
ab82cc3ba3 fixed build anchor for application in activity stream 2018-08-14 14:46:45 -04:00
Jared Tabor
93a8a952f1 Merge pull request #2806 from jaredevantabor/fix-2796
Fix 2796
2018-08-14 10:49:26 -07:00
Shane McDonald
2b9954c373 Pull in downstream k8s installer changes
- Secretification of secret stuff
- Backup / restore
2018-08-14 12:37:19 -04:00
Haokun Chen
21f0c1d1d7 Merge pull request #2832 from Haokun-Chen/fixed-sanitize-output
fixed
2018-08-14 12:09:52 -04:00
Haokun-Chen
379979511b fixed 2018-08-14 11:46:31 -04:00
Shane McDonald
2e6a7205e7 Fix broken conditional 2018-08-14 11:19:15 -04:00
Matthew Jones
14685901aa skip migrations If an environment variable is set
This is to help k8s/openshift migrations which will perform migrations
in a separate pod.
2018-08-14 11:00:51 -04:00
Haokun Chen
15480a56db Merge pull request #2820 from Haokun-Chen/2815
show client id and secret when create application
2018-08-13 16:30:34 -04:00
Haokun-Chen
9f54ba069e show client id and secret when create application 2018-08-13 15:54:57 -04:00
kialam
42f01b7f05 Use latest version of nvd3 instead
- Replace forked version in favor of latest version from NOVUS.
2018-08-13 14:49:25 -04:00
kialam
6cf1fb3c10 Update node and nom to LTS version 2018-08-13 14:46:00 -04:00
Christian Adams
03058cd1e8 Merge pull request #2824 from rooftopcellist/test_refresh_token
Test refresh token
2018-08-13 14:03:35 -04:00
Jake McDermott
a30c2fe227 Merge pull request #2817 from jakemcdermott/job-results/_debug-mode
add event replay mode to ui for finished jobs
2018-08-13 13:41:03 -04:00
Jake McDermott
d8e890b651 Merge pull request #2826 from jakemcdermott/fix-2818
fix handling for potentially missed events on initialization
2018-08-13 13:40:20 -04:00
Jake McDermott
95735ee01a Merge pull request #2827 from jakemcdermott/job-results/performance-testing
performance / ux scrolling fixes for higher volume jobs
2018-08-13 13:40:00 -04:00
Shane McDonald
047b5755bf Merge pull request #2170 from matburt/fix_web_wait_deployment
Add some env variables to the web deployment
2018-08-13 13:32:22 -04:00
Matthew Jones
4dcd379d1e Add some env variables to the web deployment
This allows the start script to properly wait on services to come
online rather than getting stuck and waiting for the full timeout
2018-08-13 13:27:00 -04:00
adamscmRH
61931d0b6c add RefreshToken tests 2018-08-13 10:08:08 -04:00
Jake McDermott
516607551c show follow tip on first auto scroll hide 2018-08-12 19:35:59 -04:00
Jake McDermott
5e974d84b6 fix handling for missed events on initialization 2018-08-12 17:44:11 -04:00
Jake McDermott
91bc39be6b performance / ux improvements for higher volume jobs 2018-08-12 17:29:30 -04:00
kialam
49222d5e72 Merge pull request #2821 from kialam/fix/2797
Fix missing Prompt button for Extra Vars in WF Visualizer
2018-08-10 11:06:43 -07:00
kialam
686e5ac545 Handle extra vars case for "Prompt" button in WF visualizer. 2018-08-10 13:33:43 -04:00
Ryan Petrello
8723508225 fix failing tests related to 2c4f7911a6 2018-08-10 12:45:35 -04:00
Ryan Petrello
18f6f68540 Merge remote-tracking branch 'tower/release_3.3.0' into devel 2018-08-10 11:54:34 -04:00
Ryan Petrello
c85dd25135 Merge pull request #2814 from ryanpetrello/fix-2805
redact sensitive URLs from stdout at /api/v2/project_updates/N/events/
2018-08-10 10:35:53 -04:00
Jake McDermott
0c3d6e7c33 add testing section for job events 2018-08-10 01:16:02 -04:00
Jake McDermott
e1b7e7f6ce add event replay mode 2018-08-10 01:15:41 -04:00
Chris Meyers
a34d8eba06 Merge pull request #2158 from chrismeyersfsu/fix-net_creds
Fix net creds
2018-08-09 23:45:53 -04:00
Ryan Petrello
cdeea54a07 Merge pull request #2160 from ryanpetrello/devel
more issue template tinkering
2018-08-09 23:10:50 -04:00
Ryan Petrello
b1074aeb56 more issue template tinkering 2018-08-09 23:08:18 -04:00
Ryan Petrello
e9cbe4fe05 Merge pull request #2159 from ryanpetrello/devel
Add more detailed issue templates
2018-08-09 23:05:25 -04:00
Ryan Petrello
593c436a09 Update issue templates 2018-08-09 23:02:50 -04:00
Ryan Petrello
999ddf458a Add more detailed issue templates. 2018-08-09 23:00:56 -04:00
chris meyers
c7c9620f03 vary the pk 2018-08-09 17:53:31 -04:00
chris meyers
45f2fe7f90 add test for first net cred ssh password protected wins 2018-08-09 17:53:23 -04:00
chris meyers
3960a72c8a first net password-protected ssh key wins 2018-08-09 17:53:13 -04:00
chris meyers
bc2b2214a8 add test for ssh over network ssh key password preference 2018-08-09 17:53:06 -04:00
chris meyers
3c2b18a965 add pexpect test for net cred 2018-08-09 17:52:55 -04:00
chris meyers
f5aed74503 fill in network ssh password protected keys 2018-08-09 17:52:45 -04:00
Chris Meyers
439e4fc138 Merge pull request #2811 from chrismeyersfsu/fix-network_encrypted_ssh_keys
fill in network ssh password protected keys
2018-08-09 17:49:59 -04:00
Christian Adams
71beb9a257 Merge pull request #2810 from rooftopcellist/hide_app_client_secret
hide client_secret from API
2018-08-09 17:44:12 -04:00
Ryan Petrello
d95f1283b5 redact sensitive URLs from stdout at /api/v2/project_updates/N/events/
see: https://github.com/ansible/tower/issues/2805
2018-08-09 17:31:09 -04:00
chris meyers
5bfe9bf228 vary the pk 2018-08-09 15:44:59 -04:00
chris meyers
40d6c763b3 add test for first net cred ssh password protected wins 2018-08-09 13:32:42 -04:00
chris meyers
2f49dc774a first net password-protected ssh key wins 2018-08-09 13:25:15 -04:00
chris meyers
8d440acb0f add test for ssh over network ssh key password preference 2018-08-09 12:51:40 -04:00
chris meyers
9a199b99ac add pexpect test for net cred 2018-08-09 12:40:37 -04:00
chris meyers
48a0038f53 fill in network ssh password protected keys 2018-08-09 12:15:27 -04:00
adamscmRH
1bc83b488b hide client_secret from API 2018-08-09 11:27:39 -04:00
Yunfan Zhang
5f0b34de38 Merge pull request #2769 from YunfanZhang42/release_3.3.0
Do not create refresh tokens for apps with implicit grant type
2018-08-09 10:50:12 -04:00
Alan Rominger
fad568c960 Merge pull request #2801 from AlanCoding/register_queue
Only add instances to policy list via CLI command
2018-08-09 10:43:21 -04:00
Shane McDonald
61c21c5ac0 Merge pull request #2808 from wwitzel3/release_3.3.0
disable computed for create preload data mgmt cmd
2018-08-09 10:14:52 -04:00
Wayne Witzel III
89642a449f disable computed for create preload data mgmt cmd 2018-08-09 10:11:37 -04:00
Bill Nottingham
bb5aeb5cf1 Merge pull request #2133 from wenottingham/do-you-like-beans
Add some more descriptive survey defaults.
2018-08-09 09:52:55 -04:00
AlanCoding
df05cff850 only add instances to policy list via CLI command 2018-08-09 09:32:09 -04:00
Dennis U
a294a6f06e Bugfix for ca_trust_dir
Changed syntax as ca_trust_dir was not correctly mounted in awx_web container and added command to update CA trust inside awx_web container after creation.
2018-08-09 14:07:29 +02:00
Jake McDermott
41f88fd2f6 Merge pull request #2740 from jakemcdermott/fix-2241
implement auto-follow-scroll behavior for job output
2018-08-08 22:43:45 -04:00
Jake McDermott
80d6b0167c implement output follow-scroll behavior 2018-08-08 22:42:21 -04:00
Jared Tabor
97c8005d00 Moves minimum idle time to 61 seconds (so that user can't type 60) 2018-08-08 17:09:04 -07:00
Yunfan Zhang
02db543848 Do not create refresh tokens for apps with implicit grant type.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-08-08 17:37:02 -04:00
Jake McDermott
fed729f101 rewrite output scrolling service 2018-08-08 15:15:58 -04:00
Jake McDermott
4c3370bd34 move constants to a file 2018-08-08 15:15:58 -04:00
Jared Tabor
86a1f9c0ad Merge pull request #2779 from jaredevantabor/fix-2778
Sanitizes text in toast message for copying resources
2018-08-08 10:40:32 -07:00
John Mitchell
dc9f3b2b51 Merge pull request #2784 from jlmitch5/fixClusterLicenseInfo
use post response if config get request erroneously doesnt have licen…
2018-08-08 10:38:36 -04:00
Wayne Witzel III
9b5cd4aa62 Merge pull request #2789 from AlanCoding/running_wfjts
Add current workflow job to running list
2018-08-08 08:47:07 -04:00
AlanCoding
7aa7cc1c98 add current workflow job to running list 2018-08-08 07:49:02 -04:00
Jared Tabor
33fa75ea89 Sanitizes ng-toast message for copy resources (via string file) 2018-08-07 19:03:05 -07:00
Ryan Petrello
bd79a5328f Merge pull request #2788 from ryanpetrello/fix-2782
fix a bug in isolated job launches when there are no controllers online
2018-08-07 20:16:56 -04:00
Ryan Petrello
91c92d57e3 fix a bug in isolated job launches when there are no controllers online
see: https://github.com/ansible/tower/issues/2782
2018-08-07 17:27:23 -04:00
Michael Abashian
7b9f01aaec Merge pull request #2783 from mabashian/2774-workflow-labels
Propagate label length validation to workflow form
2018-08-07 16:54:11 -04:00
Michael Abashian
c7cc05747f Merge pull request #2787 from mabashian/fix-e2e-tests
Fixes e2e test failure checking copy wf warning title
2018-08-07 16:53:55 -04:00
mabashian
0a78bdcf28 Added expect that was accidentally removed 2018-08-07 16:29:19 -04:00
mabashian
273754dc79 Removes redundant maxCount declaration 2018-08-07 16:24:51 -04:00
Michael Abashian
a9b6d42af5 Merge pull request #2776 from mabashian/2669-instance-list-search
Remove page_size from instance list search params
2018-08-07 16:15:05 -04:00
mabashian
7f6ab4f60b Fixes e2e test failure checking copy wf warning title 2018-08-07 15:59:46 -04:00
John Mitchell
df42a65504 use post response if config get request erroneously doesnt have license_info 2018-08-07 15:52:09 -04:00
mabashian
c7466ce449 Wraps label count validation in function 2018-08-07 14:27:04 -04:00
Jared Tabor
d1f37ad1af Merge pull request #2765 from jaredevantabor/fix-2748
Improves error handling of applications page form
2018-08-07 11:07:32 -07:00
mabashian
eb8c1d2c78 Fix comment 2018-08-07 13:55:15 -04:00
mabashian
f548e36ad7 Propagate label length validation to workflow form 2018-08-07 13:53:12 -04:00
Jared Tabor
cd177501b9 Adds catch block to catch 404 case on applications form page 2018-08-07 10:23:15 -07:00
Jared Tabor
b9e95b1158 Expands the error handling capabilities for __all__ errors 2018-08-07 10:14:53 -07:00
John Mitchell
d7a9d76d25 Merge pull request #2775 from jlmitch5/fixInstanceGroups404
Fix instance groups 404
2018-08-07 12:58:55 -04:00
Ryan Petrello
c4d9b92d79 Merge pull request #2773 from ryanpetrello/openshift-saml
set the correct X-Forwarded-Port header to fix SAML auth
2018-08-07 12:26:51 -04:00
Haokun Chen
2c9ce5ae56 Merge pull request #2777 from Haokun-Chen/2771
add headerState to status icon in job-list page
2018-08-07 11:47:10 -04:00
Haokun-Chen
412d87239c add headerState to status icon in job-list page 2018-08-07 11:39:18 -04:00
mabashian
2b3a61226b Remove page_size from instance list search params 2018-08-07 11:18:14 -04:00
John Mitchell
768d737153 fix 404 for instance groups 2018-08-07 10:53:53 -04:00
Ryan Petrello
2d4fbffb91 set the correct X-Forwarded-Port header to fix SAML auth
see: https://github.com/ansible/tower/issues/2314
2018-08-07 10:07:06 -04:00
Shane McDonald
1c32df0fcd Move django-oauth-toolkit into requirements_git.txt
All SCM based requirements need to go into this file because of how we built Ansible Tower (offline).
2018-08-06 19:00:54 -04:00
Jared Tabor
b28cdf4a63 Merge pull request #2767 from jaredevantabor/dep-lockdown
Dep lockdown
2018-08-06 13:41:41 -07:00
Jared Tabor
d776e9de0e Updates npm-shrinkwrap.json after networkUI deps removal 2018-08-06 12:53:14 -07:00
Ryan Petrello
9193125cc1 Merge pull request #2764 from ryanpetrello/dot-fork
pin django-oauth-toolkit to our fork w/ a security fix
2018-08-06 15:45:42 -04:00
Ryan Petrello
87d6940158 pin django-oauth-toolkit to our fork w/ a security fix
see: https://github.com/jazzband/django-oauth-toolkit/issues/625
2018-08-06 14:54:46 -04:00
kialam
4800b4455f Merge pull request #2753 from kialam/fix/1475-long-label-error
Client-side validation of Label field in Job Template form
2018-08-06 13:54:49 -04:00
kialam
64caeeff36 Restore missing API form errors for selects. 2018-08-06 13:27:59 -04:00
kialam
b0586cc197 Remove unused CSS. 2018-08-06 12:26:43 -04:00
kialam
6e49c25cfd Adjust error message copy. 2018-08-06 12:24:05 -04:00
kialam
efc8991aa8 Move error message to underneath form field for consistent UI. 2018-08-06 11:48:18 -04:00
kialam
0fb98642d4 Only show the character limit if the user exceeds it 2018-08-06 11:48:18 -04:00
kialam
7207d7caf4 Validate JT add and edit forms client-side
- Use form generator to add new `helperText` field to show the
character limit next to the label in the UI
- Style helper text like the checkbox text
- Update both `add` and `edit` controllers to handle client-side
validation for the `labels` field.
2018-08-06 11:48:18 -04:00
kialam
21c364d14c Adjust edit template controller to handle deferred promise errors 2018-08-06 11:48:18 -04:00
Ryan Petrello
21f29983bb Merge pull request #2762 from ryanpetrello/fix-2759
check oauth_scopes in _every_ view
2018-08-06 11:35:36 -04:00
Ryan Petrello
ec735b7b47 check oauth_scopes in _every_ view
see: https://github.com/ansible/tower/issues/2759
2018-08-06 11:05:59 -04:00
Ryan Petrello
fc589389fc Merge pull request #2758 from ryanpetrello/fix-insights
fix to handle nonexistent system_id
2018-08-06 09:24:46 -04:00
walkafwalka
d2ab7bd54d Add inventory vars to set docker install hostnames
Signed-off-by: walkafwalka <41709139+walkafwalka@users.noreply.github.com>
2018-08-04 01:49:07 -07:00
Ryan Petrello
7df027f826 fix to handle nonexistent system_id 2018-08-03 16:08:40 -04:00
Shane McDonald
090b3fad8e Update translation template files 2018-08-03 15:07:19 -04:00
Ryan Petrello
ad38bfbbe5 Merge pull request #2755 from ryanpetrello/fix-2751
fix up a minor OAuth2 token serializer nit
2018-08-03 15:01:28 -04:00
Jared Tabor
90c34f6293 Merge pull request #2736 from jaredevantabor/i18n
I18n and more translations
2018-08-03 11:59:59 -07:00
Ryan Petrello
a3566b4270 fix up a minor OAuth2 token serializer nit
see: https://github.com/ansible/tower/issues/2751
2018-08-03 14:50:37 -04:00
Jared Tabor
1986efebda More Translations 2018-08-03 11:32:02 -07:00
Bill Nottingham
cfc0779fdd Add some more descriptive survey defaults. 2018-08-03 14:12:09 -04:00
Alan Rominger
c2f60f35b4 Merge pull request #2733 from AlanCoding/policy_changes_test
Apply policy task more selectively
2018-08-03 10:59:53 -04:00
Michael Abashian
fba5dbcc80 Merge pull request #2745 from mabashian/form-ids
Adds id's to all form groups and new forms
2018-08-03 09:14:19 -04:00
AlanCoding
a99ebbb02f Apply policy task more selectively 2018-08-03 06:56:15 -04:00
Matthew Jones
d40d9f8675 Merge pull request #2126 from walkafwalka/slack_backend_web_api
Standardize Slack backend API method
2018-08-02 15:36:09 -04:00
Yunfan Zhang
6f54f59485 Merge pull request #2746 from YunfanZhang42/fix-license-error
Fixing incorrect license_error value in inventory_sync
2018-08-02 15:20:35 -04:00
Ryan Petrello
082d807007 Merge pull request #2747 from ryanpetrello/isolated-set-stat
set_stats fails in callback plugin on isolated node #2123
2018-08-02 15:20:14 -04:00
Yunfan Zhang
7001c67c84 Fixing incorrect license_error value in inventory_sync.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-08-02 14:19:13 -04:00
U-AD001\U317788
a562d9ae0c set_stats fails in callback plugin on isolated node #2123
Signed-off-by: U-AD001\U317788 <U317788@L7668YGH2.AD001.InfoFTPS.COM>
2018-08-02 13:27:56 -04:00
Ryan Petrello
62a452e66a Merge pull request #2124 from Rthur/RThur
set_stats fails in callback plugin on isolated node #2123
2018-08-02 13:27:39 -04:00
mabashian
bc49c879b4 Fix linting error 2018-08-02 12:48:32 -04:00
Wayne Witzel III
95a9e1a7b6 Merge pull request #2737 from wwitzel3/release_3.3.0
unless allow_simultaneous do not start workflow jobs already running
2018-08-02 12:37:46 -04:00
Shane McDonald
f6aee3dd41 Fix error in Dutch translation file 2018-08-02 12:30:16 -04:00
mabashian
8523b56707 Adds id's to all form groups and new forms 2018-08-02 12:28:45 -04:00
Jared Tabor
45c067b599 Merge pull request #2722 from YunfanZhang42/search-filter
Add AND filter to related search
2018-08-02 09:10:30 -07:00
Wayne Witzel III
74ed1c2c40 fetch running workflow jobs once per process 2018-08-02 11:46:38 -04:00
Shane McDonald
c97edaf9e0 Merge pull request #2744 from shanemcd/release_3.3.0
Fix syntax in nginx config
2018-08-02 11:26:49 -04:00
Shane McDonald
be7a40daf3 Fix syntax in nginx config
Broke in 6f5259d017
2018-08-02 11:24:51 -04:00
Shane McDonald
b8a51244e4 Extract latest strings 2018-08-02 11:23:32 -04:00
Shane McDonald
3cc35fc598 Pull updated localization files 2018-08-02 11:23:32 -04:00
Ryan Petrello
1cd75cf414 Merge pull request #2742 from ryanpetrello/fix-2738
simpilfy LDAP GROUP_SEARCH misconfiguration failure handling
2018-08-02 10:28:27 -04:00
Ryan Petrello
27f4e487ec simpilfy LDAP GROUP_SEARCH misconfiguration failure handling 2018-08-02 10:11:18 -04:00
John Mitchell
9131577355 Merge pull request #2721 from jlmitch5/fixJTSaveCompletedDeferring
make credential association cause deferral of jt promise chain
2018-08-02 09:45:19 -04:00
Ryan Petrello
a13712074f Merge pull request #2739 from ryanpetrello/fix-2738
fix a bug in multi-LDAP authentication
2018-08-02 08:27:13 -04:00
walkafwalka
0b9726a3ed Standardize Slack backend API method
Signed-off-by: walkafwalka <41709139+walkafwalka@users.noreply.github.com>
2018-08-02 05:31:38 +00:00
Jared Tabor
f6a960d8f4 Changes the encodeQuerysetObject function for the job details search widget
With this change, the stdout search will perform a search like search=A,B
instead of search=A&search=B
2018-08-01 20:59:37 -07:00
Yunfan Zhang
b191f6cfc3 Add AND filter to related search.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-08-01 19:43:57 -07:00
Jared Tabor
6b64ef8f64 Changes a related search w/ two search params.
Changes from using a pattern like "search=A&search=B" to "search=A,B".
2018-08-01 19:43:41 -07:00
U-AD001\U317788
01f9ba0486 set_stats fails in callback plugin on isolated node #2123
Signed-off-by: U-AD001\U317788 <U317788@L7668YGH2.AD001.InfoFTPS.COM>
2018-08-01 17:32:50 -05:00
Ryan Petrello
2102c1ef0a fix a bug in multi-LDAP authentication
see: https://github.com/ansible/tower/issues/2738
2018-08-01 17:55:13 -04:00
Wayne Witzel III
da603dd3ad use workflow_template_id 2018-08-01 15:55:19 -04:00
Wayne Witzel III
c96cf3cf5d unless allow_simultaneous, do not start workflow jobs that are already running 2018-08-01 14:53:00 -04:00
Jake McDermott
c09a23f063 Merge pull request #2734 from ansible/jakemcdermott-patch-e2e-1
update credential form type selector
2018-08-01 11:42:06 -04:00
Jake McDermott
45072b54f0 update credential form type selector 2018-08-01 11:01:38 -04:00
Ryan Petrello
0f66de2de9 Merge pull request #2732 from ryanpetrello/fix-2731
sprinkle some more i18n love for the credential form
2018-07-31 22:43:31 -04:00
Ryan Petrello
0a400ca339 sprinkle some more i18n love for the credential form
see: https://github.com/ansible/tower/issues/2731
2018-07-31 22:13:17 -04:00
walkafwalka
e02e8994ad Allow autocomplete on the AWX login page
Signed-off-by: walkafwalka <41709139+walkafwalka@users.noreply.github.com>
2018-08-01 00:21:38 +00:00
Ryan Petrello
ed79a7fc12 Merge pull request #2726 from ryanpetrello/fix-2690
prevent host deletion when the related inventory is pending deletion
2018-07-31 16:49:17 -04:00
Alan Rominger
0c0d5d4eba Merge pull request #2719 from AlanCoding/differential_policy
Apply policy results differentially
2018-07-31 16:25:14 -04:00
Ryan Petrello
5610cbe735 prevent host deletion when the related inventory is pending deletion
see: https://github.com/ansible/tower/issues/2690
2018-07-31 15:54:46 -04:00
Alan Rominger
9ff249f5c4 Merge pull request #2438 from AlanCoding/ask_user_input_creds
Ask user input if credential prompting enabled
2018-07-31 15:48:19 -04:00
Ryan Petrello
0c53a0c0a4 Merge pull request #2717 from ryanpetrello/fix-2180
allow access to JT labels if you have read access to the JT
2018-07-31 15:28:24 -04:00
Ryan Petrello
0aaa3807a9 allow access to JT labels if you have read access to the JT
see: https://github.com/ansible/tower/issues/2180
2018-07-31 15:13:24 -04:00
AlanCoding
8eaae97768 Apply policy results differentially
This avoids client-side scripting problems
where they grab the instance list during the
re-calculation which leads to incorrect assumptions
2018-07-31 15:03:36 -04:00
Ryan Petrello
f18be1c83a Merge pull request #2724 from ryanpetrello/more-network-ui
more network UI cleanup (whoops)
2018-07-31 15:00:35 -04:00
Ryan Petrello
8e3b72e1e5 more network UI cleanup (whoops) 2018-07-31 14:53:11 -04:00
John Mitchell
54422d74d0 make credential association cause deferral of jt promise chain 2018-07-31 13:26:59 -04:00
Yunfan Zhang
9cdee4f75c Merge pull request #2711 from YunfanZhang42/add_instance_groups_to_activity_stream
Add instance groups to activity stream.
2018-07-31 13:17:22 -04:00
Yunfan Zhang
f9309c9cd9 Add instance groups to activity streams.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-07-31 11:01:29 -04:00
Alan Rominger
0004c42f6d Merge pull request #2628 from AlanCoding/all_projects
Apply lock file to all project updates
2018-07-31 10:36:12 -04:00
Ryan Petrello
ef242483b3 Merge pull request #2716 from ryanpetrello/fix-fail-workflow-on-missing-jt
set workflow status to failed if we find a node w/ a missing UJT
2018-07-31 08:19:39 -04:00
Ryan Petrello
cc574be657 Merge pull request #2708 from ryanpetrello/remove-network-ui
remove the network UI
2018-07-31 08:18:13 -04:00
Bill Nottingham
80abe4b937 Merge pull request #2387 from wenottingham/certificates-for-everyone
Require certpair for SAML.
2018-07-30 22:32:05 -04:00
Alan Rominger
ebfae01aaa Merge pull request #2712 from AlanCoding/easy_way
[openstack option 2] cherry pick only openstack critical fix for empty group
2018-07-30 19:23:08 -04:00
Ryan Petrello
184db58fa3 set workflow status to failed if we find a node w/ a missing UJT
see: https://github.com/ansible/tower/issues/2576
2018-07-30 16:37:24 -04:00
Michael Abashian
55d1f5c11c Merge pull request #2706 from mabashian/2692-empty-search-list
Disable search submit until a search string is present
2018-07-30 15:16:18 -04:00
Ryan Petrello
a3040d60d9 Merge pull request #2714 from ryanpetrello/fix-2643
fail immediately if an isolated host is unreachable at launch time
2018-07-30 14:34:54 -04:00
Ryan Petrello
2216cd7c83 Merge pull request #2715 from ryanpetrello/fix-2612
add some additional validation to JT.credentials
2018-07-30 14:34:20 -04:00
Marliana Lara
8e16bf238d Merge pull request #2707 from marshmalien/fix/instance-modal-pagination
Fix instance modal pagination and smart-search
2018-07-30 14:16:36 -04:00
Ryan Petrello
b99f211c7e add some additional validation to JT.credentials
see: https://github.com/ansible/tower/issues/2612
2018-07-30 14:08:27 -04:00
Ryan Petrello
aee986d53c fail immediately if an isolated host is unreachable at launch time
see: https://github.com/ansible/tower/issues/2643
2018-07-30 12:40:26 -04:00
Ryan Petrello
6e3686bfc9 Merge pull request #2709 from ryanpetrello/fix-2671
redact the license key from settings.LICENSE activity stream entries
2018-07-30 12:28:48 -04:00
Ryan Petrello
4b0f99ab96 Merge pull request #2704 from ryanpetrello/fix-2465
fix a bug that causes orphaned auth_user rows when LDAP is misconfigured
2018-07-30 12:28:20 -04:00
Ryan Petrello
1a1b9e9138 redact the license key from settings.LICENSE activity stream entries
see: https://github.com/ansible/tower/issues/2671
2018-07-30 11:43:42 -04:00
AlanCoding
415f91dca0 cherry pick only openstack critical fix for empty group 2018-07-30 11:35:21 -04:00
Marliana Lara
77334af55a Fix instance modal pagination and search 2018-07-30 11:33:26 -04:00
Ryan Petrello
6f5259d017 remove the network UI 2018-07-30 11:03:53 -04:00
Christian Adams
5a7b519101 Merge pull request #2705 from rooftopcellist/oauth2_typo
fix OAuth typos
2018-07-30 10:42:54 -04:00
adamscmRH
1303f3f82f fix OAuth typos 2018-07-30 10:23:27 -04:00
mabashian
ba075ce5dd Disable search submit until a search string is present 2018-07-30 10:23:12 -04:00
Ryan Petrello
78eb0444ae fix a bug that causes orphaned auth_user rows when LDAP is misconfigured
see: https://github.com/ansible/tower/issues/2465
2018-07-30 09:59:20 -04:00
Ryan Petrello
681d64c96f Merge pull request #2703 from ryanpetrello/simplify-dynamic-queues
simplify dynamic queue binding
2018-07-30 09:25:44 -04:00
Ryan Petrello
3cdd0a94bd simplify dynamic queue binding
we recently made a change so that instances no longer bind to
instance-group specific queues, but now instead they each bind to
a direct queue for their specific hostname
(https://github.com/ansible/tower/pull/1922)

Because of this, we shouldn't *need* to reconfigure the queue binds at
runtime anymore when group membership changes. Under our new model,
every celeryd listens on a queue named after its hostname; when the
scheduler finds a task to run, it picks an Instance in the target
Instance Group and sends the task to the queue for that Instance's
hostname.
2018-07-28 00:48:37 -04:00
Shane McDonald
795f26e7b9 Lock down version of setuptools_scm
This was causing offline pip installs to fail for some weird reason:

The 'setuptools_scm>=1.15.0' distribution was not found and is required by the application

Even though it is there. v2.x still works.
2018-07-27 15:28:41 -04:00
Jake McDermott
dce50304f3 Merge pull request #2699 from jakemcdermott/fix-2698
fix portal mode job list
2018-07-27 14:14:00 -04:00
John Mitchell
d025f5ed2b Merge pull request #2693 from jlmitch5/fixAppTokensListRowItems
remove org and last used, fix expired datetime on app token list
2018-07-27 12:34:49 -04:00
Ryan Petrello
2371d23b7e Merge pull request #2701 from ryanpetrello/openshift-tls-autoredirect
change openshift edge termination policy to redirect (enforce https)
2018-07-27 12:31:44 -04:00
Ryan Petrello
7588e65786 change openshift edge termination policy to redirect (enforce https)
see: https://github.com/ansible/tower/issues/2591
related: https://docs.openshift.org/latest/architecture/networking/routes.html
2018-07-27 10:34:07 -04:00
Christian Adams
a2912ada11 Merge pull request #2696 from rooftopcellist/update_sdb_hostname
fix sdb, update host var
2018-07-27 09:37:06 -04:00
Jake McDermott
9e71760af7 add jobs portal relaunch test 2018-07-27 01:06:13 -04:00
Jake McDermott
61d1cb46ac fix job portal list dependency reference error 2018-07-27 00:54:12 -04:00
Jake McDermott
93c18fb40a Merge pull request #2694 from mabashian/2652-job-id
Display job id along with name in jobs list
2018-07-26 18:49:05 -04:00
Jake McDermott
c715f73160 Merge pull request #2684 from jakemcdermott/fix-2958
handle finished job runs with incomplete status info
2018-07-26 17:58:52 -04:00
adamscmRH
df6b7627bc fix sdb, update host var 2018-07-26 17:48:00 -04:00
Ryan Petrello
a211e24c0f Merge pull request #2695 from ryanpetrello/celerywatcher-iso8601
some celery-watcher tweaks
2018-07-26 17:44:50 -04:00
Jake McDermott
2ba0319e79 handle finished job run with incomplete status info 2018-07-26 17:40:43 -04:00
Ryan Petrello
9b1961f60d some celery-watcher tweaks
* give celery more time to reply over AMQP (the default timeout is 1s)
* record datestamps in celery watcher logs for debugging purposes
2018-07-26 17:16:05 -04:00
Michael Abashian
3caeb91419 Merge pull request #2689 from mabashian/2676-jobs-pagination
Fixes pagination on IG/Instance jobs lists
2018-07-26 14:49:05 -04:00
mabashian
fa414d5569 Display job id along with name in jobs list 2018-07-26 14:46:53 -04:00
John Mitchell
0d9dbc15a7 remove org and last used, fix expired datetime on app token list 2018-07-26 13:57:45 -04:00
Jared Tabor
1ba6073569 Merge pull request #2092 from jaredevantabor/ui-test-ci-failures
Bumping uirouter version and locking it to make ui tests pass
2018-07-26 09:06:16 -07:00
Ryan Petrello
7acfe414a6 Merge pull request #2686 from ryanpetrello/non-exclusive-policy-instance-list
show the manual instance tag based on the correct instance attribute
2018-07-26 11:32:43 -04:00
mabashian
7a509a4dcb Fixes pagination on IG/Instance jobs lists 2018-07-26 10:56:11 -04:00
Alan Rominger
979eaeddfa Merge pull request #2687 from AlanCoding/play_nice
fix conflicting migrations
2018-07-26 10:45:08 -04:00
AlanCoding
d1b89815f7 fix conflicting migrations 2018-07-26 10:38:26 -04:00
Ryan Petrello
bb034f007a show the manual instance tag based on the correct instance attribute
see: https://github.com/ansible/tower/issues/2583
2018-07-26 10:24:35 -04:00
Christian Adams
0694fa83b0 Merge pull request #2682 from rooftopcellist/remove_client_credentials
Remove Client Credentials grant_type
2018-07-26 10:18:46 -04:00
Alan Rominger
e96706b2fa Merge pull request #2090 from christoph-kluge/patch-1
Upgrade ansible-tower-cli if it was preinstalled
2018-07-26 09:26:13 -04:00
Ryan Petrello
57fdbc1853 Merge pull request #2677 from ryanpetrello/non-exclusive-policy-instance-list
make InstanceGroup.policy_instance_list non-exclusive by default
2018-07-25 21:10:15 -04:00
Jared Tabor
2d7e5b7905 Bumping uirouter version and locking it to make ui tests pass on shippable
There was a breaking change in uirouter 1.0.19 so going to lock it at
1.0.18. There was an issue with hard-source-webpack-plugin that was effecting
the UI dev watcher that I'm including in this change.
2018-07-25 15:28:12 -07:00
adamscmRH
87829ea339 remove client credentials grant_type 2018-07-25 18:23:08 -04:00
Jake McDermott
76d83b0acb Merge pull request #2681 from jakemcdermott/test-stability-fixes
improve stability of inventory copy test and credentials form test
2018-07-25 18:10:44 -04:00
Jake McDermott
404950104b fix logic error in test 2018-07-25 17:46:24 -04:00
Ryan Petrello
15aaca8f03 make InstanceGroup.policy_instance_list non-exclusive by default
see: https://github.com/ansible/tower/issues/2583
2018-07-25 17:26:13 -04:00
Jake McDermott
5586b5c645 improve test stability for inventory copy and credentials form 2018-07-25 17:11:20 -04:00
Alan Rominger
5a7119759a Merge pull request #2672 from AlanCoding/popin_locking
Lock IG for updating list
2018-07-25 15:48:41 -04:00
Jared Tabor
a4960a9c3a Merge pull request #2667 from jaredevantabor/dep-lockdown
Adds npm-shrinkwrap and locks down ui-router version
2018-07-25 10:36:15 -07:00
Yunfan Zhang
fec1e8d398 Merge pull request #2363 from YunfanZhang42/fix_crendential_copy
Fix credential leak when copying Job Templates
2018-07-25 13:14:40 -04:00
Stoned Elipot
ada2d65547 force boolean evaluation 2018-07-25 19:10:31 +02:00
Jared Tabor
239dcac3b4 Merge pull request #2 from jaredevantabor/jared/dep-lockdown
Shrink-wrap dev dependencies as well
2018-07-25 09:45:51 -07:00
Yunfan Zhang
cb6d7dfe69 Fix credential leak when copying Job Templates.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-07-25 11:51:17 -04:00
kialam
9e164b41a6 Shrink-wrap dev dependencies as well 2018-07-25 11:46:13 -04:00
AlanCoding
39cb9f2652 lock IG for updating list 2018-07-25 11:08:40 -04:00
Ryan Petrello
27fbfbb62d Merge pull request #2668 from ryanpetrello/verify-csrf-websockets
prevent cross site request forgery in websockets w/ a CSRF token
2018-07-25 10:15:36 -04:00
Ryan Petrello
af84b25726 prevent cross site request forgery in websockets w/ the CSRF token
now that we have the CSRF middleware, we have a reliable token
available to us which we can use to verify individual ws_receive
payloads;  this is _simpler_ than making sure you've properly configured
trusted origins, and it's also more secure than Origin header checks

see: https://github.com/ansible/tower/issues/2661
2018-07-25 09:47:53 -04:00
Christian Adams
d2d5b8ca62 Merge pull request #2664 from rooftopcellist/help_text_ext_user_tokens
help text for oauth ext user toggle
2018-07-25 09:20:55 -04:00
adamscmRH
12279b9631 help text for oauth ext user toggle 2018-07-25 08:54:37 -04:00
Jared Tabor
36e5300be6 Adds npm-shrinkwrap and locks down ui-router version 2018-07-24 21:05:44 -07:00
Jared Tabor
53c9c0b7f8 Merge pull request #2626 from jaredevantabor/fix-1501
Removes trailing slash for retrieving the scheduler partial
2018-07-24 17:44:37 -07:00
Ryan Petrello
0692b1c5ef Merge pull request #2665 from mabashian/socket-whitelist
Adds websocket origin whitelist to development.py
2018-07-24 17:03:47 -04:00
mabashian
bf40dc4793 Adds websocket origin whitelist 2018-07-24 16:53:48 -04:00
Ryan Petrello
982db88349 Merge pull request #2663 from ryanpetrello/origin-verify-refactor
slightly refactor origin validity checks
2018-07-24 15:31:31 -04:00
Ryan Petrello
c81d2f53c5 slightly refactor origin validity checks 2018-07-24 15:16:09 -04:00
Christoph Kluge
fe54b44f96 Upgrade ansible-tower-cli if it was preinstalled
In order to make this document a bit more fault-tolerant I've been adding the `--upgrade` parameter to the installation.
2018-07-24 20:55:09 +02:00
Michael Abashian
21568f74c0 Merge pull request #2624 from mabashian/2612-jt-scm
Limit the cred types that we show when adding creds to JT
2018-07-24 14:24:03 -04:00
Michael Abashian
73851a6a56 Merge pull request #2657 from mabashian/hard-source-webpack-plugin
Bumps hard-source-webpack-plugin dev dep
2018-07-24 14:23:33 -04:00
Michael Abashian
d7b545b023 Merge pull request #2656 from mabashian/2654-jobs-inv
Correctly links to inventory on jobs/templates list
2018-07-24 14:22:15 -04:00
Ryan Petrello
6d1a8ec6ec Merge pull request #2655 from ryanpetrello/fix-ws-cross-origin
improve robustness of host comparision for wss:// Origin headers
2018-07-24 13:43:05 -04:00
Ryan Petrello
4b3ca080d4 improve robustness of host comparision for wss:// Origin headers
see: https://github.com/ansible/tower/issues/2647
2018-07-24 13:30:04 -04:00
mabashian
e3601b71c0 Bumps hard-source-webpack-plugin dev dep 2018-07-24 12:04:45 -04:00
Matthew Jones
74123647fe Merge pull request #2078 from john-westcott-iv/2073_no_galaxy
#2073 - Support setting to prevent Tower from pulling roles
2018-07-24 12:01:18 -04:00
Matthew Jones
533318de3b Merge pull request #2085 from chrismeyersfsu/fix-saml_admin_attr2
fix saml_admin_attr
2018-07-24 11:48:33 -04:00
mabashian
5d5a6bb858 Correctly links to inventory on jobs/templates list 2018-07-24 11:47:58 -04:00
Ryan Petrello
c0da6f04cd Merge pull request #2648 from ryanpetrello/fix-ws-cross-origin
[3.3.0] reject ws:// connections w/ origin mismatches
2018-07-24 10:13:46 -04:00
Bill Nottingham
90c03af61b Merge pull request #2646 from wenottingham/a-moment-like-this
Fix moment minute specifier.
2018-07-24 10:02:48 -04:00
Alan Rominger
f0252f67dc Merge pull request #2625 from AlanCoding/just_role
Write special cases for object_association field
2018-07-24 07:46:22 -04:00
Ryan Petrello
e7279f2fe2 reject ws:// connections w/ origin mismatches
see: https://github.com/ansible/tower/issues/2647
2018-07-23 21:56:31 -04:00
Bill Nottingham
39ffeb31f9 Fix moment minute specifier. 2018-07-23 21:24:37 -04:00
Jared Tabor
1daba7ffb3 Switching to $http service instead of Rest service.
Because the Rest.setUrl function adds a trailing slash to the URL,
which is unnecessary for a partial.
2018-07-23 13:55:06 -07:00
Alan Rominger
4c023d21af Merge pull request #2639 from AlanCoding/cool_as_isolated
Disallow adding or removing instance from iso-IG
2018-07-23 15:57:23 -04:00
AlanCoding
6d305c60d5 Disallow adding or removing instance from iso-IG 2018-07-23 15:39:30 -04:00
chris meyers
5f85a08325 fix saml_admin_attr 2018-07-23 12:53:18 -04:00
Chris Meyers
90fba9381d Merge pull request #2632 from chrismeyersfsu/fix-saml_admin_attr
fix saml_admin_attr
2018-07-23 12:06:02 -04:00
Alan Rominger
c878c027f5 Merge pull request #2631 from AlanCoding/host_dne
Handle does-not-exist errors in JobHostSummary unicode method
2018-07-23 10:37:37 -04:00
AlanCoding
fa3a334424 Handle does not exist errors in JobHostSummary unicode 2018-07-23 10:17:47 -04:00
chris meyers
3fcd1575c1 fix saml_admin_attr 2018-07-23 10:08:18 -04:00
John Westcott IV
0ba8022eac #2073 - Support setting to prevent Tower from pulling from requirements.yml files for an SCM project 2018-07-23 09:37:49 -04:00
Christian Adams
95a32aaa6e Merge pull request #2606 from rooftopcellist/update_logging_doc
Update logging doc
2018-07-22 16:15:28 -04:00
Chris Meyers
32c2e36ac4 Merge pull request #2630 from chrismeyersfsu/better-minishift_devel
more robust minishift bringup
2018-07-20 15:52:35 -04:00
chris meyers
7d24566120 more robustness 2018-07-20 15:02:44 -04:00
AlanCoding
abdc7b9232 apply lock file to all project updates 2018-07-20 14:23:35 -04:00
AlanCoding
5de321ae7a write special cases for object_association field 2018-07-20 12:40:12 -04:00
kialam
a04d3f817a Merge pull request #2615 from kialam/fix/1444-fix-auto-close-modal
Fix prompt modal closing prematurely on JT list page
2018-07-20 11:47:00 -04:00
John Mitchell
d32997684c Merge pull request #2613 from jlmitch5/orgSmartInvNotice
add information to the smart inventory button could change based on o…
2018-07-20 11:37:30 -04:00
mabashian
3f6f6a4b7d Limit the cred types that we show when adding creds to JT 2018-07-20 11:06:49 -04:00
Michael Abashian
2e55b7a4ee Merge pull request #2620 from mabashian/2557-copy
Change post-copy behavior
2018-07-20 11:00:48 -04:00
Michael Abashian
d5edeb6f73 Merge pull request #2605 from mabashian/802-jt-creds
Allow users with edit permission on the JT to add/remove credentials
2018-07-20 11:00:31 -04:00
John Mitchell
3355b32582 update grammar 2018-07-20 10:53:09 -04:00
kialam
eabdda92b3 Show "working" message before view refresh 2018-07-20 10:52:52 -04:00
Jake McDermott
70174a2d1c Merge pull request #1 from jakemcdermott/2557-copy
update copy tests
2018-07-20 10:37:34 -04:00
Jake McDermott
bdd240f0e4 Merge pull request #2581 from ansible/jakemcdermott-patch-1
make first and last name optional
2018-07-20 10:32:49 -04:00
Jake McDermott
32f0e54666 make first and last name optional 2018-07-20 10:16:08 -04:00
Jake McDermott
4937d1f75e update copy tests 2018-07-20 10:02:50 -04:00
Marliana Lara
831e79ff17 Merge pull request #2621 from marshmalien/fix/2619-scm-icon
Change scm update icon to fa-refresh
2018-07-20 09:36:08 -04:00
Marliana Lara
7c5fc27d96 Merge pull request #2608 from marshmalien/fix/1599-about-modal
Move About modal to header
2018-07-19 16:53:19 -04:00
Michael Abashian
eb1c1acd5d Merge pull request #2574 from mabashian/2253-pendo-checkbox
Only show pendo checkbox on in license form if license is missing
2018-07-19 16:43:24 -04:00
Marliana Lara
147d301ff9 Change scm update icon from cloud-download to refresh 2018-07-19 16:43:03 -04:00
mabashian
5032849624 Remove unused deps in license controller 2018-07-19 16:19:50 -04:00
Michael Abashian
58dad97cf0 Merge pull request #2582 from mabashian/1558-settings-unsaved
Revert the auth/ldap dropdowns if saving unsaved changes is not successful
2018-07-19 16:16:33 -04:00
Michael Abashian
69754f194c Merge pull request #2597 from mabashian/2587-jt-creds
Let disassociate jt cred requests finish before attempting to associate any new ones
2018-07-19 16:15:20 -04:00
Michael Abashian
98f86c418e Merge pull request #2595 from mabashian/765-split
Adds extra logic to handle survey question choices in array form
2018-07-19 16:14:44 -04:00
mabashian
6b3f45bc26 Changes copy behavior to reload list rather than navigate to edit form. Shows toast message on successful copy. 2018-07-19 16:04:18 -04:00
Marliana Lara
1490139740 Change About modal icon to circle info icon 2018-07-19 15:30:35 -04:00
kialam
c893e467c5 Send emit message sooner from prompt controller 2018-07-19 14:30:45 -04:00
John Mitchell
083d6599d1 add information to the smart inventory button could change based on org change 2018-07-19 14:21:46 -04:00
Marliana Lara
1a982d3e40 Remove footer and related styles 2018-07-19 12:04:54 -04:00
adamscmRH
ef29dab013 update logging readme 2018-07-19 11:41:39 -04:00
mabashian
c173e2b71e Users with edit permission on the JT can add/remove credentials 2018-07-19 11:04:00 -04:00
Marliana Lara
1ff4d50cc6 Move about modal to top navigation bar 2018-07-19 10:59:33 -04:00
Matthew Jones
190525e835 Adding cluster development service definitions 2018-07-19 10:39:08 -04:00
Matthew Jones
5c400cdf79 Add local minishift development tooling
Based on mapping the local development tree through minishift
hostfolder interface.
2018-07-19 10:39:08 -04:00
Alan Rominger
eb22e09e4d Merge pull request #2568 from AlanCoding/fussy_logger
Add log statement if canceling takes way too long
2018-07-19 10:30:45 -04:00
Bill Nottingham
d66b61b854 Merge pull request #2594 from wenottingham/cherry-pickin
cherry pick some more AWX things
2018-07-19 10:03:48 -04:00
Jared Tabor
77dd2c86dc Merge pull request #2598 from jaredevantabor/fix-1501
Bumps version of angular-scheduler
2018-07-18 16:25:55 -07:00
Jared Tabor
7b7c211471 Bumps version of angular-scheduler
After fix for DTSTART parsing
2018-07-18 16:17:07 -07:00
mabashian
0104228541 Let disassociate jt cred requests finish before attempting to associate any new ones 2018-07-18 17:38:11 -04:00
Marliana Lara
bc3f06c725 Merge pull request #2585 from marshmalien/fix/2545/forks-capacity-adjuster-slider
Show fork value on capacity adjuster slider
2018-07-18 17:07:36 -04:00
Arnout van Meer
8754ab80c7 Don't capitalise last name
Making assumptions about names is always a risky situation, even having a separate first and last name field should be avoided wherever possible. In this specific case, applying auto-capitalisation to the first character of the last name field makes it impossible to correctly enter my (and many other) Dutch surname. Common initial parts of Dutch surnames are 'de', 'van', 'van der' and other combinations. These are always lowercase.

Fun additional trivia: when it comes to sorting these names alphabetically you are supposed to ignore the prefix. In the case of my name you'd index it under 'M', not 'v'.
2018-07-18 16:51:43 -04:00
Jijo Varghese
e1dde21ec3 ldap attributes filter in user_groups()
ldap search currently fetches ALL attributes which is a waste of bandwidth resources and
woefully slow on large ldap groups when it only needs to parse the name_attr

Signed-off-by: Jijo Varghese <jijojv@gmail.com>
2018-07-18 16:51:21 -04:00
mabashian
0701c7d61a Added extra logic around survey question choice splitting to prevent console errors 2018-07-18 16:50:47 -04:00
John Mitchell
b07e44ad69 Merge pull request #2573 from jlmitch5/fixEmojiRemoval
fix issue where unicode based search terms couldn't be removed
2018-07-18 16:39:07 -04:00
Chris Meyers
71fcd5f9ca Merge pull request #2035 from jijojv/devel
ldap attributes filter in user_groups()
2018-07-18 16:05:51 -04:00
Marliana Lara
4057df07ba Fix input slider styles in Firefox 2018-07-18 15:59:04 -04:00
Marliana Lara
91900d5534 Show fork value over capacity adjuster slider 2018-07-18 13:01:13 -04:00
mabashian
53c9987663 Revert the auth/ldap dropdowns if saving unsaved changes is not successful 2018-07-18 12:35:32 -04:00
Shane McDonald
8f7931e02f Merge pull request #2076 from john-westcott-iv/fix_node_link
Change node.js macOS installer link (old link was dead)
2018-07-18 12:21:11 -04:00
John Westcott IV
a124e51331 Change node.js macOS installer link (old link was dead) 2018-07-18 11:32:57 -04:00
Jared Tabor
0e663f3967 Merge pull request #2561 from jaredevantabor/fix-1501
Adjusts which partical/controller combination is for schedules-edit
2018-07-17 21:28:51 -07:00
mabashian
e82d4e9664 Only show pendo checkbox on in license form if license is missing 2018-07-17 19:31:20 -04:00
John Mitchell
76424425b2 fix issue where unicode based search terms couldn't be removed 2018-07-17 17:30:44 -04:00
Alan Rominger
5c7c441b47 Merge pull request #2555 from AlanCoding/app_name_unique
Make applications org-name-unique
2018-07-17 16:49:57 -04:00
Michael Abashian
bb65965e2b Merge pull request #2572 from mabashian/2303-inv-src
Disable copy button for inv's with sources
2018-07-17 16:20:20 -04:00
Ryan Petrello
cf478df0e3 Merge pull request #2569 from ryanpetrello/fix-2476
properly set InventorySource.status for CLI-based inventory_import
2018-07-17 15:08:49 -04:00
Michael Abashian
868ce5ccbe Merge pull request #2556 from mabashian/1464-workflow
Re-initialize tag options before calling to create select2 in prompt
2018-07-17 14:47:10 -04:00
mabashian
b2854fd4d6 Disable copy button for inv's with sources 2018-07-17 14:40:24 -04:00
Ryan Petrello
7adc6c6f73 properly set InventorySource.status for CLI-based inventory_import
see: https://github.com/ansible/tower/issues/2476
2018-07-17 14:04:50 -04:00
AlanCoding
7221c9dae1 add log statement if canceling takes way too long 2018-07-17 12:06:20 -04:00
Jake McDermott
d2eeafd5f5 Merge pull request #2553 from jakemcdermott/smoke-retry
make new data for each smoke test attempt
2018-07-17 11:55:28 -04:00
Alan Rominger
27bf12feb2 Merge pull request #2563 from AlanCoding/old_timer_types
Strict type enforcement of deprecated launch fields
2018-07-17 11:53:17 -04:00
Jake McDermott
bdc1cae24a Merge pull request #2482 from jakemcdermott/fix-2377-api
add inventory field to inventory update
2018-07-17 11:45:38 -04:00
Jake McDermott
994cb3975e make new data for each smoke test attempt 2018-07-17 11:31:24 -04:00
Jake McDermott
a968a44afb add inventory field to inventory update 2018-07-17 11:10:06 -04:00
Chris Meyers
e3cb531180 Merge pull request #2558 from chrismeyersfsu/saml_admin_user_feature_cherry_pick
Saml admin user feature cherry pick
2018-07-17 09:27:18 -04:00
AlanCoding
a38d6552e8 strict type enforcement of deprecated launch fields 2018-07-17 08:41:40 -04:00
Jared Tabor
429cf40db3 Adjusts which partical/controller combination is used when editing a schedule
MGMT jobs require a different partial + controller
2018-07-16 18:02:11 -07:00
aperigault
71730f9bc1 Update SAML doc 2018-07-16 17:14:41 -04:00
Antony PERIGAULT
53b5291a56 Fix functional tests 2018-07-16 17:03:00 -04:00
Antony PERIGAULT
3b6ab6217b New feature: Add SAML users as organization admins 2018-07-16 17:02:53 -04:00
Antony PERIGAULT
6ec2228885 Revert "Map users in organizations based on saml groups"
This reverts commit b4e0ff650165e6b0ab08d9a78be85f2f46182b94.
2018-07-16 17:02:46 -04:00
Antony PERIGAULT
062c18efa0 Map users in organizations based on saml groups 2018-07-16 17:02:38 -04:00
Michael Abashian
a955b3f947 Merge pull request #2542 from mabashian/1466-workflow-node
Properly clear out prompt data when user manually changes a node's JT
2018-07-16 16:17:52 -04:00
AlanCoding
885ea2c5e1 make applications name-unique 2018-07-16 15:54:00 -04:00
mabashian
069c60abf7 Re-initialize tag options before calling to create select2 on those fields in prompt modal 2018-07-16 15:37:12 -04:00
Ryan Petrello
b6e246f65a Merge pull request #2554 from ryanpetrello/release_3.3.0
Makefile update.
2018-07-16 14:57:16 -04:00
Ryan Petrello
f0707ad701 Makefile update. 2018-07-16 14:55:07 -04:00
Ryan Petrello
5bb71fc133 Merge pull request #2550 from rooftopcellist/fix_expire_command
fix expire session command
2018-07-16 14:53:31 -04:00
Ryan Petrello
34fe54c6e0 Makefile update. 2018-07-16 14:45:44 -04:00
Jake McDermott
2fa216c98f Merge pull request #2062 from RR2DO2/patch-1
Don't capitalise last name
2018-07-16 14:19:46 -04:00
Haokun Chen
220b45cb8a Merge pull request #2551 from Haokun-Chen/2547
show empty template list placeholder panel correctly
2018-07-16 14:11:33 -04:00
Alan Rominger
9208ef6664 Merge pull request #2540 from AlanCoding/towerkit_protector
Raise 400 instead of ignoring if fields mismatch v1/v2
2018-07-16 13:29:12 -04:00
Marliana Lara
d693dac0c6 Merge pull request #2546 from marshmalien/fix/2206-relaunch-text-translation
Send relaunch value instead of name in POST request
2018-07-16 13:26:52 -04:00
Shane McDonald
65a5f2dc9b Merge pull request #2052 from robruma/feature/callback_script_enhancement
Adding ability to ignore SSL certificate validation errors, cleanup p…
2018-07-16 13:13:51 -04:00
Shane McDonald
467a1fafcc Merge pull request #1880 from luisico/compose-web-wait-for
AWX launchers should wait for other containers to be ready
2018-07-16 13:11:06 -04:00
Shane McDonald
ad33dff6af Merge pull request #1949 from willthames/k8s_use_context
Use use-context to set Kubernetes context
2018-07-16 12:59:36 -04:00
Haokun-Chen
b5dab72dd7 show empty template list placeholder panel correctly 2018-07-16 12:59:00 -04:00
adamscmRH
3d7fd9270c fix expire session command 2018-07-16 12:57:00 -04:00
Ryan Petrello
ca6b6460bb Merge pull request #2522 from ryanpetrello/fix-2509
awx metavars for job.created_by should be more robust to DoesNotExist
2018-07-16 12:46:50 -04:00
Jake McDermott
cb9cbfff87 Merge pull request #2544 from jakemcdermott/fix-2233
fix output double-scroll bug and initial output page numbers
2018-07-16 12:32:52 -04:00
Haokun Chen
aa43610250 Merge pull request #2528 from Haokun-Chen/2248
update workflowMaker title text to be preceded by  "Workflow Visualizer"
2018-07-16 12:21:22 -04:00
Haokun Chen
1661e73086 Merge pull request #2541 from Haokun-Chen/1865
show active row indicator correctly when close active list item
2018-07-16 12:21:02 -04:00
Jared Tabor
ebaabcfbd9 Merge pull request #2537 from jaredevantabor/fix-2510
Subscribes the Sources list to the inventory group for pending deletes
2018-07-16 09:14:46 -07:00
Jared Tabor
39e2008660 Merge pull request #2534 from jaredevantabor/fix-2493
Adds error catch block to credentials resolve
2018-07-16 09:10:48 -07:00
Marliana Lara
0e36ef35af Merge pull request #2543 from marshmalien/fix/1040-center-sidebar-icons
Center align side navigation icons
2018-07-16 12:05:17 -04:00
Marliana Lara
161caf0099 Send relaunch value instead of name in POST request 2018-07-16 11:57:35 -04:00
Jake McDermott
81476d544f fix initial head/tail page values when in page mode 2018-07-16 11:43:40 -04:00
Jake McDermott
85b227213f don't page up or down while already paging up or down 2018-07-16 11:42:27 -04:00
Ryan Petrello
55be530e27 awx metavars for job.created_by should be more robust to DoesNotExist
see: https://github.com/ansible/tower/issues/2509
2018-07-16 11:35:35 -04:00
Marliana Lara
ac39519015 Center side nav icons 2018-07-16 11:23:11 -04:00
mabashian
88c5f9305d Ensure that .some() receives an array to avoid erroring 2018-07-16 11:19:19 -04:00
Alan Rominger
9db6202210 Merge pull request #2538 from AlanCoding/team_queryset
Remove custom get_queryset that ignored special case
2018-07-16 11:14:31 -04:00
mabashian
f7f1c06d80 Properly clear out prompt data when user manually changes a node's JT 2018-07-16 11:11:50 -04:00
Alan Rominger
53b4a4e2fc Merge pull request #2531 from AlanCoding/everything_text_type
Fix unicode bug in launch error message
2018-07-16 10:49:44 -04:00
Haokun-Chen
f2de453110 show active row indicator correctly when close active list item 2018-07-16 10:49:14 -04:00
kialam
ac01eab0f1 Merge pull request #2525 from kialam/fix/1067-workflow-status-pending
Update labels and tooltips whenever the websocket emits status change
2018-07-16 10:36:09 -04:00
Michael Abashian
097125446a Merge pull request #2519 from mabashian/2505-application-token
Removes application requirement when creating token, fixes delete personal token
2018-07-16 10:31:52 -04:00
Michael Abashian
4e8fff8cf1 Merge pull request #2532 from mabashian/1882-templates-list
Remove updateDataset listener from templates list controller
2018-07-16 10:31:29 -04:00
Shane McDonald
9b941e8b05 Merge pull request #2040 from kivio/tiller-namespace-configuration
#2039 add tiller-namespace as argument
2018-07-16 10:10:23 -04:00
kialam
90ad104391 Update labels and tooltips whenever the websocket emits status change
Since the translated workflow status copy is a result of a function; it
does not auto-update when `workflow.status` is updated. We should call
it whenever the web socket lets us know that a job status has changed.
2018-07-16 09:50:36 -04:00
Shane McDonald
3f8b80e415 Merge pull request #2028 from basos9/fix-nginx-log
FIX nginx use selected log formatting
2018-07-16 09:47:05 -04:00
AlanCoding
fd468ac766 raise 400 instead of ignoring if fields mismatch v1/v2 2018-07-16 09:36:43 -04:00
AlanCoding
b5b2bf15df remove custom get_queryset that ignored special case 2018-07-14 21:09:57 -04:00
Jared Tabor
0d089b8cbf Subscribes the Sources list to both the inventory group for pending deletes
It was subscribed to the jobs group, for source sync updates, but now it
is subscribed to that group and the inventory group for pending deletes.
2018-07-13 16:17:55 -07:00
Haokun-Chen
7ed89c63f9 update workflowMaker title text to be Workflow Visualizer|workflowName 2018-07-13 17:23:48 -04:00
Haokun Chen
62967b2806 Merge pull request #2530 from Haokun-Chen/2526
remove view/edit icon from dashboard Recent Template list
2018-07-13 17:19:20 -04:00
Jared Tabor
7dbdff2aa7 Adds error catch block to credentials resolve
Catches the case where a user doesn't have permission to a credential
2018-07-13 13:54:00 -07:00
Christian Adams
1dac1e4a82 Merge pull request #2529 from rooftopcellist/fix_csrf_mult_sesh
Fixes sessions in multiple tabs
2018-07-13 16:46:30 -04:00
adamscmRH
896ffb2065 Fixes sessions in multiple tabs 2018-07-13 16:31:23 -04:00
mabashian
f7dda124b1 Remove updateDataset from templates list 2018-07-13 15:59:31 -04:00
John Hill
dd63e645b3 Merge pull request #2521 from ansible/Fix4lookupmodal
Updating flow to match feature changes
2018-07-13 15:58:51 -04:00
AlanCoding
e897cbd237 fix unicode bug in launch error message 2018-07-13 15:50:50 -04:00
Haokun-Chen
57e80dfcd7 remove view/edit icon from dashboard Recent Template list 2018-07-13 15:25:13 -04:00
Alan Rominger
9a44f6d13d Merge pull request #2524 from AlanCoding/schedule_log
Add missing job lifecycle log for schedule spawns
2018-07-13 14:18:15 -04:00
Ryan Petrello
8e253a9aff Merge pull request #2473 from ryanpetrello/disable-oauth2-for-external-users
don't allow OAuth2 token creation for "external" users
2018-07-13 12:55:06 -04:00
Michael Abashian
13abb36a50 Merge pull request #2516 from mabashian/2513-machine-prompt
Cleanup _.has() usage in prompt controller
2018-07-13 11:59:07 -04:00
AlanCoding
a5803255ac add missing job lifecycle log for schedule spawns 2018-07-13 11:13:47 -04:00
Bill Nottingham
a98367f4ac Merge pull request #2068 from aperigault/devel
Update SAML doc
2018-07-13 11:05:55 -04:00
aperigault
8ad7d4f699 Update SAML doc 2018-07-13 15:39:46 +02:00
Chris Meyers
38de79b81f Merge pull request #1576 from aperigault/devel
Map users in organizations based on saml groups
2018-07-13 09:03:32 -04:00
John Hill
c9766abf0f Updating flow 2018-07-13 08:59:35 -04:00
mabashian
d90a1a1ce7 Fixed deleting personal access tokens 2018-07-12 17:24:12 -04:00
mabashian
8297bd00b3 Removes application requirement when creating a token 2018-07-12 17:02:26 -04:00
mabashian
912c774376 Cleanup _.has() usage in prompt controller 2018-07-12 14:57:52 -04:00
Ryan Petrello
df0e28ec65 don't allow OAuth2 token creation for "external" users
see: https://github.com/ansible/tower/issues/2326
2018-07-12 14:33:59 -04:00
Marliana Lara
d9713f9b3f Merge pull request #2477 from marshmalien/fix/1040-sidebar-spacing
Fix side navigation icon alignment
2018-07-12 13:28:51 -04:00
Jared Tabor
8310d736f5 Merge pull request #2462 from mabashian/2309-breadcrumb
Move ui-view from lookup component out to form
2018-07-11 22:30:12 -07:00
Jake McDermott
a7f967429e Merge pull request #2506 from jakemcdermott/fix-2495
show status icon next to job output panel title when expanded
2018-07-11 22:08:02 -04:00
Jared Tabor
02f6fa9b0a Prevents the user from adding a token for a user other than themselves
It's possible to maninpulate the URL to get to the add-token screen
for a different user, which gives the user the idea that they could
possibly add a token for that user, which is not allowed.
2018-07-11 17:32:56 -07:00
Jared Tabor
1b67755358 Cleanup to users' state tree
In order to add additional route flexibility for the users-tokens states

Removes unnecessary ui-view from form-generator

Adjust nested ui-view target

found during PR feedback
2018-07-11 16:45:20 -07:00
Jared Tabor
a30e2f93a6 Adds org column to the application lookup modal, while on tokens form 2018-07-11 16:32:33 -07:00
mabashian
8a2be07ccb Tweaked logic around the lookup modal and new form lookup fields in order to support dynamic breadcrumbs and selecting applications with the same name. 2018-07-11 16:32:30 -07:00
Jake McDermott
2d8a10ebe9 show status icon next to panel title when expanded 2018-07-11 18:29:06 -04:00
Jake McDermott
0f5c4a4bf7 Merge pull request #2490 from ansible/jakemcdermott-workflow-panel-scroll
hide workflow job left panel scrollbar when it isn't needed
2018-07-11 17:32:13 -04:00
Alan Rominger
2ceae5c88a Merge pull request #2496 from AlanCoding/proj_create
Restore project_admin as role for project creation
2018-07-11 16:11:09 -04:00
AlanCoding
46c8920020 restore project_admin as role for project creation 2018-07-11 15:36:48 -04:00
Alan Rominger
f268857129 Merge pull request #2466 from AlanCoding/prompts_but_not_prompts
Fix regression of JT callback relaunch
2018-07-11 13:58:39 -04:00
AlanCoding
6697d0c205 fix bug where empty extra vars gave relaunch 500 2018-07-11 13:09:44 -04:00
Jake McDermott
a85326777b hide workflow job left panel scrollbar when it isn't needed 2018-07-11 13:02:20 -04:00
Marliana Lara
56521cceb9 Merge pull request #2487 from marshmalien/fix/remove-sched-cal
Remove calendar icon from job templates list
2018-07-11 12:48:22 -04:00
Marliana Lara
b7b704e4c7 Remove calendar icon from job templates list 2018-07-11 11:16:02 -04:00
Christian Adams
6ac17c874f Merge pull request #2486 from rooftopcellist/fix_change_pass
selectively clear sesh on pass change
2018-07-11 10:59:06 -04:00
adamscmRH
e99d922261 selectively clear sesh on pass change 2018-07-11 10:29:16 -04:00
Ryan Petrello
3c8a81bcab Merge pull request #2484 from ryanpetrello/spaaaaaaaaaaaaaaaaaaaace
remove unnecessary spaces
2018-07-11 10:04:23 -04:00
Ryan Petrello
090c585be5 remove unnecessary spaces 2018-07-11 09:50:50 -04:00
Ryan Petrello
5fd7badd1b Merge pull request #2483 from ryanpetrello/iso-policy-instance-list
don't allow isolated instances in IG.policy_instance_list
2018-07-11 09:43:50 -04:00
Ryan Petrello
387f7d3d67 don't allow isolated instances in IG.policy_instance_list
see: https://github.com/ansible/tower/issues/2394
2018-07-11 09:29:46 -04:00
Arnout van Meer
a0e8d8aecf Don't capitalise last name
Making assumptions about names is always a risky situation, even having a separate first and last name field should be avoided wherever possible. In this specific case, applying auto-capitalisation to the first character of the last name field makes it impossible to correctly enter my (and many other) Dutch surname. Common initial parts of Dutch surnames are 'de', 'van', 'van der' and other combinations. These are always lowercase.

Fun additional trivia: when it comes to sorting these names alphabetically you are supposed to ignore the prefix. In the case of my name you'd index it under 'M', not 'v'.
2018-07-11 14:09:34 +01:00
Yunfan Zhang
92b44246a6 Merge pull request #2471 from YunfanZhang42/fix_token_modified
Fix null values on Token modified field.
2018-07-10 16:32:33 -04:00
Alan Rominger
00cc002b8e Merge pull request #2467 from AlanCoding/ig_errors
Fix server errors unattaching instance from group
2018-07-10 16:20:21 -04:00
Yunfan Zhang
e2ed24aef0 Fix null values on Token modified field. 2018-07-10 16:03:25 -04:00
Alan Rominger
a7561ce527 Merge pull request #2478 from AlanCoding/std_env
Move static inventory update options to constants
2018-07-10 16:01:31 -04:00
Ben Thomasson
d9ddf56285 Merge pull request #2468 from benthomasson/network_ui_very_long_names
Wraps long names of devices in the network UI at 25 characters
2018-07-10 15:55:11 -04:00
Ryan Petrello
68cf80cbca Merge pull request #2479 from ryanpetrello/release_3.3.0
Revert "enforce JT/Job.timeout >= 0"
2018-07-10 15:28:57 -04:00
Ryan Petrello
07ddfe2c9c Merge pull request #2059 from mattclay/node-pool
Switch AWX to a dedicated Shippable node pool.
2018-07-10 15:21:35 -04:00
Ryan Petrello
acd045379c Revert "enforce JT/Job.timeout >= 0"
This reverts commit 1fb41cf8d0.
2018-07-10 15:06:13 -04:00
Matt Clay
18b7b3e028 Switch AWX to a dedicated Shippable node pool.
Signed-off-by: Matt Clay <matt@mystile.com>
2018-07-10 11:58:09 -07:00
AlanCoding
a634b6b9e7 move static inventory update options to constants 2018-07-10 14:45:55 -04:00
Marliana Lara
60f6fba19b Fix side navigation icon alignment 2018-07-10 14:40:21 -04:00
Ben Thomasson
45cece8f57 Wraps long names of devices in the network UI at 25 characters 2018-07-10 14:35:09 -04:00
Jake McDermott
68ceaadf8d Merge pull request #2474 from ansible/jakemcdermott-patch-1
use a less rigid selector for credential form title
2018-07-10 14:02:48 -04:00
Christian Adams
2aa3150bdd Merge pull request #2472 from rooftopcellist/expiration_logout_500
catch empty session case
2018-07-10 13:51:45 -04:00
adamscmRH
762ce04b0a catch empty session case 2018-07-10 13:50:39 -04:00
Jake McDermott
00a7de99a4 use a less rigid selector for credential form title 2018-07-10 13:41:25 -04:00
Marliana Lara
319b1f56fc Merge pull request #2450 from marshmalien/fix/2433-hide-cred-list-label
Fix credential labels in jobs list
2018-07-10 13:36:56 -04:00
kialam
bf0469faad Merge pull request #2470 from kialam/fix/2388-fix-activity-stream
Adjust `schedule` route params for activity stream functionality
2018-07-10 13:23:43 -04:00
Marliana Lara
deb6c3caf8 Sanitize credential name tags 2018-07-10 13:18:42 -04:00
Jake McDermott
630cdce244 Merge pull request #2443 from jakemcdermott/fix-2397
sanitize host detail modal stderr/stdout
2018-07-10 11:44:11 -04:00
kialam
fe16579f88 Adjust schedule route params for activity stream functionality 2018-07-10 11:41:04 -04:00
Jake McDermott
321983fdfa santize host detail modal stderr and stdout 2018-07-10 11:19:33 -04:00
Jake McDermott
93fe14fa01 fix wrapping of host event modal stdout/err lines 2018-07-10 11:19:00 -04:00
Marliana Lara
83d86b3375 Merge pull request #2437 from marshmalien/fix/2434-list-icons
Tweak network visualization icon and remove calendar icon from lists
2018-07-10 11:09:14 -04:00
Ryan Petrello
ca3a2c752d Merge pull request #2463 from ryanpetrello/fix-2421
enforce JT/Job.timeout >= 0
2018-07-10 10:42:46 -04:00
Alan Rominger
7b860e4eeb Merge pull request #2445 from AlanCoding/true_admin
Fix bug with custom script user_capabilities
2018-07-10 10:25:17 -04:00
AlanCoding
73f3837f62 fix server errors unattaching instance from group 2018-07-10 09:38:56 -04:00
Marliana Lara
ae64b9abac Remove calendar icon and related code from lists 2018-07-10 09:28:33 -04:00
AlanCoding
ec643d6406 fix regression of callback relaunch 2018-07-10 08:45:23 -04:00
Ryan Petrello
1fb41cf8d0 enforce JT/Job.timeout >= 0
see: https://github.com/ansible/tower/issues/2421
2018-07-10 08:25:36 -04:00
kialam
9c653cb603 Merge pull request #2455 from kialam/fix/2193-workflow-status
Account for canceled workflow status in chart and results section
2018-07-09 16:58:44 -04:00
Christian Adams
ab861ae777 Merge pull request #2460 from rooftopcellist/reorder_root_api
Reorder root api
2018-07-09 16:39:13 -04:00
John Mitchell
33a0b017a6 Merge pull request #2454 from jlmitch5/fixJobsPortalMode
Fix jobs portal mode
2018-07-09 16:35:55 -04:00
Marliana Lara
b9250e2ceb Merge pull request #2458 from marshmalien/fix/1847-dashboard-graph
Fix dashboard graph view dropdown
2018-07-09 16:35:06 -04:00
Michael Abashian
8002cac82e Merge pull request #2427 from mabashian/2424-vault
Fixed bug displaying vault cred with no vault_id
2018-07-09 16:22:01 -04:00
adamscmRH
16dc1f57dd reorder api endpoint links 2018-07-09 16:11:27 -04:00
Alan Rominger
c78e274373 Merge pull request #2459 from AlanCoding/old_cred_msg
Change key to match old error message
2018-07-09 15:57:11 -04:00
AlanCoding
e36458a6c0 change key to match old error message 2018-07-09 15:36:13 -04:00
Alan Rominger
a90329f21b Merge pull request #2385 from AlanCoding/team_org_object_roles
Allow adding teams to org object roles
2018-07-09 15:34:45 -04:00
Yunfan Zhang
307e5204fa Merge pull request #2447 from YunfanZhang42/fix_credential_leak
Forbid users from using unauthorized credentials in projects and inventories.
2018-07-09 15:06:39 -04:00
Yunfan Zhang
270102c188 Forbid users from using unauthorized credentials in projects and inventories.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-07-09 15:04:53 -04:00
Ryan Petrello
55b6f95b61 Merge pull request #2453 from ryanpetrello/fix-api-login-redirect
make the API browser direct you to the proper location post-login
2018-07-09 14:48:47 -04:00
Marliana Lara
617017aebd Fix dashboard graph view dropdown update bug 2018-07-09 14:37:26 -04:00
AlanCoding
e044b996e5 allow adding teams to org object roles 2018-07-09 14:13:57 -04:00
John Mitchell
9ffb3395bc fix index.less new line issue 2018-07-09 13:58:50 -04:00
Ryan Petrello
1d09c6b25a make the API browser direct you to the proper location post-login 2018-07-09 13:58:38 -04:00
John Mitchell
2f8b668ef9 fix portal mode issues 2018-07-09 13:53:46 -04:00
Alan Rominger
2dd3014374 Merge pull request #2441 from AlanCoding/error_message
Fix regression: include error message from remote server
2018-07-09 13:51:06 -04:00
Jared Tabor
6d33e27100 Merge pull request #2429 from jaredevantabor/fix-2422
Corrects label on schedule form
2018-07-09 10:46:37 -07:00
kialam
5a338c5f9b Account for canceled workflow status in chart and results section 2018-07-09 13:34:52 -04:00
Bill Nottingham
5c16f8c294 Merge pull request #2451 from wenottingham/six-PRs-and-a-movie
Merge assorted PRs from the AWX community
2018-07-09 13:27:17 -04:00
Wayne Witzel III
8969276710 Merge pull request #2446 from ansible/issue-2330
Add explicit Job Template Admin role
2018-07-09 13:26:39 -04:00
Rob Ruma
6378479ee7 Updates to callback scripts that include retry functionality for bash and extra_vars handling for PowerShell
Signed-off-by: Rob Ruma <robruma@users.noreply.github.com>
2018-07-09 13:00:10 -04:00
Bill Nottingham
ae4135f149 add tests 2018-07-09 12:59:45 -04:00
moss
14def1e693 add want_hostcollections for sat6 source vars
Signed-off-by: moss <smossber@redhat.com>
2018-07-09 12:59:35 -04:00
Paul Neumann
73197f3ae5 Extend unit test for Azure source variable generation
Add tests for generation of Azure source variables. Test cases such
as overwriting a variable with its default value, overwriting a variable
with something different to its default value and add variables not set
by default.
2018-07-09 12:59:14 -04:00
Paul Neumann
4b7f106e9f Enable source variables for Azure inventory 2018-07-09 12:58:59 -04:00
Cristian Vargas
475a2bd9bb Remove trailing comma
Signed-off-by: Cristian Vargas <cristian@swapps.co>
2018-07-09 12:58:21 -04:00
Cristian Vargas
7ecde597ac Make LAST UPDATED field in projects table sortable
Signed-off-by: Cristian Vargas <cristian@swapps.co>
2018-07-09 12:58:12 -04:00
Wayne Witzel III
70a97ce998 Update test to reflect needing job_template_admin_role 2018-07-09 12:17:34 -04:00
Jake McDermott
3b3ae9f7f5 Merge pull request #2444 from jakemcdermott/fix-2334
add host_status_counts to adhoc commands; fix status display for adhoc commands
2018-07-09 12:08:25 -04:00
Ryan Petrello
df095d9b67 Merge pull request #2449 from ryanpetrello/https-logs
default HTTP-based log emits to HTTPS
2018-07-09 12:07:34 -04:00
Bill Nottingham
a4b1cb6e20 Merge pull request #2055 from wenottingham/sattests
add want_hostcollections for sat6 source vars (with tests)
2018-07-09 12:05:26 -04:00
Ryan Petrello
6bd9792518 default HTTP-based log emits to HTTPS
see: https://github.com/ansible/awx/issues/2048
2018-07-09 11:52:04 -04:00
Bill Nottingham
64cfbe7642 add tests 2018-07-09 11:49:45 -04:00
Marliana Lara
549cd347e9 Fix credential labels in jobs list 2018-07-09 11:33:21 -04:00
Chris Meyers
6a610d633f Merge pull request #2430 from chrismeyersfsu/fix-do_not_touch_my_iso
deny topology changes to iso instances via api
2018-07-09 11:04:19 -04:00
Wayne Witzel III
2f78c658b1 Add explicit Job Template Admin role 2018-07-09 10:57:58 -04:00
moss
0f50dfd617 add want_hostcollections for sat6 source vars
Signed-off-by: moss <smossber@redhat.com>
2018-07-09 10:45:16 -04:00
Bill Nottingham
4737200566 Merge pull request #2051 from wenottingham/remove-issue-link
Rework reporting issues/get involved.
2018-07-09 10:17:30 -04:00
AlanCoding
7860cda9dc fix bug with custom script user_capabilities 2018-07-09 10:15:17 -04:00
Jake McDermott
bf55c7e7e2 use host_status_counts field for adhoc command jobs ui 2018-07-09 10:13:49 -04:00
Jake McDermott
1b1df63415 add host_status_counts to adhoc command event 2018-07-09 10:13:39 -04:00
Jake McDermott
380bf77b63 move host_status_counts logic into event model 2018-07-09 10:13:31 -04:00
Jake McDermott
87fccb9f45 fix status list for client-generated status counts 2018-07-09 10:13:21 -04:00
Ryan Petrello
e886311d41 Merge pull request #2439 from ryanpetrello/copy-over-here
Add a Location header to HTTP 201 for POST to copy endpoints
2018-07-09 09:28:51 -04:00
AlanCoding
34e2d9b47c fix regression: include error message from remote server 2018-07-09 09:04:14 -04:00
Ryan Petrello
2eb09e2fa2 Merge pull request #2435 from ryanpetrello/webpack-ui-external
add instructions for running the UI webpack server on an external host
2018-07-09 08:52:54 -04:00
Ryan Petrello
2916edd70f Add a Location header to HTTP 201 for POST to copy endpoints 2018-07-09 08:47:01 -04:00
AlanCoding
6a9a8eacc2 ask user input if credential prompting enabled 2018-07-09 08:37:47 -04:00
Ryan Petrello
da0fe173c9 Merge pull request #2431 from ryanpetrello/fix-201-location
add a missing Location header on HTTP 201 in a few places
2018-07-09 08:37:17 -04:00
sangongs
67c59b66e2 Merge pull request #2376 from sangongs/fix_get_failures
Fix serializers of unified_jobs & ad_hoc_commands to avoid exceptions
2018-07-09 08:14:34 -04:00
Rob Ruma
6514c338a2 Adding ability to ignore SSL certificate validation errors, cleanup parameters and usage
Signed-off-by: Rob Ruma <robruma@users.noreply.github.com>
2018-07-06 23:18:12 -04:00
chris meyers
19e865e9a5 prevent remove iso instance from iso instance groups 2018-07-06 15:34:26 -04:00
chris meyers
2ffc4b256d fix copy paste error 2018-07-06 15:12:57 -04:00
Christian Adams
7f27a3c74d Merge pull request #2335 from rooftopcellist/patch_exp_setting
migrate AUTH_TOKEN_EXPIRATION  to new session length setting
2018-07-06 15:08:02 -04:00
Ryan Petrello
9a2c359274 add instructions for running the UI webpack server on an external host 2018-07-06 14:52:34 -04:00
chris meyers
aeca21ab5b deny topology changes to iso instances via api 2018-07-06 14:50:17 -04:00
Marliana Lara
0a890d04da Merge pull request #2425 from marshmalien/fix/2417-instance-modal-styles
Fix instance modal styles
2018-07-06 14:28:38 -04:00
Bill Nottingham
4f02fe0b32 Rework reporting issues/get involved.
Denote that bugs & ideas go to the issue tracking repo, and discussion goes to mailing list/IRC.
2018-07-06 14:27:12 -04:00
adamscmRH
cb6514777d grab on-disk setting 2018-07-06 14:16:59 -04:00
Jared Tabor
7bf1569417 Corrects label on schedule form 2018-07-06 10:46:24 -07:00
John Mitchell
9ae88acc49 fix jobs list header 2018-07-06 11:59:50 -04:00
Ryan Petrello
ef211a4dc8 add a missing Location header on HTTP 201 in a few places 2018-07-06 11:34:48 -04:00
Ryan Petrello
b445e66ffa Merge pull request #2423 from ryanpetrello/multibyte-unicode-isolated
don't decode stdout on-the-fly as it's processed
2018-07-06 09:44:11 -04:00
Ryan Petrello
172defa0d4 don't use codecs.open for syncing isolated stdout data
see: https://github.com/ansible/tower/issues/2315
2018-07-06 08:25:51 -04:00
Bill Nottingham
dd8ca48bf9 Merge pull request #2403 from wenottingham/read-all-about-it
Don't filter out read role.
2018-07-05 20:04:54 -04:00
Marliana Lara
900cb56950 Merge pull request #2419 from marshmalien/fix/1517-xss-application-token-description
Add sanitize filter to token description field
2018-07-05 16:46:10 -04:00
Marliana Lara
f6c48bc1da Merge pull request #2426 from marshmalien/fix/1521-templates-dismiss-button
Hide dismiss button on the templates list panel
2018-07-05 16:44:46 -04:00
mabashian
85de502681 Fixed bug displaying vault cred with no vault_id 2018-07-05 15:51:27 -04:00
Marliana Lara
df3f10d71b Hide dismiss button on the templates list panel 2018-07-05 15:28:59 -04:00
Marliana Lara
aafc92819d Fix instance modal styles 2018-07-05 14:57:35 -04:00
Marliana Lara
b860395949 Add sanitize filter to token description field 2018-07-05 13:57:38 -04:00
Marliana Lara
70f1b0d642 Merge pull request #2418 from marshmalien/fix/2243-activity-stream-link
Add case for CTIT settings in activity stream
2018-07-05 13:25:28 -04:00
Jared Tabor
56fc5b104e Merge pull request #2415 from jaredevantabor/fix-2413
Fixes Discard Changes & Save buttons in Settings page
2018-07-05 10:01:24 -07:00
Marliana Lara
c71f98dc42 Add case for settings in build link factory 2018-07-05 12:16:40 -04:00
adamscmRH
9ac92c0ee0 refactor code 2018-07-05 11:48:33 -04:00
Bill Nottingham
fa5132991f Require certpair for SAML. 2018-07-05 11:12:00 -04:00
Christian Adams
90d57300da Merge pull request #2357 from rooftopcellist/hookup_ui_expire
Hookup ui expire
2018-07-05 08:45:56 -04:00
Jared Tabor
a4e9f18d2b Fixes Discard Changes & Save buttons in Settings page 2018-07-03 15:25:00 -07:00
Alan Rominger
0b811a53ff Merge pull request #2410 from AlanCoding/filterama
Show filterable: False if not filterable
2018-07-03 17:32:11 -04:00
adamscmRH
3e1aaec9fe add generic setting method 2018-07-03 17:09:47 -04:00
adamscmRH
ae0793f374 Hookup UI session expiration 2018-07-03 16:53:27 -04:00
Alan Rominger
13c1b87df4 Merge pull request #2191 from AlanCoding/schedule_fixes
Fix bugs creating WFJT schedule with passwords
2018-07-03 16:51:01 -04:00
Jared Tabor
2f108e55f3 Merge pull request #2412 from jaredevantabor/fix-warning
Prefers arrow function over unnamed function
2018-07-03 13:26:55 -07:00
Jared Tabor
580736e80d Prefers arrow function over unnamed function 2018-07-03 13:08:57 -07:00
Alan Rominger
360ad7ad61 Merge branch 'release_3.3.0' into filterama 2018-07-03 15:42:37 -04:00
Ryan Petrello
151187f623 Merge pull request #2408 from ryanpetrello/fix-2323
properly check read permissions in `GET /api/v2/wfjt/N/copy/`
2018-07-03 15:32:20 -04:00
kialam
1feb81f20c Merge pull request #2402 from kialam/fix/2308-network-ui-device
Update the canvas element’s scale factor upon initialization.
2018-07-03 15:24:42 -04:00
Alan Rominger
1f7d7151ad Merge pull request #2405 from AlanCoding/app_act_str
Add back in application activity stream link
2018-07-03 15:23:18 -04:00
AlanCoding
b97626bf37 show filterable: False if not filterable 2018-07-03 15:21:10 -04:00
Yunfan Zhang
e9a2100a62 Merge pull request #2400 from YunfanZhang42/fix_content_type
Handle exception with invalid HTTP content_type.
2018-07-03 15:16:13 -04:00
Ryan Petrello
d1f5485b96 properly check read permissions in GET /api/v2/wfjt/N/copy/
see: https://github.com/ansible/tower/issues/2323
2018-07-03 15:15:00 -04:00
kialam
26360f8852 Update the canvas element’s scale factor upon initialization.
And fix initial value of `$scope.current_scale`.
2018-07-03 15:03:09 -04:00
AlanCoding
2a5853e4fc add back in application activity stream link 2018-07-03 14:30:56 -04:00
Bill Nottingham
e271a69efb Don't filter out read role. 2018-07-03 14:00:38 -04:00
Yunfan Zhang
b4890ee331 Handle exception with invalid HTTP content_type.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-07-03 13:55:18 -04:00
Jared Tabor
4c1bc49258 Merge pull request #2395 from jaredevantabor/https-dev-server
Changes UI dev server to operate over https
2018-07-03 09:30:41 -07:00
Marliana Lara
77815c20a4 Merge pull request #2386 from marshmalien/fix/1824-disable-row-user-permissions
Fix disableRowValue expression in permissions users list
2018-07-03 11:27:19 -04:00
Marliana Lara
a9ddd02f5c Merge pull request #2392 from marshmalien/fix/1380-disable-ig-lookup
Disable instance group lookup for org admin
2018-07-03 11:17:11 -04:00
Marliana Lara
f3ff624873 Merge pull request #2361 from marshmalien/fix/panel-header-docs
Modify panel header to accept title and badge string bindings
2018-07-03 11:16:36 -04:00
Ryan Petrello
1c478b5ccb Merge pull request #2399 from ryanpetrello/remove-storage-cruft
delete some old, dead code
2018-07-03 11:04:57 -04:00
Ryan Petrello
b8dbf62abc delete some old, dead code 2018-07-03 10:30:22 -04:00
Marliana Lara
220831a3d0 Merge pull request #2382 from marshmalien/fix/2321-modal-backdrop
Fix modal backdrop styles
2018-07-03 10:27:25 -04:00
Haokun Chen
641392b815 Merge pull request #2342 from Haokun-Chen/1843
move smart inventory button next to smart-search bar in host list page
2018-07-03 10:10:03 -04:00
Ryan Petrello
d58411cf07 Merge pull request #2396 from ryanpetrello/fix-pexpect-hang
support env vars that contain unicode (without hanging)
2018-07-03 08:44:46 -04:00
Ryan Petrello
4d7a20a9fb support env vars that contain unicode (without hanging)
see: https://github.com/ansible/tower/issues/2391
see: https://github.com/pexpect/pexpect/issues/512
2018-07-03 08:26:11 -04:00
Jared Tabor
92cf8d538a Changes UI dev server to operate over https 2018-07-02 22:09:24 -07:00
Marliana Lara
35b27005d4 Disable instance group lookup when user is an org admin 2018-07-02 16:25:46 -04:00
adamscmRH
4c84d400a8 migrate session length setting 2018-07-02 14:17:16 -04:00
adamscmRH
b5dc3e6b94 patch session length settings 2018-07-02 14:17:16 -04:00
Marliana Lara
773c41ec81 Fix disableRowValue expression in permissions users list 2018-07-02 12:49:30 -04:00
Guoqiang Zhang
5a4451ddd4 Fix serializers of unified_jobs & ad_hoc_commands to avoid special exceptions 2018-07-02 11:53:33 -04:00
Ryan Petrello
380df1b327 Merge pull request #2380 from ryanpetrello/noisy-celery-watcher
make celery-watcher less noisy
2018-07-02 11:01:18 -04:00
Jake McDermott
209c29d897 Merge pull request #2381 from ansible/jakemcdermott-remove-final-counter-offset
remove offset from EOF websocket final_counter
2018-07-02 10:49:22 -04:00
Ryan Petrello
a8eb4327ea make celery-watcher less noisy 2018-07-02 10:44:06 -04:00
Jake McDermott
1d9e788db4 Merge pull request #2383 from ansible/jakemcdermott-fix-2234
use height of parent container for output section
2018-07-02 10:43:53 -04:00
Jake McDermott
164e6cceca use height of parent container for output section 2018-07-02 10:25:58 -04:00
Marliana Lara
ce2f4dca16 Fix instance modal backdrop styles 2018-07-02 10:21:31 -04:00
Haokun Chen
d17f3d7d2a Merge pull request #2355 from Haokun-Chen/2197
deregister the transition hook when destroy smart-search controller
2018-07-02 10:18:25 -04:00
Jake McDermott
3edf5ba95c remove offset from final_counter 2018-07-02 10:08:12 -04:00
Marcin Karkocha
a19df9b3b3 #2039 add tiller-namespace as argument 2018-07-02 12:33:26 +00:00
Ilkka Tengvall
0443bd3099 fixes selinux permissions for awx data.
fixes issue #2036 and  #1896
2018-07-02 09:22:36 +03:00
Jijo Varghese
919a614dbb ldap attributes filter in user_groups()
ldap search currently fetches ALL attributes which is a waste of bandwidth resources and
woefully slow on large ldap groups when it only needs to parse the name_attr

Signed-off-by: Jijo Varghese <jijojv@gmail.com>
2018-06-30 00:02:19 -07:00
Alan Rominger
6f63c7ba38 Merge pull request #2346 from AlanCoding/no_controller_node
No controller node field for project updates
2018-06-29 14:52:34 -04:00
Marliana Lara
581436f23d Merge pull request #2369 from marshmalien/fix/2234-job-output-height
[Job Results] Remove scrollbar from standard out panel
2018-06-29 14:25:51 -04:00
AlanCoding
8ae979908c Enforce unified list field consistency
Discovered via bug: controller_node field present in
project update list but not in detail view

Added tests to assert that "unified" list serializer
produces same fields as the ordinary serializer,
for unified jobs & unified JTs

Added test to check that list serializers do differ
from detail serializer except for allowed differences

Added test to check that list serializers are applied
correctly - only on list views, and that detail views,
likewise, do not use list serializers

Fix the many many bugs discovered by these new
testing mechanisms
2018-06-29 14:03:52 -04:00
Marliana Lara
94674313e4 Remove scrollbar from job results standard out 2018-06-29 12:07:52 -04:00
Alan Rominger
d5661a0434 Merge pull request #2343 from AlanCoding/credential_hell
Copy JT credential logic to Job summary fields
2018-06-28 19:27:33 -04:00
Haokun-Chen
81ef98e627 leftAlign smart inventory button next to search bar 2018-06-28 16:53:12 -04:00
Michael Abashian
1c194dbfbc Merge pull request #2351 from mabashian/2301-xss
Rolls back changes to the xss filter.  Addresses escaped characters in cred tags.
2018-06-28 15:04:56 -04:00
Ryan Petrello
26bd16b855 Merge pull request #2352 from ryanpetrello/fix-csrf-sessions
fix a few remaining CSRF nits
2018-06-28 13:57:13 -04:00
Marliana Lara
642cc88fcd Modify panel header to accept title and badge string bindings 2018-06-28 13:44:05 -04:00
mabashian
b426eeeb5c Rolls back xss filter test 2018-06-28 13:26:48 -04:00
Ryan Petrello
b8ed78ee9d Never send WWW-Authenticate: Basic... headers for the API 2018-06-28 13:00:23 -04:00
Ben Thomasson
fe66bb99d5 Merge pull request #2242 from benthomasson/network_ui_read_only_permissions_fix
Adds topology edit permissions check to network ui session
2018-06-28 12:54:41 -04:00
Haokun Chen
ad483aedc7 Merge pull request #2337 from Haokun-Chen/2096
show credential on job detail page for jobs besides JTs playbook job
2018-06-28 11:52:04 -04:00
Haokun-Chen
a07ee67eb9 deregister the transition hook when destroy smart-search controller 2018-06-28 11:01:01 -04:00
Ryan Petrello
d52fa377d8 remove unnecessary CSRF exemptions 2018-06-28 09:35:01 -04:00
Ryan Petrello
3b0f7de3e6 Properly return HTTP 403 when CSRF fails (not HTTP 500) 2018-06-28 09:33:59 -04:00
Michael Abashian
e8748fa147 Merge pull request #2338 from mabashian/instance-modal-search
Updates to instance list and instance modal search
2018-06-28 09:15:34 -04:00
Ryan Petrello
63723013f7 Merge pull request #2345 from ryanpetrello/fix-csrf-sessions
properly enforce CSRF validation
2018-06-28 09:14:56 -04:00
mabashian
cbcc47010d Rolls back changes to the xss filter. Removes unnecessary sanitize of credential names in tags 2018-06-28 08:59:36 -04:00
V.Gouvalas
1239195289 FIX nginx use selected log formatting 2018-06-28 14:09:13 +03:00
Ryan Petrello
504dfd32ee properly enforce CSRF validation
see: https://github.com/ansible/tower/issues/2339
2018-06-27 21:09:26 -04:00
Jake McDermott
b54ea736b0 Merge pull request #2318 from jakemcdermott/job-results/viewable-page-up-down
make output nav controls move up or down by viewable content height
2018-06-27 20:13:30 -04:00
Jared Tabor
0ec95c8463 Merge pull request #2296 from jaredevantabor/fix-719
Displayeth thy Cancel button on the jobs list for a running system job
2018-06-27 15:08:33 -07:00
Jared Tabor
c9c7ee14b2 Merge pull request #2329 from jaredevantabor/schedules
Fixeth thy schedules
2018-06-27 15:04:20 -07:00
Marliana Lara
8317102f0d Merge pull request #2336 from marshmalien/1723-ux-manual-instances
Remove instance policy list lookup from instance group form
2018-06-27 16:10:20 -04:00
AlanCoding
a15527b54c copy JT credential logic to Job summary fields 2018-06-27 14:39:35 -04:00
Ryan Petrello
39bc64d089 Merge pull request #2332 from ryanpetrello/fix-session-limit
make settings.SESSIONS_PER_USER work
2018-06-27 14:34:21 -04:00
Jared Tabor
aa76f6ca39 Adjustments to Socket Service for session-limit PR 2018-06-27 10:45:23 -07:00
Haokun-Chen
67bda81e67 show credential to job detail page 2018-06-27 12:45:24 -04:00
Ryan Petrello
b2cdf82b78 make settings.SESSIONS_PER_USER work
see: https://github.com/ansible/tower/issues/2209
2018-06-27 12:09:56 -04:00
mabashian
9ec5009bdf Updates to instance list and instance modal search 2018-06-27 11:44:38 -04:00
John Mitchell
3e951a5598 Merge pull request #2328 from jlmitch5/fixTemplateTagWrapping
Fix template tag wrapping
2018-06-27 11:05:45 -04:00
Haokun Chen
9f6d431c54 Merge pull request #2324 from Haokun-Chen/2050
update tag component to use tag directive
2018-06-27 10:24:13 -04:00
Marliana Lara
7c76807a8e Remove instance policy list lookup from instance group form 2018-06-27 10:18:03 -04:00
Jared Tabor
5702c8249e Fixes the standalone schedules list styling
The list was not wrapped in a panel and the form was not showing
above the list view like our other CRUD views.
2018-06-26 14:19:12 -07:00
John Mitchell
106ec1aabe fix template list tag wrapping 2018-06-26 16:21:30 -04:00
John Mitchell
a9526de2c4 fix inv host list status wrapping 2018-06-26 16:21:09 -04:00
Haokun-Chen
da421f28e8 update tag component to use tag directive in smart-search, multi-select, input/lookup.partial, instance-group-multiselect 2018-06-26 13:59:02 -04:00
Haokun Chen
7aa48708d6 Merge pull request #2305 from Haokun-Chen/2225
fixing margin for instances group, application, credential page
2018-06-26 13:56:44 -04:00
John Mitchell
981f77774b Merge pull request #2224 from ansible/2179
align tag to left hand side of bar
2018-06-26 13:48:38 -04:00
Jake McDermott
e07eba266d Merge pull request #2306 from jakemcdermott/job-results/static-pager
improve job output search
2018-06-26 13:12:21 -04:00
Jake McDermott
47fc676607 cache last job_event page when not running 2018-06-26 12:55:58 -04:00
Jake McDermott
7f23aa81e6 clear job event search on relaunch 2018-06-26 12:55:52 -04:00
Jake McDermott
e6668a43cd add pager for static and filtered job results 2018-06-26 12:55:37 -04:00
Jake McDermott
374f781d0d make nav controls move up or down by viewable content height 2018-06-26 12:08:41 -04:00
Ryan Petrello
d73b71d94b Merge pull request #2317 from ryanpetrello/harden-session-expiration
make `awx-manage expire_sessions --user xyz` more robust
2018-06-26 10:39:46 -04:00
Haokun-Chen
feff7fb776 fixing margin for instances list, application token, credential permission page 2018-06-26 10:37:52 -04:00
Haokun Chen
b7ff3aa8fe Merge pull request #2311 from Haokun-Chen/2234
add responsiveness to job output panel
2018-06-26 10:22:53 -04:00
Ryan Petrello
5c44bf4ef9 Merge pull request #2313 from ryanpetrello/fix-ui-401
don't send WWW-Authenticate: Basic for AJAX, and properly detect 401
2018-06-26 10:07:35 -04:00
Ryan Petrello
f6920a02cf make awx-manage expire_sessions --user xyz more robust
see: https://github.com/ansible/tower/issues/2316
2018-06-26 08:52:52 -04:00
Ryan Petrello
7880f83d97 don't send WWW-Authenticate: Basic for AJAX, and properly detect 401 2018-06-26 08:40:21 -04:00
Haokun-Chen
be0a77b203 add responsiveness to job output panel 2018-06-25 16:53:39 -04:00
Bill Nottingham
2e980293d9 Merge pull request #2009 from cdvv7788/Issue/1506
Make LAST UPDATED field in projects table sortable #1506
2018-06-25 16:27:30 -04:00
Bill Nottingham
0d03036fb1 Merge pull request #1629 from robruma/feature/update_callback_scripts
Updates to callback scripts
2018-06-25 15:47:25 -04:00
Ryan Petrello
a4271024fe Merge pull request #2014 from cdvv7788/fix-contributing-docs
Fix issue with table of contents(CONTRIBUTING.md)
2018-06-25 15:37:46 -04:00
Ryan Petrello
37972ec9da Merge pull request #1876 from paneu/azure-rm-inv-variables
Enable source variables for Azure inventory
2018-06-25 15:36:27 -04:00
Ryan Petrello
d8c4f118c2 Merge pull request #2020 from ryanpetrello/fix-tz-test
fix a failing timezone test
2018-06-25 15:36:15 -04:00
Ryan Petrello
1b2d7ed748 fix a failing timezone test 2018-06-25 15:18:29 -04:00
Paul Neumann
f6eb534f30 Extend unit test for Azure source variable generation
Add tests for generation of Azure source variables. Test cases such
as overwriting a variable with its default value, overwriting a variable
with something different to its default value and add variables not set
by default.
2018-06-25 20:26:20 +02:00
Paul Neumann
33f9834747 Enable source variables for Azure inventory 2018-06-25 20:26:20 +02:00
Christian Adams
602f60b9b2 Merge pull request #2019 from rooftopcellist/cp_pytest_upgrade
update dev pytest
2018-06-25 13:27:20 -04:00
adamscmRH
3b36f85989 update dev pytest 2018-06-25 13:22:17 -04:00
Jake McDermott
2ca4c08567 Merge pull request #2294 from jaredevantabor/2179
Update jobs list if navigating from the output page.
2018-06-25 12:38:58 -04:00
John Mitchell
b6334361af fix typo 2018-06-25 11:47:14 -04:00
Jake McDermott
c5300e9c05 Merge pull request #2298 from jakemcdermott/job-results/expand-collapse-all-without-domquery
store event names in record list to find orphan task lines when toggling
2018-06-25 11:38:06 -04:00
Jake McDermott
9449eeb37e Merge pull request #2299 from jakemcdermott/tests/workflow-visualizer-5000-selector
update selector used for workflow button
2018-06-25 10:47:34 -04:00
Jake McDermott
295dba8622 Merge pull request #2297 from jakemcdermott/job-results/reintroduce-ng-non-bindable
reintroduce ng-non-bindable to output lines
2018-06-25 10:45:58 -04:00
Haokun Chen
fb56585636 Merge pull request #2290 from Haokun-Chen/2254
update jobs/schedules to schedules in route and breadcrumb
2018-06-25 10:24:36 -04:00
Jake McDermott
e64d05c324 update selector used for workflow button 2018-06-25 10:05:52 -04:00
Marliana Lara
f53662a248 Merge pull request #2292 from marshmalien/fix/2251-firefox-dashboard-dropdown-arrows
Fix dashboard graph dropdown arrows in firefox
2018-06-25 09:59:38 -04:00
Marliana Lara
3fbde0b409 Merge pull request #2289 from marshmalien/fix/2277-wrap-preview-tags
Wrap job prompt preview tags
2018-06-25 09:59:03 -04:00
Haokun Chen
a7ba7708bb Merge pull request #2287 from Haokun-Chen/2284
fix job result stats section when running/finish jobs
2018-06-25 09:47:48 -04:00
Christian Adams
39c0ed4ad6 Merge pull request #2291 from rooftopcellist/revert_radius_110
Revert Django-radius to 1.1.0
2018-06-25 08:59:36 -04:00
Jake McDermott
71f2388ec8 use record list to find orphan task records when toggling 2018-06-25 01:38:53 -04:00
Jake McDermott
92b8d90800 reintroduce ng-non-bindable directive to output lines 2018-06-25 01:06:41 -04:00
Cristian Vargas
19ca2581fa Fix issue with table of contents(links)
Signed-off-by: Cristian Vargas <cristian@swapps.co>
2018-06-23 13:16:38 -05:00
Jared Tabor
d468f829dd Shows the Cancel button on the jobs list for a running system job 2018-06-22 17:56:26 -07:00
Jared Tabor
ccd8a48617 Merge pull request #2295 from jaredevantabor/2265
Alas, the stdout page wasn't loading if sockets were down
2018-06-22 15:36:59 -07:00
Jared Tabor
041256a6e0 Removing return statement
The SocketService.addStateResolve returns the resolve so you don't
have to.
2018-06-22 14:47:52 -07:00
Jared Tabor
c0f3b0268e Update jobs list if navigating from the output page. 2018-06-22 13:42:00 -07:00
Marliana Lara
ad205a869d Fix dashboard graph dropdown arrows in firefox 2018-06-22 16:29:57 -04:00
Jake McDermott
46223d3cbf Merge pull request #2282 from Haokun-Chen/fixed-toggle-menu
fix toggle menu when scroll up
2018-06-22 15:38:09 -04:00
Haokun-Chen
2d2b1676aa update jobs/schedules to schedules in route and breadcrumb 2018-06-22 15:36:44 -04:00
Jake McDermott
c19af3ca4f Merge pull request #2288 from marshmalien/fix/2279-job-output-line-highlight
Flex job event line highlighting across entire row
2018-06-22 15:27:45 -04:00
Marliana Lara
93988896a9 Wrap job prompt preview tags 2018-06-22 15:27:32 -04:00
Marliana Lara
ffdb564c15 Flex job event line highlighting across entire row 2018-06-22 15:06:16 -04:00
adamscmRH
8cc77234fc revert django-radius from 1.3.3 to 1.1.0 2018-06-22 15:01:11 -04:00
John Hill
aa98842364 Merge pull request #1953 from mabashian/jt-launch-automated-tests
First pass at JT launch with prompts automated tests
2018-06-22 14:37:03 -04:00
Jake McDermott
a50614983a wait for job to finish before ending tests 2018-06-22 14:21:14 -04:00
Jared Tabor
a8504d7bd7 Merge pull request #2276 from jaredevantabor/disabled-codemirror
Improves UX for readonly codemirrors so that users can copy/paste
2018-06-22 11:09:58 -07:00
Jake McDermott
d3b71858df use prompt inventory list id 2018-06-22 13:53:34 -04:00
Jake McDermott
ef4607b29f make sure surveys are enabled before adding a survey 2018-06-22 13:53:25 -04:00
Jake McDermott
9ae5ffc8ca make sure project is updated before test begins 2018-06-22 13:53:15 -04:00
Jake McDermott
2f2b19ffec increase timeout threshold for login 2018-06-22 13:53:06 -04:00
mabashian
e243cf4435 Fixed linting errors 2018-06-22 13:51:10 -04:00
mabashian
fbfaf69ee9 Added extra assertions and waits to reduce flake 2018-06-22 13:51:10 -04:00
mabashian
1d74499385 Added check to make sure that input contents match what we expect them to match 2018-06-22 13:51:10 -04:00
mabashian
264b0f248a First pass at automated jt launch tests 2018-06-22 13:51:10 -04:00
Marliana Lara
a6837343a5 Merge pull request #2275 from marshmalien/fix/see-more-see-less
Add show more/less to job details labels
2018-06-22 13:15:07 -04:00
Haokun-Chen
e51e4e5f6c fix job result stats section when running/finish jobs 2018-06-22 13:09:04 -04:00
Christian Adams
8bd2217a49 Merge pull request #2278 from rooftopcellist/fix_dot_oauth2_error
Fix dot oauth2 error
2018-06-22 12:54:39 -04:00
Marliana Lara
62fd5ea6ef Show up to 50 labels in job details 2018-06-22 11:33:40 -04:00
Ryan Petrello
accf586588 Merge pull request #2283 from sangongs/honcho_io_encoding
Force the python IO encoding to be utf_8 when using honcho
2018-06-22 10:22:55 -04:00
Guoqiang Zhang
530860c386 Force the python IO encoding to be utf_8 when using honcho 2018-06-22 09:35:28 -04:00
Haokun-Chen
3933e01dd1 fix toggle menu when scroll up 2018-06-22 09:33:23 -04:00
adamscmRH
b7f5161835 try-except auth_header 2018-06-21 17:11:34 -04:00
Marliana Lara
09abba63b7 Add show more less to job details labels 2018-06-21 17:08:18 -04:00
Alan Rominger
bed4d240af Merge pull request #2274 from AlanCoding/absolute_nonsense
Remove brittle condition causing schema to fail
2018-06-21 15:44:48 -04:00
Jared Tabor
aac939d9e4 Improves UX for readonly codemirrors so that users can copy/paste 2018-06-21 12:30:53 -07:00
AlanCoding
b2251cb916 remove brittle condition causing schema to fail 2018-06-21 14:39:25 -04:00
Jake McDermott
7cd203d610 Merge pull request #2246 from marshmalien/fix/job-output-table
Extend standard out line border to full length of container
2018-06-21 13:47:59 -04:00
Haokun Chen
f72ed46354 Merge pull request #2270 from Haokun-Chen/2248
change workflow editor to workflow visualizer
2018-06-21 13:46:29 -04:00
Cristian Vargas
5a8f4060b7 Remove trailing comma
Signed-off-by: Cristian Vargas <cristian@swapps.co>
2018-06-21 11:53:33 -05:00
Haokun-Chen
f3e4780c7a change workflow editor to workflow visualizer 2018-06-21 12:27:35 -04:00
Ryan Petrello
008a3a0d01 Merge pull request #2269 from ryanpetrello/no-inventory-credentials-v1
always specify `cloud: True/False` for JT/job credential summary
2018-06-21 12:07:10 -04:00
Ryan Petrello
813a3be2b8 always specify cloud: True/False for JT/job credential summary 2018-06-21 11:16:35 -04:00
Ryan Petrello
c944f37637 Merge pull request #2268 from ryanpetrello/no-inventory-credentials-v1
filter jt.summary_fields.credential.credential_type from /api/v1/
2018-06-21 11:12:56 -04:00
Ryan Petrello
c7125a335a filter jt.summary_fields.credential.credential_type from /api/v1/ 2018-06-21 11:03:23 -04:00
Ben Thomasson
d294139f4a Adds topology edit permissions check to network ui session
This allows the read-only views to work while rejecting
any edit messages that could be sent by a read-only client.
2018-06-21 10:57:15 -04:00
Ryan Petrello
30e2207960 Merge pull request #2266 from AlanCoding/no_cs_v1
Do not show create_schedule link in v1
2018-06-21 10:54:17 -04:00
Ryan Petrello
9994dad55f Merge pull request #2262 from ryanpetrello/no-inventory-credentials-v1
don't show summary_fields.credential.credential_type_id on /api/v1/
2018-06-21 10:29:50 -04:00
John Mitchell
abe7d3b084 Merge pull request #2247 from jlmitch5/fixAddOrgAndNewListSearch
Fix add org and new list search
2018-06-21 10:21:04 -04:00
AlanCoding
94fce61d36 do not show create_schedule link in v1 2018-06-21 10:09:47 -04:00
Marliana Lara
8297b040f8 Wrap output event text 2018-06-21 09:51:55 -04:00
Ryan Petrello
83ecea2377 don't show summary_fields.credential.credential_type_id on /api/v1/ 2018-06-21 09:19:47 -04:00
Cristian Vargas
fc745e1979 Make LAST UPDATED field in projects table sortable
Signed-off-by: Cristian Vargas <cristian@swapps.co>
2018-06-20 22:42:18 -05:00
adamscmRH
01a1d6ffd0 selectively authenticate with OAuth2 Backend 2018-06-20 23:09:52 -04:00
Jared Tabor
f38b01c80e Merge pull request #2237 from jaredevantabor/networking
Network UI fixes
2018-06-20 15:47:33 -07:00
Jared Tabor
ccb7758b37 Changes the ngShow for the Network Visualizer and Remediate Inventory buttons
to only show them on the Details tab (or in the case of Remediate inventory,
only show it on the Details or Hosts tab).
2018-06-20 15:27:40 -07:00
Ryan Petrello
7dee3c74ef Merge pull request #2259 from ryanpetrello/no-inventory-credentials-v1
don't show inventory_source.related.credentials in /api/v1/
2018-06-20 17:37:06 -04:00
Ryan Petrello
78f6907c1b don't show inventory_source/update.related.credentials in /api/v1/ 2018-06-20 17:21:08 -04:00
Haokun Chen
9ec53b6e03 Merge pull request #2249 from Haokun-Chen/2228
enable expand/collapse all tasks button in job result page
2018-06-20 15:05:27 -04:00
Jared Tabor
f3fa3afe93 Changes title on the Network UI to "Network Visualizer | <name of inv>" 2018-06-20 11:48:42 -07:00
Haokun-Chen
daf3215241 enable expand/collapse all tasks button in job result page 2018-06-20 14:30:35 -04:00
Marliana Lara
15c8f5709c Update side nav width and font size 2018-06-20 14:22:24 -04:00
AlanCoding
f753bea24f Test-based fixes to launch config password handling
Fix bug creating WFJT schedule with passwords:
discard survey_passwords field if given in WFJT
prompts processing method.
Fixed by porting prior JT fix to WFJT method of
same name.

Fix bug where API browser will show encrypted form
of variables in the POST submission box after
failed attempt:
copy extra_data so encrypted data values are not
added in still-linked request.data

Fix a bug where submitted extra_data $encrypted$ string
literal was saved because survey_passwords was empty
when there was no diff from prior.

Allow not answering required password questions with a
non-empty default value when saving a launch config.
The literal $encrypted$ string now gets passed into the
prompts / survey validator.
2018-06-20 14:18:38 -04:00
John Mitchell
e89f9b62f5 emit value expected by new lists from smart search 2018-06-20 14:01:49 -04:00
Marliana Lara
2824e750cb Extend standard out line border to full length of container 2018-06-20 13:49:41 -04:00
Yunfan Zhang
37d61904bf Merge pull request #2177 from YunfanZhang42/disallow_dict_on_credentials
Disallow posting dictionary as credentials to JT launch API endpoint.
2018-06-20 13:37:21 -04:00
Alan Rominger
8dc2068d18 Merge pull request #2238 from AlanCoding/hold_auth_app
Delay auth app migrations until 3.3
2018-06-20 13:27:44 -04:00
Yunfan Zhang
9fec43c643 Disallow posting dictionary as credentials to JT launch API endpoint. 2018-06-20 13:05:47 -04:00
John Mitchell
3d42fb1237 updating reference to custom virtualenv 2018-06-20 12:50:38 -04:00
Alan Rominger
d1bc9758db Merge pull request #2060 from AlanCoding/one_less_counter
Get rid of duplicate counter variable
2018-06-20 09:46:03 -04:00
AlanCoding
ecf24b6eef delay auth app migrations until 3.3 2018-06-20 07:57:40 -04:00
Jared Tabor
2566a5f14f Adds a button to the inventory form that links the user directly to hte
Network UI
2018-06-19 14:55:51 -07:00
Jared Tabor
c02c92890c Enables smart inventories to be shown on the network UI 2018-06-19 14:55:51 -07:00
Jared Tabor
afb214b8d4 Hides the "Inventory" title on the inventory toolbox when toggling 2018-06-19 14:55:51 -07:00
Jared Tabor
0bc3332f68 Changes console.logs to $log.debug for network UI 2018-06-19 14:55:51 -07:00
Jared Tabor
5bf0724bd0 Changes "Cancel" button to read "Close" 2018-06-19 14:55:51 -07:00
Ryan Petrello
bb657de6a7 Merge pull request #2231 from ryanpetrello/expedite-isolated-heartbeat
expedite the heartbeat when an isolated node is registered
2018-06-19 16:38:56 -04:00
Marliana Lara
07665d545d Merge pull request #2230 from marshmalien/fix/2229-side-nav-styles
Fix side navigation width and text styles
2018-06-19 15:41:45 -04:00
Ryan Petrello
ff2f7aa950 expedite the heartbeat when an isolated node is registered 2018-06-19 15:37:02 -04:00
Haokun Chen
8df186bc91 Merge pull request #2227 from Haokun-Chen/2157
make Instance Group in job details a link
2018-06-19 15:09:55 -04:00
Marliana Lara
540f4fa956 Update instance group breadcrumb strings 2018-06-19 15:07:37 -04:00
Haokun-Chen
38526b831b make Instance Group in job details a link 2018-06-19 14:47:42 -04:00
Marliana Lara
520293dd2e Fix side navigation width and text styles 2018-06-19 14:00:02 -04:00
Ryan Petrello
2be8e8d55a Merge pull request #2217 from ryanpetrello/fix-job-reaper
stop setting celery's hostname dynamically (it's passed via the cli)
2018-06-19 13:05:14 -04:00
Michael Abashian
1dffb542b8 Merge pull request #2204 from jakemcdermott/fix-2190
job output window - use tail for max counter when it is greater than api counter
2018-06-19 12:51:28 -04:00
Michael Abashian
389ed995d5 Merge pull request #2218 from jakemcdermott/fix-2159
job output window - improve scrolling behavior
2018-06-19 12:51:05 -04:00
Bill Nottingham
3dd2b97a53 Merge pull request #2223 from wenottingham/info-for-the-info-gods
Switch token/basic auth logging to INFO.
2018-06-19 12:29:24 -04:00
Ryan Petrello
471ff69257 stop setting celery's hostname dynamically (it's passed via the cli) 2018-06-19 12:16:00 -04:00
John Mitchell
5231b4c738 align tag to left hand side of bar
link #2169
2018-06-19 11:42:57 -04:00
Bill Nottingham
482f45b860 Switch token/basic auth logging to INFO, to match login/logout logging. 2018-06-19 11:37:19 -04:00
Haokun Chen
598d6e8445 Merge pull request #2188 from Haokun-Chen/1849
fix credential form private key passphrase and authorize password error
2018-06-19 11:11:30 -04:00
Jake McDermott
106494e650 use tail for max counter when it is greater than api counter 2018-06-19 09:49:05 -04:00
Jake McDermott
8f34725f7e don't reset scroll position on page-first 2018-06-19 09:46:17 -04:00
Jake McDermott
a6c4f15a86 set page-up post-scroll height to beginning of new dataset 2018-06-19 09:45:41 -04:00
Shane McDonald
93ddda13fd Merge pull request #2216 from ansible/rollback-task-reaper-pr
Revert "fix celery task reaper"
2018-06-18 19:24:29 -04:00
Haokun-Chen
fe31f54778 delete empty inputs fields to clear error on credential form 2018-06-18 16:48:41 -04:00
Ryan Petrello
ef6433c6f9 Revert "fix celery task reaper"
This reverts commit 1359208a99.
2018-06-18 16:18:20 -04:00
Ryan Petrello
b4c30576af Merge pull request #2200 from ryanpetrello/custom_venv_allow_bundled
allow the bundled `ansible` virtualenv to be selected on JT/Project
2018-06-18 15:50:16 -04:00
Ryan Petrello
eb9083c447 allow the bundled ansible virtualenv to be selected on JT/Proj
see: https://github.com/ansible/awx/issues/34
2018-06-18 14:33:09 -04:00
Christian Adams
7aa835abd4 Merge pull request #2210 from rooftopcellist/fix_refresh_token_fallout
fix oauth2 refresh tests for dat112
2018-06-18 14:31:35 -04:00
Shane McDonald
4f5a0d5a08 Merge pull request #1994 from taylorsmithgg/patch-1
Update INSTALL.md
2018-06-18 14:15:45 -04:00
Marliana Lara
4b59628075 Merge pull request #2175 from marshmalien/fix/1496-inconsistent-ui-character-escaping
Use textContent property instead of innerHTML within sanitize filter
2018-06-18 13:37:36 -04:00
adamscmRH
b498585c27 fix oauth2 refresh tests for dat112 2018-06-18 13:27:18 -04:00
Taylor Smith
e768e3f743 Update INSTALL.md
Fix link for kubernetes installer
2018-06-18 10:15:38 -07:00
Haokun Chen
af97338190 Merge pull request #2205 from Haokun-Chen/2181
keep expanded output window state after search
2018-06-18 12:42:41 -04:00
Haokun-Chen
11ffc8e28f keep expanded output window state after search 2018-06-18 12:39:42 -04:00
Haokun Chen
3df8a1df8c Merge pull request #2170 from Haokun-Chen/1890
disabled toggle for replace/revert button for auditor user
2018-06-18 09:47:02 -04:00
Ryan Petrello
a3a9b04416 Merge pull request #2201 from ryanpetrello/release_3.3.0
fix busted migrations
2018-06-15 20:48:43 -04:00
Ryan Petrello
427271f791 fix busted migrations 2018-06-15 20:38:57 -04:00
Chris Meyers
ee179c3693 Merge pull request #2174 from chrismeyersfsu/fix-reaper_hostname_map
fix celery task reaper
2018-06-15 17:06:04 -04:00
chris meyers
1359208a99 fix celery task reaper
* celery workers have internal queue names that are named after the
system hostname. This may differ from what tower knows the host by,
Instance.hostname
This adds a mapping so we can convert internal celery names to Instance
names for purposes of reaping jobs.
2018-06-15 16:56:53 -04:00
Marliana Lara
2a52dceb1a Update sanitize filter test 2018-06-15 13:49:35 -04:00
Ryan Petrello
6d17954571 Merge pull request #2185 from ryanpetrello/fix-2184
fix a bug in JobTemplate.extra_credentials summary_fields
2018-06-15 13:49:01 -04:00
Ryan Petrello
45fb262556 fix a bug in JobTemplate.extra_credentials summary_fields
see: https://github.com/ansible/tower/issues/2184
2018-06-15 12:19:40 -04:00
Marliana Lara
9a73d9c616 Use textContent property instead of innerHTML in sanitize filter 2018-06-15 10:43:19 -04:00
Christian Adams
1b5ea07745 Merge pull request #2171 from rooftopcellist/upgrade_oauth_112
Upgrade Django-oauth-toolkit to 1.1.2
2018-06-15 10:22:20 -04:00
Haokun Chen
9fef1e91aa Merge pull request #2173 from Haokun-Chen/2169
fix alignment of Job details status icon with text
2018-06-15 09:54:53 -04:00
Haokun Chen
5150933890 Merge pull request #2172 from Haokun-Chen/2155
fix Job output search tag styling
2018-06-15 09:54:39 -04:00
adamscmRH
c5f2b9a471 upgrade django-oauth-toolkit to 1.1.2 2018-06-15 09:50:34 -04:00
AlanCoding
16696a6fea get rid of duplicate counter variable 2018-06-15 09:29:13 -04:00
John Mitchell
26ffad11a5 Merge pull request #2148 from jlmitch5/fixNoLicenseLayoutStyling
fix no license layout styling
2018-06-14 17:32:24 -04:00
John Mitchell
4a26745daf fix no license layout styling 2018-06-14 17:31:53 -04:00
Marliana Lara
3da4aaa669 Merge pull request #2168 from marshmalien/fix/2144-job-output-line-number-styles
Fix inconsistent line number background color in job output panel
2018-06-14 16:29:08 -04:00
Haokun-Chen
bcdef5a58d fix alignment of Job details status icon with text 2018-06-14 15:52:01 -04:00
Alan Rominger
ad354238e9 Merge pull request #2165 from AlanCoding/bwrap_where_art_thou
log details for unhandled bwrap case
2018-06-14 15:18:09 -04:00
Christian Adams
5ee4333fb0 Merge pull request #2163 from rooftopcellist/related_token_endpoint
Add Related token link
2018-06-14 14:39:13 -04:00
Shane McDonald
8aa651faba Update translations 2018-06-14 14:37:18 -04:00
Haokun-Chen
df3aca7ff7 fix Job output search tag styling 2018-06-14 14:18:13 -04:00
adamscmRH
462e0be8d3 adds related tokens link to app endpoint 2018-06-14 14:12:18 -04:00
AlanCoding
adee02ab51 log details for unhandled bwrap case 2018-06-14 14:01:59 -04:00
Haokun-Chen
8df3c6e901 disabled toggle for replace/revert button for auditor user 2018-06-14 13:56:38 -04:00
Ryan Petrello
d0efa67845 Merge pull request #2161 from ryanpetrello/fix-2038
enforce `True` or `False` for boolean credential injectors
2018-06-14 13:29:58 -04:00
Ryan Petrello
0bcbccba33 enforce True or False for boolean credential injectors
see: https://github.com/ansible/tower/issues/2038
2018-06-14 12:34:54 -04:00
Marliana Lara
b9a4f50592 Fix inconsistent line number background color in job output panel 2018-06-14 11:50:32 -04:00
Christian Adams
485ce3f994 Merge pull request #2164 from rooftopcellist/update_pytest
update dev pytest
2018-06-14 11:45:57 -04:00
adamscmRH
b87d25300a update dev pytest 2018-06-14 10:11:11 -04:00
Yunfan Zhang
2a983e3dec Merge pull request #2152 from YunfanZhang42/host_filter_case_insensitive
Make search in Smart Filter case insensitive.
2018-06-13 16:21:00 -04:00
Ryan Petrello
07323640bc Merge pull request #2156 from ryanpetrello/fix-iso-dev
fix a few isolated dev issues
2018-06-13 15:36:59 -04:00
Ryan Petrello
84eacfc360 fix a few isolated dev issues
the main goal of this change is to make `make docker-isolated` work out
of the box

- specify the proper version for awx-expect --version
- update some deprecated playbook bits
- change the isolated container to privileged so bwrap will work
- fix awx-manage test_isolated_connection
- expedite the first isolated heartbeat so you don't have to wait 10m;
  this is accomplished by _not_ setting Instance.last_isolated_check to
  now() at insertion time (which causes the next check not to happen for
  10 minutes)
- fix a bug that caused isolated node execution to fail when bwrap was
  enabled

see: https://github.com/ansible/tower/issues/2150

This reverts commit 9863fe71dc.
2018-06-13 14:17:58 -04:00
Yunfan Zhang
f332c0b8c3 Make search in host_filter case insensitive. 2018-06-13 14:16:48 -04:00
Jared Tabor
e921f8e42b Merge pull request #2081 from jaredevantabor/i18n
UI i18n Audit
2018-06-13 14:13:12 -04:00
Marliana Lara
39d6b924e9 Merge pull request #2145 from marshmalien/fix/2143-remove-instance-modal-header-panel
Remove panel header directive from instance modals
2018-06-13 12:49:39 -04:00
Jared Tabor
1a8b5426f8 UI i18n Audit: Translates strings throughout the UI
Translations for dashboard lists -> tooltips

Changing "Portal Mode" to "My View," in part due to translations.

Adding "Job Template" to strings to be translated from OPTIONS on API

Marking translations for JT that has a project that needs to be re-synced.

Marking translations for survey maker

Marking translations for lookup modal directive

Marking translations for empty, "Go To Notifications To Add Template"

Adds strings service for scheduler, and marking strings for translation

Translations for teams linkout from orgs, as well as cred types

Translations for instance groups

Marks translations for the Network UI

Translates strings on the workflow editor

Translations for workflow results

Translations for host event modal and some missing translations on

the stdout page.
2018-06-13 12:49:22 -04:00
Marliana Lara
13a5554b4e Merge pull request #2142 from marshmalien/fix/863-input-lookup-component-styles
Fix input lookup component styles
2018-06-13 12:45:44 -04:00
Michael Abashian
7912f56f02 Merge pull request #2138 from mabashian/2126-search-multiple-requests
Fixed issue where search actions were sending two requests
2018-06-13 10:12:37 -04:00
Marliana Lara
acb1336721 Fix input lookup button height 2018-06-13 09:39:45 -04:00
mabashian
ab53fd0874 Fix smart search directive unit tests 2018-06-12 16:24:32 -04:00
Ryan Petrello
a92c2a2e17 Merge pull request #2141 from ryanpetrello/fix-1979
properly detect settings.AUTHENTICATION_BACKEND changes for SSO logins
2018-06-12 15:43:27 -04:00
Marliana Lara
625ae5d1bf Remove panel header directive from instance modals 2018-06-12 15:43:06 -04:00
Ryan Petrello
c3bda8e259 properly detect settings.AUTHENTICATION_BACKEND changes for SSO logins
see: https://github.com/ansible/tower/issues/1979
2018-06-12 15:24:09 -04:00
kialam
404fdb474c Merge pull request #2130 from kialam/fix/2106-job-view-pagination
Broadcast `updateDataset` for job template controller
2018-06-12 15:06:06 -04:00
mabashian
36732d8113 Fixed issue where search actions were sending two requests. Cleaned up and organized smart search controller 2018-06-12 14:28:56 -04:00
Jake McDermott
1f9bd96700 Merge pull request #2132 from jakemcdermott/job-results/basic-output-expand-collapse
add minimal output line collapse / expand
2018-06-12 14:26:38 -04:00
Ryan Petrello
ee6902bbbb Merge pull request #2140 from ryanpetrello/release_3.3.0
make sdb-listen work for docker-compose-cluster
2018-06-12 14:20:42 -04:00
Jake McDermott
5cf2204f0e Merge pull request #2131 from jakemcdermott/job-results/eof-counter
replace final_line_count with final_counter for EOF websocket
2018-06-12 14:11:33 -04:00
Haokun Chen
dcf8538731 Merge pull request #2135 from Haokun-Chen/1848
remove .at-TabGroup + .at-Panel-body margin setting, affecting credentials, applications, instance groups
2018-06-12 13:59:13 -04:00
Ryan Petrello
1733a20094 make sdb-listen work for docker-compose-cluster
use a different port range for each container, because docker can't map
them all to the same port range
2018-06-12 13:57:28 -04:00
Haokun Chen
0ffa28dd98 Merge pull request #2139 from Haokun-Chen/2134
fix to enable to change default value of TCP CONNECTION TIMEOUT
2018-06-12 13:50:41 -04:00
Haokun Chen
2954c29e7c Merge pull request #2137 from Haokun-Chen/1967
fix schedules list of inventory sources gives global schedules list
2018-06-12 13:50:31 -04:00
Haokun Chen
387682cee8 Merge pull request #2125 from Haokun-Chen/1837
fix error when deleting the only item on page 2 for list page
2018-06-12 13:50:10 -04:00
Michael Abashian
39dee3d5c2 Merge pull request #2120 from mabashian/1882-prompt-cred-filter
Fix issue searching creds list on prompt
2018-06-12 13:43:06 -04:00
Haokun-Chen
f200a39b4b fix to enable to change default value of TCP CONNECTION TIMEOUT for logging 2018-06-12 12:54:35 -04:00
Michael Abashian
c2afb240f3 Merge pull request #2129 from mabashian/2091-inv-src-cred
Fixed clear-all on inventory source credential lookup
2018-06-12 12:11:45 -04:00
Haokun-Chen
913da53ce6 fix schedules list of inventory sources gives global schedules list 2018-06-12 11:46:27 -04:00
Haokun Chen
03099c91f8 Merge pull request #2128 from Haokun-Chen/host-completed-jobs-tower
add completed job section on host page and related host page under inventory
2018-06-12 11:41:31 -04:00
Chris Meyers
bc9a934cfe Merge pull request #2110 from chrismeyersfsu/improvement-remove_instance_group_queues2
remove rampart group queue subscription
2018-06-12 11:36:04 -04:00
Haokun-Chen
9ae69a4651 remove .at-TabGroup + .at-Panel-body margin setting 2018-06-12 10:02:08 -04:00
Alan Rominger
ce117285e1 Merge pull request #2079 from AlanCoding/creds_no_op
Allow no-op case when modifying deprecated credentials
2018-06-12 09:08:35 -04:00
Ryan Petrello
4df4d7366e Merge pull request #1983 from lshchur/patch-1
Update INSTALL.md
2018-06-12 08:25:09 -04:00
Ryan Petrello
1488c737a1 Merge pull request #2123 from ryanpetrello/fix-2118
more gracefully handle fact cache failures for hosts that contain /
2018-06-12 07:59:23 -04:00
Alan Rominger
3251ed2f6c Merge pull request #1980 from AlanCoding/settings_exc_info
Handle broken transactions in DB settings getattr
2018-06-12 07:49:05 -04:00
Alan Rominger
a8c31a51e9 Merge pull request #2004 from AlanCoding/checkin_access
Allow managing credentials with external user management
2018-06-12 07:47:16 -04:00
Alan Rominger
951142d510 Merge pull request #1950 from AlanCoding/more_roles
Cover testing of new 3.3 org roles for user security fix
2018-06-12 07:45:36 -04:00
Lyosha Shchur
99e6c21cbd Update INSTALL.md 2018-06-12 11:57:24 +03:00
Jake McDermott
eb39fcfeaf add basic output expand-collapse 2018-06-11 21:04:40 -04:00
Jake McDermott
992bc1a5ec use final_counter from EOF websocket in UI 2018-06-11 18:36:56 -04:00
Jake McDermott
60a38a196a add final_counter to EOF websocket 2018-06-11 18:36:28 -04:00
Jake McDermott
ce411a21c6 Merge pull request #2117 from jakemcdermott/job-results/window
apply a windowing function to buffered event stream
2018-06-11 18:31:19 -04:00
Jake McDermott
9137b4acef Merge pull request #2114 from jakemcdermott/job-results/host-counts
reduce the minimum number of http requests required to load job details from 7 to 3
2018-06-11 18:19:14 -04:00
kialam
9ef301f25a Broadcast updateDataset for job template controller
So it knows to call the `refreshJobs ()` method and update the model
accordingly.
2018-06-11 17:43:13 -04:00
mabashian
9d8db1d75b Changed let to const 2018-06-11 17:01:11 -04:00
mabashian
a3368a8c96 Fixed clear-all on inventory source credential lookup 2018-06-11 16:46:04 -04:00
Haokun-Chen
069c5dacaa add completed job section on host page
host completed jobs added on both host page and related section under inventory edit
2018-06-11 16:37:16 -04:00
Haokun-Chen
49f0a63150 fix error when deleting the only item on page 2 for list page of organization, scheduler,
instance_groups, inventories, projects, jobs, template, credentials, inventory-scripts,
teams, users, credential-types and notifications
2018-06-11 15:56:44 -04:00
Chris Meyers
769e714f71 Merge pull request #2122 from chrismeyersfsu/fix-iso_celery_usage
iso nodes do not have celery. that is ok
2018-06-11 15:47:16 -04:00
chris meyers
987063e7fd iso nodes do not have celery. that is ok 2018-06-11 15:38:41 -04:00
Ryan Petrello
d0d7bf5c21 more gracefully handle fact cache failures for hosts that contain /
see: https://github.com/ansible/awx/issues/1977
related: https://github.com/ansible/ansible/issues/41413
2018-06-11 15:38:09 -04:00
Ryan Petrello
ab4271b36d Merge pull request #2124 from ryanpetrello/for-shaaaaaaame
fix failing flake8
2018-06-11 15:38:03 -04:00
Ryan Petrello
62c5784833 fix failing flake8 2018-06-11 15:21:47 -04:00
Yunfan Zhang
ee00c628af Merge pull request #2116 from YunfanZhang42/release_3.3.0
Disallow HTTP update methods in job_detail API endpoint.
2018-06-11 15:10:11 -04:00
Yunfan Zhang
1bc1a6f63f Disallow HTTP update methods in job_detail API endpoint. 2018-06-11 14:47:43 -04:00
Ryan Petrello
fa9b7106ff Merge pull request #2102 from ryanpetrello/fix-2085
WIP: add a background process to spot celery hangs and reload the worker pool
2018-06-11 12:44:18 -04:00
Ryan Petrello
88e3c46810 add a background process to spot celery hangs and reload the worker pool
see: https://github.com/ansible/tower/issues/2085
2018-06-11 12:22:21 -04:00
mabashian
6794afb284 Maintain reference to querySet rather than cloning so that changes made after initialization will propagate 2018-06-11 11:56:33 -04:00
John Mitchell
fbafb9a5bf Merge pull request #2052 from jlmitch5/fixInstancesList
instance list fixes
2018-06-11 10:05:21 -04:00
John Mitchell
709cf70138 use dot notation for state params 2018-06-11 09:50:12 -04:00
Haokun Chen
8e944bc097 Merge pull request #2105 from Haokun-Chen/1904
Hide run selection when current tab is different from selected
2018-06-11 09:45:03 -04:00
Jake McDermott
6a59356200 apply a windowing function to buffered event stream 2018-06-10 22:25:05 -04:00
Jake McDermott
5e9da2d772 request job details and initial events dataset concurrently 2018-06-08 22:28:00 -04:00
Jake McDermott
4c93c68a29 remove single-event api queries and extra labels request 2018-06-08 22:27:52 -04:00
Jake McDermott
92ae09e163 add host_status_counts and playbook_counts to project update details 2018-06-08 22:27:41 -04:00
Yunfan Zhang
18384bc509 Merge pull request #2112 from YunfanZhang42/release_3.3.0
Fix exception format in project_update_stdout.
2018-06-08 16:22:02 -04:00
Marliana Lara
3ff3e8d298 Merge pull request #2109 from marshmalien/fix/2068-pagination-error
Add value to $scope.querySet when in .users.add states
2018-06-08 16:19:36 -04:00
Michael Abashian
8b543ea0a7 Merge pull request #2082 from mabashian/2075-jt-edit-put
Changed jt edit api call from put to patch
2018-06-08 15:57:34 -04:00
Yunfan Zhang
1a3ab7d487 Fix exception format in project_update_stdout.
Signed-off-by: Yunfan Zhang <yz322@duke.edu>
2018-06-08 15:42:00 -04:00
chris meyers
fb11967114 remove isolated instance group queue listening 2018-06-08 13:46:58 -04:00
chris meyers
1cea20092c remove rampart group queue subscription
* We now target Instances in the task manager when transitioning jobs
from pending to waiting; whereas before we submitted jobs to Instance
Groups to be picked up by Instance's in those Instance Groups.
Subscribing Instances to their Instance Groups is no longer needed. This
change removes the Instance Group queue subscription.
2018-06-08 11:20:54 -04:00
Marliana Lara
750f70c21f Add value to $scope.querySet when in .users.add states 2018-06-08 10:59:27 -04:00
Haokun Chen
d44215f291 Merge pull request #2101 from Haokun-Chen/1850
validate input when toggle replace/revert on password
2018-06-08 10:57:01 -04:00
Haokun-Chen
4bafe02a94 Hide run selection when current tab is different from selected 2018-06-08 10:55:07 -04:00
Yunfan Zhang
1255cfc2f0 Merge pull request #2104 from YunfanZhang42/release_3.3.0
Fix job id incorrectly cast to string in ActiveJobConflict.
2018-06-08 09:53:06 -04:00
Yunfan Zhang
0de369b42f Fix job id incorrectly cast to string in ActiveJobConflict. 2018-06-08 09:31:38 -04:00
Alan Rominger
bcd9c5dada Merge pull request #2098 from AlanCoding/u_no_copy
Prohibit users without read_role from viewing copy endpoint
2018-06-08 08:54:32 -04:00
Jake McDermott
f78f179789 Merge pull request #2057 from jakemcdermott/job-results/slide
fix memory leak in output render service, rewrite output data storage
2018-06-08 03:10:25 -04:00
Jake McDermott
09aa75e7c4 simplify and add docstrings 2018-06-08 02:56:32 -04:00
Jake McDermott
cbae7efdd5 use a sliding window over counter intervals 2018-06-07 22:28:06 -04:00
Jake McDermott
1c414789fb fix memory leak in output render service 2018-06-07 22:27:57 -04:00
Alan Rominger
df1fe19b21 Merge pull request #2089 from AlanCoding/friends_workflow_job
Prohibit relaunching workflow jobs from other users
2018-06-07 20:07:58 -04:00
Christian Adams
4f3c45ac59 Merge pull request #2087 from rooftopcellist/add_DDT_to_docs
Info on setting up DDT
2018-06-07 18:26:11 -04:00
Haokun-Chen
ab42c710eb validate form when toggle replace/revert on password/secret 2018-06-07 15:58:31 -04:00
AlanCoding
ed762fd4b6 prohibit users without read_role from viewing copy endpoint 2018-06-07 15:14:49 -04:00
Alan Rominger
d969e37f94 Merge pull request #2095 from AlanCoding/memories_of_labels
Exclude m2m copies from activity stream
2018-06-07 15:09:27 -04:00
Haokun Chen
62a5104302 Merge pull request #2093 from Haokun-Chen/2066
fixed 404 error when delete smart inventory while editing
2018-06-07 14:56:43 -04:00
kialam
4391f14da9 Merge pull request #2097 from kialam/fix/2028-session-timeout
Fix placement of network ui `select2` dropdowns
2018-06-07 14:47:59 -04:00
Jared Tabor
86f840f220 Merge pull request #2083 from jaredevantabor/awx-net-zoom-default
Sets default zoom to 100% on network UI
2018-06-07 11:42:36 -07:00
Haokun Chen
fa9c6967fd Merge pull request #2086 from Haokun-Chen/2033
Reset and clear export dropdown selection after user takes action for Network UI
2018-06-07 14:36:36 -04:00
kialam
1b45e8b825 Merge pull request #2034 from kialam/fix/1884-scm-creds-filter
Fix Project SCM cred lookup
2018-06-07 14:15:20 -04:00
Michael Abashian
2e82347769 Merge pull request #2011 from mabashian/1934-schedule-wf-pass-prompt
Add read-only view of prompts.  Prevent creds with passwords on jt schedules/wfjt nodes
2018-06-07 14:14:42 -04:00
kialam
7ecef3ee5e Fix placement of network ui select2 dropdowns
Render them in the correct parent container in the DOM.
2018-06-07 13:50:04 -04:00
mabashian
91c46731d1 Removed unused Alert 2018-06-07 13:42:33 -04:00
AlanCoding
8509a43b95 exclude m2m copies from activity stream 2018-06-07 13:34:58 -04:00
mabashian
1a4e7c8572 Rolled credential warning string back to include remove or replace 2018-06-07 13:16:42 -04:00
mabashian
68ac23dd46 Fixed various bugs with preventing prompting for credential passwords on schedules and workflow nodes 2018-06-07 13:16:42 -04:00
mabashian
09ee140fb4 Prevent scheduling JT runs where credentials with passwords are required. Added read-only view of schedules when user does not have edit permissions. 2018-06-07 13:16:42 -04:00
Haokun-Chen
c2001d0442 fixed error when delete smart inventory while editing 2018-06-07 13:08:45 -04:00
AlanCoding
b0b7f7a295 prohibit relaunching workflow jobs from other users 2018-06-07 13:01:15 -04:00
Jake McDermott
b1f36572c6 Merge pull request #2065 from jakemcdermott/2058
add host_status, play, and task counts to job details
2018-06-07 12:59:11 -04:00
Yunfan Zhang
6f09c1b994 Merge pull request #2090 from YunfanZhang42/fix_test_expect
Fix Jenkins test_expect.
2018-06-07 12:18:19 -04:00
Yunfan Zhang
b68ded7c15 Fix tests. 2018-06-07 12:04:20 -04:00
Ryan Petrello
18e371c0cf Merge pull request #2088 from ryanpetrello/fix-2085
default instance capacity to zero
2018-06-07 12:00:07 -04:00
adamscmRH
68f7f25788 info to set ip DDT 2018-06-07 11:46:10 -04:00
kialam
6fee8c699d Fix SCM credential list for Projects add and edit views 2018-06-07 11:44:08 -04:00
kialam
b344eb9af0 Fix failing test by only preserving credential_type
- Reset `defaults` object’s own `credential_type` value to that of
`queryset`’s.
2018-06-07 11:44:07 -04:00
kialam
99ea28c3fd Check defaults against query set to make sure credential_type does not get overwritten
- We want to preserve the existing `credential_type` param that already
exists in `queryset` and not have `defaults
` overwrite it. We first loop through the `defaults` object keys and
check it against the the keys of `queryset` and if the keys match, then
set the value to `queryset[key]`.
2018-06-07 11:44:07 -04:00
Ryan Petrello
195aff37ad default instance capacity to zero at registration/insertion time
if the first health check fails due to AMQP or celery issues, the
capacity will stay at the default of 100 (which is confusing)

see: https://github.com/ansible/tower/issues/2085
2018-06-07 11:42:31 -04:00
Haokun-Chen
9ff995f6f9 reset Export dropdown after user takes action in Network UI 2018-06-07 10:43:44 -04:00
Marliana Lara
85aeb799dc Merge pull request #2078 from marshmalien/fix/869-instance-groups-jobs-link
Add "running jobs" and "total jobs" links to instances and instance groups
2018-06-07 09:45:29 -04:00
Chris Meyers
dfe2ce4b43 Merge pull request #2080 from chrismeyersfsu/fix-controller_node_adhoc
add controller_node to ad hoc job
2018-06-07 09:02:29 -04:00
AlanCoding
dde706b61f allow no-op case when modifying deprecated credentials 2018-06-07 07:16:07 -04:00
Jared Tabor
4fa1518bcc Sets default zoom to 100% on network UI
instead of 120%
2018-06-06 18:24:24 -07:00
mabashian
a108238e0a Changed jt edit api call from put to patch so that we don't clear the credentials every time a change is made. Removed unneeded code. 2018-06-06 18:32:09 -04:00
Jake McDermott
f8f59c8c8c add host_status, play, and task counts to job details 2018-06-06 18:02:31 -04:00
chris meyers
0702692ca9 add controller_node to adhoc command job 2018-06-06 16:28:28 -04:00
Chris Meyers
429c1bf2b4 Merge pull request #2070 from chrismeyersfsu/fix-controller_node_not_needed_on_some_jobs
remove controller_node field from jobs that don't apply
2018-06-06 16:19:00 -04:00
kialam
cc1cd38ddd Merge pull request #2009 from kialam/fix/1063-multiple-creds-tags
View More Component with Credential Tags in Template List View
2018-06-06 16:06:13 -04:00
Jake McDermott
3f8e6e3416 Merge pull request #2074 from Haokun-Chen/1881
fixed job details search bar when empty input or duplicate input
2018-06-06 15:20:55 -04:00
Haokun Chen
60d535fa6b Merge pull request #2069 from Haokun-Chen/2046
remove HIDE CURSOR and HIDE BUTTONS from the key shortcuts in Network UI
2018-06-06 15:17:14 -04:00
chris meyers
74155dfc9d add system jobs to controller_node exceptions 2018-06-06 15:04:41 -04:00
Ryan Petrello
0fd89579e9 Merge pull request #2073 from ryanpetrello/more-i18n
sprinkle more i18n for certain field labels
2018-06-06 14:57:58 -04:00
Marliana Lara
c8ab4d4623 Add link to running and total jobs for instance groups and instances 2018-06-06 14:52:36 -04:00
Marliana Lara
31da1e6ef7 Audit string translations in instance groups templates 2018-06-06 14:48:23 -04:00
Haokun-Chen
6b1129ce1d fixed job details search bar when empty input or duplicate input 2018-06-06 14:29:32 -04:00
Ryan Petrello
d0249d3ae6 sprinkle more i18n for certain field labels
see: https://github.com/ansible/tower/issues/2063
2018-06-06 14:06:34 -04:00
Marliana Lara
decfc8fa8c Update limit-panels directive to query for the new Panels component 2018-06-06 13:36:42 -04:00
Chris Meyers
431ee9bbbf Merge pull request #2049 from chrismeyersfsu/improvement-jobs_total3
add total job count for instance + instance group
2018-06-06 12:56:03 -04:00
Haokun-Chen
48c4266cb3 Remove HIDE CURSOR and HIDE BUTTONS from the key 2018-06-06 11:51:02 -04:00
chris meyers
8ee4b9680c remove controller_node field from jobs that don't apply 2018-06-06 11:26:15 -04:00
kialam
d6ca943d23 Remove TagService 2018-06-06 11:17:09 -04:00
kialam
b16854898b Refactor Toggle Tag Component
This refactor includes the following things:
- Offload credential tag formatting to the parent controller, e.g.
`TemplateListController`.
- Initialize the `Toggle Tag` component in the parent view instead of
the List Item component view.
- Rename some variables for better comprehension.
2018-06-06 11:17:09 -04:00
kialam
6ca4c7de9d Offload tag formatting logic to templateList controller 2018-06-06 11:17:09 -04:00
kialam
b8404abb26 Rename credential tooltip component string
- For better legibility
2018-06-06 11:17:09 -04:00
kialam
2ee361db5d Rename toggle component to toggle-tag for better clarity. 2018-06-06 11:17:09 -04:00
kialam
22ddf7883a Adjust template to account for more than one tag type. 2018-06-06 11:17:09 -04:00
kialam
cc91729f72 Account for default tags as well 2018-06-06 11:17:09 -04:00
kialam
8373d89c92 Duplicate ns.tooltips CREDENTIALS string to ComponentStrings to avoid using OutputStrings 2018-06-06 11:17:08 -04:00
kialam
e66b00eb64 Translate VIEW MORE and VIEW LESS into component strings 2018-06-06 11:17:08 -04:00
kialam
265554accb Add link to credentials tag in template 2018-06-06 11:17:08 -04:00
kialam
f49b61ecfa Create TagService
This new Service can be used anywhere that needs a credentials tag and
can be expanded upon to include other helpful tag methods as needed.
2018-06-06 11:17:08 -04:00
kialam
62f4beddb2 Reduce height of tags in job list page 2018-06-06 11:17:08 -04:00
kialam
63f3a38ceb Add more functionality to Toggle Tag Component
- Remove existing `switch` logic in favor of Toggle Tag Component, now
with comments!

- Slight adjustment to icons to center vertically; account for
non-standard credential `kind` attributes so icons display as they
should.

- Style the `View More/Less` button accordingly

- Update Toggle Tag directive template to include icons
2018-06-06 11:17:08 -04:00
kialam
de6167a52c Create basic toggle tag component 2018-06-06 11:17:08 -04:00
Alan Rominger
4f85de5fcf Merge pull request #2056 from AlanCoding/alan33chachachachanges
Update CHANGELOG.md for many 3.3 items
2018-06-06 10:57:55 -04:00
AlanCoding
a9391584d7 Update CHANGELOG.md for 3.3 items
Added API items in headline feature list
Added items found by scrubbing the merged PR queue

Add 3.3 section header
move the 3.3 section to the top of file,
before the existing 3.2 section
2018-06-06 10:37:49 -04:00
Will Thames
b899096f99 Use use-context to set Kubernetes context
`kubectl config use-context` is the command to set the current context,
not `set-context`

Signed-off-by: Will Thames <will@thames.id.au>
2018-06-06 13:02:26 +10:00
chris meyers
b876c2af62 add total job count for instance + instance group 2018-06-05 12:05:22 -04:00
Dmytro Makovey
adaa164a19 allow nginx config extension 2018-06-05 08:16:08 -07:00
Matthew Jones
ba997f924e Merge pull request #2055 from matburt/remove_logstash
Remove the logstash container from the base dev docker compose
2018-06-05 09:55:48 -04:00
Matthew Jones
22dd6ddfea Remove the logstash container from the base dev docker compose
Now with less java running while you code!
2018-06-05 09:42:38 -04:00
Yunfan Zhang
c055666a9f Merge pull request #2035 from YunfanZhang42/release_3.3.0
Added awx-manage command for expiring sessions.
2018-06-05 09:36:37 -04:00
Wayne Witzel III
b0d1ba4861 Merge pull request #2054 from wwitzel3/release_3.3.0
Only duplicate nodes if original WFJT is not available
2018-06-05 09:22:41 -04:00
Yunfan Zhang
d8cb47bf82 Added awx-manage command for expiring sessions. 2018-06-05 09:18:55 -04:00
Wayne Witzel III
7affa15efe Only duplicate nodes if original WFJT is not available 2018-06-05 13:08:06 +00:00
Alan Rominger
88051cc9fc Merge pull request #2045 from AlanCoding/can_see_all_teams
Show org-admins all teams if ALL USERS setting enabled
2018-06-05 08:39:59 -04:00
AlanCoding
74c6c350a1 show org-admins all teams if ALL USERS setting enabled 2018-06-05 07:55:13 -04:00
Alan Rominger
d250b89f47 Merge pull request #2041 from AlanCoding/lazy_passwords
No launch config errors with replacable ASK credential
2018-06-05 07:49:43 -04:00
John Mitchell
e480639699 Merge pull request #2044 from jlmitch5/fixInvSourceNotifSearch
fix notifications search on inventory source form tab
2018-06-04 17:55:54 -04:00
John Mitchell
8bd801fd07 make sure instances list is always ordered 2018-06-04 17:53:08 -04:00
John Mitchell
5c874c6b3d fix wrapping issue for instances list 2018-06-04 17:36:30 -04:00
Yunfan Zhang
4fe7c9ea42 Merge pull request #1953 from YunfanZhang42/devel
Let create_oauth2_token print errors from std_err.
2018-06-04 16:42:44 -04:00
Ryan Petrello
bfb8e97a9d Merge pull request #2051 from ryanpetrello/space-for
fix a setting help text typo
2018-06-04 16:31:13 -04:00
Ryan Petrello
97fc745329 fix a setting help text typo 2018-06-04 16:28:26 -04:00
Yunfan Zhang
64b612921d Merge branch 'devel' into devel 2018-06-04 15:54:23 -04:00
Yunfan Zhang
9945a3bc64 Added an awx-manage command for generating OAuth2 token. 2018-06-04 15:49:04 -04:00
Ryan Petrello
5ceeb020cf Merge pull request #2048 from ryanpetrello/how-do-you-say-violet-in-french
fix an i18n-related bug that affects non-English hipchat users
2018-06-04 15:26:15 -04:00
Ryan Petrello
581756527e fix an i18n-related bug that affects non-English hipchat users
see: https://github.com/ansible/tower/issues/951
2018-06-04 15:02:27 -04:00
Chris Meyers
899084fa75 Merge pull request #1922 from chrismeyersfsu/improvement-accurate_capacity
per-instance accurate capacity consumption
2018-06-04 14:36:58 -04:00
John Mitchell
f9ed4296bb fix notifications search on inventory source form tab 2018-06-04 13:51:49 -04:00
John Mitchell
d2858e2d0e Merge pull request #2016 from jlmitch5/appTabOrgAdmin
make app tab visiable to org admins
2018-06-04 12:04:16 -04:00
AlanCoding
648ec3141b no launch config errors with replacable ASK credential 2018-06-04 11:19:22 -04:00
Christian Adams
17bc2a42ab Merge pull request #2040 from rooftopcellist/oauth2_doc_clean
updates oauth docs with quickstart
2018-06-04 11:14:18 -04:00
adamscmRH
d885d0fe22 updates oauth docs with quickstart 2018-06-04 10:57:18 -04:00
chris meyers
7b0b4f562d get isolated execution at the point its needed
* Instead of passing around the isolated host that the task is to
execute on; grab the isolated execution host from the instance further
down the call stack. Without passing the isolated hostname around.
2018-06-04 10:06:59 -04:00
chris meyers
b94cf379f6 do not choose offline instances 2018-06-04 10:06:59 -04:00
chris meyers
9d732cdbdf update unit and functional tests 2018-06-04 10:06:59 -04:00
chris meyers
9863fe71dc do not require privileged iso container
* The init call w/ privileged was causing my laptop to wig out. This
changeset still functions w/ out requiring privileged access.
2018-06-04 10:06:59 -04:00
chris meyers
8d352a4edf conform isolated system to new early node choice
* Randomly chose an instance in the controller instance group for which
to control the isolated node run. Note the chosen instance via a job
controller_node field
2018-06-04 10:06:59 -04:00
chris meyers
e720fe5dd0 decide the node a job will run early
* Deciding the Instance that a Job runs on at celery task run-time makes
it hard to evenly distribute tasks among Instnaces. Instead, the task
manager will look at the world of running jobs and choose an instance
node to run on; applying a deterministic job distribution algo.
2018-06-04 10:06:59 -04:00
Alan Rominger
f394c02afd Merge pull request #2013 from AlanCoding/big_trouble_in_0013
Fix tracebacks when running migrations
2018-06-04 09:51:44 -04:00
AlanCoding
239c60a2bd fix tracebacks when running migrations 2018-06-04 07:35:35 -04:00
Bill Nottingham
7ef32a8827 Merge pull request #2037 from wenottingham/tower-inv-fix
Fix syntax error
2018-06-02 12:07:00 -04:00
Bill Nottingham
427ea6752e Fix syntax error 2018-06-01 22:25:46 -04:00
Christian Adams
69a507ae19 Merge pull request #2008 from rooftopcellist/default_scope
Default scope
2018-06-01 13:43:11 -04:00
adamscmRH
97c5ff0b33 make scope write by default 2018-06-01 13:24:32 -04:00
Jake McDermott
b7bb80c79f Merge pull request #2020 from sangongs/fix_failed_badge_color
Fix the color of the tips badge for failed hosts in the host status bar
2018-06-01 11:38:10 -04:00
Guoqiang Zhang
7aa2b7f6a7 Fix the color of the tips badge for failed hosts in the host status bar 2018-06-01 10:25:41 -04:00
Ryan Petrello
330691f4a2 Merge pull request #2019 from ryanpetrello/back-to-the-future
fix a failing timezone test
2018-06-01 10:14:22 -04:00
Marliana Lara
7a997f0615 Merge pull request #2015 from marshmalien/fix/1970-1885-scheduler-bugs
Fix invalid schedule warning and disable save button
2018-06-01 10:04:29 -04:00
Ryan Petrello
6183e5166d fix a failing timezone test 2018-06-01 09:51:42 -04:00
Alan Rominger
a4efd0a5d2 Merge pull request #2005 from AlanCoding/dep_oauth
Make our oauth model creation a dependency of other app
2018-06-01 09:35:07 -04:00
Ryan Petrello
8c5f3404bf Merge pull request #2006 from ryanpetrello/port-jinja2-always
allow Jinja2 in ansible -a when ALLOW_JINJA_IN_EXTRA_VARS is 'always'
2018-06-01 07:32:48 -04:00
Jared Tabor
e2d3a7be26 Merge pull request #1999 from jaredevantabor/fix-1927
Fixes URL used for root groups for pagination purposes
2018-05-31 14:14:49 -07:00
Jared Tabor
7549d85619 Merge pull request #2001 from jaredevantabor/fix-741
Marking a Configure Tower string for translation
2018-05-31 14:06:06 -07:00
John Mitchell
a20eaae7bc make app tab visiable to org admins 2018-05-31 17:02:51 -04:00
Haokun Chen
b944f2d681 Merge pull request #1997 from Haokun-Chen/fix-dashboard-icon
fixed job list action icon on dashboard page for system auditor user
2018-05-31 16:36:16 -04:00
Marliana Lara
2bdb1fc577 Fix scheduler form warning bug and disable save when date options are invalid 2018-05-31 16:31:19 -04:00
Haokun Chen
be4e5c8f06 fixed dashboard icon under job template section for system auditor user
dashboard icon fixed
2018-05-31 16:18:55 -04:00
Yunfan Zhang
a45ccfdc79 Merge pull request #1942 from YunfanZhang42/devel
Added an awx-manage command for generating OAuth2 token.
2018-05-31 16:13:58 -04:00
Jared Tabor
782b9b8bec Fixes URL used for root groups for pagination purposes.
Changes from 'inventories/:inventory_id/root_groups' to
'inventories/:inventory_id/groups'. Includes changing the function
name for root groups based on PR feedback.
2018-05-31 13:06:15 -07:00
Jared Tabor
be864012b7 Merge pull request #1957 from jaredevantabor/fix-1824-2
Makes rows inactive on permissions list if assigning user doesn't have
2018-05-31 12:43:52 -07:00
Alan Rominger
b3b38777c1 Merge pull request #1994 from AlanCoding/network_client
Remove network_ui Client model, replace with simple uuid
2018-05-31 15:23:00 -04:00
Marliana Lara
c0b243df7e Merge pull request #1988 from marshmalien/fix/1883-vault-password-toggle
Fix vault prompt password show/hide toggle
2018-05-31 14:57:58 -04:00
Marliana Lara
47406b0832 Merge pull request #1984 from marshmalien/fix/1847-dashboard-graph-dropdown
Fix dashboard graph VIEW dropdown filter
2018-05-31 14:57:38 -04:00
Yunfan Zhang
2c4f7911a6 Added an awx-manage command for generating OAuth2 token. 2018-05-31 14:27:21 -04:00
Alan Rominger
dd944319f1 Merge pull request #1989 from AlanCoding/delete_networks
Delete network canvas objects in delete inventory task
2018-05-31 13:57:13 -04:00
Jared Tabor
edbb03cdc0 Merge pull request #1998 from jaredevantabor/fix-1982
Prevents Network UI from scrolling and showing Tower
2018-05-31 09:37:04 -07:00
Jared Tabor
01611540f0 Marking a Configure Tower string for translation
Once this gets added to the UI's es.po file, this should show up translated,
along with it's tooltip.
2018-05-31 09:36:23 -07:00
Ryan Petrello
99d2f3ea34 allow Jinja2 in ansible -a when ALLOW_JINJA_IN_EXTRA_VARS is 'always' 2018-05-31 11:49:50 -04:00
Shane McDonald
246e63bdb6 Update translation templates 2018-05-31 10:53:57 -04:00
AlanCoding
b7a5c10ce4 make our oauth model creation a dependency of other app 2018-05-31 10:19:43 -04:00
Bill Nottingham
01dcb3f733 Merge pull request #1938 from tux-00/patch-1
Fix bad path in installation doc
2018-05-31 09:56:43 -04:00
Ryan Petrello
68bfb08b03 Merge pull request #1995 from ryanpetrello/test-tower-inv-source
add a test for tower inventory syncs
2018-05-31 09:36:10 -04:00
John Mitchell
24c6f14f44 Merge pull request #1977 from jlmitch5/fixTokenScopeAddInUI
Fix token scope add in ui
2018-05-31 09:35:15 -04:00
AlanCoding
f692f0c70a test creating credential for self & org_member 2018-05-31 08:58:38 -04:00
AlanCoding
253606c8bf allow managing credentials with external user management 2018-05-31 08:40:32 -04:00
Raphaël B
f485185562 Fix bad path 2018-05-31 11:32:55 +02:00
Jared Tabor
70897d3503 Prevents Network UI from scrolling and showing Tower
I also fixed an issue where the mouse-wheel events were not zooming
the network UI in firefox.
2018-05-30 14:19:07 -07:00
Alan Rominger
302505905e Merge pull request #1992 from AlanCoding/copy_v2
Make copy endpoints specific to v2
2018-05-30 15:51:44 -04:00
Alan Rominger
7aa1c64fac Merge pull request #1996 from AlanCoding/null_handler_again
Interpret null protocol as logging.NullHandler
2018-05-30 15:49:15 -04:00
AlanCoding
015b19d8c3 interpret null protocol as logging.NullHandler 2018-05-30 15:21:51 -04:00
Ryan Petrello
e2a05b14a5 Merge pull request #1993 from ryanpetrello/tower-inv-errors
clean up Tower inventory error handling
2018-05-30 15:15:07 -04:00
Ryan Petrello
9bc871db47 add a test for tower inventory syncs 2018-05-30 15:13:49 -04:00
AlanCoding
c690da4058 make copy endpoints specific to v2 2018-05-30 14:01:58 -04:00
AlanCoding
e889c976eb Remove network_ui Client model 2018-05-30 13:56:19 -04:00
Ryan Petrello
354b076956 clean up Tower inventory error handling
related: https://github.com/ansible/tower/pull/1697
related: https://github.com/ansible/tower-qa/pull/1746
2018-05-30 13:34:14 -04:00
Marliana Lara
79202708af Fix vault credential password prompt toggle show and hide 2018-05-30 12:42:27 -04:00
AlanCoding
124fcd6f62 delete network canvas objects in delete inventory task 2018-05-30 12:03:20 -04:00
Bill Nottingham
56d6ba2eda Merge pull request #1985 from wenottingham/netpuffaddr
ansible venv: re-add netaddr Python package
2018-05-30 10:57:04 -04:00
Pierre-Louis Bonicoli
16cde26468 ansible venv: re-add netaddr Python package
Closes #1763
2018-05-30 10:32:54 -04:00
Bill Nottingham
c3ab51e8fe Merge pull request #1924 from pilou-/ansible_venv_readd_netaddr
ansible virtualenv: re-add netaddr Python package
2018-05-30 10:27:08 -04:00
Ryan Petrello
a75da0fd58 Merge branch 'release_3.3.0' into fixTokenScopeAddInUI 2018-05-30 10:18:56 -04:00
AlanCoding
4e6fd59180 Handle broken transactions in DB settings getattr
This expands the role of the log database error context manager
and will actually make itself an exception to the standard
ORM behavior of raising an error when any queries are executed
inside of a broken transaction.

In this particular case it is less risky to continue on
with a database query and push the data to memcache than
it would be to use default settings values in violation of
user's intent. (hopefully)
2018-05-30 09:00:03 -04:00
Pierre-Louis Bonicoli
a752d04505 ansible venv: re-add netaddr Python package
Closes #1763
2018-05-30 02:01:03 +02:00
Marliana Lara
4c9ceb48a1 Merge pull request #1981 from marshmalien/fix/1886-job-details-credential
Add credential tags to job details
2018-05-29 17:27:23 -04:00
Marliana Lara
4f90391f54 Fix dashboard graph status dropdown value 2018-05-29 17:25:09 -04:00
Marliana Lara
5d0a131530 Add credential tags to job details 2018-05-29 16:29:14 -04:00
Ryan Petrello
a3aad31be3 Merge pull request #1964 from ryanpetrello/fix-token-scope
fix a few minor issues that have broken the User Token creation
2018-05-29 15:10:17 -04:00
John Mitchell
0f6fe210b7 fix when token scope is passing when the ui saves the form 2018-05-29 15:04:25 -04:00
Jake McDermott
d01940ffc5 Merge pull request #1965 from jakemcdermott/double-search
Fix wording of smart search key
2018-05-29 14:31:14 -04:00
Jake McDermott
9d87f85275 fix wording of search keys 2018-05-29 14:14:47 -04:00
Alan Rominger
232ad2a06c Merge pull request #1912 from AlanCoding/other_user_relaunch
Disallow launching jobs with other user's prompts
2018-05-29 11:51:13 -04:00
Ryan Petrello
b6d450923a Merge pull request #1972 from ryanpetrello/i-am-not-a-smart-man
use the _correct_ argument to specify poll vs select
2018-05-29 11:31:51 -04:00
Chris Meyers
f1083540a3 Merge pull request #1971 from chrismeyersfsu/fix-cached_dependency_list
do not cache dependency_list
2018-05-29 11:27:59 -04:00
Ryan Petrello
c369d44518 use the _correct_ argument to specify poll vs select 2018-05-29 11:25:08 -04:00
Ryan Petrello
238ffe5e7e Merge pull request #1969 from ryanpetrello/better-pexpect-poll
upgrade to the latest pexpect
2018-05-29 10:35:29 -04:00
chris meyers
4da68564ef do not cache dependency_list
* This is probably causing some bug. Calls to start_task within the same
run of the task manager could result in previous dependency lists being
used.
2018-05-29 10:27:51 -04:00
Ryan Petrello
7f7f635f7b upgrade to the latest pexpect
see: https://github.com/pexpect/pexpect/pull/492
see: https://github.com/ansible/tower/issues/1797
2018-05-29 09:52:59 -04:00
Ryan Petrello
af7ec17ccd fix a few minor issues that have broken the User Token creation
see: https://github.com/ansible/tower/issues/1928
2018-05-25 17:37:02 -04:00
Ryan Petrello
0fca495792 Merge pull request #1961 from ryanpetrello/fix-1672
don't allow Accept:application/json on /api/login/
2018-05-25 16:55:11 -04:00
Ryan Petrello
fc1077b9cb Merge pull request #1962 from ryanpetrello/i18n-credentials
mark dynamic Credential Type labels and help_text for i18n
2018-05-25 16:31:09 -04:00
Ryan Petrello
e03c584b80 mark dynamic Credential Type labels and help_text for i18n
see: https://github.com/ansible/tower/issues/1960
related: https://github.com/ansible/ansible-tower/pull/6844
2018-05-25 15:08:11 -04:00
Ryan Petrello
a0433773d8 don't allow Accept:application/json on /api/login/
see: https://github.com/ansible/tower/issues/1672
2018-05-25 14:21:22 -04:00
Marliana Lara
b5cb4e8290 Merge pull request #1958 from marshmalien/fix/1949-proj-permissions-users-link
Fix project permissions user link
2018-05-25 14:10:46 -04:00
Marliana Lara
0b0fd21734 Fix project permissions user link 2018-05-25 13:57:10 -04:00
kialam
8acb57f43a Merge pull request #1954 from kialam/fix/1880-tag-component
Create Tag Component for Job Search
2018-05-25 13:45:09 -04:00
kialam
376a763cc0 vertically center CLEAR ALL "button" using newly created mixin and resolve merge conflict 2018-05-25 13:32:43 -04:00
kialam
a9bdac0d53 use newer variables 2018-05-25 12:26:44 -04:00
kialam
d8dcac9158 small cleanup 2018-05-25 12:26:44 -04:00
kialam
edada76050 Pixel pushing 2018-05-25 12:26:44 -04:00
kialam
d83fa5a031 change 5px down to 3px per design feedback. 2018-05-25 12:26:44 -04:00
kialam
7292e00158 create componentized tags 2018-05-25 12:26:44 -04:00
Alan Rominger
03d975e18d Merge pull request #1959 from AlanCoding/cpf8
flake8 errors in access.py due to an upgrade
2018-05-25 12:09:37 -04:00
Jake McDermott
54056963af Merge pull request #1951 from jakemcdermott/job-results/strings
organize and translate job output and workflow results strings
2018-05-25 11:34:18 -04:00
AlanCoding
e64e25fcc1 flake8 errors in access.py due to an upgrade 2018-05-25 11:28:38 -04:00
Jake McDermott
29f0f94734 Merge pull request #1955 from jakemcdermott/job-results/always-discard-lines-beneath-threshold
always discard lines beneath threshold when tailing output
2018-05-25 11:22:08 -04:00
Christian Adams
b065593e49 Merge pull request #1932 from rooftopcellist/validate_scope
Validate scope
2018-05-25 10:49:02 -04:00
Alan Rominger
d35fb691b1 Merge pull request #1952 from AlanCoding/new_test_artifact
Ignore new test artifact being produced
2018-05-25 09:54:05 -04:00
John Mitchell
733c3fe594 Merge pull request #1940 from jlmitch5/fixAuditor
Fix auditor issues of displaying stuff you shouldn't in the ui
2018-05-25 09:34:42 -04:00
Ryan Petrello
960b64f292 Merge pull request #1947 from ryanpetrello/fix-897
fix a bug in the instance policy algorithm when both min and % are used
2018-05-25 08:55:51 -04:00
Jared Tabor
3d8d27064f Makes rows inactive on permissions list if assigning user doesn't have
permission to edit the target user
2018-05-25 00:18:50 -07:00
Jake McDermott
46758f1e7e always discard events beneath line threshold 2018-05-24 22:48:09 -04:00
Jake McDermott
e085c4ae71 use a one-way binding for back-to-top text 2018-05-24 20:10:00 -04:00
Marliana Lara
cdbcf4c128 Merge pull request #1897 from marshmalien/fix/1865-templates-list-active-row
Update active row indicator when state param id changes
2018-05-24 16:32:56 -04:00
Michael Abashian
6f868a7bca Merge pull request #1925 from mabashian/1902-root-edge-type
Fixed error changing edge type of a previous root node
2018-05-24 16:28:31 -04:00
Michael Abashian
f187210405 Merge pull request #1941 from mabashian/1933-edge-toggle
Fixed edge type dropdown race condition
2018-05-24 16:24:15 -04:00
Jake McDermott
dcd36adf25 add one-way bindings for static stats bar strings 2018-05-24 15:59:58 -04:00
Jake McDermott
62fa6dadb0 organize and translate workflow results strings 2018-05-24 15:57:50 -04:00
Jake McDermott
930ecaec3e organize and translate job output strings 2018-05-24 15:57:31 -04:00
AlanCoding
1790b1703f ignore new test artifact being produced 2018-05-24 15:48:13 -04:00
adamscmRH
bb6a4f6964 fix oauth urls & rename for clarity 2018-05-24 15:32:48 -04:00
Marliana Lara
c1593935ca Update active row indicator when state param id changes 2018-05-24 15:24:01 -04:00
Jake McDermott
b68b4db888 Merge pull request #1936 from jakemcdermott/job-results/update-search
update filterable check for job results search
2018-05-24 15:03:39 -04:00
Bill Nottingham
bd744bced7 Merge pull request #1912 from wenottingham/great-pexpectations
Regen requirements (followon to https://github.com/ansible/awx/pull/1895)
2018-05-24 14:34:56 -04:00
adamscmRH
3d5605f4b5 refactor & purge cruft 2018-05-24 14:33:27 -04:00
Marliana Lara
5af17b4e78 Merge pull request #1937 from marshmalien/fix/1619-statedefinition-error-handler
Add error handler to stateDefinitions resourceData resolve
2018-05-24 14:22:19 -04:00
Bill Nottingham
f4c165bf28 Regen requirements (followon to https://github.com/ansible/awx/pull/1895) 2018-05-24 14:14:17 -04:00
AlanCoding
e04a07f56c cover testing of new 3.3 org roles for user security fix 2018-05-24 13:56:38 -04:00
Marliana Lara
41e432abf0 Add error handling to stateDefinitions resolve block 2018-05-24 13:21:44 -04:00
Ryan Petrello
870adc14f9 fix a bug in the instance policy algorithm when both min and % are used
see: https://github.com/ansible/tower/issues/897
2018-05-24 12:28:46 -04:00
adamscmRH
be9598af53 fix refresh token & refactor 2018-05-24 12:25:27 -04:00
Bill Nottingham
019a07f919 Merge pull request #1920 from wenottingham/great-pexpectations
adding pexpect support
2018-05-24 12:21:09 -04:00
Alan Rominger
da2fa14bf7 Merge pull request #1910 from AlanCoding/moflake8
flake8 errors in access.py due to an upgrade
2018-05-24 11:47:37 -04:00
adamscmRH
5d220e8222 add scope validator to token endpoints 2018-05-24 11:06:58 -04:00
AlanCoding
1466e5c343 flake8 errors in access.py due to an upgrade 2018-05-24 10:17:55 -04:00
Ryan Petrello
f0df747a2f Merge pull request #1943 from ryanpetrello/network-ui-ci
run network ui tests in shippable and Jenkins
2018-05-24 09:58:37 -04:00
Ryan Petrello
c9c7a4b8f4 fix a few broken network UI tests 2018-05-24 09:46:35 -04:00
Ryan Petrello
37264d9d21 rename some tests from unit -> functional 2018-05-24 09:27:34 -04:00
Ryan Petrello
3abdf66794 run network ui tests in shippable and Jenkins 2018-05-24 09:07:53 -04:00
Alan Rominger
9dc4e1944c Merge pull request #1917 from AlanCoding/no_more
Do not put deep copy items in activity stream
2018-05-24 08:07:05 -04:00
Ryan Petrello
479a7cd320 Merge pull request #1938 from ryanpetrello/fix-1866
add help text for the new custom_virtualenv field
2018-05-24 06:28:20 -04:00
Ryan Petrello
1ea4ef8778 Merge pull request #1942 from ryanpetrello/fix-1939
allow any authenticated user to access the schedule preview API endpoint
2018-05-24 06:27:31 -04:00
Ryan Petrello
63f089c712 allow any authenticated user to access the schedule preview API endpoint
see: https://github.com/ansible/tower/issues/1939
2018-05-23 16:51:58 -04:00
mabashian
dbc02ae9a1 Fixed race condition where selecte2-ifying the edge type was happening before the digest cycle finished 2018-05-23 16:44:44 -04:00
John Mitchell
ef7ed76178 fix auditor issues 2018-05-23 16:31:08 -04:00
Ryan Petrello
d8f86ecba0 add help text for the new custom_virtualenv field
see: https://github.com/ansible/tower/issues/1866
2018-05-23 16:19:59 -04:00
Jake McDermott
06eb400f22 add callback for checking if field is filterable 2018-05-23 15:59:20 -04:00
Ryan Petrello
1564f62c2a Merge pull request #1835 from AlanCoding/network_ui_admin
Restrict network_ui to inventory admins
2018-05-23 15:25:55 -04:00
Ryan Petrello
ec8d6e2f6b Merge pull request #1929 from ryanpetrello/fix-968
allow AUTH_LDAP_USER_FLAGS_BY_GROUP to specify an OR'd list for a flag
2018-05-23 14:58:27 -04:00
Ryan Petrello
28a42850a2 allow AUTH_LDAP_USER_FLAGS_BY_GROUP to specify an OR'd list for a flag
see: https://github.com/ansible/tower/issues/968
2018-05-23 14:45:46 -04:00
Bill Nottingham
50503f97cc Regen requirements_ansible.txt (minimal update). 2018-05-23 14:11:09 -04:00
Jared Tabor
921c3d2535 Merge pull request #1924 from jaredevantabor/fix-1831
Fixes Organizations pagination
2018-05-23 09:53:35 -07:00
Jared Tabor
4edb689f83 Merge pull request #1923 from jaredevantabor/fix-1064
Validates extra vars before moving to next step in prompt workflow
2018-05-23 09:51:41 -07:00
Alan Rominger
550c6edb33 Merge pull request #1851 from AlanCoding/sch_modified_by
Fix schedules modified_by getting nulled
2018-05-23 10:42:07 -04:00
Bill Nottingham
7bc28276f2 add note 2018-05-23 10:31:54 -04:00
Ryan Petrello
8bbc36336e Merge pull request #1906 from ryanpetrello/delete-user-activity-stream
store metadata about ActivityStream.actor when the User is deleted
2018-05-23 10:15:01 -04:00
Michael Abashian
966464623a Merge pull request #1915 from mabashian/1900-concurrent-checkbox
Fixed concurrent jobs checkbox on wfjt edit form
2018-05-23 10:12:20 -04:00
Michael Abashian
c7a0634480 Merge pull request #1914 from mabashian/1901-wfjt-prompt-vars
Fix aggregation of extra vars on wfjt launch preview
2018-05-23 10:11:57 -04:00
Michael Abashian
81126fd48f Merge pull request #1911 from mabashian/1905-wf-launch-check
Only check the launch endpoint for job templates when editing wf node
2018-05-23 10:10:38 -04:00
Ryan Petrello
f434196bae store denormalized metadata about ActivityStream.actor for accounting
see: https://github.com/ansible/tower/issues/1782
2018-05-23 09:47:26 -04:00
AlanCoding
b7e9bda6cf track prior organization_id by base model prior values tore
Also fix bug where unified pointers were counted in
the prior values store
2018-05-23 08:54:03 -04:00
mabashian
c913badafe Fixed error changing edge type of a previous root node 2018-05-22 20:21:39 -04:00
Jared Tabor
b37926792f Fixes organizations collections watcher
it was watching 'organization' instead of 'organizations'
2018-05-22 17:11:04 -07:00
Jake McDermott
d9ce945762 Merge pull request #1921 from jakemcdermott/job-results/sanitize-breadcrumb
sanitize dynamic job details breadcrumb
2018-05-22 20:09:27 -04:00
Jared Tabor
16b00e4867 Validates extra vars before moving to next step in prompt workflow 2018-05-22 15:35:21 -07:00
Jake McDermott
f42c9bb952 sanitize dynamic breadcrumb label 2018-05-22 17:45:51 -04:00
Fedor Sumkin
a1ed0f47ab adding pexpect support 2018-05-22 16:45:05 -04:00
Bill Nottingham
00877769a3 Merge pull request #1895 from sumkincpp/patch-1
Support for expect ansible module
2018-05-22 16:43:48 -04:00
Jake McDermott
845227a9c4 Merge pull request #1918 from jakemcdermott/job-results/fix-status-check
improve status checking for job results
2018-05-22 16:40:55 -04:00
AlanCoding
d369ae7638 do not put deep copy items in activity stream 2018-05-22 16:23:08 -04:00
Jake McDermott
34dc939782 improve the check performed to determine if a job is in an active state 2018-05-22 16:22:13 -04:00
AlanCoding
c3368bc4ff disallow launching with other users prompts 2018-05-22 15:47:36 -04:00
mabashian
2bb59fde54 Fixed concurrent jobs checkbox on wfjt edit form 2018-05-22 15:03:41 -04:00
mabashian
87f4104304 Get default wfjt extra vars so that we can show all extra vars on launch preview 2018-05-22 14:55:43 -04:00
Jake McDermott
156b5e6979 Merge pull request #1888 from jakemcdermott/fix-1770
make prior output viewable for partial job runs
2018-05-22 14:47:18 -04:00
Jake McDermott
9bbed9f14e use event end_line for discarding events below starting threshold 2018-05-22 13:58:24 -04:00
Jake McDermott
89e08460dd display client finish time for incomplete job statuses 2018-05-22 13:57:37 -04:00
mabashian
c5f0d66554 Only check the launch endpoint for job templates, not unified jts of other types 2018-05-22 13:48:00 -04:00
Alan Rominger
7d36bd1fb2 Merge pull request #1786 from AlanCoding/system_params2
Add exception to allow relaunching callback jobs
2018-05-22 12:48:58 -04:00
Jared Tabor
8a1f2e9f54 Merge pull request #1873 from jaredevantabor/ldap-stuff
LDAP fixes for saving, and improved error handling
2018-05-22 09:11:42 -07:00
Jared Tabor
f585aa44be Merge pull request #1821 from jaredevantabor/breadcrumbs
Fixes a portal mode breadcrumb and capitalizes the instance groups b.c.
2018-05-22 09:09:56 -07:00
John Mitchell
22cffccc38 Merge pull request #1762 from jlmitch5/appTokenSearchPath
update app tokens search path
2018-05-22 12:00:42 -04:00
Alan Rominger
e2cd05e8e2 Merge pull request #1903 from AlanCoding/jake
Add final_line_count to EOF websocket
2018-05-22 11:47:51 -04:00
AlanCoding
f54ac776cd add final_line_count to EOF websocket 2018-05-21 15:47:43 -04:00
Ryan Petrello
ffdd7f162b Merge pull request #1893 from ryanpetrello/fix-broken-cancels
revert expect(use_poll=True) due to a bug that causes `os.read()` hangs
2018-05-21 13:05:51 -04:00
Ryan Petrello
d493a4e0d0 revert expect(use_poll=True) due to a bug that causes os.read() hangs
There's a bug in the implementation in pexpect:
pexpect/pexpect#491

Issues that could be related to this:
ansible/awx#1870
ansible/awx#1840

Rolling this back will cause #861 to no longer be "fixed". We'll have to solve it another way, or wait for pexpect to fix the poll bug.
2018-05-21 12:42:20 -04:00
Ryan Petrello
d7cdfdca2a Merge pull request #1861 from ryanpetrello/safe-queue-name
prevent unicode in instance hostnames and instance group names
2018-05-21 12:14:54 -04:00
Jake McDermott
2cbadcd392 make prior output viewable for partial job runs 2018-05-21 11:25:47 -04:00
Alan Rominger
36d566800c Merge pull request #1867 from AlanCoding/help_text_fds
Mark field scm_delete_on_next_update for removal
2018-05-21 10:12:05 -04:00
Fedor Sumkin
809de21451 adding pexpect support 2018-05-19 18:42:50 +03:00
Jared Tabor
7610c660cb Fixes the CTiT save errors. I added a toast message for successful saves too. 2018-05-18 16:30:44 -07:00
Ryan Petrello
4abac44411 prevent unicode in instance hostnames and instance group names
see: https://github.com/ansible/tower/issues/1721
2018-05-18 16:28:43 -04:00
Wayne Witzel III
86616c4062 Merge pull request #1864 from wwitzel3/fix-1859
Check if the project update for the project has been canceled.
2018-05-18 15:08:04 -04:00
Wayne Witzel III
9fe44cfaae check EACCES and only refresh cancel_flag 2018-05-18 14:58:58 -04:00
AlanCoding
222fbfc328 add help text, deprecate field 2018-05-18 14:26:22 -04:00
AlanCoding
969fb21e98 restrict network_ui to inv admins 2018-05-18 14:17:59 -04:00
Wayne Witzel III
5279b102cb Fix task unit test 2018-05-18 13:52:51 -04:00
Wayne Witzel III
41fe9e1caf Check if the project update for the project we are trying to lock is canceled 2018-05-18 12:46:54 -04:00
AlanCoding
967624c576 fix schedules modified_by getting nulled 2018-05-18 07:38:49 -04:00
Marliana Lara
f6eeecf6d1 Merge pull request #1834 from marshmalien/fix/1323-ctit-dialog-position
Fix position of CTiT logger test dialog
2018-05-17 16:52:52 -04:00
Matthew Jones
72f2994cc5 Merge branch 'release_3.3.0' into devel 2018-05-17 16:07:47 -04:00
Ryan Petrello
2e0125037a Merge pull request #1836 from ryanpetrello/hands-off-my-tokens
filter `/api/v2/users/N/tokens/` to only show tokens for _that_ user
2018-05-17 15:54:28 -04:00
Marliana Lara
02417dc668 Fix position in Firefox 2018-05-17 15:46:06 -04:00
Ryan Petrello
51f66b8c0a filter /api/v2/users/N/tokens/ to only show tokens for _that_ user
see: https://github.com/ansible/tower/issues/1773
2018-05-17 15:44:35 -04:00
Chris Meyers
a348893a91 Merge pull request #1846 from chrismeyersfsu/fix-1_in_maxint_chance_of_collision
more test fixes
2018-05-17 15:04:56 -04:00
AlanCoding
db6cc7c50b Add exception to allow relaunching callback jobs
allows for execute_role level users to directly
relaunch callback-type jobs, even though limit
has changed from JT, it is a down-selection
2018-05-17 14:41:56 -04:00
chris meyers
4031c888de fork process may finish before cancel callback
* The "should we cancel?" callback check is only called while the
subprocess (child) is alive. If the child executes quickly, the cancel
callback has no chance to run.
* call a subprocess that takes longer to run like sleep 2
2018-05-17 14:39:57 -04:00
chris meyers
d8615df47f postgres back tests can't do this 2018-05-17 14:39:57 -04:00
Jared Tabor
85caf6253c Fixes a portal mode breadcrumb and capitalizes the instance groups breadcrumb 2018-05-17 11:36:51 -07:00
Ryan Petrello
46add35f98 Merge pull request #1840 from chrismeyersfsu/fix-1_in_maxint_chance_of_collision
flake8
2018-05-17 14:15:57 -04:00
chris meyers
88bb98c967 flake8 2018-05-17 13:38:37 -04:00
Ryan Petrello
1026bc493f Merge pull request #1819 from ryanpetrello/slooooooooooooow-uri-cleaner
speed up a handful of really slow stdout tests
2018-05-17 13:38:20 -04:00
Chris Meyers
49982eea2d Merge pull request #1839 from chrismeyersfsu/fix-1_in_maxint_chance_of_collision
reduce chance of collision on cache namespace
2018-05-17 13:37:35 -04:00
chris meyers
40ef30a914 reduce chance of collision on cache namespace 2018-05-17 13:37:04 -04:00
Ryan Petrello
b6923bdbeb speed up a handful of really slow stdout tests
before: 59 passed in 95.20 seconds
after: 59 passed in 11.09 seconds
2018-05-17 13:27:18 -04:00
Chris Meyers
178d94a421 Merge pull request #1818 from chrismeyersfsu/fix-parallel_failures
isolate test cache
2018-05-17 13:24:40 -04:00
Jared Tabor
1876b3b0f5 Merge pull request #1809 from jaredevantabor/scheduler
Fixes to the scheduler form
2018-05-17 10:12:51 -07:00
chris meyers
04767641af isolate cache 2018-05-17 12:58:11 -04:00
Marliana Lara
b4bee93b35 Fix position of CTiT logger test dialog 2018-05-17 12:46:25 -04:00
Marliana Lara
64e3323ff5 Merge pull request #1815 from marshmalien/fix/1474-instance-policy-list-search
Hookup instance policy list smart search and add Dataset resolve
2018-05-17 12:25:38 -04:00
Alan Rominger
14d10a93cc Merge pull request #1817 from AlanCoding/notification_fail
Do not fail entire notification chain if one fails
2018-05-17 10:06:03 -04:00
Ryan Petrello
5bbbb87fee Merge pull request #1822 from AlanCoding/f8
fix flake8 introduced by new tests
2018-05-17 08:59:06 -04:00
AlanCoding
c998fd6bcb fix flake8 introduced by new tests 2018-05-17 07:43:09 -04:00
Jake McDermott
8f1c15e20d Merge pull request #1820 from jakemcdermott/job-results/fix-counters
don't reset counters on job start
2018-05-16 18:46:27 -04:00
Jake McDermott
2255ee5dba don't reset counters on job start 2018-05-16 17:32:40 -04:00
AlanCoding
f9871f32a3 do not fail entire notification chain if one fails 2018-05-16 15:16:40 -04:00
Chris Meyers
7f214f5ad2 Merge pull request #1766 from chrismeyersfsu/i_like_parallel_tests_and_I_can_not_lie
parallelize test running
2018-05-16 15:13:20 -04:00
chris meyers
97ab6449b9 parallelize test running 2018-05-16 14:29:15 -04:00
Jake McDermott
ae8fe207d4 Merge pull request #1812 from jakemcdermott/1770
maintain correct page and event counts on running jobs
2018-05-16 12:22:39 -04:00
Marliana Lara
f2e0214623 Hookup instance policy list smart search and add Dataset resolve 2018-05-16 12:12:21 -04:00
Ryan Petrello
f287948efe Merge pull request #1804 from ryanpetrello/stdout-format-json
never convert ANSI codes to HTML for format /stdout/?format=json
2018-05-16 11:41:20 -04:00
Ryan Petrello
53ef9ed288 never convert ANSI codes to HTML for format /stdout/?format=json
see: https://github.com/ansible/awx/issues/1863
2018-05-16 11:20:55 -04:00
Ryan Petrello
f49d52ad8e Merge pull request #1807 from ryanpetrello/polymorphic_created_by_delete
restore a django-polymorphic workaround to avoid a weird cascade bug
2018-05-16 11:03:41 -04:00
Ryan Petrello
07aeecc018 Merge pull request #1813 from ryanpetrello/until-until-until
fix a nuanced parsing bug in naive UNTIL= parsing
2018-05-16 10:01:27 -04:00
Ryan Petrello
39cb1cb60c fix a nuanced parsing bug in naive UNTIL= parsing 2018-05-16 09:35:04 -04:00
Jake McDermott
1d9fb53879 Merge pull request #1808 from jlmitch5/assortedStyleFixes33
Assorted style fixes for 3.3
2018-05-16 00:44:08 -04:00
Jake McDermott
11e7dcd0dc maintain correct page counts on running jobs 2018-05-16 00:19:41 -04:00
Jake McDermott
77e75c6e13 Merge pull request #1811 from jaredevantabor/workflow-stdout-vars
Uses atCodeMirror directive for extra vars widget on workflow results…
2018-05-15 23:34:27 -04:00
Jared Tabor
3658ce1a93 Uses atCodeMirror directive for extra vars widget on workflow results page 2018-05-15 18:09:07 -07:00
Jared Tabor
1e6905aac4 Fixes to the scheduler form 2018-05-15 15:31:21 -07:00
John Mitchell
3a6f1e2b63 make labels input standard width on wfjt form 2018-05-15 17:18:51 -04:00
John Mitchell
87239c0e11 right align smart inv button 2018-05-15 17:18:35 -04:00
John Mitchell
7b5dcee30f fix smart status bar color 2018-05-15 17:17:56 -04:00
Ryan Petrello
db1a669c68 work around a django-polymorphic bug that breaks certain cascades
see: #1794
2018-05-15 16:55:37 -04:00
Ryan Petrello
29927433cb Merge pull request #1806 from ryanpetrello/md5-not-even-once
remove md5 password hashing in dev
2018-05-15 16:33:35 -04:00
Chris Meyers
0bbc08e587 Merge pull request #1882 from chrismeyersfsu/fix-installer_readme
add variables to inventory mentioned in docs
2018-05-15 16:12:14 -04:00
Jared Tabor
0eefed80e1 Merge pull request #1765 from jaredevantabor/schedules-reorg
Schedules Re-org to related tabs
2018-05-15 13:10:35 -07:00
Ryan Petrello
d5fbb2d3b6 remove md5 password hashing in dev 2018-05-15 14:57:47 -04:00
chris meyers
ceedc135b2 add variables to inventory mentioned in docs
* Also better error message when openshift cert failure
2018-05-15 14:44:43 -04:00
Jared Tabor
f3923af3fa Makes extra variables CodeMirror shown only for JT-schedules that
have promptable extra vars in the JT. Hides vars for all other schedule types
2018-05-15 11:38:25 -07:00
Ryan Petrello
6bce1b9413 Merge pull request #1802 from ryanpetrello/scm-inventory-bwrap-root
run scm inv syncs at the project root so relative imports work w/ bwrap
2018-05-15 13:46:25 -04:00
Bill Nottingham
52ecc975d9 Merge pull request #1878 from wenottingham/that's-not-how-that-works
Fix checkout of role requirements.
2018-05-15 10:42:43 -07:00
Bill Nottingham
c078a51ddb Merge pull request #1789 from wenottingham/that's-not-how-that-works
Fix checkout of role requirements.
2018-05-15 10:28:05 -07:00
Bill Nottingham
32c027e0ea Merge pull request #1793 from wenottingham/what-did-you-pexpect
Bump pexpect version on isolated node.
2018-05-15 09:49:26 -07:00
Ryan Petrello
3ab7f06f95 run scm inv syncs at the project root so relative imports work w/ bwrap
see: https://github.com/ansible/tower/issues/1357
2018-05-15 12:00:37 -04:00
Luis Gracia
8e85a57c1a AWX launchers should wait for other containers to be ready 2018-05-15 11:45:54 -04:00
John Mitchell
fd0b439ee6 Merge pull request #1779 from jlmitch5/updateDefaultAnsibleEnvironmentText
change default option text for ansible environment dropdown to Default Environment
2018-05-15 11:36:43 -04:00
Bill Nottingham
6622e6bbd6 Bump pexpect version on isolated node. 2018-05-15 11:24:27 -04:00
Ryan Petrello
7481d671ff Merge pull request #1791 from ryanpetrello/censor-deleted-token
censor OAuth tokens from activity stream deletion records
2018-05-15 10:00:55 -04:00
Ryan Petrello
05b0c5ec6f censor OAuth tokens from activity stream deletion records
see: https://github.com/ansible/tower/issues/1772
2018-05-15 09:16:37 -04:00
Ryan Petrello
f5c4abc81b Merge pull request #1787 from ryanpetrello/admin-dif-mode
fix a bug that prevented JT admins from editing diff mode
2018-05-15 09:02:14 -04:00
Wayne Witzel III
e7e173b576 Merge pull request #1790 from wwitzel3/fix-1744
Prevent creating excessive update computed tasks when copying an Inve…
2018-05-15 08:37:49 -04:00
Alan Rominger
64fed4d360 Merge pull request #1768 from AlanCoding/all_the_search_fields
Enforce consistently setting view search_fields
2018-05-15 08:32:44 -04:00
Wayne Witzel III
5c45b25484 Prevent creating excessive update computed tasks when copying an Inventory 2018-05-15 08:17:48 -04:00
Bill Nottingham
efd0085ba2 Fix checkout of role requirements.
'omit' is only special as a module argument, it cannot be used in this way.
Hence, just have two conditional tasks.
2018-05-15 01:22:13 -04:00
Bill Nottingham
c3d720cbd4 Fix checkout of role requirements.
'omit' is only special as a module argument, it cannot be used in this way.
Hence, just have two conditional tasks.
2018-05-15 01:20:51 -04:00
Jared Tabor
5006b84eee adds parentResolve for new route 2018-05-14 18:34:07 -07:00
Jared Tabor
8f3cc4ec3e Addes a /#/jobs/schedules/:schedule_id/ route to the app
To leave user in the context of jobs/schedules when editing
a schedule instead of putting them in the context of the resource
they're scheduling
2018-05-14 17:54:30 -07:00
Jared Tabor
e04b2b7455 Fixes breadcrumbs for all the schedule states 2018-05-14 17:17:24 -07:00
Michael Abashian
406d82b99c Merge pull request #1783 from mabashian/1513-delete-last-survey-q
Delete the survey if the user removes all the survey questions
2018-05-14 16:07:19 -04:00
Michael Abashian
eb8140284a Merge pull request #1781 from mabashian/944-limit-panels
Tweaked limit-panels so that it doesn't use $transitions
2018-05-14 16:07:01 -04:00
Michael Abashian
dbfe99ab27 Merge pull request #1764 from mabashian/1454-checkbox-styling
Fixed credentials form checkbox styling
2018-05-14 16:06:28 -04:00
Michael Abashian
32e78ed7b2 Merge pull request #1752 from mabashian/1466-workflow
Fixed bug checking for credentials to remove
2018-05-14 16:06:06 -04:00
Michael Abashian
b69e2ed7a0 Merge pull request #1739 from mabashian/1717-delete-permission
Fixed bug deleting last team/user permission on page
2018-05-14 16:05:54 -04:00
Ryan Petrello
357a735e56 fix a bug that prevented JT admins from editing diff mode
see: https://github.com/ansible/tower/issues/801
2018-05-14 16:01:36 -04:00
mabashian
bfc602ae10 Changed variable names 2018-05-14 14:58:29 -04:00
mabashian
1a9b60a199 Delete the survey if the user removes all the survey questions 2018-05-14 14:55:32 -04:00
Ryan Petrello
7646f12e76 Merge pull request #1777 from ryanpetrello/admin-virtualenv
fix a bug that prevented JT admins from editing custom virtualenvs
2018-05-14 14:45:51 -04:00
Ryan Petrello
a942ccb272 Merge pull request #1778 from ryanpetrello/1k-ought-to-be-enough-for-anybody
truncate certain event fields when they are overly long
2018-05-14 14:30:42 -04:00
mabashian
ef514fb3c0 Mitigated race condition issues with limit-panel directive by removing dependency on the state transition event 2018-05-14 14:28:52 -04:00
Ryan Petrello
5b55e3cb2b fix a bug that prevented JT admins from editing custom virtualenvs
see: https://github.com/ansible/tower/issues/1754
2018-05-14 14:12:22 -04:00
Ryan Petrello
bb3b19e174 truncate certain event fields when they are overly long
see: https://github.com/ansible/tower/issues/1775
2018-05-14 14:02:17 -04:00
Jake McDermott
a74b8fa744 Merge pull request #1755 from jakemcdermott/1747
always render initial set of job events on initialization for still-running jobs
2018-05-14 11:41:38 -04:00
John Mitchell
3d157fab47 change default option text for ansible environment dropdown to Default Environment 2018-05-14 11:26:46 -04:00
Jake McDermott
503668141b add procedure for attaching to running jobs 2018-05-14 11:17:54 -04:00
Alan Rominger
6a0966d456 Merge pull request #1761 from AlanCoding/project_save_diff
Update project if certain params changed
2018-05-14 11:13:46 -04:00
AlanCoding
ec7f1c2540 enforce consistently setting view search_fields 2018-05-14 10:12:49 -04:00
Jake McDermott
665354c32e add skip functionality to event replay tool 2018-05-12 00:18:15 -04:00
Jake McDermott
f3343f780c always remove websocket listeners 2018-05-12 00:18:04 -04:00
Jake McDermott
2f5eefe809 push initial events on partially complete job initialization 2018-05-12 00:17:52 -04:00
Jared Tabor
77e195bbb9 Moves schedules tab to related tab for sources form 2018-05-11 16:42:49 -07:00
Jared Tabor
ce09ab446d Moves scheduler to related tab for projects
Signed-off-by: Jared Tabor <jtabor@redhat.com>
2018-05-11 16:37:24 -07:00
Jared Tabor
13d58107b8 Moves scheduler to related tab for workflows
and updates all links to point to updated state
2018-05-11 16:37:24 -07:00
Jared Tabor
464b7c3775 Moves schedules to related tab for job templates 2018-05-11 16:37:24 -07:00
mabashian
e9348134f0 Fixed credentials form checkbox styling 2018-05-11 16:38:04 -04:00
AlanCoding
b79606d9d3 update project if certain params changed 2018-05-11 13:59:15 -04:00
John Mitchell
a096051dc3 update app tokens search path 2018-05-11 13:54:25 -04:00
John Mitchell
0f98ed5046 Merge pull request #1753 from jlmitch5/newListForPortalMode
update portal mode templates list to new style
2018-05-11 10:33:59 -04:00
Ryan Petrello
6c0af2ef57 Merge pull request #1667 from ryanpetrello/and-you-get-a-timezone
change timezone behavior slightly for Schedule.rrule to make things simpler for UI folks
2018-05-11 09:55:23 -04:00
Alan Rominger
1b64e52f64 Merge pull request #1749 from AlanCoding/fix_team_parents
Fix team parentage being removed
2018-05-11 07:19:17 -04:00
John Mitchell
79ccabd0bd Merge pull request #1750 from jlmitch5/newTokensListRowItems
add new row items to user's token list
2018-05-10 16:52:50 -04:00
Jared Tabor
669b40a3e3 Merge pull request #1751 from jaredevantabor/1662-copy-prompt
Removes prompt modal after clicking the action button on the copy prompt
2018-05-10 13:30:10 -07:00
Jared Tabor
576a4a1b58 removes extra slash 2018-05-10 13:04:26 -07:00
John Mitchell
db2a2fa578 update portal mode templates list to new style 2018-05-10 14:44:23 -04:00
John Mitchell
97614892c6 fix syntax error in tokens list controller 2018-05-10 14:17:38 -04:00
John Mitchell
8a2c3ce716 add tokens to activity stream 2018-05-10 14:13:13 -04:00
Jared Tabor
4caa145161 Removes prompt modal after clicking the action button on the copy prompt 2018-05-10 11:06:56 -07:00
John Mitchell
924cb51d51 make delete of app work when you are on app's tokens route 2018-05-10 13:45:46 -04:00
John Mitchell
77eea40d0b use app name as part of delete token confirmation modal header 2018-05-10 13:38:56 -04:00
mabashian
a648ce5457 Fixed bug checking for credentials to remove 2018-05-10 13:00:32 -04:00
John Mitchell
956596227b use translated string for scope in tokens list 2018-05-10 12:38:56 -04:00
Jared Tabor
0c45d917d1 adds comment for setUntil function 2018-05-10 09:34:39 -07:00
John Mitchell
6c26574718 add new row items to token list 2018-05-10 12:29:55 -04:00
Jake McDermott
4b5c09c07c Merge pull request #1745 from jakemcdermott/fix-1740
show inventory-related and license error on for inventory update job details
2018-05-10 12:00:55 -04:00
Jake McDermott
6ccb2a46f7 Merge pull request #1743 from jakemcdermott/job-results/fix-1535
error handling for job results filter and route
2018-05-10 11:53:53 -04:00
AlanCoding
949895d0bc fix team parentage being removed 2018-05-10 11:13:09 -04:00
John Mitchell
adfe44a761 Merge pull request #1727 from jlmitch5/33appfieldupdates
app field updates
2018-05-10 11:09:41 -04:00
Wayne Witzel III
5d016c0dcb Merge pull request #1705 from benthomasson/network_ui_openshift_fix
Adds websocket for network_ui to the installer version of nginx.conf
2018-05-10 09:41:11 -04:00
Michael Abashian
916d88eee7 Merge pull request #1736 from mabashian/1729-scheduler
Added min value error message to "Days of data to keep" on scheduler
2018-05-10 09:31:12 -04:00
Michael Abashian
c3816a9812 Merge pull request #1735 from mabashian/1732-schedule
Only initialize extra vars if they are promptable
2018-05-10 09:30:51 -04:00
Michael Abashian
e6a56aa784 Merge pull request #1734 from mabashian/1730-jt-launch-inv
Fixed jt launch next button disabled when prompting for inventory
2018-05-10 09:29:17 -04:00
Michael Abashian
9afda6b331 Merge pull request #1728 from mabashian/1714-wf-completed-jobs
Added completed jobs tab to the workflow form
2018-05-10 09:28:57 -04:00
Alan Rominger
db776feea9 Merge pull request #1666 from AlanCoding/handlers_everywhere
Send our oddball loggers to external logger too
2018-05-10 08:38:31 -04:00
Alan Rominger
5643505a31 Merge pull request #1664 from AlanCoding/more_wfjt_cred_fixes
Correctly check credential permission on WFJT copy
2018-05-10 07:42:49 -04:00
Alan Rominger
1b69f7a376 Merge pull request #1716 from AlanCoding/sinfo
Include full stack trace for DB settings error
2018-05-09 20:04:41 -04:00
Jake McDermott
e19ffc1fba show license error details 2018-05-09 19:43:40 -04:00
Jake McDermott
4355b30afe show overwrite details 2018-05-09 19:43:32 -04:00
Jake McDermott
43ea72e278 show inventory source details 2018-05-09 19:43:24 -04:00
Jake McDermott
b030cdcd40 use inventory id from job args to construct inventory link 2018-05-09 19:43:14 -04:00
Jared Tabor
04b8349895 fixes issues with select dropdowns
and adds a search box for the timezone select dropdown
2018-05-09 16:15:02 -07:00
Jared Tabor
507db4e3b6 sets the UNTIL time to use the "until" that is explicitly state on the
schedules endpoint GET response
2018-05-09 14:39:26 -07:00
Chris Meyers
1d0ed6b0b3 Merge pull request #1733 from chrismeyersfsu/fix-instance_enabled_flag
disabled instance stay subscribed to bcast queue
2018-05-09 17:11:51 -04:00
chris meyers
4761e17566 disabled instance stay subscribed to bcast queue
* A disabled node needs to stay subscribed to the broadcast queue
because the work to re-subscribe the node to queues when the node is
re-enabled is done over the broadcast queue.
2018-05-09 17:03:26 -04:00
Ryan Petrello
c52eb0f327 provide a naive UNTIL= datestamp for schedules for UI convenience 2018-05-09 15:51:52 -04:00
Jake McDermott
3b5dd7eac5 error handling for job results filter and route 2018-05-09 15:31:28 -04:00
Ryan Petrello
056933e33e refactor naive UNTIL= coercion 2018-05-09 15:00:48 -04:00
mabashian
eccf3029b4 Fixed bug deleting last team/user permission on page 2018-05-09 14:31:33 -04:00
mabashian
9218a89589 Added error message to "Days of data to keep" when the user inputs a value less than one 2018-05-09 13:21:15 -04:00
mabashian
a02521a0bd Only initialize extra vars if they are promptable 2018-05-09 13:03:58 -04:00
mabashian
39827af902 Fixed jt launch next button disabled when prompting for inventory 2018-05-09 12:37:00 -04:00
Michael Abashian
72f982ab55 Merge pull request #1725 from mabashian/1670-clear-all
Activity stream clear-all bug fixes
2018-05-09 12:23:16 -04:00
AlanCoding
bbfabd2779 include full stack trace for DB settings error 2018-05-09 11:37:40 -04:00
mabashian
ece5724c80 Added completed jobs tab to the workflow form 2018-05-08 19:31:24 -04:00
John Mitchell
ffdf406300 reorder fields and make redirect_uri field not required on app form 2018-05-08 17:09:52 -04:00
mabashian
366c1c19b0 Removed commented lines. Rolled back noInfo change 2018-05-08 16:19:56 -04:00
mabashian
1807d0a910 Activity stream clear-all bug fixes. Re-enabled smart search directive test which required tweaking karma conf. 2018-05-08 16:13:56 -04:00
Alan Rominger
b50bddbc93 Merge pull request #1719 from AlanCoding/dragon_lair
Allow unicode queue names via CLI
2018-05-08 14:11:52 -04:00
Alan Rominger
2450a3ecd4 Merge pull request #1708 from AlanCoding/namespace_explosions
Accurate 400 messages for undefined filename namespaces
2018-05-08 14:04:55 -04:00
AlanCoding
3bd54ab837 allow unicode queue names via CLI 2018-05-08 12:43:39 -04:00
Ryan Petrello
00ae91dace slight cleanup and refactor of Schedule.timezone property 2018-05-08 08:28:51 -04:00
Jared Tabor
876431c529 Removes the 'Z' from the UNTIL before sending the rrule to the API 2018-05-07 14:42:59 -07:00
Jared Tabor
33d4c97156 Sets the timezone to the api/v2/schedule/:id -> data.timezone
and moving the data calls from the controller to the route resolve
2018-05-07 14:42:59 -07:00
Shane McDonald
cb91b97fd0 Update pot files 2018-05-07 17:35:14 -04:00
Ryan Petrello
441e5cc9c2 allow naive UNTILs to be specified for schedule rrules 2018-05-07 13:00:01 -07:00
Ryan Petrello
fbe2391b86 provide the timezone so that the UI doesn't have to
this will also ensure that UI doesn't use a different front end library
that will yield different results than the underlying Python code
2018-05-07 13:00:01 -07:00
AlanCoding
1e38abff91 accurate 400 messages for undefined filename namespaces 2018-05-07 15:39:10 -04:00
Ben Thomasson
e5dd3a9626 Merge pull request #1257 from benthomasson/network_ui_unit_tests
Adds unit tests for network_ui
2018-05-07 14:45:34 -04:00
Alan Rominger
459362daa5 Merge pull request #1706 from ansible/AlanCoding-patch-1
Fix syntax error in docs
2018-05-07 14:42:09 -04:00
Alan Rominger
ea2ddd3bba Fix syntax error in docs 2018-05-07 14:14:09 -04:00
Ben Thomasson
33ef12002f Adds websocket for network_ui to the installer version of nginx.conf 2018-05-07 13:42:29 -04:00
Jake McDermott
8e75cabcfa Merge pull request #1695 from jakemcdermott/fix-1614-1615-1616
disable activity stream for relaunched job labels, fix ui activity stream links
2018-05-07 12:57:44 -04:00
Jake McDermott
99e722e8e4 Merge pull request #1694 from jakemcdermott/job-results/remove-watch
job results - remove all watchers and move code into components
2018-05-07 12:57:26 -04:00
Jake McDermott
654ab0f007 Merge pull request #1704 from marshmalien/fix/1702-ff-job-results-panel-width
Fix Job Results panel width in Firefox
2018-05-07 12:54:33 -04:00
Marliana Lara
327d673301 Merge pull request #1701 from marshmalien/fix/job-template-form-extra-vars-cm-error
Set id on extra_vars job template form field
2018-05-07 12:20:10 -04:00
Marliana Lara
1488697001 Fix job results panel width in firefox 2018-05-07 12:19:39 -04:00
Marliana Lara
af4e86d70e Set Id on extra_vars job template form field 2018-05-07 11:19:30 -04:00
Alan Rominger
f4aaabaae7 Merge pull request #1698 from AlanCoding/transactions_gone_crazy
do not check for migration version if not migrating
2018-05-07 11:06:05 -04:00
Marliana Lara
de22fd40fa Merge pull request #1679 from marshmalien/fix/1442-extra-vars-api-error-validation
Fix job template extra vars form validation
2018-05-07 10:14:36 -04:00
Alan Rominger
0015df148b Merge pull request #1696 from AlanCoding/lock_wait
Add log message when locks are holding up jobs
2018-05-07 09:59:52 -04:00
Alan Rominger
f4a946f228 Merge pull request #1697 from AlanCoding/tower_json_err
Fix error-handling bug for tower inventory source
2018-05-07 09:47:57 -04:00
AlanCoding
e099c455d2 do not check for migration version if not migrating 2018-05-07 08:56:24 -04:00
AlanCoding
b275d13da2 fix error-handling bug for tower inventory source 2018-05-07 08:38:44 -04:00
AlanCoding
5a37184e7c add log message when locks are holding up jobs 2018-05-07 07:44:08 -04:00
Jake McDermott
63c268f9c5 don't render activity stream links for labels 2018-05-07 07:22:25 -04:00
Jake McDermott
363266fb89 fix links to workflow jobs on activity stream 2018-05-07 07:22:16 -04:00
Jake McDermott
d00b8549b4 disable activity stream for relaunched job label associations 2018-05-07 07:22:03 -04:00
Jake McDermott
42b88c6400 move directive code to components 2018-05-07 02:24:11 -04:00
Jake McDermott
58beb9640c remove watchers 2018-05-07 02:23:56 -04:00
Jake McDermott
a3fdd244b5 add message service 2018-05-07 02:23:39 -04:00
Jake McDermott
34a2128af8 Merge pull request #1684 from jakemcdermott/job-results/tag-lists
show job and skip tags as collapsable label lists
2018-05-04 14:45:55 -04:00
Jake McDermott
77a8abbc25 Merge pull request #1685 from jakemcdermott/filterable-if-filterable
show filterable:true for filterable fields
2018-05-04 12:57:20 -04:00
Jake McDermott
3d752997ee filter empty tags 2018-05-04 12:24:01 -04:00
Marliana Lara
23da2487d7 Merge pull request #1683 from marshmalien/fix/1650-current-system-config
Fix undefined form error in Configuration System form
2018-05-04 10:58:58 -04:00
Alan Rominger
8067113368 Merge pull request #1689 from AlanCoding/error_error
Avoid error in templating error
2018-05-04 10:43:49 -04:00
Alan Rominger
0fae43fc70 Merge pull request #1687 from AlanCoding/cannot_find_org
Avoid DB action in signal, confusing logs
2018-05-04 10:42:55 -04:00
Graham Mainwaring
617d6a8cf4 Merge pull request #1851 from ghjm/devel
Move data migration docs to root dir
2018-05-04 10:12:40 -04:00
Graham Mainwaring
c144bb99cf Move data migration docs to root dir 2018-05-04 10:11:21 -04:00
Graham Mainwaring
6db32e5c3e Merge pull request #1848 from rooftopcellist/data_migration_docs
Adds data migration docs for upgrades
2018-05-04 10:07:03 -04:00
AlanCoding
c5d49be2c1 avoid error in templating error 2018-05-04 08:39:09 -04:00
AlanCoding
6d7f772e98 avoid DB action in signal, confusing logs 2018-05-04 08:12:40 -04:00
adamscmRH
b281aaa0e5 Adds data migration docs for upgrades 2018-05-03 23:49:03 -04:00
Jake McDermott
0682d19d5e show filterable:true for filterable fields 2018-05-03 17:37:19 -04:00
Jake McDermott
5ada6f6db2 show job and skip tags as collapsable label lists 2018-05-03 14:40:23 -04:00
Marliana Lara
34408a8ef9 Fix undefined currentSystem form error 2018-05-03 14:29:17 -04:00
Ben Thomasson
af4367b222 Adds unit tests for network_ui
* Covers 100% of non-migration python lines of code
2018-05-03 14:13:33 -04:00
Michael Abashian
a9c9646060 Merge pull request #1680 from ansible/jakemcdermott-patch-smoke
remove redundant navbar checks
2018-05-03 13:46:47 -04:00
Jake McDermott
6f9da515b1 Update smoke.js 2018-05-03 13:43:47 -04:00
Marliana Lara
f3b24b8c55 Merge pull request #1676 from marshmalien/fix/1674-remove-portal-mode-breadcrumb
Remove portalMode.myJobs from portal mode breadcrumb
2018-05-03 13:42:39 -04:00
Jake McDermott
21a973752b remove redundant navbar checks 2018-05-03 13:41:12 -04:00
Marliana Lara
187534dba8 Fix job template extra vars form validation 2018-05-03 13:29:04 -04:00
Jake McDermott
b9f9104f57 Merge pull request #1669 from jakemcdermott/fix-1668
use icontains when expected for searches
2018-05-03 13:19:58 -04:00
Chris Meyers
2c118fc82d Merge pull request #1678 from chrismeyersfsu/fix-better_cluster_log_messages
better cluster membership policy log messages
2018-05-03 11:48:18 -04:00
chris meyers
5668d215fd better cluster membership policy log messages 2018-05-03 11:44:46 -04:00
Jake McDermott
1ed9f609fc use correct param names when calling encodeParams 2018-05-03 11:42:27 -04:00
Jake McDermott
2b1bef54ce add failing unit tests 2018-05-03 11:41:56 -04:00
Michael Abashian
da5781bfc9 Merge pull request #1661 from mabashian/679-searchable-fields
Consume searchable fields from api options response
2018-05-03 11:21:12 -04:00
Wayne Witzel III
538c15141a Merge pull request #1675 from wwitzel3/fix-879
Bulk update host field to null for JobEvents
2018-05-03 11:15:15 -04:00
Marliana Lara
42d33e5135 Remove portal mode breadcrumb 2018-05-03 10:58:42 -04:00
Wayne Witzel III
91a2466650 Bulk update host field to null for JobEvents 2018-05-03 10:48:36 -04:00
AlanCoding
ec1e94376c correctly check credential permission on WFJT copy 2018-05-03 07:42:59 -04:00
Jake McDermott
2abf959d84 Merge pull request #1648 from marshmalien/ux-hit-list/add-buttons
UX Hit List - Add Buttons
2018-05-03 01:27:24 -04:00
Jake McDermott
771dbe2ffe Merge pull request #1659 from marshmalien/fix/ux-hit-list
UX Hit List
2018-05-03 01:08:46 -04:00
Jake McDermott
143012318d Merge pull request #1660 from jakemcdermott/update-1534
update job urls for models
2018-05-02 18:44:39 -04:00
Jake McDermott
5b3bfa31df Merge pull request #1647 from jakemcdermott/fix-1534-and-713
add persistent jobs->results filtering, prior version compatibility for job urls
2018-05-02 18:42:54 -04:00
Jake McDermott
127883f104 add prior version url compatibility 2018-05-02 18:21:25 -04:00
Jared Tabor
0715773987 Merge pull request #1632 from jaredevantabor/1507-error-message
fixes error handling with groups service, sources service
2018-05-02 14:22:45 -07:00
Jared Tabor
e792abbdc1 Merge pull request #1646 from jaredevantabor/1476-cancel-job
Changes "Cancel" to "OK" on cancel-job-prompt modal
2018-05-02 14:16:42 -07:00
Jared Tabor
3b7a50f3e9 Merge pull request #1645 from jaredevantabor/1472-popover-traceback
Don't render tooltips that shouldn't exist
2018-05-02 14:15:03 -07:00
Jared Tabor
2baae8f75b Merge pull request #1640 from jaredevantabor/1502-AS-after-networking
Fix Activity Stream after visiting the network UI
2018-05-02 14:14:49 -07:00
Marliana Lara
8b6ee8d360 Fix all of the issues for the 3.3 UX Hit List
* Portal mode job header
* Move edit buttons to beginning of action buttons
* Dashboard job row spacing
* Decrease toggle button height
* Remove extra scrollbars from job results standard out
2018-05-02 16:05:32 -04:00
Marliana Lara
2140daf11e Fix add button display property and add tooltips
* Add tooltips to list add buttons of instance groups, instances, and applications.
2018-05-02 15:55:23 -04:00
AlanCoding
59744e421f send our oddball loggers to external logger too 2018-05-02 15:33:58 -04:00
mabashian
84c0fdfa4a Removed unused function 2018-05-02 14:21:43 -04:00
Jake McDermott
45ffe7a955 update api-ui job urls 2018-05-02 14:17:28 -04:00
mabashian
368a037062 Remove non-filterable fields from search key and treat searches using those keys like string searches. 2018-05-02 14:17:03 -04:00
Michael Abashian
1d6b15a6a7 Merge pull request #1627 from mabashian/user-pass-validation
Clear invalid password error if password field is completely cleared
2018-05-02 14:02:22 -04:00
Michael Abashian
48b0d4445c Merge pull request #1625 from mabashian/1621-team-org-list
Fixed team list org sorting
2018-05-02 14:02:00 -04:00
Michael Abashian
342ef8f2c9 Merge pull request #1624 from mabashian/1493-copy-inv-list
Reload state after copying inventory to update list
2018-05-02 14:01:33 -04:00
Michael Abashian
5cda2c94ac Merge pull request #1620 from mabashian/1589-relaunch-passwords
Fixed error showing vault password prompts on relaunch
2018-05-02 14:01:06 -04:00
Alan Rominger
b62dfa3e49 Merge pull request #1658 from AlanCoding/check_wfjt_creds
Check WFJT credentials fix
2018-05-02 13:52:30 -04:00
Chris Meyers
a50358afc5 Merge pull request #1638 from chrismeyersfsu/fix-isolated_heartbeat
control celery routes using celery router
2018-05-02 13:51:58 -04:00
Jared Tabor
7a3fb02791 Aligns text for canceling/deleting a job on the jobs list & the stdout page 2018-05-02 10:44:04 -07:00
Ryan Petrello
ad11653975 Merge pull request #1636 from ryanpetrello/bad-license-no-schedules
don't run scheduled jobs if there isn't a valid license
2018-05-02 13:36:29 -04:00
AlanCoding
902b1af417 fix access check for wfjt node copy 2018-05-02 13:24:57 -04:00
Alan Rominger
65b342ae73 Merge pull request #1654 from AlanCoding/pluralize_again
Update access check to plural creds
2018-05-02 13:08:04 -04:00
Chris Meyers
e24eef1d13 Merge pull request #1656 from chrismeyersfsu/fix-instance_group_creation_required
only require the name field when creating instance group
2018-05-02 13:07:46 -04:00
chris meyers
9f745dd3b8 control celery routes using celery router
* Each time a route is needed (i.e. when a task is sumitted to celery).
The router will be queried. This is ideal. With the previous method we
had to consider how a change in the routes would propogate to all celery
workers and nodes.

* fully describe the default awx queue
* Our dynamic queue registration would correct awx_private_queue.
However, we don't want celery to even create an "invalid"/extra
queue-exchange-route. This change makes sure we don't create extranious
things in rabbitmq.

* reduce the cluster queue registration output. Only output when the
queue registration list changes.
2018-05-02 12:57:36 -04:00
chris meyers
38885580b4 only require the name field when creating instance group 2018-05-02 12:32:08 -04:00
Ryan Petrello
30af0a1b44 don't run scheduled jobs if there isn't a valid license 2018-05-02 11:52:51 -04:00
Christian Adams
0e4b0e86bf Merge pull request #1642 from rooftopcellist/session_parity
add auth cookies
2018-05-02 11:47:59 -04:00
AlanCoding
652f837622 update access check to plural creds 2018-05-02 11:37:38 -04:00
Ben Thomasson
f6600872b0 Merge pull request #1643 from benthomasson/network_ui_export_yaml_fix
Fixes timeout when exporting YAML from network UI
2018-05-02 11:15:31 -04:00
Ben Thomasson
d386e89af2 Merge pull request #1626 from benthomasson/network_ui_websocket_auth_fix
Adds authentication checking to the network UI websocket.
2018-05-02 11:15:19 -04:00
Marliana Lara
7007e46b8a Remove add button dropdown gap and update border radius
* Fix linting error
2018-05-02 10:57:24 -04:00
Alan Rominger
72655961e4 Merge pull request #1630 from AlanCoding/no_restart_try2
Replace service restart with new handler changing dynamically with settings
2018-05-02 10:32:57 -04:00
Ben Thomasson
89cabf7ca0 Fixes timeout when exporting YAML from network UI
Exporting YAML on dev envs with honcho and in production environments
would timeout.  This was due to daphne handling the export request
in dev but not in production.  This fixes network_ui to use uwsgi instead
of daphne to handle the request.
2018-05-02 10:31:36 -04:00
Ben Thomasson
d8a1b78316 Adds authentication checking to the network UI websocket.
Adds user authentication checking to the websocket connect
callback function. This prevents unauthenicated users
from making changes to the network canvas or viewing the
data on the canvas by getting snapshots of the diagram.
2018-05-02 10:28:24 -04:00
Antony PERIGAULT
4090fe6d11 Fix functional tests 2018-05-02 16:25:44 +02:00
AlanCoding
ac20aa954a Replace logging-related restart with dynamic handler
refactor existing handlers to be the related
  "real" handler classes, which are swapped
  out dynamically by external logger "proxy" handler class

real handler swapout only done on setting change

remove restart_local_services method
get rid of uWSGI fifo file

change TCP/UDP return type contract so that it mirrors
  the request futures object
add details to socket error messages
2018-05-02 09:47:22 -04:00
Marliana Lara
dce52d0552 Update the Add button content and styles
* Change the text from "Add" to "+"
* Update the e2e test to check for an id #button-add
2018-05-02 09:35:11 -04:00
Antony PERIGAULT
9bfac4f44b New feature: Add SAML users as organization admins 2018-05-02 15:03:48 +02:00
Antony PERIGAULT
13cd57feba Revert "Map users in organizations based on saml groups"
This reverts commit b4e0ff650165e6b0ab08d9a78be85f2f46182b94.
2018-05-02 15:03:48 +02:00
Antony PERIGAULT
eab417cf8b Map users in organizations based on saml groups 2018-05-02 14:54:20 +02:00
Jake McDermott
0c8b2a9872 remove unused service 2018-05-02 01:06:15 -04:00
Jake McDermott
83d5fef67c conditionally hide scroll 2018-05-02 01:06:04 -04:00
Jake McDermott
b64990562a Merge pull request #1644 from jaredevantabor/activity-stream-fixes
Activity stream fixes
2018-05-01 19:34:41 -04:00
Jared Tabor
cf0efe969e Changes "Cancel" to "OK" on cancel-job-prompt modal 2018-05-01 16:20:44 -07:00
Jared Tabor
63542c3b43 Don't render tooltips that shouldn't exist 2018-05-01 16:05:22 -07:00
Jake McDermott
359140f733 Merge pull request #1634 from mabashian/1486-relaunch
Update relaunch button on details page in real time as status changes
2018-05-01 18:48:05 -04:00
Jared Tabor
a840ec4089 Fixes jobs' page activity stream link, and remove AS button on job results page 2018-05-01 15:36:47 -07:00
Jared Tabor
a79632968c Fixes job template schedule link from Activity Stream 2018-05-01 15:19:44 -07:00
adamscmRH
dead84da1a add auth cookies 2018-05-01 16:57:17 -04:00
Jared Tabor
079d8e2565 fixes issue with ui-view for network UI
and closes network UI socket connections after closing the network UI
2018-05-01 13:43:33 -07:00
Christian Adams
fd4f78a64c Merge pull request #1637 from rooftopcellist/exp_setting_update
Token Expiration Setting Update
2018-05-01 15:05:33 -04:00
adamscmRH
1963ab689a rm an unnecessary uwsgi restart 2018-05-01 14:12:00 -04:00
Chris Meyers
cbc1fc2faa Merge pull request #1635 from chrismeyersfsu/fix-tower_instance_group_read_only
make tower instance group name field read-only
2018-05-01 13:54:52 -04:00
Chris Meyers
22c2bd0257 Merge pull request #1629 from chrismeyersfsu/fix-stable_broadcast_queue_name
broadcast queues get a per-node stable queue name
2018-05-01 13:53:25 -04:00
chris meyers
202ddae813 make tower instance group name field read-only 2018-05-01 13:31:24 -04:00
chris meyers
648d9165ff broadcast queues get a per-node stable queue name
* Using Kombu's default Broadcast() constructor requires only 1
parameter. That parameter defines the exchange name and the queue name
is randomly generated per-node.
* This caused problems if/when celery enters an infinite restart loop
because too many rabbit queues get created and rabbit OOM's
(gracefully).
* To remedy this we tell Broadcast the queue name to use, which is
derived from some constant + the node name so that the per-node queue
name is stable.
2018-05-01 13:09:10 -04:00
mabashian
5ef297aec1 Update relaunch button on details page in real time as status changes 2018-05-01 12:13:16 -04:00
Jared Tabor
421293c8c5 fixes error handling with groups service, sources service 2018-04-30 15:11:34 -07:00
mabashian
e45be8155e Clear invalid password error if password field is completely cleared 2018-04-30 14:57:05 -04:00
Jake McDermott
f7effd82dc Merge pull request #1828 from jakemcdermott/patch-tests
patch smoke test
2018-04-30 14:22:29 -04:00
Ben Thomasson
05556809d3 Merge pull request #1618 from benthomasson/network_ui_toolbox_title_fix
Fixes scroll of devices over inventory toolbox title.
2018-04-30 13:59:49 -04:00
Ben Thomasson
90813c9be6 Merge pull request #1617 from benthomasson/network_ui_toolbox_drag_fix
Fixes dragging devices out of the inventory toolbox
2018-04-30 13:59:17 -04:00
Ben Thomasson
58d47a1b0b Merge pull request #1622 from benthomasson/network_ui_inventory_redirect
Fixes 301 redirects on topology websocket connection
2018-04-30 13:58:25 -04:00
Jake McDermott
b71a8af62d patch smoke test 2018-04-30 13:51:43 -04:00
Christian Adams
dab766239f Merge pull request #1613 from rooftopcellist/update_oauth2_filter
granularly prevent filtering oauth secrets
2018-04-30 12:11:24 -04:00
Shane McDonald
17b6051233 Merge pull request #1826 from shanemcd/update-install-docs
Update install docs
2018-04-30 12:05:11 -04:00
Shane McDonald
6f4ef29ae7 Update install docs
- Document openshift_skip_tls_verify
- Document openshift_pg_emptydir
- Add minimum minishift specs
- Move minishift section below variable reference
2018-04-30 12:02:57 -04:00
mabashian
f8a9402d4b Fixed team list org sorting 2018-04-30 11:55:54 -04:00
adamscmRH
4197a9fd35 granularly prevent filtering oauth secrets 2018-04-30 11:54:23 -04:00
mabashian
fcc5549ec9 Reload state after copying inventory to update list 2018-04-30 11:41:26 -04:00
Ben Thomasson
fd38c62e7e Fixes 301 redirects on topology websocket connection
Fixes 301 redirects on creation of the topology websocket
connection by adding a trailing slash to the websocket URI.
2018-04-30 10:59:54 -04:00
mabashian
24e363888a Fixed error showing vault password prompts on relaunch 2018-04-30 10:47:41 -04:00
Ben Thomasson
456bf5d04d Fixes scroll of devices over inventory toolbox title.
Fixes a defect where the devices in the inventory toolbox
would scroll over the toolbox title.   This moves the title
later in the rendering order and adds a background to the title.
2018-04-30 10:40:30 -04:00
Ben Thomasson
10fd65bea0 Fixes dragging devices out of the inventory toolbox
Fixes a defect where devices were dropped onto the canvas
if they were moved a small amount after being selected in
the inventory toolbox.   This fix checks that the mouse
has cleared the boundary of the inventory toolbox before
dropping it onto the canvas.
2018-04-30 10:26:09 -04:00
Ryan Petrello
1e4c2f6d4f Merge pull request #1814 from jaredevantabor/1811-sockets
Adds liveUpdates flag for the UI back in
2018-04-27 16:24:16 -04:00
John Mitchell
7781667977 Merge pull request #1612 from jlmitch5/removePanelCloseIcon
only show close icon in templates panel header when applicable
2018-04-27 15:44:34 -04:00
John Mitchell
aa6fc6d8bf only show close icon in templates panel header when applicable 2018-04-27 15:38:12 -04:00
Jared Tabor
791cc06e27 Adds liveUpdates flag for the UI back in
This line was lost in the 3.2.4 merge
2018-04-27 12:33:57 -07:00
Jared Tabor
28d6983be0 Merge pull request #1610 from jaredevantabor/fix-sockets
Fix sockets
2018-04-27 12:31:39 -07:00
Alan Rominger
f122fb4e1d Merge pull request #1321 from AlanCoding/order_field_validate
Use field validation in both filter classes
2018-04-27 14:34:07 -04:00
John Mitchell
1344e056fa Merge pull request #1597 from jlmitch5/oauthNewFields
Oauth new fields
2018-04-27 14:22:21 -04:00
Jared Tabor
f5c4f9a9df Adds liveUpdates flag for the UI back in
This line was lost in the 3.2.4 merge
2018-04-27 11:15:20 -07:00
John Mitchell
11560ab7bb populate org and description on app detail view 2018-04-27 13:05:34 -04:00
Ryan Petrello
0e27d62e7a Merge pull request #1608 from ryanpetrello/celery-whooooooooo-aaaaaare-you-who-who-who-whoooo
restore the celery hostname
2018-04-27 12:15:33 -04:00
Ryan Petrello
c8e416f0b7 restore the celery hostname 2018-04-27 11:40:58 -04:00
John Mitchell
6ab64590d7 update app activity stream target to o_auth2_application 2018-04-27 11:37:17 -04:00
Jake McDermott
c31dd4994e Merge pull request #1606 from marshmalien/fix/1536-job-results-ux
Fix job result detail and standard out panel styles
2018-04-27 11:34:41 -04:00
Jake McDermott
5537431e05 Merge pull request #1598 from jakemcdermott/project-host-details-and-traceback-label
add click-to-open project host details and improve traceback details label
2018-04-27 11:31:59 -04:00
Marliana Lara
35bd98eb49 Fix job result detail and standard out panel styles 2018-04-27 10:31:36 -04:00
John Mitchell
f99792e604 make selects work with ng required 2018-04-26 17:06:20 -04:00
Jake McDermott
61757fb2b1 improve traceback details label 2018-04-26 13:24:41 -04:00
John Mitchell
3bcc48402c add support for applications activity stream 2018-04-26 13:23:03 -04:00
John Mitchell
72254758f6 add support for additional selects 2018-04-26 13:22:39 -04:00
Jake McDermott
9cc9bdc4b5 clickable stdout events and host details modal for projects 2018-04-26 13:21:28 -04:00
AlanCoding
6306ac2825 use field validation in both filter classes 2018-04-26 07:23:20 -04:00
John Mitchell
45d037a2cc don't prefer destructuring for arrays within es-lint 2018-04-25 21:12:13 -04:00
Rob Ruma
e8b026648f Updates to callback scripts that include retry functionality for bash and extra_vars handling for PowerShell
Signed-off-by: Rob Ruma <robruma@users.noreply.github.com>
2018-03-21 08:22:08 -04:00
1458 changed files with 81219 additions and 57801 deletions

41
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,41 @@
---
name: "\U0001F41B Bug report"
about: Create a report to help us improve
---
##### ISSUE TYPE
- Bug Report
##### COMPONENT NAME
<!-- Pick the area of AWX for this issue, you can have multiple, delete the rest: -->
- API
- UI
- Installer
##### SUMMARY
<!-- Briefly describe the problem. -->
##### ENVIRONMENT
* AWX version: X.Y.Z
* AWX install method: openshift, minishift, docker on linux, docker for mac, boot2docker
* Ansible version: X.Y.Z
* Operating System:
* Web Browser:
##### STEPS TO REPRODUCE
<!-- Please describe exactly how to reproduce the problem. -->
##### EXPECTED RESULTS
<!-- What did you expect to happen when running the steps above? -->
##### ACTUAL RESULTS
<!-- What actually happened? -->
##### ADDITIONAL INFORMATION
<!-- Include any links to sosreport, database dumps, screenshots or other
information. -->

View File

@@ -0,0 +1,22 @@
---
name: "✨ Feature request"
about: Suggest an idea for this project
---
##### ISSUE TYPE
- Feature Idea
##### COMPONENT NAME
<!-- Pick the area of AWX for this issue, you can have multiple, delete the rest: -->
- API
- UI
- Installer
##### SUMMARY
<!-- Briefly describe the problem or desired enhancement. -->
##### ADDITIONAL INFORMATION
<!-- Include any links to sosreport, database dumps, screenshots or other
information. -->

View File

@@ -0,0 +1,9 @@
---
name: "\U0001F525 Security bug report"
about: How to report security vulnerabilities
---
For all security related bugs, email security@ansible.com instead of using this issue tracker and you will receive a prompt response.
For more information on the Ansible community's practices regarding responsible disclosure, see https://www.ansible.com/security

9
.gitignore vendored
View File

@@ -1,3 +1,8 @@
# Ignore generated schema
swagger.json
schema.json
reference-schema.json
# Tags
.tags
.tags1
@@ -52,10 +57,12 @@ __pycache__
**/node_modules/**
/tmp
**/npm-debug.log*
**/package-lock.json
# UI build flag files
awx/ui/.deps_built
awx/ui/.release_built
awx/ui/.release_deps_built
# Testing
.cache
@@ -67,6 +74,7 @@ pep8.txt
scratch
testem.log
awx/awx_test.sqlite3-journal
.pytest_cache/
# Mac OS X
*.DS_Store
@@ -111,7 +119,6 @@ local/
*.mo
requirements/vendor
.i18n_built
VERSION
.idea/*
# AWX python libs populated by requirements.txt

View File

@@ -2,29 +2,29 @@
Hi there! We're excited to have you as a contributor.
Have questions about this document or anything not covered here? Come chat with us at `#ansible-awx` on irc.freenode.net, or submit your question to the [mailing list](https://groups.google.com/forum/#!forum/awx-project) .
Have questions about this document or anything not covered here? Come chat with us at `#ansible-awx` on irc.freenode.net, or submit your question to the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
## Table of contents
* [Things to know prior to submitting code](#things-to-know-before-contributing-code)
* [Things to know prior to submitting code](#things-to-know-prior-to-submitting-code)
* [Setting up your development environment](#setting-up-your-development-environment)
* [Prerequisites](#prerequisites)
* [Docker](#docker)
* [Docker compose](#docker-compose)
* [Node and npm](#node-and-npm)
* [Building the environment](#building-the-environment)
* [Clone the AWX repo](#clone-the-awx-repo)
* [Build the environment](#build-the-environment)
* [Fork and clone the AWX repo](#fork-and-clone-the-awx-repo)
* [Create local settings](#create-local-settings)
* [Build the base image](#build-the-base-image)
* [Build the user interface](#build-the-user-interface)
# [Running the environment](#running-the-environment)
* [Running the environment](#running-the-environment)
* [Start the containers](#start-the-containers)
* [Start from the container shell](#start-from-the-container-shell)
* [Post Build Steps](#post-build-steps)
* [Start a shell](#start-the-shell)
* [Create a superuser](#create-a-superuser)
* [Load the data](#load-the-data)
* [Building API Documentation](#build-documentation)
* [Start a shell](#start-a-shell)
* [Create a superuser](#create-a-superuser)
* [Load the data](#load-the-data)
* [Building API Documentation](#build-api-documentation)
* [Accessing the AWX web interface](#accessing-the-awx-web-interface)
* [Purging containers and images](#purging-containers-and-images)
* [What should I work on?](#what-should-i-work-on)
@@ -34,10 +34,11 @@ Have questions about this document or anything not covered here? Come chat with
## Things to know prior to submitting code
- All code submissions are done through pull requests against the `devel` branch.
- You must use `git commit --signoff` for any commit to be merged, and agree that usage of --signoff constitutes agreement with the terms of [DCO 1.1](./DCO_1_1.md).
- You must use `git commit --signoff` for any commit to be merged, and agree that usage of --signoff constitutes agreement with the terms of [DCO 1.1](./DCO_1_1.md).
- Take care to make sure no merge commits are in the submission, and use `git rebase` vs `git merge` for this reason.
- If collaborating with someone else on the same branch, consider using `--force-with-lease` instead of `--force`. This will prevent you from accidentally overwriting commits pushed by someone else. For more information, see https://git-scm.com/docs/git-push#git-push---force-with-leaseltrefnamegt
- If submitting a large code change, it's a good idea to join the `#ansible-awx` channel on irc.freenode.net, and talk about what you would like to do or add first. This not only helps everyone know what's going on, it also helps save time and effort, if the community decides some changes are needed.
- We ask all of our community members and contributors to adhere to the [Ansible code of conduct](http://docs.ansible.com/ansible/latest/community/code_of_conduct.html). If you have questions, or need assistance, please reach out to our community team at [codeofconduct@ansible.com](mailto:codeofconduct@ansible.com)
- We ask all of our community members and contributors to adhere to the [Ansible code of conduct](http://docs.ansible.com/ansible/latest/community/code_of_conduct.html). If you have questions, or need assistance, please reach out to our community team at [codeofconduct@ansible.com](mailto:codeofconduct@ansible.com)
## Setting up your development environment
@@ -49,7 +50,7 @@ The AWX development environment workflow and toolchain is based on Docker, and t
Prior to starting the development services, you'll need `docker` and `docker-compose`. On Linux, you can generally find these in your distro's packaging, but you may find that Docker themselves maintain a separate repo that tracks more closely to the latest releases.
For macOS and Windows, we recommend [Docker for Mac](https://www.docker.com/docker-mac) and [Docker for Windows](https://www.docker.com/docker-windows)
For macOS and Windows, we recommend [Docker for Mac](https://www.docker.com/docker-mac) and [Docker for Windows](https://www.docker.com/docker-windows)
respectively.
For Linux platforms, refer to the following from Docker:
@@ -86,8 +87,8 @@ If you're not using Docker for Mac, or Docker for Windows, you may need, or choo
The AWX UI requires the following:
- Node 6.x LTS version
- NPM 3.x LTS
- Node 8.x LTS
- NPM 6.x LTS
### Build the environment
@@ -137,21 +138,21 @@ Run the following to build the AWX UI:
```
### Running the environment
#### Start the containers
#### Start the containers
Start the development containers by running the following:
```bash
(host)$ make docker-compose
```
The above utilizes the image built in the previous step, and will automatically start all required services and dependent containers. Once the containers launch, your session will be attached to the *awx* container, and you'll be able to watch log messages and events in real time. You will see messages from Django, celery, and the front end build process.
The above utilizes the image built in the previous step, and will automatically start all required services and dependent containers. Once the containers launch, your session will be attached to the *awx* container, and you'll be able to watch log messages and events in real time. You will see messages from Django and the front end build process.
If you start a second terminal session, you can take a look at the running containers using the `docker ps` command. For example:
```bash
# List running containers
(host)$ docker ps
(host)$ docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@@ -174,7 +175,7 @@ The first time you start the environment, database migrations need to run in ord
```bash
awx_1 | Operations to perform:
awx_1 | Synchronize unmigrated apps: solo, api, staticfiles, debug_toolbar, messages, channels, django_extensions, ui, rest_framework, polymorphic
awx_1 | Apply all migrations: sso, taggit, sessions, djcelery, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
awx_1 | Apply all migrations: sso, taggit, sessions, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
awx_1 | Synchronizing apps without migrations:
awx_1 | Creating tables...
awx_1 | Running deferred SQL...
@@ -219,7 +220,7 @@ If you want to start and use the development environment, you'll first need to b
```
The above will do all the setup tasks, including running database migrations, so it may take a couple minutes.
Now you can start each service individually, or start all services in a pre-configured tmux session like so:
```bash
@@ -248,9 +249,9 @@ Before you can log into AWX, you need to create an admin user. With this user yo
(container)# awx-manage createsuperuser
```
You will be prompted for a username, an email address, and a password, and you will be asked to confirm the password. The email address is not important, so just enter something that looks like an email address. Remember the username and password, as you will use them to log into the web interface for the first time.
##### Load demo data
You can optionally load some demo data. This will create a demo project, inventory, and job template. From within the container shell, run the following to load the data:
```bash
@@ -276,7 +277,7 @@ in OpenAPI format. A variety of online tools are available for translating
this data into more consumable formats (such as HTML). http://editor.swagger.io
is an example of one such service.
### Accessing the AWX web interface
### Accessing the AWX web interface
You can now log into the AWX web interface at [https://localhost:8043](https://localhost:8043), and access the API directly at [https://localhost:8043/api/](https://localhost:8043/api/).
@@ -289,7 +290,7 @@ When necessary, remove any AWX containers and images by running the following:
```bash
(host)$ make docker-clean
```
## What should I work on?
For feature work, take a look at the current [Enhancements](https://github.com/ansible/awx/issues?q=is%3Aissue+is%3Aopen+label%3Atype%3Aenhancement).
@@ -329,7 +330,24 @@ We like to keep our commit history clean, and will require resubmission of pull
Sometimes it might take us a while to fully review your PR. We try to keep the `devel` branch in good working order, and so we review requests carefully. Please be patient.
All submitted PRs will have the linter and unit tests run against them, and the status reported in the PR.
All submitted PRs will have the linter and unit tests run against them via Zuul, and the status reported in the PR.
## PR Checks ran by Zuul
Zuul jobs for awx are defined in the [zuul-jobs](https://github.com/ansible/zuul-jobs) repo.
Zuul runs the following checks that must pass:
1) `tox-awx-api-lint`
2) `tox-awx-ui-lint`
3) `tox-awx-api`
4) `tox-awx-ui`
5) `tox-awx-swagger`
Zuul runs the following checks that are non-voting (can not pass but serve to inform PR reviewers):
1) `tox-awx-detect-schema-change`
This check generates the schema and diffs it against a reference copy of the `devel` version of the schema.
Reviewers should inspect the `job-output.txt.gz` related to the check if their is a failure (grep for `diff -u -b` to find beginning of diff).
If the schema change is expected and makes sense in relation to the changes made by the PR, then you are good to go!
If not, the schema changes should be fixed, but this decision must be enforced by reviewers.
## Reporting Issues

97
DATA_MIGRATION.md Normal file
View File

@@ -0,0 +1,97 @@
# Migrating Data Between AWX Installations
## Introduction
Upgrades using Django migrations are not expected to work in AWX. As a result, to upgrade to a new version, it is necessary to export resources from the old AWX node and import them into a freshly-installed node with the new version. The recommended way to do this is to use the tower-cli send/receive feature.
This tool does __not__ support export/import of the following:
* Logs/history
* Credential passwords
* LDAP/AWX config
### Install & Configure Tower-CLI
In terminal, pip install tower-cli (if you do not have pip already, install [here](https://pip.pypa.io/en/stable/installing/)):
```
$ pip install --upgrade ansible-tower-cli
```
The AWX host URL, user, and password must be set for the AWX instance to be exported:
```
$ tower-cli config host http://<old-awx-host.example.com>
$ tower-cli config username <user>
$ tower-cli config password <pass>
```
For more information on installing tower-cli look [here](http://tower-cli.readthedocs.io/en/latest/quickstart.html).
### Export Resources
Export all objects
```$ tower-cli receive --all > assets.json```
### Teardown Old AWX
Clean up remnants of the old AWX install:
```docker rm -f $(docker ps -aq)``` # remove all old awx containers
```make clean-ui``` # clean up ui artifacts
### Install New AWX version
If you are installing AWX as a dev container, pull down the latest code or version you want from GitHub, build
the image locally, then start the container
```
git pull # retrieve latest AWX changes from repository
make docker-compose-build # build AWX image
make docker-compose # run container
```
For other install methods, refer to the [Install.md](https://github.com/ansible/awx/blob/devel/INSTALL.md).
### Import Resources
Configure tower-cli for your new AWX host as shown earlier. Import from a JSON file named assets.json
```
$ tower-cli config host http://<new-awx-host.example.com>
$ tower-cli config username <user>
$ tower-cli config password <pass>
$ tower-cli send assets.json
```
--------------------------------------------------------------------------------
## Additional Info
If you have two running AWX hosts, it is possible to copy all assets from one instance to another
```$ tower-cli receive --tower-host old-awx-host.example.com --all | tower-cli send --tower-host new-awx-host.example.com```
#### More Granular Exports:
Export all credentials
```$ tower-cli receive --credential all > credentials.json```
> Note: This exports the credentials with blank strings for passwords and secrets
Export a credential named "My Credential"
```$ tower-cli receive --credential "My Credential"```
#### More Granular Imports:
You could import anything except an organization defined in a JSON file named assets.json
```$ tower-cli send --prevent organization assets.json```

View File

@@ -62,8 +62,8 @@ Before you can run a deployment, you'll need the following installed in your loc
- [docker-py](https://github.com/docker/docker-py) Python module
- [GNU Make](https://www.gnu.org/software/make/)
- [Git](https://git-scm.com/) Requires Version 1.8.4+
- [Node 6.x LTS version](https://nodejs.org/en/download/)
- [NPM 3.x LTS](https://docs.npmjs.com/)
- [Node 8.x LTS version](https://nodejs.org/en/download/)
- [NPM 6.x LTS](https://docs.npmjs.com/)
### System Requirements
@@ -119,30 +119,15 @@ To complete a deployment to OpenShift, you will obviously need access to an Open
You will also need to have the `oc` command in your PATH. The `install.yml` playbook will call out to `oc` when logging into, and creating objects on the cluster.
The default resource requests per-pod requires:
The default resource requests per-deployment requires:
> Memory: 6GB
> CPU: 3 cores
This can be tuned by overriding the variables found in [/installer/openshift/defaults/main.yml](/installer/openshift/defaults/main.yml). Special care should be taken when doing this as undersized instances will experience crashes and resource exhaustion.
This can be tuned by overriding the variables found in [/installer/roles/kubernetes/defaults/main.yml](/installer/roles/kubernetes/defaults/main.yml). Special care should be taken when doing this as undersized instances will experience crashes and resource exhaustion.
For more detail on how resource requests are formed see: [https://docs.openshift.com/container-platform/latest/dev_guide/compute_resources.html#dev-compute-resources](https://docs.openshift.com/container-platform/latest/dev_guide/compute_resources.html#dev-compute-resources)
#### Deploying to Minishift
Install Minishift by following the [installation guide](https://docs.openshift.org/latest/minishift/getting-started/installing.html).
The Minishift VM contains a Docker daemon, which you can use to build the AWX images. This is generally the approach you should take, and we recommend doing so. To use this instance, run the following command to setup your environment:
```bash
# Set DOCKER environment variable to point to the Minishift VM
$ eval $(minishift docker-env)
```
**Note**
> If you choose to not use the Docker instance running inside the VM, and build the images externally, you will have to enable the OpenShift cluster to access the images. This involves pushing the images to an external Docker registry, and granting the cluster access to it, or exposing the internal registry, and pushing the images into it.
### Pre-build steps
Before starting the build process, review the [inventory](./installer/inventory) file, and uncomment and provide values for the following variables found in the `[all:vars]` section:
@@ -151,7 +136,12 @@ Before starting the build process, review the [inventory](./installer/inventory)
> IP address or hostname of the OpenShift cluster. If you're using Minishift, this will be the value returned by `minishift ip`.
*awx_openshift_project*
*openshift_skip_tls_verify*
> Boolean. Set to True if using self-signed certs.
*openshift_project*
> Name of the OpenShift project that will be created, and used as the namespace for the AWX app. Defaults to *awx*.
@@ -159,6 +149,10 @@ Before starting the build process, review the [inventory](./installer/inventory)
> Username of the OpenShift user that will create the project, and deploy the application. Defaults to *developer*.
*openshift_pg_emptydir*
> Boolean. Set to True to use an emptyDir volume when deploying the PostgreSQL pod. Note: This should only be used for demo and testing purposes.
*docker_registry*
> IP address and port, or URL, for accessing a registry that the OpenShift cluster can access. Defaults to *172.30.1.1:5000*, the internal registry delivered with Minishift. This is not needed if you are using official hosted images.
@@ -171,11 +165,30 @@ Before starting the build process, review the [inventory](./installer/inventory)
> Username of the user that will push images to the registry. Will generally match the *openshift_user* value. Defaults to *developer*. This is not needed if you are using official hosted images.
#### Deploying to Minishift
Install Minishift by following the [installation guide](https://docs.openshift.org/latest/minishift/getting-started/installing.html).
The recommended minimum resources for your Minishift VM:
```bash
$ minishift start --cpus=4 --memory=8GB
```
The Minishift VM contains a Docker daemon, which you can use to build the AWX images. This is generally the approach you should take, and we recommend doing so. To use this instance, run the following command to setup your environment:
```bash
# Set DOCKER environment variable to point to the Minishift VM
$ eval $(minishift docker-env)
```
**Note**
> If you choose to not use the Docker instance running inside the VM, and build the images externally, you will have to enable the OpenShift cluster to access the images. This involves pushing the images to an external Docker registry, and granting the cluster access to it, or exposing the internal registry, and pushing the images into it.
#### PostgreSQL
AWX requires access to a PostgreSQL database, and by default, one will be created and deployed in a pod. The database is configured for persistence and will create a persistent volume claim named `postgresql`. By default it will claim 5GB from the available persistent volume pool. This can be tuned by setting a variable in the inventory file or on the command line during the `ansible-playbook` run.
ansible-playbook ... -e pg_volume_capacity=n
By default, AWX will deploy a PostgreSQL pod inside of your cluster. You will need to create a [Persistent Volume Claim](https://docs.openshift.org/latest/dev_guide/persistent_volumes.html) which is named `postgresql` by default, and can be overridden by setting the `openshift_pg_pvc_name` variable. For testing and demo purposes, you may set `openshift_pg_emptydir=yes`.
If you wish to use an external database, in the inventory file, set the value of `pg_hostname`, and update `pg_username`, `pg_password`, `pg_database`, and `pg_port` with the connection information. When setting `pg_hostname` the installer will assume you have configured the database in that location and will not launch the postgresql pod.
@@ -223,7 +236,7 @@ Using /etc/ansible/ansible.cfg as config file
}
Operations to perform:
Synchronize unmigrated apps: solo, api, staticfiles, messages, channels, django_extensions, ui, rest_framework, polymorphic
Apply all migrations: sso, taggit, sessions, djcelery, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
Apply all migrations: sso, taggit, sessions, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
@@ -305,7 +318,7 @@ The default resource requests per-pod requires:
> Memory: 6GB
> CPU: 3 cores
This can be tuned by overriding the variables found in [/installer/kubernetes/defaults/main.yml](/installer/kubernetes[/defaults/main.yml). Special care should be taken when doing this as undersized instances will experience crashes and resource exhaustion.
This can be tuned by overriding the variables found in [/installer/roles/kubernetes/defaults/main.yml](/installer/roles/kubernetes/defaults/main.yml). Special care should be taken when doing this as undersized instances will experience crashes and resource exhaustion.
For more detail on how resource requests are formed see: [https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)
@@ -317,7 +330,7 @@ Before starting the build process, review the [inventory](./installer/inventory)
> Prior to running the installer, make sure you've configured the context for the cluster you'll be installing to. This is how the installer knows which cluster to connect to and what authentication to use
*awx_kubernetes_namespace*
*kubernetes_namespace*
> Name of the Kubernetes namespace where the AWX resources will be installed. This will be created if it doesn't exist
@@ -391,7 +404,7 @@ If you're installing using Docker Compose, you'll need [Docker Compose](https://
#### Deploying to a remote host
By default, the delivered [installer/inventory](./installer/inventory) file will deploy AWX to the local host. It is possible; however, to deploy to a remote host. The [installer/install.yml](./installer/install.yml) playbook can be used to build images on the local host, and ship the built images to, and run deployment tasks on, a remote host. To do this, modify the [installer/inventory](./installer/inventory) file, by commenting out `localhost`, and adding the remote host.
By default, the delivered [installer/inventory](./installer/inventory) file will deploy AWX to the local host. It is possible, however, to deploy to a remote host. The [installer/install.yml](./installer/install.yml) playbook can be used to build images on the local host, and ship the built images to, and run deployment tasks on, a remote host. To do this, modify the [installer/inventory](./installer/inventory) file, by commenting out `localhost`, and adding the remote host.
For example, suppose you wish to build images locally on your CI/CD host, and deploy them to a remote host named *awx-server*. To do this, add *awx-server* to the [installer/inventory](./installer/inventory) file, and comment out or remove `localhost`, as demonstrated by the following:
@@ -413,7 +426,7 @@ If you choose to use the official images then the remote host will be the one to
> As mentioned above, in [Prerequisites](#prerequisites-1), the prerequisites are required on the remote host.
> When deploying to a remote host, the playook does not execute tasks with the `become` option. For this reason, make sure the user that connects to the remote host has privileges to run the `docker` command. This typically means that non-privileged users need to be part of the `docker` group.
> When deploying to a remote host, the playbook does not execute tasks with the `become` option. For this reason, make sure the user that connects to the remote host has privileges to run the `docker` command. This typically means that non-privileged users need to be part of the `docker` group.
#### Inventory variables
@@ -436,6 +449,10 @@ Before starting the build process, review the [inventory](./installer/inventory)
When using docker-compose, the `docker-compose.yml` file will be created there (default `/var/lib/awx`).
*ca_trust_dir*
> If you're using a non trusted CA, provide a path where the untrusted Certs are stored on your Host.
#### Docker registry
If you wish to tag and push built images to a Docker registry, set the following variables in the inventory file:
@@ -535,7 +552,7 @@ Using /etc/ansible/ansible.cfg as config file
}
Operations to perform:
Synchronize unmigrated apps: solo, api, staticfiles, messages, channels, django_extensions, ui, rest_framework, polymorphic
Apply all migrations: sso, taggit, sessions, djcelery, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
Apply all migrations: sso, taggit, sessions, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...

179
Makefile
View File

@@ -1,4 +1,4 @@
PYTHON ?= python
PYTHON ?= python3
PYTHON_VERSION = $(shell $(PYTHON) -c "from distutils.sysconfig import get_python_version; print(get_python_version())")
SITELIB=$(shell $(PYTHON) -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
OFFICIAL ?= no
@@ -11,11 +11,7 @@ GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
MANAGEMENT_COMMAND ?= awx-manage
IMAGE_REPOSITORY_AUTH ?=
IMAGE_REPOSITORY_BASE ?= https://gcr.io
VERSION=$(shell git describe --long --first-parent)
VERSION3=$(shell git describe --long --first-parent | sed 's/\-g.*//')
VERSION3DOT=$(shell git describe --long --first-parent | sed 's/\-g.*//' | sed 's/\-/\./')
RELEASE_VERSION=$(shell git describe --long --first-parent | sed 's@\([0-9.]\{1,\}\).*@\1@')
VERSION := $(shell cat VERSION)
# NOTE: This defaults the container image version to the branch that's active
COMPOSE_TAG ?= $(GIT_BRANCH)
@@ -46,20 +42,9 @@ DATE := $(shell date -u +%Y%m%d%H%M)
NAME ?= awx
GIT_REMOTE_URL = $(shell git config --get remote.origin.url)
ifeq ($(OFFICIAL),yes)
VERSION_TARGET ?= $(RELEASE_VERSION)
else
VERSION_TARGET ?= $(VERSION3DOT)
endif
# TAR build parameters
ifeq ($(OFFICIAL),yes)
SDIST_TAR_NAME=$(NAME)-$(RELEASE_VERSION)
WHEEL_NAME=$(NAME)-$(RELEASE_VERSION)
else
SDIST_TAR_NAME=$(NAME)-$(VERSION3DOT)
WHEEL_NAME=$(NAME)-$(VERSION3DOT)
endif
SDIST_TAR_NAME=$(NAME)-$(VERSION)
WHEEL_NAME=$(NAME)-$(VERSION)
SDIST_COMMAND ?= sdist
WHEEL_COMMAND ?= bdist_wheel
@@ -68,12 +53,13 @@ WHEEL_FILE ?= $(WHEEL_NAME)-py2-none-any.whl
# UI flag files
UI_DEPS_FLAG_FILE = awx/ui/.deps_built
UI_RELEASE_DEPS_FLAG_FILE = awx/ui/.release_deps_built
UI_RELEASE_FLAG_FILE = awx/ui/.release_built
I18N_FLAG_FILE = .i18n_built
.PHONY: awx-link clean clean-tmp clean-venv requirements requirements_dev \
develop refresh adduser migrate dbchange dbshell runserver celeryd \
develop refresh adduser migrate dbchange dbshell runserver \
receiver test test_unit test_ansible test_coverage coverage_html \
dev_build release_build release_clean sdist \
ui-docker-machine ui-docker ui-release ui-devel \
@@ -88,6 +74,7 @@ clean-ui:
rm -rf awx/ui/test/e2e/reports/
rm -rf awx/ui/client/languages/
rm -f $(UI_DEPS_FLAG_FILE)
rm -f $(UI_RELEASE_DEPS_FLAG_FILE)
rm -f $(UI_RELEASE_FLAG_FILE)
clean-tmp:
@@ -99,6 +86,11 @@ clean-venv:
clean-dist:
rm -rf dist
clean-schema:
rm -rf swagger.json
rm -rf schema.json
rm -rf reference-schema.json
# Remove temporary build files, compiled Python files.
clean: clean-ui clean-dist
rm -rf awx/public
@@ -110,7 +102,6 @@ clean: clean-ui clean-dist
rm -rf requirements/vendor
rm -rf tmp
rm -rf $(I18N_FLAG_FILE)
rm -f VERSION
mkdir tmp
rm -rf build $(NAME)-$(VERSION) *.egg-info
find . -type f -regex ".*\.py[co]$$" -delete
@@ -131,23 +122,30 @@ virtualenv_ansible:
mkdir $(VENV_BASE); \
fi; \
if [ ! -d "$(VENV_BASE)/ansible" ]; then \
virtualenv --system-site-packages $(VENV_BASE)/ansible && \
virtualenv -p python --system-site-packages $(VENV_BASE)/ansible && \
$(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) --ignore-installed six packaging appdirs && \
$(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) --ignore-installed setuptools==36.0.1 && \
$(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) --ignore-installed pip==9.0.1; \
fi; \
fi
virtualenv_ansible_py3:
if [ "$(VENV_BASE)" ]; then \
if [ ! -d "$(VENV_BASE)" ]; then \
mkdir $(VENV_BASE); \
fi; \
if [ ! -d "$(VENV_BASE)/ansible3" ]; then \
python3 -m venv --system-site-packages $(VENV_BASE)/ansible3; \
fi; \
fi
virtualenv_awx:
if [ "$(VENV_BASE)" ]; then \
if [ ! -d "$(VENV_BASE)" ]; then \
mkdir $(VENV_BASE); \
fi; \
if [ ! -d "$(VENV_BASE)/awx" ]; then \
virtualenv --system-site-packages $(VENV_BASE)/awx && \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --ignore-installed six packaging appdirs && \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --ignore-installed setuptools==36.0.1 && \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --ignore-installed pip==9.0.1; \
$(PYTHON) -m venv $(VENV_BASE)/awx; \
fi; \
fi
@@ -159,6 +157,11 @@ requirements_ansible: virtualenv_ansible
fi
$(VENV_BASE)/ansible/bin/pip uninstall --yes -r requirements/requirements_ansible_uninstall.txt
requirements_ansible_py3: virtualenv_ansible_py3
cat requirements/requirements_ansible.txt requirements/requirements_ansible_git.txt | $(VENV_BASE)/ansible3/bin/pip3 install $(PIP_OPTIONS) --no-binary $(SRC_ONLY_PKGS) --ignore-installed -r /dev/stdin
$(VENV_BASE)/ansible3/bin/pip3 install ansible # can't inherit from system ansible, it's py2
$(VENV_BASE)/ansible3/bin/pip3 uninstall --yes -r requirements/requirements_ansible_uninstall.txt
requirements_ansible_dev:
if [ "$(VENV_BASE)" ]; then \
$(VENV_BASE)/ansible/bin/pip install pytest mock; \
@@ -166,11 +169,9 @@ requirements_ansible_dev:
requirements_isolated:
if [ ! -d "$(VENV_BASE)/awx" ]; then \
virtualenv --system-site-packages $(VENV_BASE)/awx && \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --ignore-installed six packaging appdirs && \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --ignore-installed setuptools==35.0.2 && \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --ignore-installed pip==9.0.1; \
$(PYTHON) -m venv $(VENV_BASE)/awx; \
fi;
echo "include-system-site-packages = true" >> $(VENV_BASE)/awx/lib/python$(PYTHON_VERSION)/pyvenv.cfg
$(VENV_BASE)/awx/bin/pip install -r requirements/requirements_isolated.txt
# Install third-party requirements needed for AWX's environment.
@@ -180,14 +181,15 @@ requirements_awx: virtualenv_awx
else \
cat requirements/requirements.txt requirements/requirements_git.txt | $(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) --no-binary $(SRC_ONLY_PKGS) --ignore-installed -r /dev/stdin ; \
fi
$(VENV_BASE)/awx/bin/pip uninstall --yes -r requirements/requirements_tower_uninstall.txt
echo "include-system-site-packages = true" >> $(VENV_BASE)/awx/lib/python$(PYTHON_VERSION)/pyvenv.cfg
#$(VENV_BASE)/awx/bin/pip uninstall --yes -r requirements/requirements_tower_uninstall.txt
requirements_awx_dev:
$(VENV_BASE)/awx/bin/pip install -r requirements/requirements_dev.txt
requirements: requirements_ansible requirements_awx
requirements_dev: requirements requirements_awx_dev requirements_ansible_dev
requirements_dev: requirements requirements_ansible_py3 requirements_awx_dev requirements_ansible_dev
requirements_test: requirements
@@ -206,7 +208,7 @@ version_file:
if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
python -c "import awx as awx; print awx.__version__" > /var/lib/awx/.awx_version; \
python -c "import awx; print(awx.__version__)" > /var/lib/awx/.awx_version; \
# Do any one-time init tasks.
comma := ,
@@ -219,7 +221,7 @@ init:
if [ "$(AWX_GROUP_QUEUES)" == "tower,thepentagon" ]; then \
$(MANAGEMENT_COMMAND) provision_instance --hostname=isolated; \
$(MANAGEMENT_COMMAND) register_queue --queuename='thepentagon' --hostnames=isolated --controller=tower; \
$(MANAGEMENT_COMMAND) generate_isolated_key | ssh -o "StrictHostKeyChecking no" root@isolated 'cat > /root/.ssh/authorized_keys'; \
$(MANAGEMENT_COMMAND) generate_isolated_key > /awx_devel/awx/main/expect/authorized_keys; \
fi;
# Refresh development environment after pulling new code.
@@ -248,7 +250,7 @@ server_noattach:
tmux new-session -d -s awx 'exec make uwsgi'
tmux rename-window 'AWX'
tmux select-window -t awx:0
tmux split-window -v 'exec make celeryd'
tmux split-window -v 'exec make dispatcher'
tmux new-window 'exec make daphne'
tmux select-window -t awx:1
tmux rename-window 'WebSockets'
@@ -270,22 +272,16 @@ supervisor:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
supervisord --configuration /supervisor.conf --pidfile=/tmp/supervisor_pid
supervisord --pidfile=/tmp/supervisor_pid
# Alternate approach to tmux to run all development tasks specified in
# Procfile. https://youtu.be/OPMgaibszjk
# Procfile.
honcho:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
honcho start -f tools/docker-compose/Procfile
flower:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
celery flower --address=0.0.0.0 --port=5555 --broker=amqp://guest:guest@$(RABBITMQ_HOST):5672//
collectstatic:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
@@ -296,7 +292,7 @@ uwsgi: collectstatic
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
uwsgi -b 32768 --socket 127.0.0.1:8050 --module=awx.wsgi:application --home=/venv/awx --chdir=/awx_devel/ --vacuum --processes=5 --harakiri=120 --master --no-orphans --py-autoreload 1 --max-requests=1000 --stats /tmp/stats.socket --master-fifo=/awxfifo --lazy-apps --logformat "%(addr) %(method) %(uri) - %(proto) %(status)" --hook-accepting1-once="exec:/bin/sh -c '[ -f /tmp/celery_pid ] && kill -1 `cat /tmp/celery_pid` || true'"
uwsgi -b 32768 --socket 127.0.0.1:8050 --module=awx.wsgi:application --home=/venv/awx --chdir=/awx_devel/ --vacuum --processes=5 --harakiri=120 --master --no-orphans --py-autoreload 1 --max-requests=1000 --stats /tmp/stats.socket --lazy-apps --logformat "%(addr) %(method) %(uri) - %(proto) %(status)" --hook-accepting1-once="exec:awx-manage run_dispatcher --reload"
daphne:
@if [ "$(VENV_BASE)" ]; then \
@@ -317,13 +313,13 @@ runserver:
fi; \
$(PYTHON) manage.py runserver
# Run to start the background celery worker for development.
celeryd:
rm -f /tmp/celery_pid
# Run to start the background task dispatcher for development.
dispatcher:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
celery worker -A awx -l DEBUG -B -Ofair --autoscale=100,4 --schedule=$(CELERY_SCHEDULE_FILE) -n celery@$(COMPOSE_HOST) --pidfile /tmp/celery_pid
$(PYTHON) manage.py run_dispatcher
# Run to start the zeromq callback receiver
receiver:
@@ -359,26 +355,31 @@ pyflakes: reports
pylint: reports
@(set -o pipefail && $@ | reports/$@.report)
genschema: reports
$(MAKE) swagger PYTEST_ARGS="--genschema"
swagger: reports
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
(set -o pipefail && py.test awx/conf/tests/functional awx/main/tests/functional/api awx/main/tests/docs --release=$(VERSION_TARGET) | tee reports/$@.report)
(set -o pipefail && py.test $(PYTEST_ARGS) awx/conf/tests/functional awx/main/tests/functional/api awx/main/tests/docs --release=$(VERSION_TARGET) | tee reports/$@.report)
check: flake8 pep8 # pyflakes pylint
awx-link:
cp -R /tmp/awx.egg-info /awx_devel/ || true
sed -i "s/placeholder/$(shell git describe --long | sed 's/\./\\./g')/" /awx_devel/awx.egg-info/PKG-INFO
cp /tmp/awx.egg-link /venv/awx/lib/python2.7/site-packages/awx.egg-link
cp -f /tmp/awx.egg-link /venv/awx/lib/python$(PYTHON_VERSION)/site-packages/awx.egg-link
TEST_DIRS ?= awx/main/tests/unit awx/main/tests/functional awx/conf/tests awx/sso/tests
# Run all API unit tests.
test:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
py.test $(TEST_DIRS)
PYTHONDONTWRITEBYTECODE=1 py.test -p no:cacheprovider -n auto $(TEST_DIRS)
awx-manage check_migrations --dry-run --check -n 'vNNN_missing_migration_file'
test_combined: test_ansible test
@@ -465,7 +466,7 @@ messages:
# generate l10n .json .mo
languages: $(I18N_FLAG_FILE)
$(I18N_FLAG_FILE): $(UI_DEPS_FLAG_FILE)
$(I18N_FLAG_FILE): $(UI_RELEASE_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run languages
$(PYTHON) tools/scripts/compilemessages.py
touch $(I18N_FLAG_FILE)
@@ -473,13 +474,31 @@ $(I18N_FLAG_FILE): $(UI_DEPS_FLAG_FILE)
# End l10n TASKS
# --------------------------------------
# UI TASKS
# UI RELEASE TASKS
# --------------------------------------
ui-release: $(UI_RELEASE_FLAG_FILE)
$(UI_RELEASE_FLAG_FILE): $(I18N_FLAG_FILE) $(UI_RELEASE_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run build-release
touch $(UI_RELEASE_FLAG_FILE)
$(UI_RELEASE_DEPS_FLAG_FILE):
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 $(NPM_BIN) --unsafe-perm --prefix awx/ui ci --no-save awx/ui
touch $(UI_RELEASE_DEPS_FLAG_FILE)
# END UI RELEASE TASKS
# --------------------------------------
# UI TASKS
# --------------------------------------
ui-deps: $(UI_DEPS_FLAG_FILE)
$(UI_DEPS_FLAG_FILE):
$(NPM_BIN) --unsafe-perm --prefix awx/ui install awx/ui
@if [ -f ${UI_RELEASE_DEPS_FLAG_FILE} ]; then \
rm -rf awx/ui/node_modules; \
rm -f ${UI_RELEASE_DEPS_FLAG_FILE}; \
fi; \
$(NPM_BIN) --unsafe-perm --prefix awx/ui ci --no-save awx/ui
touch $(UI_DEPS_FLAG_FILE)
ui-docker-machine: $(UI_DEPS_FLAG_FILE)
@@ -493,12 +512,6 @@ ui-docker: $(UI_DEPS_FLAG_FILE)
ui-devel: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run build-devel -- $(MAKEFLAGS)
ui-release: $(UI_RELEASE_FLAG_FILE)
$(UI_RELEASE_FLAG_FILE): $(I18N_FLAG_FILE) $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run build-release
touch $(UI_RELEASE_FLAG_FILE)
ui-test: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run test
@@ -509,9 +522,6 @@ ui-test-ci: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run test:ci
$(NPM_BIN) --prefix awx/ui run unit
testjs_ci:
echo "Update UI unittests later" #ui-test-ci
jshint: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) run --prefix awx/ui jshint
$(NPM_BIN) run --prefix awx/ui lint
@@ -559,23 +569,38 @@ docker-isolated:
TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml -f tools/docker-isolated-override.yml create
docker start tools_awx_1
docker start tools_isolated_1
echo "__version__ = '`python setup.py --version`'" | docker exec -i tools_isolated_1 /bin/bash -c "cat > /venv/awx/lib/python2.7/site-packages/awx.py"
if [ "`docker exec -i -t tools_isolated_1 cat /root/.ssh/authorized_keys`" == "`docker exec -t tools_awx_1 cat /root/.ssh/id_rsa.pub`" ]; then \
echo "SSH keys already copied to isolated instance"; \
else \
docker exec "tools_isolated_1" bash -c "mkdir -p /root/.ssh && rm -f /root/.ssh/authorized_keys && echo $$(docker exec -t tools_awx_1 cat /root/.ssh/id_rsa.pub) >> /root/.ssh/authorized_keys"; \
fi
TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml -f tools/docker-isolated-override.yml up
echo "__version__ = '`git describe --long | cut -d - -f 1-1`'" | docker exec -i tools_isolated_1 /bin/bash -c "cat > /venv/awx/lib/python$(PYTHON_VERSION)/site-packages/awx.py"
CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml -f tools/docker-isolated-override.yml up
# Docker Compose Development environment
docker-compose: docker-auth
TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml up --no-recreate awx
CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml up --no-recreate awx
docker-compose-cluster: docker-auth
TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose-cluster.yml up
CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose-cluster.yml up
docker-compose-test: docker-auth
cd tools && TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports awx /bin/bash
cd tools && CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports awx /bin/bash
docker-compose-runtest:
cd tools && CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports awx /start_tests.sh
docker-compose-build-swagger:
cd tools && CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports awx /start_tests.sh swagger
docker-compose-genschema:
cd tools && CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports awx /start_tests.sh genschema
mv swagger.json schema.json
docker-compose-detect-schema-change:
$(MAKE) docker-compose-genschema
curl https://s3.amazonaws.com/awx-public-ci-files/schema.json -o reference-schema.json
# Ignore differences in whitespace with -b
diff -u -b reference-schema.json schema.json
docker-compose-clean:
cd tools && CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm -w /awx_devel --service-ports awx make clean
cd tools && TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose rm -sf
docker-compose-build: awx-devel-build
@@ -601,11 +626,14 @@ docker-refresh: docker-clean docker-compose
# Docker Development Environment with Elastic Stack Connected
docker-compose-elk: docker-auth
TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml -f tools/elastic/docker-compose.logstash-link.yml -f tools/elastic/docker-compose.elastic-override.yml up --no-recreate
CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml -f tools/elastic/docker-compose.logstash-link.yml -f tools/elastic/docker-compose.elastic-override.yml up --no-recreate
docker-compose-cluster-elk: docker-auth
TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose-cluster.yml -f tools/elastic/docker-compose.logstash-link-cluster.yml -f tools/elastic/docker-compose.elastic-override.yml up --no-recreate
minishift-dev:
ansible-playbook -i localhost, -e devtree_directory=$(CURDIR) tools/clusterdevel/start_minishift_dev.yml
clean-elk:
docker stop tools_kibana_1
docker stop tools_logstash_1
@@ -618,5 +646,4 @@ psql-container:
docker run -it --net tools_default --rm postgres:9.6 sh -c 'exec psql -h "postgres" -p "5432" -U postgres'
VERSION:
@echo $(VERSION_TARGET) > $@
@echo "awx: $(VERSION_TARGET)"
@echo "awx: $(VERSION)"

View File

@@ -1,7 +1,6 @@
[![Run Status](https://api.shippable.com/projects/591c82a22f895107009e8b35/badge?branch=devel)](https://app.shippable.com/github/ansible/awx)
[![Gated by Zuul](https://zuul-ci.org/gated.svg)](https://ansible.softwarefactory-project.io/zuul/status)
AWX
===
<img src="https://raw.githubusercontent.com/ansible/awx-logos/master/awx/ui/client/assets/logo-login.svg?sanitize=true" width=200 alt="AWX" />
AWX provides a web-based user interface, REST API, and task engine built on top of [Ansible](https://github.com/ansible/ansible). It is the upstream project for [Tower](https://www.ansible.com/tower), a commercial derivative of AWX.
@@ -11,6 +10,8 @@ To learn more about using AWX, and Tower, view the [Tower docs site](http://docs
The AWX Project Frequently Asked Questions can be found [here](https://www.ansible.com/awx-project-faq).
The AWX logos and branding assets are covered by [our trademark guidelines](https://github.com/ansible/awx-logos/blob/master/TRADEMARKS.md).
Contributing
------------
@@ -23,7 +24,7 @@ Contributing
Reporting Issues
----------------
If you're experiencing a problem, we encourage you to open an issue, and share your feedback. But before opening a new issue, we ask that you please take a look at our [Issues guide](./ISSUES.md).
If you're experiencing a problem that you feel is a bug in AWX, or have ideas for how to improve AWX, we encourage you to open an issue, and share your feedback. But before opening a new issue, we ask that you please take a look at our [Issues guide](./ISSUES.md).
Code of Conduct
---------------
@@ -33,11 +34,10 @@ We ask all of our community members and contributors to adhere to the [Ansible c
Get Involved
------------
We welcome your feedback and ideas. Here's how to reach us:
We welcome your feedback and ideas. Here's how to reach us with feedback and questions:
- Join the `#ansible-awx` channel on irc.freenode.net
- Join the [mailing list](https://groups.google.com/forum/#!forum/awx-project)
- [Open an Issue](https://github.com/ansible/awx/issues)
License
-------

1
VERSION Normal file
View File

@@ -0,0 +1 @@
3.0.1

View File

@@ -7,11 +7,10 @@ import sys
import warnings
from pkg_resources import get_distribution
from .celery import app as celery_app # noqa
__version__ = get_distribution('awx').version
__all__ = ['__version__']
__all__ = ['__version__', 'celery_app']
# Check for the presence/absence of "devonly" module to determine if running
# from a source code checkout or release packaage.
@@ -22,6 +21,48 @@ except ImportError: # pragma: no cover
MODE = 'production'
import hashlib
try:
import django
from django.utils.encoding import force_bytes
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.backends.base import schema
HAS_DJANGO = True
except ImportError:
HAS_DJANGO = False
if HAS_DJANGO is True:
# This line exists to make sure we don't regress on FIPS support if we
# upgrade Django; if you're upgrading Django and see this error,
# update the version check below, and confirm that FIPS still works.
if django.__version__ != '1.11.16':
raise RuntimeError("Django version other than 1.11.16 detected {}. \
Subclassing BaseDatabaseSchemaEditor is known to work for Django 1.11.16 \
and may not work in newer Django versions.".format(django.__version__))
class FipsBaseDatabaseSchemaEditor(BaseDatabaseSchemaEditor):
@classmethod
def _digest(cls, *args):
"""
Generates a 32-bit digest of a set of arguments that can be used to
shorten identifying names.
"""
try:
h = hashlib.md5()
except ValueError:
h = hashlib.md5(usedforsecurity=False)
for arg in args:
h.update(force_bytes(arg))
return h.hexdigest()[:8]
schema.BaseDatabaseSchemaEditor = FipsBaseDatabaseSchemaEditor
def find_commands(management_dir):
# Modified version of function from django/core/management/__init__.py.
command_dir = os.path.join(management_dir, 'commands')
@@ -50,16 +91,6 @@ def prepare_env():
# Monkeypatch Django find_commands to also work with .pyc files.
import django.core.management
django.core.management.find_commands = find_commands
# Fixup sys.modules reference to django.utils.six to allow jsonfield to
# work when using Django 1.4.
import django.utils
try:
import django.utils.six
except ImportError: # pragma: no cover
import six
sys.modules['django.utils.six'] = sys.modules['six']
django.utils.six = sys.modules['django.utils.six']
from django.utils import six # noqa
# Use the AWX_TEST_DATABASE_* environment variables to specify the test
# database settings to use when management command is run as an external
# program via unit tests.

View File

@@ -11,7 +11,7 @@ from django.utils.encoding import smart_text
# Django REST Framework
from rest_framework import authentication
# Django OAuth Toolkit
# Django-OAuth-Toolkit
from oauth2_provider.contrib.rest_framework import OAuth2Authentication
logger = logging.getLogger('awx.api.authentication')
@@ -25,7 +25,7 @@ class LoggedBasicAuthentication(authentication.BasicAuthentication):
ret = super(LoggedBasicAuthentication, self).authenticate(request)
if ret:
username = ret[0].username if ret[0] else '<none>'
logger.debug(smart_text(u"User {} performed a {} to {} through the API".format(username, request.method, request.path)))
logger.info(smart_text(u"User {} performed a {} to {} through the API".format(username, request.method, request.path)))
return ret
def authenticate_header(self, request):
@@ -39,9 +39,6 @@ class SessionAuthentication(authentication.SessionAuthentication):
def authenticate_header(self, request):
return 'Session'
def enforce_csrf(self, request):
return None
class LoggedOAuth2Authentication(OAuth2Authentication):
@@ -50,8 +47,8 @@ class LoggedOAuth2Authentication(OAuth2Authentication):
if ret:
user, token = ret
username = user.username if user else '<none>'
logger.debug(smart_text(
u"User {} performed a {} to {} through the API using OAuth token {}.".format(
logger.info(smart_text(
u"User {} performed a {} to {} through the API using OAuth 2 token {}.".format(
username, request.method, request.path, token.pk
)
))

View File

@@ -4,6 +4,7 @@ from django.utils.translation import ugettext_lazy as _
# AWX
from awx.conf import fields, register
from awx.api.fields import OAuth2ProviderField
from oauth2_provider.settings import oauth2_settings
register(
@@ -36,13 +37,25 @@ register(
register(
'OAUTH2_PROVIDER',
field_class=OAuth2ProviderField,
default={'ACCESS_TOKEN_EXPIRE_SECONDS': 315360000000,
default={'ACCESS_TOKEN_EXPIRE_SECONDS': oauth2_settings.ACCESS_TOKEN_EXPIRE_SECONDS,
'AUTHORIZATION_CODE_EXPIRE_SECONDS': 600},
label=_('OAuth 2 Timeout Settings'),
help_text=_('Dictionary for customizing OAuth 2 timeouts, available items are '
'`ACCESS_TOKEN_EXPIRE_SECONDS`, the duration of access tokens in the number '
'of seconds, and `AUTHORIZATION_CODE_EXPIRE_SECONDS`, the duration of '
'authorization grants in the number of seconds.'),
'authorization codes in the number of seconds.'),
category=_('Authentication'),
category_slug='authentication',
)
register(
'ALLOW_OAUTH2_FOR_EXTERNAL_USERS',
field_class=fields.BooleanField,
default=False,
label=_('Allow External Users to Create OAuth2 Tokens'),
help_text=_('For security reasons, users from external auth providers (LDAP, SAML, '
'SSO, Radius, and others) are not allowed to create OAuth2 tokens. '
'To change this behavior, enable this setting. Existing tokens will '
'not be deleted when this setting is toggled off.'),
category=_('Authentication'),
category_slug='authentication',
)

View File

@@ -12,7 +12,11 @@ class ActiveJobConflict(ValidationError):
status_code = 409
def __init__(self, active_jobs):
super(ActiveJobConflict, self).__init__({
# During APIException.__init__(), Django Rest Framework
# turn everything in self.detail into string by using force_text.
# Declare detail afterwards circumvent this behavior.
super(ActiveJobConflict, self).__init__()
self.detail = {
"error": _("Resource is being used by running jobs."),
"active_jobs": active_jobs
})
}

View File

@@ -97,7 +97,7 @@ class DeprecatedCredentialField(serializers.IntegerField):
kwargs['allow_null'] = True
kwargs['default'] = None
kwargs['min_value'] = 1
kwargs['help_text'] = 'This resource has been deprecated and will be removed in a future release'
kwargs.setdefault('help_text', 'This resource has been deprecated and will be removed in a future release')
super(DeprecatedCredentialField, self).__init__(**kwargs)
def to_internal_value(self, pk):

View File

@@ -4,6 +4,7 @@
# Python
import re
import json
from functools import reduce
# Django
from django.core.exceptions import FieldError, ValidationError
@@ -24,7 +25,6 @@ from rest_framework.filters import BaseFilterBackend
from awx.main.utils import get_type_for_model, to_python_boolean
from awx.main.utils.db import get_all_field_names
from awx.main.models.credential import CredentialType
from awx.main.models.rbac import RoleAncestorEntry
class V1CredentialFilterBackend(BaseFilterBackend):
@@ -65,7 +65,7 @@ class TypeFilterBackend(BaseFilterBackend):
model = queryset.model
model_type = get_type_for_model(model)
if 'polymorphic_ctype' in get_all_field_names(model):
types_pks = set([v for k,v in types_map.items() if k in types])
types_pks = set([v for k, v in types_map.items() if k in types])
queryset = queryset.filter(polymorphic_ctype_id__in=types_pks)
elif model_type in types:
queryset = queryset
@@ -77,6 +77,63 @@ class TypeFilterBackend(BaseFilterBackend):
raise ParseError(*e.args)
def get_field_from_path(model, path):
'''
Given a Django ORM lookup path (possibly over multiple models)
Returns the last field in the line, and also the revised lookup path
ex., given
model=Organization
path='project__timeout'
returns tuple of field at the end of the line as well as a corrected
path, for special cases we do substitutions
(<IntegerField for timeout>, 'project__timeout')
'''
# Store of all the fields used to detect repeats
field_set = set([])
new_parts = []
for name in path.split('__'):
if model is None:
raise ParseError(_('No related model for field {}.').format(name))
# HACK: Make project and inventory source filtering by old field names work for backwards compatibility.
if model._meta.object_name in ('Project', 'InventorySource'):
name = {
'current_update': 'current_job',
'last_update': 'last_job',
'last_update_failed': 'last_job_failed',
'last_updated': 'last_job_run',
}.get(name, name)
if name == 'type' and 'polymorphic_ctype' in get_all_field_names(model):
name = 'polymorphic_ctype'
new_parts.append('polymorphic_ctype__model')
else:
new_parts.append(name)
if name in getattr(model, 'PASSWORD_FIELDS', ()):
raise PermissionDenied(_('Filtering on password fields is not allowed.'))
elif name == 'pk':
field = model._meta.pk
else:
name_alt = name.replace("_", "")
if name_alt in model._meta.fields_map.keys():
field = model._meta.fields_map[name_alt]
new_parts.pop()
new_parts.append(name_alt)
else:
field = model._meta.get_field(name)
if isinstance(field, ForeignObjectRel) and getattr(field.field, '__prevent_search__', False):
raise PermissionDenied(_('Filtering on %s is not allowed.' % name))
elif getattr(field, '__prevent_search__', False):
raise PermissionDenied(_('Filtering on %s is not allowed.' % name))
if field in field_set:
# Field traversed twice, could create infinite JOINs, DoSing Tower
raise ParseError(_('Loops not allowed in filters, detected on field {}.').format(field.name))
field_set.add(field)
model = getattr(field, 'related_model', None)
return field, '__'.join(new_parts)
class FieldLookupBackend(BaseFilterBackend):
'''
Filter using field lookups provided via query string parameters.
@@ -91,61 +148,23 @@ class FieldLookupBackend(BaseFilterBackend):
'isnull', 'search')
def get_field_from_lookup(self, model, lookup):
field = None
parts = lookup.split('__')
if parts and parts[-1] not in self.SUPPORTED_LOOKUPS:
parts.append('exact')
if '__' in lookup and lookup.rsplit('__', 1)[-1] in self.SUPPORTED_LOOKUPS:
path, suffix = lookup.rsplit('__', 1)
else:
path = lookup
suffix = 'exact'
if not path:
raise ParseError(_('Query string field name not provided.'))
# FIXME: Could build up a list of models used across relationships, use
# those lookups combined with request.user.get_queryset(Model) to make
# sure user cannot query using objects he could not view.
new_parts = []
field, new_path = get_field_from_path(model, path)
# Store of all the fields used to detect repeats
field_set = set([])
for name in parts[:-1]:
# HACK: Make project and inventory source filtering by old field names work for backwards compatibility.
if model._meta.object_name in ('Project', 'InventorySource'):
name = {
'current_update': 'current_job',
'last_update': 'last_job',
'last_update_failed': 'last_job_failed',
'last_updated': 'last_job_run',
}.get(name, name)
if name == 'type' and 'polymorphic_ctype' in get_all_field_names(model):
name = 'polymorphic_ctype'
new_parts.append('polymorphic_ctype__model')
else:
new_parts.append(name)
if name in getattr(model, 'PASSWORD_FIELDS', ()):
raise PermissionDenied(_('Filtering on password fields is not allowed.'))
elif name == 'pk':
field = model._meta.pk
else:
name_alt = name.replace("_", "")
if name_alt in model._meta.fields_map.keys():
field = model._meta.fields_map[name_alt]
new_parts.pop()
new_parts.append(name_alt)
else:
field = model._meta.get_field(name)
if 'auth' in name or 'token' in name:
raise PermissionDenied(_('Filtering on %s is not allowed.' % name))
if isinstance(field, ForeignObjectRel) and getattr(field.field, '__prevent_search__', False):
raise PermissionDenied(_('Filtering on %s is not allowed.' % name))
elif getattr(field, '__prevent_search__', False):
raise PermissionDenied(_('Filtering on %s is not allowed.' % name))
if field in field_set:
# Field traversed twice, could create infinite JOINs, DoSing Tower
raise ParseError(_('Loops not allowed in filters, detected on field {}.').format(field.name))
field_set.add(field)
model = getattr(field, 'related_model', None) or field.model
if parts:
new_parts.append(parts[-1])
new_lookup = '__'.join(new_parts)
new_lookup = new_path
new_lookup = '__'.join([new_path, suffix])
return field, new_lookup
def to_python_related(self, value):
@@ -173,7 +192,7 @@ class FieldLookupBackend(BaseFilterBackend):
def value_to_python(self, model, lookup, value):
try:
lookup = lookup.encode("ascii")
lookup.encode("ascii")
except UnicodeEncodeError:
raise ValueError("%r is not an allowed field name. Must be ascii encodable." % lookup)
@@ -219,7 +238,11 @@ class FieldLookupBackend(BaseFilterBackend):
or_filters = []
chain_filters = []
role_filters = []
search_filters = []
search_filters = {}
# Can only have two values: 'AND', 'OR'
# If 'AND' is used, an iterm must satisfy all condition to show up in the results.
# If 'OR' is used, an item just need to satisfy one condition to appear in results.
search_filter_relation = 'OR'
for key, values in request.query_params.lists():
if key in self.RESERVED_NAMES:
continue
@@ -243,11 +266,13 @@ class FieldLookupBackend(BaseFilterBackend):
# Search across related objects.
if key.endswith('__search'):
if values and ',' in values[0]:
search_filter_relation = 'AND'
values = reduce(lambda list1, list2: list1 + list2, [i.split(',') for i in values])
for value in values:
search_value, new_keys = self.value_to_python(queryset.model, key, force_text(value))
assert isinstance(new_keys, list)
for new_key in new_keys:
search_filters.append((new_key, search_value))
search_filters[search_value] = new_keys
continue
# Custom chain__ and or__ filters, mutually exclusive (both can
@@ -321,12 +346,12 @@ class FieldLookupBackend(BaseFilterBackend):
else:
args.append(Q(**{k:v}))
for role_name in role_filters:
if not hasattr(queryset.model, 'accessible_pk_qs'):
raise ParseError(_(
'Cannot apply role_level filter to this list because its model '
'does not use roles for access control.'))
args.append(
Q(pk__in=RoleAncestorEntry.objects.filter(
ancestor__in=request.user.roles.all(),
content_type_id=ContentType.objects.get_for_model(queryset.model).id,
role_field=role_name
).values_list('object_id').distinct())
Q(pk__in=queryset.model.accessible_pk_qs(request.user, role_name))
)
if or_filters:
q = Q()
@@ -336,11 +361,18 @@ class FieldLookupBackend(BaseFilterBackend):
else:
q |= Q(**{k:v})
args.append(q)
if search_filters:
if search_filters and search_filter_relation == 'OR':
q = Q()
for k,v in search_filters:
q |= Q(**{k:v})
for term, constrains in search_filters.items():
for constrain in constrains:
q |= Q(**{constrain: term})
args.append(q)
elif search_filters and search_filter_relation == 'AND':
for term, constrains in search_filters.items():
q_chain = Q()
for constrain in constrains:
q_chain |= Q(**{constrain: term})
queryset = queryset.filter(q_chain)
for n,k,v in chain_filters:
if n:
q = ~Q(**{k:v})
@@ -371,7 +403,7 @@ class OrderByBackend(BaseFilterBackend):
else:
order_by = (value,)
if order_by:
order_by = self._strip_sensitive_model_fields(queryset.model, order_by)
order_by = self._validate_ordering_fields(queryset.model, order_by)
# Special handling of the type field for ordering. In this
# case, we're not sorting exactly on the type field, but
@@ -396,15 +428,17 @@ class OrderByBackend(BaseFilterBackend):
# Return a 400 for invalid field names.
raise ParseError(*e.args)
def _strip_sensitive_model_fields(self, model, order_by):
def _validate_ordering_fields(self, model, order_by):
for field_name in order_by:
# strip off the negation prefix `-` if it exists
_field_name = field_name.split('-')[-1]
prefix = ''
path = field_name
if field_name[0] == '-':
prefix = field_name[0]
path = field_name[1:]
try:
# if the field name is encrypted/sensitive, don't sort on it
if _field_name in getattr(model, 'PASSWORD_FIELDS', ()) or \
getattr(model._meta.get_field(_field_name), '__prevent_search__', False):
raise ParseError(_('cannot order by field %s') % _field_name)
except FieldDoesNotExist:
pass
yield field_name
field, new_path = get_field_from_path(model, path)
new_path = '{}{}'.format(prefix, new_path)
except (FieldError, FieldDoesNotExist) as e:
raise ParseError(e.args[0])
yield new_path

View File

@@ -5,7 +5,7 @@
import inspect
import logging
import time
import six
import urllib.parse
# Django
from django.conf import settings
@@ -22,16 +22,14 @@ from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import views as auth_views
# Django REST Framework
from rest_framework.authentication import get_authorization_header
from rest_framework.exceptions import PermissionDenied, AuthenticationFailed, ParseError
from rest_framework.exceptions import PermissionDenied, AuthenticationFailed, ParseError, NotAcceptable, UnsupportedMediaType
from rest_framework import generics
from rest_framework.response import Response
from rest_framework import status
from rest_framework import views
from rest_framework.permissions import AllowAny
# cryptography
from cryptography.fernet import InvalidToken
from rest_framework.renderers import StaticHTMLRenderer, JSONRenderer
from rest_framework.negotiation import DefaultContentNegotiation
# AWX
from awx.api.filters import FieldLookupBackend
@@ -39,7 +37,7 @@ from awx.main.models import * # noqa
from awx.main.access import access_registry
from awx.main.utils import * # noqa
from awx.main.utils.db import get_all_field_names
from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer
from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer, UserSerializer
from awx.api.versioning import URLPathVersioning, get_request_version
from awx.api.metadata import SublistAttachDetatchMetadata, Metadata
@@ -54,7 +52,7 @@ __all__ = ['APIView', 'GenericAPIView', 'ListAPIView', 'SimpleListAPIView',
'ParentMixin',
'DeleteLastUnattachLabelMixin',
'SubListAttachDetachAPIView',
'CopyAPIView']
'CopyAPIView', 'BaseUsersList',]
logger = logging.getLogger('awx.api.generics')
analytics_logger = logging.getLogger('awx.analytics.performance')
@@ -62,14 +60,36 @@ analytics_logger = logging.getLogger('awx.analytics.performance')
class LoggedLoginView(auth_views.LoginView):
def get(self, request, *args, **kwargs):
# The django.auth.contrib login form doesn't perform the content
# negotiation we've come to expect from DRF; add in code to catch
# situations where Accept != text/html (or */*) and reply with
# an HTTP 406
try:
DefaultContentNegotiation().select_renderer(
request,
[StaticHTMLRenderer],
'html'
)
except NotAcceptable:
resp = Response(status=status.HTTP_406_NOT_ACCEPTABLE)
resp.accepted_renderer = StaticHTMLRenderer()
resp.accepted_media_type = 'text/plain'
resp.renderer_context = {}
return resp
return super(LoggedLoginView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
original_user = getattr(request, 'user', None)
ret = super(LoggedLoginView, self).post(request, *args, **kwargs)
current_user = getattr(request, 'user', None)
if current_user and getattr(current_user, 'pk', None) and current_user != original_user:
logger.info("User {} logged in.".format(current_user.username))
if request.user.is_authenticated:
logger.info(smart_text(u"User {} logged in.".format(self.request.user.username)))
ret.set_cookie('userLoggedIn', 'true')
current_user = UserSerializer(self.request.user)
current_user = smart_text(JSONRenderer().render(current_user.data))
current_user = urllib.parse.quote('%s' % current_user, '')
ret.set_cookie('current_user', current_user, secure=settings.SESSION_COOKIE_SECURE or None)
return ret
else:
ret.status_code = 401
@@ -82,6 +102,7 @@ class LoggedLogoutView(auth_views.LogoutView):
original_user = getattr(request, 'user', None)
ret = super(LoggedLogoutView, self).dispatch(request, *args, **kwargs)
current_user = getattr(request, 'user', None)
ret.set_cookie('userLoggedIn', 'false')
if (not current_user or not getattr(current_user, 'pk', True)) \
and current_user != original_user:
logger.info("User {} logged out.".format(original_user.username))
@@ -165,9 +186,13 @@ class APIView(views.APIView):
request.drf_request_user = getattr(drf_request, 'user', False)
except AuthenticationFailed:
request.drf_request_user = None
except ParseError as exc:
except (PermissionDenied, ParseError) as exc:
request.drf_request_user = None
self.__init_request_error__ = exc
except UnsupportedMediaType as exc:
exc.detail = _('You did not use correct Content-Type in your HTTP request. '
'If you are using our REST API, the Content-Type must be application/json')
self.__init_request_error__ = exc
return drf_request
def finalize_response(self, request, response, *args, **kwargs):
@@ -180,6 +205,7 @@ class APIView(views.APIView):
if hasattr(self, '__init_request_error__'):
response = self.handle_exception(self.__init_request_error__)
if response.status_code == 401:
response.data['detail'] += ' To establish a login session, visit /api/login/.'
logger.info(status_msg)
else:
logger.warn(status_msg)
@@ -198,26 +224,35 @@ class APIView(views.APIView):
return response
def get_authenticate_header(self, request):
"""
Determine the WWW-Authenticate header to use for 401 responses. Try to
use the request header as an indication for which authentication method
was attempted.
"""
for authenticator in self.get_authenticators():
resp_hdr = authenticator.authenticate_header(request)
if not resp_hdr:
continue
req_hdr = get_authorization_header(request)
if not req_hdr:
continue
if resp_hdr.split()[0] and resp_hdr.split()[0] == req_hdr.split()[0]:
return resp_hdr
# If it can't be determined from the request, use the last
# authenticator (should be Basic).
try:
return authenticator.authenticate_header(request)
except NameError:
pass
# HTTP Basic auth is insecure by default, because the basic auth
# backend does not provide CSRF protection.
#
# If you visit `/api/v2/job_templates/` and we return
# `WWW-Authenticate: Basic ...`, your browser will prompt you for an
# HTTP basic auth username+password and will store it _in the browser_
# for subsequent requests. Because basic auth does not require CSRF
# validation (because it's commonly used with e.g., tower-cli and other
# non-browser clients), browsers that save basic auth in this way are
# vulnerable to cross-site request forgery:
#
# 1. Visit `/api/v2/job_templates/` and specify a user+pass for basic auth.
# 2. Visit a nefarious website and submit a
# `<form action='POST' method='https://tower.example.org/api/v2/job_templates/N/launch/'>`
# 3. The browser will use your persisted user+pass and your login
# session is effectively hijacked.
#
# To prevent this, we will _no longer_ send `WWW-Authenticate: Basic ...`
# headers in responses; this means that unauthenticated /api/v2/... requests
# will now return HTTP 401 in-browser, rather than popping up an auth dialog.
#
# This means that people who wish to use the interactive API browser
# must _first_ login in via `/api/login/` to establish a session (which
# _does_ enforce CSRF).
#
# CLI users can _still_ specify basic auth credentials explicitly via
# a header or in the URL e.g.,
# `curl https://user:pass@tower.example.org/api/v2/job_templates/N/launch/`
return 'Bearer realm=api authorization_url=/api/o/authorize/'
def get_view_description(self, html=False):
"""
@@ -266,7 +301,7 @@ class APIView(views.APIView):
# submitted data was rejected.
request_method = getattr(self, '_raw_data_request_method', None)
response_status = getattr(self, '_raw_data_response_status', 0)
if request_method in ('POST', 'PUT', 'PATCH') and response_status in xrange(400, 500):
if request_method in ('POST', 'PUT', 'PATCH') and response_status in range(400, 500):
return self.request.data.copy()
return data
@@ -288,6 +323,12 @@ class APIView(views.APIView):
kwargs.pop('version')
return super(APIView, self).dispatch(request, *args, **kwargs)
def check_permissions(self, request):
if request.method not in ('GET', 'OPTIONS', 'HEAD'):
if 'write' not in getattr(request.user, 'oauth_scopes', ['write']):
raise PermissionDenied()
return super(APIView, self).check_permissions(request)
class GenericAPIView(generics.GenericAPIView, APIView):
# Base class for all model-based views.
@@ -303,7 +344,7 @@ class GenericAPIView(generics.GenericAPIView, APIView):
# form.
if hasattr(self, '_raw_data_form_marker'):
# Always remove read only fields from serializer.
for name, field in serializer.fields.items():
for name, field in list(serializer.fields.items()):
if getattr(field, 'read_only', None):
del serializer.fields[name]
serializer._data = self.update_raw_data(serializer.data)
@@ -345,7 +386,6 @@ class GenericAPIView(generics.GenericAPIView, APIView):
]:
d[key] = self.metadata_class().get_serializer_info(serializer, method=method)
d['settings'] = settings
d['has_named_url'] = self.model in settings.NAMED_URL_GRAPH
return d
@@ -508,9 +548,8 @@ class SubListDestroyAPIView(DestroyAPIView, SubListAPIView):
def perform_list_destroy(self, instance_list):
if self.check_sub_obj_permission:
# Check permissions for all before deleting, avoiding half-deleted lists
for instance in instance_list:
if self.has_delete_permission(instance):
if not self.has_delete_permission(instance):
raise PermissionDenied()
for instance in instance_list:
self.perform_destroy(instance, check_permission=False)
@@ -705,7 +744,7 @@ class SubListAttachDetachAPIView(SubListCreateAttachDetachAPIView):
def update_raw_data(self, data):
request_method = getattr(self, '_raw_data_request_method', None)
response_status = getattr(self, '_raw_data_response_status', 0)
if request_method == 'POST' and response_status in xrange(400, 500):
if request_method == 'POST' and response_status in range(400, 500):
return super(SubListAttachDetachAPIView, self).update_raw_data(data)
return {'id': None}
@@ -716,6 +755,7 @@ class DeleteLastUnattachLabelMixin(object):
when the last disassociate is called should inherit from this class. Further,
the model should implement is_detached()
'''
def unattach(self, request, *args, **kwargs):
(sub_id, res) = super(DeleteLastUnattachLabelMixin, self).unattach_validate(request)
if res:
@@ -791,6 +831,10 @@ class CopyAPIView(GenericAPIView):
new_in_330 = True
new_in_api_v2 = True
def v1_not_allowed(self):
return Response({'detail': 'Action only possible starting with v2 API.'},
status=status.HTTP_404_NOT_FOUND)
def _get_copy_return_serializer(self, *args, **kwargs):
if not self.copy_return_serializer_class:
return self.get_serializer(*args, **kwargs)
@@ -806,15 +850,18 @@ class CopyAPIView(GenericAPIView):
return field_val
if isinstance(field_val, dict):
for sub_field in field_val:
if isinstance(sub_field, six.string_types) \
and isinstance(field_val[sub_field], six.string_types):
if isinstance(sub_field, str) \
and isinstance(field_val[sub_field], str):
try:
field_val[sub_field] = decrypt_field(obj, field_name, sub_field)
except InvalidToken:
except AttributeError:
# Catching the corner case with v1 credential fields
field_val[sub_field] = decrypt_field(obj, sub_field)
elif isinstance(field_val, six.string_types):
field_val = decrypt_field(obj, field_name)
elif isinstance(field_val, str):
try:
field_val = decrypt_field(obj, field_name)
except AttributeError:
return field_val
return field_val
def _build_create_dict(self, obj):
@@ -868,13 +915,18 @@ class CopyAPIView(GenericAPIView):
obj, field.name, field_val
)
new_obj = model.objects.create(**create_kwargs)
logger.debug('Deep copy: Created new object {}({})'.format(
new_obj, model
))
# Need to save separatedly because Djang-crum get_current_user would
# not work properly in non-request-response-cycle context.
new_obj.created_by = creater
new_obj.save()
for m2m in m2m_to_preserve:
for related_obj in m2m_to_preserve[m2m].all():
getattr(new_obj, m2m).add(related_obj)
from awx.main.signals import disable_activity_stream
with disable_activity_stream():
for m2m in m2m_to_preserve:
for related_obj in m2m_to_preserve[m2m].all():
getattr(new_obj, m2m).add(related_obj)
if not old_parent:
sub_objects = []
for o2m in o2m_to_preserve:
@@ -889,13 +941,21 @@ class CopyAPIView(GenericAPIView):
return ret
def get(self, request, *args, **kwargs):
if get_request_version(request) < 2:
return self.v1_not_allowed()
obj = self.get_object()
if not request.user.can_access(obj.__class__, 'read', obj):
raise PermissionDenied()
create_kwargs = self._build_create_dict(obj)
for key in create_kwargs:
create_kwargs[key] = getattr(create_kwargs[key], 'pk', None) or create_kwargs[key]
return Response({'can_copy': request.user.can_access(self.model, 'add', create_kwargs)})
can_copy = request.user.can_access(self.model, 'add', create_kwargs) and \
request.user.can_access(self.model, 'copy_related', obj)
return Response({'can_copy': can_copy})
def post(self, request, *args, **kwargs):
if get_request_version(request) < 2:
return self.v1_not_allowed()
obj = self.get_object()
create_kwargs = self._build_create_dict(obj)
create_kwargs_check = {}
@@ -903,6 +963,8 @@ class CopyAPIView(GenericAPIView):
create_kwargs_check[key] = getattr(create_kwargs[key], 'pk', None) or create_kwargs[key]
if not request.user.can_access(self.model, 'add', create_kwargs_check):
raise PermissionDenied()
if not request.user.can_access(self.model, 'copy_related', obj):
raise PermissionDenied()
serializer = self.get_serializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@@ -924,4 +986,24 @@ class CopyAPIView(GenericAPIView):
permission_check_func=permission_check_func
)
serializer = self._get_copy_return_serializer(new_obj)
return Response(serializer.data, status=status.HTTP_201_CREATED)
headers = {'Location': new_obj.get_absolute_url(request=request)}
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
class BaseUsersList(SubListCreateAttachDetachAPIView):
def post(self, request, *args, **kwargs):
ret = super(BaseUsersList, self).post( request, *args, **kwargs)
if ret.status_code != 201:
return ret
try:
if ret.data is not None and request.data.get('is_system_auditor', False):
# This is a faux-field that just maps to checking the system
# auditor role member list.. unfortunately this means we can't
# set it on creation, and thus needs to be set here.
user = User.objects.get(id=ret.data['id'])
user.is_system_auditor = request.data['is_system_auditor']
ret.data['is_system_auditor'] = request.data['is_system_auditor']
except AttributeError as exc:
print(exc)
pass
return ret

View File

@@ -62,14 +62,15 @@ class Metadata(metadata.SimpleMetadata):
opts = serializer.Meta.model._meta.concrete_model._meta
verbose_name = smart_text(opts.verbose_name)
field_info['help_text'] = field_help_text[field.field_name].format(verbose_name)
# If field is not part of the model, then show it as non-filterable
if field.field_name == 'type':
field_info['filterable'] = True
else:
is_model_field = False
for model_field in serializer.Meta.model._meta.fields:
if field.field_name == model_field.name:
is_model_field = True
field_info['filterable'] = True
break
if not is_model_field:
else:
field_info['filterable'] = False
# Indicate if a field has a default value.
@@ -156,7 +157,7 @@ class Metadata(metadata.SimpleMetadata):
finally:
view.request = request
for field, meta in actions[method].items():
for field, meta in list(actions[method].items()):
if not isinstance(meta, dict):
continue
@@ -233,17 +234,17 @@ class RoleMetadata(Metadata):
# TODO: Tower 3.3 remove class and all uses in views.py when API v1 is removed
class JobTypeMetadata(Metadata):
def get_field_info(self, field):
res = super(JobTypeMetadata, self).get_field_info(field)
def get_field_info(self, field):
res = super(JobTypeMetadata, self).get_field_info(field)
if field.field_name == 'job_type':
index = 0
for choice in res['choices']:
if choice[0] == 'scan':
res['choices'].pop(index)
break
index += 1
return res
if field.field_name == 'job_type':
index = 0
for choice in res['choices']:
if choice[0] == 'scan':
res['choices'].pop(index)
break
index += 1
return res
class SublistAttachDetatchMetadata(Metadata):

View File

@@ -4,7 +4,7 @@ import json
# Django
from django.conf import settings
from django.utils import six
from django.utils.encoding import smart_str
from django.utils.translation import ugettext_lazy as _
# Django REST Framework
@@ -25,7 +25,7 @@ class JSONParser(parsers.JSONParser):
encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
try:
data = stream.read().decode(encoding)
data = smart_str(stream.read(), encoding=encoding)
if not data:
return {}
obj = json.loads(data, object_pairs_hook=OrderedDict)
@@ -33,4 +33,4 @@ class JSONParser(parsers.JSONParser):
raise ParseError(_('JSON parse error - not a JSON object'))
return obj
except ValueError as exc:
raise ParseError(_('JSON parse error - %s\nPossible cause: trailing comma.' % six.text_type(exc)))
raise ParseError(_('JSON parse error - %s\nPossible cause: trailing comma.' % str(exc)))

View File

@@ -1,12 +1,12 @@
# Copyright (c) 2015 Ansible, Inc.
# All Rights Reserved.
from django.utils.safestring import SafeText
# Django REST Framework
from rest_framework import renderers
from rest_framework.request import override_method
import six
class BrowsableAPIRenderer(renderers.BrowsableAPIRenderer):
'''
@@ -20,6 +20,19 @@ class BrowsableAPIRenderer(renderers.BrowsableAPIRenderer):
return renderers.JSONRenderer()
return renderer
def get_content(self, renderer, data, accepted_media_type, renderer_context):
if isinstance(data, SafeText):
# Older versions of Django (pre-2.0) have a py3 bug which causes
# bytestrings marked as "safe" to not actually get _treated_ as
# safe; this causes certain embedded strings (like the stdout HTML
# view) to be improperly escaped
# see: https://github.com/ansible/awx/issues/3108
# https://code.djangoproject.com/ticket/28121
return data
return super(BrowsableAPIRenderer, self).get_content(renderer, data,
accepted_media_type,
renderer_context)
def get_context(self, data, accepted_media_type, renderer_context):
# Store the associated response status to know how to populate the raw
# data form.
@@ -71,8 +84,8 @@ class PlainTextRenderer(renderers.BaseRenderer):
format = 'txt'
def render(self, data, media_type=None, renderer_context=None):
if not isinstance(data, six.string_types):
data = six.text_type(data)
if not isinstance(data, str):
data = str(data)
return data.encode(self.charset)

File diff suppressed because it is too large Load Diff

View File

@@ -54,8 +54,6 @@ within all designated text fields of a model.
?search=findme
_Added in AWX 1.4_
(_Added in Ansible Tower 3.1.0_) Search across related fields:
?related__search=findme
@@ -84,7 +82,7 @@ To exclude results matching certain criteria, prefix the field parameter with
?not__field=value
(_Added in AWX 1.4_) By default, all query string filters are AND'ed together, so
By default, all query string filters are AND'ed together, so
only the results matching *all* filters will be returned. To combine results
matching *any* one of multiple criteria, prefix each query string parameter
with `or__`:

View File

@@ -10,7 +10,7 @@ object containing groups, including the hosts, children and variables for each
group. The response data is equivalent to that returned by passing the
`--list` argument to an inventory script.
_(Added in AWX 1.3)_ Specify a query string of `?hostvars=1` to retrieve the JSON
Specify a query string of `?hostvars=1` to retrieve the JSON
object above including all host variables. The `['_meta']['hostvars']` object
in the response contains an entry for each host with its variables. This
response format can be used with Ansible 1.3 and later to avoid making a
@@ -18,11 +18,19 @@ separate API request for each host. Refer to
[Tuning the External Inventory Script](http://docs.ansible.com/developing_inventory.html#tuning-the-external-inventory-script)
for more information on this feature.
_(Added in AWX 1.4)_ By default, the inventory script will only return hosts that
By default, the inventory script will only return hosts that
are enabled in the inventory. This feature allows disabled hosts to be skipped
when running jobs without removing them from the inventory. Specify a query
string of `?all=1` to return all hosts, including disabled ones.
Specify a query string of `?towervars=1` to add variables
to the hostvars of each host that specifies its enabled state and database ID.
Specify a query string of `?subset=slice2of5` to produce an inventory that
has a restricted number of hosts according to the rules of job slicing.
To apply multiple query strings, join them with the `&` character, like `?hostvars=1&all=1`.
## Host Response
Make a GET request to this resource with a query string similar to

View File

@@ -48,7 +48,7 @@ Here is a more comprehensive example showing the various question types and thei
"min": 5,
"max": "",
"required": false,
"default": "yes"
"default": "Leeloo Minai Lekarariba-Laminai-Tchai Ekbat De Sebat"
},
{
"type": "text",
@@ -57,9 +57,9 @@ Here is a more comprehensive example showing the various question types and thei
"variable": "short_answer",
"choices": "",
"min": "",
"max": 5,
"max": 7,
"required": false,
"default": "yes"
"default": "leeloo"
},
{
"type": "text",
@@ -70,7 +70,7 @@ Here is a more comprehensive example showing the various question types and thei
"min": "",
"max": "",
"required": true,
"default": "yes"
"default": "NOT OPTIONAL"
},
{
"type": "multiplechoice",
@@ -81,7 +81,7 @@ Here is a more comprehensive example showing the various question types and thei
"min": "",
"max": "",
"required": false,
"default": "yes"
"default": "one"
},
{
"type": "multiselect",
@@ -92,7 +92,7 @@ Here is a more comprehensive example showing the various question types and thei
"min": "",
"max": "",
"required": false,
"default": "yes"
"default": "one\nthree"
},
{
"type": "integer",

View File

@@ -1,7 +1,3 @@
{% if has_named_url %}
### Note: starting from api v2, this resource object can be accessed via its named URL.
{% endif %}
# Retrieve {{ model_verbose_name|title|anora }}:
Make GET request to this resource to retrieve a single {{ model_verbose_name }}

View File

@@ -1,7 +1,3 @@
{% if has_named_url %}
### Note: starting from api v2, this resource object can be accessed via its named URL.
{% endif %}
{% ifmeth GET %}
# Retrieve {{ model_verbose_name|title|anora }}:

View File

@@ -1,7 +1,3 @@
{% if has_named_url %}
### Note: starting from api v2, this resource object can be accessed via its named URL.
{% endif %}
{% ifmeth GET %}
# Retrieve {{ model_verbose_name|title|anora }}:

View File

@@ -1,7 +1,3 @@
{% if has_named_url %}
### Note: starting from api v2, this resource object can be accessed via its named URL.
{% endif %}
{% ifmeth GET %}
# Retrieve {{ model_verbose_name|title|anora }}:

View File

@@ -8,6 +8,7 @@ from awx.api.views import (
JobTemplateDetail,
JobTemplateLaunch,
JobTemplateJobsList,
JobTemplateSliceWorkflowJobsList,
JobTemplateCallback,
JobTemplateSchedulesList,
JobTemplateSurveySpec,
@@ -28,6 +29,7 @@ urls = [
url(r'^(?P<pk>[0-9]+)/$', JobTemplateDetail.as_view(), name='job_template_detail'),
url(r'^(?P<pk>[0-9]+)/launch/$', JobTemplateLaunch.as_view(), name='job_template_launch'),
url(r'^(?P<pk>[0-9]+)/jobs/$', JobTemplateJobsList.as_view(), name='job_template_jobs_list'),
url(r'^(?P<pk>[0-9]+)/slice_workflow_jobs/$', JobTemplateSliceWorkflowJobsList.as_view(), name='job_template_slice_workflow_jobs_list'),
url(r'^(?P<pk>[0-9]+)/callback/$', JobTemplateCallback.as_view(), name='job_template_callback'),
url(r'^(?P<pk>[0-9]+)/schedules/$', JobTemplateSchedulesList.as_view(), name='job_template_schedules_list'),
url(r'^(?P<pk>[0-9]+)/survey_spec/$', JobTemplateSurveySpec.as_view(), name='job_template_survey_spec'),

View File

@@ -1,18 +0,0 @@
# Copyright (c) 2017 Ansible, Inc.
# All Rights Reserved.
from django.conf.urls import url
from oauth2_provider.urls import base_urlpatterns
from awx.api.views import (
ApiOAuthAuthorizationRootView,
)
urls = [
url(r'^$', ApiOAuthAuthorizationRootView.as_view(), name='oauth_authorization_root_view'),
] + base_urlpatterns
__all__ = ['urls']

View File

@@ -11,7 +11,6 @@ from awx.api.views import (
OAuth2TokenList,
OAuth2TokenDetail,
OAuth2TokenActivityStreamList,
OAuth2PersonalTokenList
)
@@ -42,8 +41,7 @@ urls = [
r'^tokens/(?P<pk>[0-9]+)/activity_stream/$',
OAuth2TokenActivityStreamList.as_view(),
name='o_auth2_token_activity_stream_list'
),
url(r'^personal_tokens/$', OAuth2PersonalTokenList.as_view(), name='o_auth2_personal_token_list'),
),
]
__all__ = ['urls']

View File

@@ -0,0 +1,31 @@
# Copyright (c) 2017 Ansible, Inc.
# All Rights Reserved.
from django.conf.urls import url
from oauthlib import oauth2
from oauth2_provider import views
from awx.api.views import (
ApiOAuthAuthorizationRootView,
)
class TokenView(views.TokenView):
def create_token_response(self, request):
try:
return super(TokenView, self).create_token_response(request)
except oauth2.AccessDeniedError as e:
return request.build_absolute_uri(), {}, str(e), '403'
urls = [
url(r'^$', ApiOAuthAuthorizationRootView.as_view(), name='oauth_authorization_root_view'),
url(r"^authorize/$", views.AuthorizationView.as_view(), name="authorize"),
url(r"^token/$", TokenView.as_view(), name="token"),
url(r"^revoke_token/$", views.RevokeTokenView.as_view(), name="revoke-token"),
]
__all__ = ['urls']

View File

@@ -67,8 +67,8 @@ from .schedule import urls as schedule_urls
from .activity_stream import urls as activity_stream_urls
from .instance import urls as instance_urls
from .instance_group import urls as instance_group_urls
from .user_oauth import urls as user_oauth_urls
from .oauth import urls as oauth_urls
from .oauth2 import urls as oauth2_urls
from .oauth2_root import urls as oauth2_root_urls
v1_urls = [
@@ -130,7 +130,7 @@ v2_urls = [
url(r'^applications/(?P<pk>[0-9]+)/$', OAuth2ApplicationDetail.as_view(), name='o_auth2_application_detail'),
url(r'^applications/(?P<pk>[0-9]+)/tokens/$', ApplicationOAuth2TokenList.as_view(), name='application_o_auth2_token_list'),
url(r'^tokens/$', OAuth2TokenList.as_view(), name='o_auth2_token_list'),
url(r'^', include(user_oauth_urls)),
url(r'^', include(oauth2_urls)),
]
app_name = 'api'
@@ -145,7 +145,7 @@ urlpatterns = [
url(r'^logout/$', LoggedLogoutView.as_view(
next_page='/api/', redirect_field_name='next'
), name='logout'),
url(r'^o/', include(oauth_urls)),
url(r'^o/', include(oauth2_root_urls)),
]
if settings.SETTINGS_MODULE == 'awx.settings.development':
from awx.api.swagger import SwaggerSchemaView

View File

@@ -15,8 +15,8 @@ from awx.api.views import (
UserActivityStreamList,
UserAccessList,
OAuth2ApplicationList,
OAuth2TokenList,
OAuth2PersonalTokenList,
OAuth2UserTokenList,
UserPersonalTokenList,
UserAuthorizedTokenList,
)
@@ -32,9 +32,9 @@ urls = [
url(r'^(?P<pk>[0-9]+)/activity_stream/$', UserActivityStreamList.as_view(), name='user_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/access_list/$', UserAccessList.as_view(), name='user_access_list'),
url(r'^(?P<pk>[0-9]+)/applications/$', OAuth2ApplicationList.as_view(), name='o_auth2_application_list'),
url(r'^(?P<pk>[0-9]+)/tokens/$', OAuth2TokenList.as_view(), name='o_auth2_token_list'),
url(r'^(?P<pk>[0-9]+)/tokens/$', OAuth2UserTokenList.as_view(), name='o_auth2_token_list'),
url(r'^(?P<pk>[0-9]+)/authorized_tokens/$', UserAuthorizedTokenList.as_view(), name='user_authorized_token_list'),
url(r'^(?P<pk>[0-9]+)/personal_tokens/$', OAuth2PersonalTokenList.as_view(), name='o_auth2_personal_token_list'),
url(r'^(?P<pk>[0-9]+)/personal_tokens/$', UserPersonalTokenList.as_view(), name='user_personal_token_list'),
]

File diff suppressed because it is too large Load Diff

211
awx/api/views/inventory.py Normal file
View File

@@ -0,0 +1,211 @@
# Copyright (c) 2018 Red Hat, Inc.
# All Rights Reserved.
# Python
import logging
# Django
from django.conf import settings
from django.db.models import Q
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
# Django REST Framework
from rest_framework.exceptions import PermissionDenied
from rest_framework.response import Response
from rest_framework import status
# AWX
from awx.main.models import (
ActivityStream,
Inventory,
JobTemplate,
Role,
User,
InstanceGroup,
InventoryUpdateEvent,
InventoryUpdate,
InventorySource,
CustomInventoryScript,
)
from awx.api.generics import (
ListCreateAPIView,
RetrieveUpdateDestroyAPIView,
SubListAPIView,
SubListAttachDetachAPIView,
ResourceAccessList,
CopyAPIView,
)
from awx.api.serializers import (
InventorySerializer,
ActivityStreamSerializer,
RoleSerializer,
InstanceGroupSerializer,
InventoryUpdateEventSerializer,
CustomInventoryScriptSerializer,
InventoryDetailSerializer,
JobTemplateSerializer,
)
from awx.api.views.mixin import (
ActivityStreamEnforcementMixin,
RelatedJobsPreventDeleteMixin,
ControlledByScmMixin,
)
logger = logging.getLogger('awx.api.views.organization')
class InventoryUpdateEventsList(SubListAPIView):
model = InventoryUpdateEvent
serializer_class = InventoryUpdateEventSerializer
parent_model = InventoryUpdate
relationship = 'inventory_update_events'
view_name = _('Inventory Update Events List')
search_fields = ('stdout',)
def finalize_response(self, request, response, *args, **kwargs):
response['X-UI-Max-Events'] = settings.MAX_UI_JOB_EVENTS
return super(InventoryUpdateEventsList, self).finalize_response(request, response, *args, **kwargs)
class InventoryScriptList(ListCreateAPIView):
model = CustomInventoryScript
serializer_class = CustomInventoryScriptSerializer
class InventoryScriptDetail(RetrieveUpdateDestroyAPIView):
model = CustomInventoryScript
serializer_class = CustomInventoryScriptSerializer
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
can_delete = request.user.can_access(self.model, 'delete', instance)
if not can_delete:
raise PermissionDenied(_("Cannot delete inventory script."))
for inv_src in InventorySource.objects.filter(source_script=instance):
inv_src.source_script = None
inv_src.save()
return super(InventoryScriptDetail, self).destroy(request, *args, **kwargs)
class InventoryScriptObjectRolesList(SubListAPIView):
model = Role
serializer_class = RoleSerializer
parent_model = CustomInventoryScript
search_fields = ('role_field', 'content_type__model',)
def get_queryset(self):
po = self.get_parent_object()
content_type = ContentType.objects.get_for_model(self.parent_model)
return Role.objects.filter(content_type=content_type, object_id=po.pk)
class InventoryScriptCopy(CopyAPIView):
model = CustomInventoryScript
copy_return_serializer_class = CustomInventoryScriptSerializer
class InventoryList(ListCreateAPIView):
model = Inventory
serializer_class = InventorySerializer
def get_queryset(self):
qs = Inventory.accessible_objects(self.request.user, 'read_role')
qs = qs.select_related('admin_role', 'read_role', 'update_role', 'use_role', 'adhoc_role')
qs = qs.prefetch_related('created_by', 'modified_by', 'organization')
return qs
class InventoryDetail(RelatedJobsPreventDeleteMixin, ControlledByScmMixin, RetrieveUpdateDestroyAPIView):
model = Inventory
serializer_class = InventoryDetailSerializer
def update(self, request, *args, **kwargs):
obj = self.get_object()
kind = self.request.data.get('kind') or kwargs.get('kind')
# Do not allow changes to an Inventory kind.
if kind is not None and obj.kind != kind:
return self.http_method_not_allowed(request, *args, **kwargs)
return super(InventoryDetail, self).update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if not request.user.can_access(self.model, 'delete', obj):
raise PermissionDenied()
self.check_related_active_jobs(obj) # related jobs mixin
try:
obj.schedule_deletion(getattr(request.user, 'id', None))
return Response(status=status.HTTP_202_ACCEPTED)
except RuntimeError as e:
return Response(dict(error=_("{0}".format(e))), status=status.HTTP_400_BAD_REQUEST)
class InventoryActivityStreamList(ActivityStreamEnforcementMixin, SubListAPIView):
model = ActivityStream
serializer_class = ActivityStreamSerializer
parent_model = Inventory
relationship = 'activitystream_set'
search_fields = ('changes',)
def get_queryset(self):
parent = self.get_parent_object()
self.check_parent_access(parent)
qs = self.request.user.get_queryset(self.model)
return qs.filter(Q(inventory=parent) | Q(host__in=parent.hosts.all()) | Q(group__in=parent.groups.all()))
class InventoryInstanceGroupsList(SubListAttachDetachAPIView):
model = InstanceGroup
serializer_class = InstanceGroupSerializer
parent_model = Inventory
relationship = 'instance_groups'
class InventoryAccessList(ResourceAccessList):
model = User # needs to be User for AccessLists's
parent_model = Inventory
class InventoryObjectRolesList(SubListAPIView):
model = Role
serializer_class = RoleSerializer
parent_model = Inventory
search_fields = ('role_field', 'content_type__model',)
def get_queryset(self):
po = self.get_parent_object()
content_type = ContentType.objects.get_for_model(self.parent_model)
return Role.objects.filter(content_type=content_type, object_id=po.pk)
class InventoryJobTemplateList(SubListAPIView):
model = JobTemplate
serializer_class = JobTemplateSerializer
parent_model = Inventory
relationship = 'jobtemplates'
def get_queryset(self):
parent = self.get_parent_object()
self.check_parent_access(parent)
qs = self.request.user.get_queryset(self.model)
return qs.filter(inventory=parent)
class InventoryCopy(CopyAPIView):
model = Inventory
copy_return_serializer_class = InventorySerializer

309
awx/api/views/mixin.py Normal file
View File

@@ -0,0 +1,309 @@
# Copyright (c) 2018 Red Hat, Inc.
# All Rights Reserved.
import dateutil
import logging
from django.db.models import (
Count,
F,
)
from django.db import transaction
from django.shortcuts import get_object_or_404
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from rest_framework.permissions import SAFE_METHODS
from rest_framework.exceptions import PermissionDenied
from rest_framework.response import Response
from rest_framework import status
from awx.main.constants import ACTIVE_STATES
from awx.main.utils import (
get_object_or_400,
parse_yaml_or_json,
)
from awx.main.models.ha import (
Instance,
InstanceGroup,
)
from awx.main.models.organization import Team
from awx.main.models.projects import Project
from awx.main.models.inventory import Inventory
from awx.main.models.jobs import JobTemplate
from awx.conf.license import (
feature_enabled,
LicenseForbids,
)
from awx.api.exceptions import ActiveJobConflict
logger = logging.getLogger('awx.api.views.mixin')
class ActivityStreamEnforcementMixin(object):
'''
Mixin to check that license supports activity streams.
'''
def check_permissions(self, request):
ret = super(ActivityStreamEnforcementMixin, self).check_permissions(request)
if not feature_enabled('activity_streams'):
raise LicenseForbids(_('Your license does not allow use of the activity stream.'))
return ret
class SystemTrackingEnforcementMixin(object):
'''
Mixin to check that license supports system tracking.
'''
def check_permissions(self, request):
ret = super(SystemTrackingEnforcementMixin, self).check_permissions(request)
if not feature_enabled('system_tracking'):
raise LicenseForbids(_('Your license does not permit use of system tracking.'))
return ret
class WorkflowsEnforcementMixin(object):
'''
Mixin to check that license supports workflows.
'''
def check_permissions(self, request):
ret = super(WorkflowsEnforcementMixin, self).check_permissions(request)
if not feature_enabled('workflows') and request.method not in ('GET', 'OPTIONS', 'DELETE'):
raise LicenseForbids(_('Your license does not allow use of workflows.'))
return ret
class UnifiedJobDeletionMixin(object):
'''
Special handling when deleting a running unified job object.
'''
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if not request.user.can_access(self.model, 'delete', obj):
raise PermissionDenied()
try:
if obj.unified_job_node.workflow_job.status in ACTIVE_STATES:
raise PermissionDenied(detail=_('Cannot delete job resource when associated workflow job is running.'))
except self.model.unified_job_node.RelatedObjectDoesNotExist:
pass
# Still allow deletion of new status, because these can be manually created
if obj.status in ACTIVE_STATES and obj.status != 'new':
raise PermissionDenied(detail=_("Cannot delete running job resource."))
elif not obj.event_processing_finished:
# Prohibit deletion if job events are still coming in
if obj.finished and now() < obj.finished + dateutil.relativedelta.relativedelta(minutes=1):
# less than 1 minute has passed since job finished and events are not in
return Response({"error": _("Job has not finished processing events.")},
status=status.HTTP_400_BAD_REQUEST)
else:
# if it has been > 1 minute, events are probably lost
logger.warning('Allowing deletion of {} through the API without all events '
'processed.'.format(obj.log_format))
obj.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
class InstanceGroupMembershipMixin(object):
'''
This mixin overloads attach/detach so that it calls InstanceGroup.save(),
triggering a background recalculation of policy-based instance group
membership.
'''
def attach(self, request, *args, **kwargs):
response = super(InstanceGroupMembershipMixin, self).attach(request, *args, **kwargs)
sub_id, res = self.attach_validate(request)
if status.is_success(response.status_code):
if self.parent_model is Instance:
ig_obj = get_object_or_400(self.model, pk=sub_id)
inst_name = ig_obj.hostname
else:
inst_name = get_object_or_400(self.model, pk=sub_id).hostname
with transaction.atomic():
ig_qs = InstanceGroup.objects.select_for_update()
if self.parent_model is Instance:
ig_obj = get_object_or_400(ig_qs, pk=sub_id)
else:
# similar to get_parent_object, but selected for update
parent_filter = {
self.lookup_field: self.kwargs.get(self.lookup_field, None),
}
ig_obj = get_object_or_404(ig_qs, **parent_filter)
if inst_name not in ig_obj.policy_instance_list:
ig_obj.policy_instance_list.append(inst_name)
ig_obj.save(update_fields=['policy_instance_list'])
return response
def is_valid_relation(self, parent, sub, created=False):
if sub.is_isolated():
return {'error': _('Isolated instances may not be added or removed from instances groups via the API.')}
if self.parent_model is InstanceGroup:
ig_obj = self.get_parent_object()
if ig_obj.controller_id is not None:
return {'error': _('Isolated instance group membership may not be managed via the API.')}
return None
def unattach_validate(self, request):
(sub_id, res) = super(InstanceGroupMembershipMixin, self).unattach_validate(request)
if res:
return (sub_id, res)
sub = get_object_or_400(self.model, pk=sub_id)
attach_errors = self.is_valid_relation(None, sub)
if attach_errors:
return (sub_id, Response(attach_errors, status=status.HTTP_400_BAD_REQUEST))
return (sub_id, res)
def unattach(self, request, *args, **kwargs):
response = super(InstanceGroupMembershipMixin, self).unattach(request, *args, **kwargs)
if status.is_success(response.status_code):
sub_id = request.data.get('id', None)
if self.parent_model is Instance:
inst_name = self.get_parent_object().hostname
else:
inst_name = get_object_or_400(self.model, pk=sub_id).hostname
with transaction.atomic():
ig_qs = InstanceGroup.objects.select_for_update()
if self.parent_model is Instance:
ig_obj = get_object_or_400(ig_qs, pk=sub_id)
else:
# similar to get_parent_object, but selected for update
parent_filter = {
self.lookup_field: self.kwargs.get(self.lookup_field, None),
}
ig_obj = get_object_or_404(ig_qs, **parent_filter)
if inst_name in ig_obj.policy_instance_list:
ig_obj.policy_instance_list.pop(ig_obj.policy_instance_list.index(inst_name))
ig_obj.save(update_fields=['policy_instance_list'])
return response
class RelatedJobsPreventDeleteMixin(object):
def perform_destroy(self, obj):
self.check_related_active_jobs(obj)
return super(RelatedJobsPreventDeleteMixin, self).perform_destroy(obj)
def check_related_active_jobs(self, obj):
active_jobs = obj.get_active_jobs()
if len(active_jobs) > 0:
raise ActiveJobConflict(active_jobs)
time_cutoff = now() - dateutil.relativedelta.relativedelta(minutes=1)
recent_jobs = obj._get_related_jobs().filter(finished__gte = time_cutoff)
for unified_job in recent_jobs.get_real_instances():
if not unified_job.event_processing_finished:
raise PermissionDenied(_(
'Related job {} is still processing events.'
).format(unified_job.log_format))
class OrganizationCountsMixin(object):
def get_serializer_context(self, *args, **kwargs):
full_context = super(OrganizationCountsMixin, self).get_serializer_context(*args, **kwargs)
if self.request is None:
return full_context
db_results = {}
org_qs = self.model.accessible_objects(self.request.user, 'read_role')
org_id_list = org_qs.values('id')
if len(org_id_list) == 0:
if self.request.method == 'POST':
full_context['related_field_counts'] = {}
return full_context
inv_qs = Inventory.accessible_objects(self.request.user, 'read_role')
project_qs = Project.accessible_objects(self.request.user, 'read_role')
# Produce counts of Foreign Key relationships
db_results['inventories'] = inv_qs\
.values('organization').annotate(Count('organization')).order_by('organization')
db_results['teams'] = Team.accessible_objects(
self.request.user, 'read_role').values('organization').annotate(
Count('organization')).order_by('organization')
JT_project_reference = 'project__organization'
JT_inventory_reference = 'inventory__organization'
db_results['job_templates_project'] = JobTemplate.accessible_objects(
self.request.user, 'read_role').exclude(
project__organization=F(JT_inventory_reference)).values(JT_project_reference).annotate(
Count(JT_project_reference)).order_by(JT_project_reference)
db_results['job_templates_inventory'] = JobTemplate.accessible_objects(
self.request.user, 'read_role').values(JT_inventory_reference).annotate(
Count(JT_inventory_reference)).order_by(JT_inventory_reference)
db_results['projects'] = project_qs\
.values('organization').annotate(Count('organization')).order_by('organization')
# Other members and admins of organization are always viewable
db_results['users'] = org_qs.annotate(
users=Count('member_role__members', distinct=True),
admins=Count('admin_role__members', distinct=True)
).values('id', 'users', 'admins')
count_context = {}
for org in org_id_list:
org_id = org['id']
count_context[org_id] = {
'inventories': 0, 'teams': 0, 'users': 0, 'job_templates': 0,
'admins': 0, 'projects': 0}
for res, count_qs in db_results.items():
if res == 'job_templates_project':
org_reference = JT_project_reference
elif res == 'job_templates_inventory':
org_reference = JT_inventory_reference
elif res == 'users':
org_reference = 'id'
else:
org_reference = 'organization'
for entry in count_qs:
org_id = entry[org_reference]
if org_id in count_context:
if res == 'users':
count_context[org_id]['admins'] = entry['admins']
count_context[org_id]['users'] = entry['users']
continue
count_context[org_id][res] = entry['%s__count' % org_reference]
# Combine the counts for job templates by project and inventory
for org in org_id_list:
org_id = org['id']
count_context[org_id]['job_templates'] = 0
for related_path in ['job_templates_project', 'job_templates_inventory']:
if related_path in count_context[org_id]:
count_context[org_id]['job_templates'] += count_context[org_id].pop(related_path)
full_context['related_field_counts'] = count_context
return full_context
class ControlledByScmMixin(object):
'''
Special method to reset SCM inventory commit hash
if anything that it manages changes.
'''
def _reset_inv_src_rev(self, obj):
if self.request.method in SAFE_METHODS or not obj:
return
project_following_sources = obj.inventory_sources.filter(
update_on_project_update=True, source='scm')
if project_following_sources:
# Allow inventory changes unrelated to variables
if self.model == Inventory and (
not self.request or not self.request.data or
parse_yaml_or_json(self.request.data.get('variables', '')) == parse_yaml_or_json(obj.variables)):
return
project_following_sources.update(scm_last_revision='')
def get_object(self):
obj = super(ControlledByScmMixin, self).get_object()
self._reset_inv_src_rev(obj)
return obj
def get_parent_object(self):
obj = super(ControlledByScmMixin, self).get_parent_object()
self._reset_inv_src_rev(obj)
return obj

View File

@@ -0,0 +1,247 @@
# Copyright (c) 2018 Red Hat, Inc.
# All Rights Reserved.
# Python
import logging
# Django
from django.db.models import Count
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
# AWX
from awx.conf.license import (
feature_enabled,
LicenseForbids,
)
from awx.main.models import (
ActivityStream,
Inventory,
Project,
JobTemplate,
WorkflowJobTemplate,
Organization,
NotificationTemplate,
Role,
User,
Team,
InstanceGroup,
)
from awx.api.generics import (
ListCreateAPIView,
RetrieveUpdateDestroyAPIView,
SubListAPIView,
SubListCreateAttachDetachAPIView,
SubListAttachDetachAPIView,
ResourceAccessList,
BaseUsersList,
)
from awx.api.serializers import (
OrganizationSerializer,
InventorySerializer,
ProjectSerializer,
UserSerializer,
TeamSerializer,
ActivityStreamSerializer,
RoleSerializer,
NotificationTemplateSerializer,
WorkflowJobTemplateSerializer,
InstanceGroupSerializer,
)
from awx.api.views.mixin import (
ActivityStreamEnforcementMixin,
RelatedJobsPreventDeleteMixin,
OrganizationCountsMixin,
)
logger = logging.getLogger('awx.api.views.organization')
class OrganizationList(OrganizationCountsMixin, ListCreateAPIView):
model = Organization
serializer_class = OrganizationSerializer
def get_queryset(self):
qs = Organization.accessible_objects(self.request.user, 'read_role')
qs = qs.select_related('admin_role', 'auditor_role', 'member_role', 'read_role')
qs = qs.prefetch_related('created_by', 'modified_by')
return qs
def create(self, request, *args, **kwargs):
"""Create a new organzation.
If there is already an organization and the license of this
instance does not permit multiple organizations, then raise
LicenseForbids.
"""
# Sanity check: If the multiple organizations feature is disallowed
# by the license, then we are only willing to create this organization
# if no organizations exist in the system.
if (not feature_enabled('multiple_organizations') and
self.model.objects.exists()):
raise LicenseForbids(_('Your license only permits a single '
'organization to exist.'))
# Okay, create the organization as usual.
return super(OrganizationList, self).create(request, *args, **kwargs)
class OrganizationDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAPIView):
model = Organization
serializer_class = OrganizationSerializer
def get_serializer_context(self, *args, **kwargs):
full_context = super(OrganizationDetail, self).get_serializer_context(*args, **kwargs)
if not hasattr(self, 'kwargs') or 'pk' not in self.kwargs:
return full_context
org_id = int(self.kwargs['pk'])
org_counts = {}
access_kwargs = {'accessor': self.request.user, 'role_field': 'read_role'}
direct_counts = Organization.objects.filter(id=org_id).annotate(
users=Count('member_role__members', distinct=True),
admins=Count('admin_role__members', distinct=True)
).values('users', 'admins')
if not direct_counts:
return full_context
org_counts = direct_counts[0]
org_counts['inventories'] = Inventory.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['teams'] = Team.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['projects'] = Project.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['job_templates'] = JobTemplate.accessible_objects(**access_kwargs).filter(
project__organization__id=org_id).count()
full_context['related_field_counts'] = {}
full_context['related_field_counts'][org_id] = org_counts
return full_context
class OrganizationInventoriesList(SubListAPIView):
model = Inventory
serializer_class = InventorySerializer
parent_model = Organization
relationship = 'inventories'
class OrganizationUsersList(BaseUsersList):
model = User
serializer_class = UserSerializer
parent_model = Organization
relationship = 'member_role.members'
class OrganizationAdminsList(BaseUsersList):
model = User
serializer_class = UserSerializer
parent_model = Organization
relationship = 'admin_role.members'
class OrganizationProjectsList(SubListCreateAttachDetachAPIView):
model = Project
serializer_class = ProjectSerializer
parent_model = Organization
relationship = 'projects'
parent_key = 'organization'
class OrganizationWorkflowJobTemplatesList(SubListCreateAttachDetachAPIView):
model = WorkflowJobTemplate
serializer_class = WorkflowJobTemplateSerializer
parent_model = Organization
relationship = 'workflows'
parent_key = 'organization'
class OrganizationTeamsList(SubListCreateAttachDetachAPIView):
model = Team
serializer_class = TeamSerializer
parent_model = Organization
relationship = 'teams'
parent_key = 'organization'
class OrganizationActivityStreamList(ActivityStreamEnforcementMixin, SubListAPIView):
model = ActivityStream
serializer_class = ActivityStreamSerializer
parent_model = Organization
relationship = 'activitystream_set'
search_fields = ('changes',)
class OrganizationNotificationTemplatesList(SubListCreateAttachDetachAPIView):
model = NotificationTemplate
serializer_class = NotificationTemplateSerializer
parent_model = Organization
relationship = 'notification_templates'
parent_key = 'organization'
class OrganizationNotificationTemplatesAnyList(SubListCreateAttachDetachAPIView):
model = NotificationTemplate
serializer_class = NotificationTemplateSerializer
parent_model = Organization
relationship = 'notification_templates_any'
class OrganizationNotificationTemplatesErrorList(SubListCreateAttachDetachAPIView):
model = NotificationTemplate
serializer_class = NotificationTemplateSerializer
parent_model = Organization
relationship = 'notification_templates_error'
class OrganizationNotificationTemplatesSuccessList(SubListCreateAttachDetachAPIView):
model = NotificationTemplate
serializer_class = NotificationTemplateSerializer
parent_model = Organization
relationship = 'notification_templates_success'
class OrganizationInstanceGroupsList(SubListAttachDetachAPIView):
model = InstanceGroup
serializer_class = InstanceGroupSerializer
parent_model = Organization
relationship = 'instance_groups'
class OrganizationAccessList(ResourceAccessList):
model = User # needs to be User for AccessLists's
parent_model = Organization
class OrganizationObjectRolesList(SubListAPIView):
model = Role
serializer_class = RoleSerializer
parent_model = Organization
search_fields = ('role_field', 'content_type__model',)
def get_queryset(self):
po = self.get_parent_object()
content_type = ContentType.objects.get_for_model(self.parent_model)
return Role.objects.filter(content_type=content_type, object_id=po.pk)

281
awx/api/views/root.py Normal file
View File

@@ -0,0 +1,281 @@
# Copyright (c) 2018 Ansible, Inc.
# All Rights Reserved.
import logging
import operator
import json
from collections import OrderedDict
from django.conf import settings
from django.utils.encoding import smart_text
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from rest_framework import status
from awx.api.generics import APIView
from awx.main.ha import is_ha_environment
from awx.main.utils import (
get_awx_version,
get_ansible_version,
get_custom_venv_choices,
to_python_boolean,
)
from awx.api.versioning import reverse, get_request_version, drf_reverse
from awx.conf.license import get_license, feature_enabled
from awx.main.constants import PRIVILEGE_ESCALATION_METHODS
from awx.main.models import (
Project,
Organization,
Instance,
InstanceGroup,
JobTemplate,
)
logger = logging.getLogger('awx.api.views.root')
class ApiRootView(APIView):
permission_classes = (AllowAny,)
view_name = _('REST API')
versioning_class = None
swagger_topic = 'Versioning'
@method_decorator(ensure_csrf_cookie)
def get(self, request, format=None):
''' List supported API versions '''
v1 = reverse('api:api_v1_root_view', kwargs={'version': 'v1'})
v2 = reverse('api:api_v2_root_view', kwargs={'version': 'v2'})
data = OrderedDict()
data['description'] = _('AWX REST API')
data['current_version'] = v2
data['available_versions'] = dict(v1 = v1, v2 = v2)
data['oauth2'] = drf_reverse('api:oauth_authorization_root_view')
if feature_enabled('rebranding'):
data['custom_logo'] = settings.CUSTOM_LOGO
data['custom_login_info'] = settings.CUSTOM_LOGIN_INFO
return Response(data)
class ApiOAuthAuthorizationRootView(APIView):
permission_classes = (AllowAny,)
view_name = _("API OAuth 2 Authorization Root")
versioning_class = None
swagger_topic = 'Authentication'
def get(self, request, format=None):
data = OrderedDict()
data['authorize'] = drf_reverse('api:authorize')
data['token'] = drf_reverse('api:token')
data['revoke_token'] = drf_reverse('api:revoke-token')
return Response(data)
class ApiVersionRootView(APIView):
permission_classes = (AllowAny,)
swagger_topic = 'Versioning'
def get(self, request, format=None):
''' List top level resources '''
data = OrderedDict()
data['ping'] = reverse('api:api_v1_ping_view', request=request)
data['instances'] = reverse('api:instance_list', request=request)
data['instance_groups'] = reverse('api:instance_group_list', request=request)
data['config'] = reverse('api:api_v1_config_view', request=request)
data['settings'] = reverse('api:setting_category_list', request=request)
data['me'] = reverse('api:user_me_list', request=request)
data['dashboard'] = reverse('api:dashboard_view', request=request)
data['organizations'] = reverse('api:organization_list', request=request)
data['users'] = reverse('api:user_list', request=request)
data['projects'] = reverse('api:project_list', request=request)
data['project_updates'] = reverse('api:project_update_list', request=request)
data['teams'] = reverse('api:team_list', request=request)
data['credentials'] = reverse('api:credential_list', request=request)
if get_request_version(request) > 1:
data['credential_types'] = reverse('api:credential_type_list', request=request)
data['applications'] = reverse('api:o_auth2_application_list', request=request)
data['tokens'] = reverse('api:o_auth2_token_list', request=request)
data['inventory'] = reverse('api:inventory_list', request=request)
data['inventory_scripts'] = reverse('api:inventory_script_list', request=request)
data['inventory_sources'] = reverse('api:inventory_source_list', request=request)
data['inventory_updates'] = reverse('api:inventory_update_list', request=request)
data['groups'] = reverse('api:group_list', request=request)
data['hosts'] = reverse('api:host_list', request=request)
data['job_templates'] = reverse('api:job_template_list', request=request)
data['jobs'] = reverse('api:job_list', request=request)
data['job_events'] = reverse('api:job_event_list', request=request)
data['ad_hoc_commands'] = reverse('api:ad_hoc_command_list', request=request)
data['system_job_templates'] = reverse('api:system_job_template_list', request=request)
data['system_jobs'] = reverse('api:system_job_list', request=request)
data['schedules'] = reverse('api:schedule_list', request=request)
data['roles'] = reverse('api:role_list', request=request)
data['notification_templates'] = reverse('api:notification_template_list', request=request)
data['notifications'] = reverse('api:notification_list', request=request)
data['labels'] = reverse('api:label_list', request=request)
data['unified_job_templates'] = reverse('api:unified_job_template_list', request=request)
data['unified_jobs'] = reverse('api:unified_job_list', request=request)
data['activity_stream'] = reverse('api:activity_stream_list', request=request)
data['workflow_job_templates'] = reverse('api:workflow_job_template_list', request=request)
data['workflow_jobs'] = reverse('api:workflow_job_list', request=request)
data['workflow_job_template_nodes'] = reverse('api:workflow_job_template_node_list', request=request)
data['workflow_job_nodes'] = reverse('api:workflow_job_node_list', request=request)
return Response(data)
class ApiV1RootView(ApiVersionRootView):
view_name = _('Version 1')
class ApiV2RootView(ApiVersionRootView):
view_name = _('Version 2')
class ApiV1PingView(APIView):
"""A simple view that reports very basic information about this
instance, which is acceptable to be public information.
"""
permission_classes = (AllowAny,)
authentication_classes = ()
view_name = _('Ping')
swagger_topic = 'System Configuration'
def get(self, request, format=None):
"""Return some basic information about this instance
Everything returned here should be considered public / insecure, as
this requires no auth and is intended for use by the installer process.
"""
response = {
'ha': is_ha_environment(),
'version': get_awx_version(),
'active_node': settings.CLUSTER_HOST_ID,
}
response['instances'] = []
for instance in Instance.objects.all():
response['instances'].append(dict(node=instance.hostname, heartbeat=instance.modified,
capacity=instance.capacity, version=instance.version))
sorted(response['instances'], key=operator.itemgetter('node'))
response['instance_groups'] = []
for instance_group in InstanceGroup.objects.all():
response['instance_groups'].append(dict(name=instance_group.name,
capacity=instance_group.capacity,
instances=[x.hostname for x in instance_group.instances.all()]))
return Response(response)
class ApiV1ConfigView(APIView):
permission_classes = (IsAuthenticated,)
view_name = _('Configuration')
swagger_topic = 'System Configuration'
def check_permissions(self, request):
super(ApiV1ConfigView, self).check_permissions(request)
if not request.user.is_superuser and request.method.lower() not in {'options', 'head', 'get'}:
self.permission_denied(request) # Raises PermissionDenied exception.
def get(self, request, format=None):
'''Return various sitewide configuration settings'''
if request.user.is_superuser or request.user.is_system_auditor:
license_data = get_license(show_key=True)
else:
license_data = get_license(show_key=False)
if not license_data.get('valid_key', False):
license_data = {}
if license_data and 'features' in license_data and 'activity_streams' in license_data['features']:
# FIXME: Make the final setting value dependent on the feature?
license_data['features']['activity_streams'] &= settings.ACTIVITY_STREAM_ENABLED
pendo_state = settings.PENDO_TRACKING_STATE if settings.PENDO_TRACKING_STATE in ('off', 'anonymous', 'detailed') else 'off'
data = dict(
time_zone=settings.TIME_ZONE,
license_info=license_data,
version=get_awx_version(),
ansible_version=get_ansible_version(),
eula=render_to_string("eula.md") if license_data.get('license_type', 'UNLICENSED') != 'open' else '',
analytics_status=pendo_state,
become_methods=PRIVILEGE_ESCALATION_METHODS,
)
# If LDAP is enabled, user_ldap_fields will return a list of field
# names that are managed by LDAP and should be read-only for users with
# a non-empty ldap_dn attribute.
if getattr(settings, 'AUTH_LDAP_SERVER_URI', None) and feature_enabled('ldap'):
user_ldap_fields = ['username', 'password']
user_ldap_fields.extend(getattr(settings, 'AUTH_LDAP_USER_ATTR_MAP', {}).keys())
user_ldap_fields.extend(getattr(settings, 'AUTH_LDAP_USER_FLAGS_BY_GROUP', {}).keys())
data['user_ldap_fields'] = user_ldap_fields
if request.user.is_superuser \
or request.user.is_system_auditor \
or Organization.accessible_objects(request.user, 'admin_role').exists() \
or Organization.accessible_objects(request.user, 'auditor_role').exists():
data.update(dict(
project_base_dir = settings.PROJECTS_ROOT,
project_local_paths = Project.get_local_path_choices(),
custom_virtualenvs = get_custom_venv_choices()
))
elif JobTemplate.accessible_objects(request.user, 'admin_role').exists():
data['custom_virtualenvs'] = get_custom_venv_choices()
return Response(data)
def post(self, request):
if not isinstance(request.data, dict):
return Response({"error": _("Invalid license data")}, status=status.HTTP_400_BAD_REQUEST)
if "eula_accepted" not in request.data:
return Response({"error": _("Missing 'eula_accepted' property")}, status=status.HTTP_400_BAD_REQUEST)
try:
eula_accepted = to_python_boolean(request.data["eula_accepted"])
except ValueError:
return Response({"error": _("'eula_accepted' value is invalid")}, status=status.HTTP_400_BAD_REQUEST)
if not eula_accepted:
return Response({"error": _("'eula_accepted' must be True")}, status=status.HTTP_400_BAD_REQUEST)
request.data.pop("eula_accepted")
try:
data_actual = json.dumps(request.data)
except Exception:
logger.info(smart_text(u"Invalid JSON submitted for license."),
extra=dict(actor=request.user.username))
return Response({"error": _("Invalid JSON")}, status=status.HTTP_400_BAD_REQUEST)
try:
from awx.main.utils.common import get_licenser
license_data = json.loads(data_actual)
license_data_validated = get_licenser(**license_data).validate()
except Exception:
logger.warning(smart_text(u"Invalid license submitted."),
extra=dict(actor=request.user.username))
return Response({"error": _("Invalid License")}, status=status.HTTP_400_BAD_REQUEST)
# If the license is valid, write it to the database.
if license_data_validated['valid_key']:
settings.LICENSE = license_data
settings.TOWER_URL_BASE = "{}://{}".format(request.scheme, request.get_host())
return Response(license_data_validated)
logger.warning(smart_text(u"Invalid license submitted."),
extra=dict(actor=request.user.username))
return Response({"error": _("Invalid license")}, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request):
try:
settings.LICENSE = {}
return Response(status=status.HTTP_204_NO_CONTENT)
except Exception:
# FIX: Log
return Response({"error": _("Failed to remove license.")}, status=status.HTTP_400_BAD_REQUEST)

View File

@@ -1,25 +0,0 @@
# Copyright (c) 2017 Ansible, Inc.
# All Rights Reserved.
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings # noqa
try:
import awx.devonly # noqa
MODE = 'development'
except ImportError: # pragma: no cover
MODE = 'production'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'awx.settings.%s' % MODE)
app = Celery('awx')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
if __name__ == '__main__':
app.start()

View File

@@ -2,8 +2,6 @@
from django.apps import AppConfig
# from django.core import checks
from django.utils.translation import ugettext_lazy as _
from awx.main.utils.handlers import configure_external_logger
from django.conf import settings
class ConfConfig(AppConfig):
@@ -11,16 +9,7 @@ class ConfConfig(AppConfig):
name = 'awx.conf'
verbose_name = _('Configuration')
def configure_oauth2_provider(self, settings):
from oauth2_provider import settings as o_settings
o_settings.oauth2_settings = o_settings.OAuth2ProviderSettings(
settings.OAUTH2_PROVIDER, o_settings.DEFAULTS,
o_settings.IMPORT_STRINGS, o_settings.MANDATORY
)
def ready(self):
self.module.autodiscover()
from .settings import SettingsWrapper
SettingsWrapper.initialize()
configure_external_logger(settings)
self.configure_oauth2_provider(settings)

View File

@@ -1,6 +1,6 @@
# Python
import logging
import urlparse
import urllib.parse as urlparse
from collections import OrderedDict
# Django
@@ -10,8 +10,6 @@ from django.utils.translation import ugettext_lazy as _
# Django REST Framework
from rest_framework.fields import * # noqa
import six
logger = logging.getLogger('awx.conf.fields')
# Use DRF fields to convert/validate settings:
@@ -71,7 +69,7 @@ class StringListBooleanField(ListField):
return False
elif value in NullBooleanField.NULL_VALUES:
return None
elif isinstance(value, basestring):
elif isinstance(value, str):
return self.child.to_representation(value)
except TypeError:
pass
@@ -88,7 +86,7 @@ class StringListBooleanField(ListField):
return False
elif data in NullBooleanField.NULL_VALUES:
return None
elif isinstance(data, basestring):
elif isinstance(data, str):
return self.child.run_validation(data)
except TypeError:
pass
@@ -139,7 +137,7 @@ class KeyValueField(DictField):
def to_internal_value(self, data):
ret = super(KeyValueField, self).to_internal_value(data)
for value in data.values():
if not isinstance(value, six.string_types + six.integer_types + (float,)):
if not isinstance(value, (str, int, float)):
if isinstance(value, OrderedDict):
value = dict(value)
self.fail('invalid_child', input=value)

View File

@@ -1,480 +0,0 @@
# Copyright (c) 2016 Ansible, Inc.
# All Rights Reserved.
# Python
import base64
import collections
import difflib
import json
import os
import shutil
# Django
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from django.utils.text import slugify
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
# Tower
from awx import MODE
from awx.conf import settings_registry
from awx.conf.fields import empty, SkipField
from awx.conf.models import Setting
from awx.conf.utils import comment_assignments
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
'category',
nargs='*',
type=str,
)
parser.add_argument(
'--dry-run',
action='store_true',
dest='dry_run',
default=False,
help=_('Only show which settings would be commented/migrated.'),
)
parser.add_argument(
'--skip-errors',
action='store_true',
dest='skip_errors',
default=False,
help=_('Skip over settings that would raise an error when commenting/migrating.'),
)
parser.add_argument(
'--no-comment',
action='store_true',
dest='no_comment',
default=False,
help=_('Skip commenting out settings in files.'),
)
parser.add_argument(
'--comment-only',
action='store_true',
dest='comment_only',
default=False,
help=_('Skip migrating and only comment out settings in files.'),
)
parser.add_argument(
'--backup-suffix',
dest='backup_suffix',
default=now().strftime('.%Y%m%d%H%M%S'),
help=_('Backup existing settings files with this suffix.'),
)
@transaction.atomic
def handle(self, *args, **options):
self.verbosity = int(options.get('verbosity', 1))
self.dry_run = bool(options.get('dry_run', False))
self.skip_errors = bool(options.get('skip_errors', False))
self.no_comment = bool(options.get('no_comment', False))
self.comment_only = bool(options.get('comment_only', False))
self.backup_suffix = options.get('backup_suffix', '')
self.categories = options.get('category', None) or ['all']
self.style.HEADING = self.style.MIGRATE_HEADING
self.style.LABEL = self.style.MIGRATE_LABEL
self.style.OK = self.style.SQL_FIELD
self.style.SKIP = self.style.WARNING
self.style.VALUE = self.style.SQL_KEYWORD
# Determine if any categories provided are invalid.
category_slugs = []
invalid_categories = []
for category in self.categories:
category_slug = slugify(category)
if category_slug in settings_registry.get_registered_categories():
if category_slug not in category_slugs:
category_slugs.append(category_slug)
else:
if category not in invalid_categories:
invalid_categories.append(category)
if len(invalid_categories) == 1:
raise CommandError('Invalid setting category: {}'.format(invalid_categories[0]))
elif len(invalid_categories) > 1:
raise CommandError('Invalid setting categories: {}'.format(', '.join(invalid_categories)))
# Build a list of all settings to be migrated.
registered_settings = []
for category_slug in category_slugs:
for registered_setting in settings_registry.get_registered_settings(category_slug=category_slug, read_only=False):
if registered_setting not in registered_settings:
registered_settings.append(registered_setting)
self._migrate_settings(registered_settings)
def _get_settings_file_patterns(self):
if MODE == 'development':
return [
'/etc/tower/settings.py',
'/etc/tower/conf.d/*.py',
os.path.join(os.path.dirname(__file__), '..', '..', '..', 'settings', 'local_*.py')
]
else:
return [
os.environ.get('AWX_SETTINGS_FILE', '/etc/tower/settings.py'),
os.path.join(os.environ.get('AWX_SETTINGS_DIR', '/etc/tower/conf.d/'), '*.py'),
]
def _get_license_file(self):
return os.environ.get('AWX_LICENSE_FILE', '/etc/tower/license')
def _comment_license_file(self, dry_run=True):
license_file = self._get_license_file()
diff_lines = []
if os.path.exists(license_file):
try:
raw_license_data = open(license_file).read()
json.loads(raw_license_data)
except Exception as e:
raise CommandError('Error reading license from {0}: {1!r}'.format(license_file, e))
if self.backup_suffix:
backup_license_file = '{}{}'.format(license_file, self.backup_suffix)
else:
backup_license_file = '{}.old'.format(license_file)
diff_lines = list(difflib.unified_diff(
raw_license_data.splitlines(),
[],
fromfile=backup_license_file,
tofile=license_file,
lineterm='',
))
if not dry_run:
if self.backup_suffix:
shutil.copy2(license_file, backup_license_file)
os.remove(license_file)
return diff_lines
def _get_local_settings_file(self):
if MODE == 'development':
static_root = os.path.join(os.path.dirname(__file__), '..', '..', '..', 'ui', 'static')
else:
static_root = settings.STATIC_ROOT
return os.path.join(static_root, 'local_settings.json')
def _comment_local_settings_file(self, dry_run=True):
local_settings_file = self._get_local_settings_file()
diff_lines = []
if os.path.exists(local_settings_file):
try:
raw_local_settings_data = open(local_settings_file).read()
json.loads(raw_local_settings_data)
except Exception as e:
if not self.skip_errors:
raise CommandError('Error reading local settings from {0}: {1!r}'.format(local_settings_file, e))
return diff_lines
if self.backup_suffix:
backup_local_settings_file = '{}{}'.format(local_settings_file, self.backup_suffix)
else:
backup_local_settings_file = '{}.old'.format(local_settings_file)
diff_lines = list(difflib.unified_diff(
raw_local_settings_data.splitlines(),
[],
fromfile=backup_local_settings_file,
tofile=local_settings_file,
lineterm='',
))
if not dry_run:
if self.backup_suffix:
shutil.copy2(local_settings_file, backup_local_settings_file)
os.remove(local_settings_file)
return diff_lines
def _get_custom_logo_file(self):
if MODE == 'development':
static_root = os.path.join(os.path.dirname(__file__), '..', '..', '..', 'ui', 'static')
else:
static_root = settings.STATIC_ROOT
return os.path.join(static_root, 'assets', 'custom_console_logo.png')
def _comment_custom_logo_file(self, dry_run=True):
custom_logo_file = self._get_custom_logo_file()
diff_lines = []
if os.path.exists(custom_logo_file):
try:
raw_custom_logo_data = open(custom_logo_file).read()
except Exception as e:
if not self.skip_errors:
raise CommandError('Error reading custom logo from {0}: {1!r}'.format(custom_logo_file, e))
return diff_lines
if self.backup_suffix:
backup_custom_logo_file = '{}{}'.format(custom_logo_file, self.backup_suffix)
else:
backup_custom_logo_file = '{}.old'.format(custom_logo_file)
diff_lines = list(difflib.unified_diff(
['<PNG Image ({} bytes)>'.format(len(raw_custom_logo_data))],
[],
fromfile=backup_custom_logo_file,
tofile=custom_logo_file,
lineterm='',
))
if not dry_run:
if self.backup_suffix:
shutil.copy2(custom_logo_file, backup_custom_logo_file)
os.remove(custom_logo_file)
return diff_lines
def _check_if_needs_comment(self, patterns, setting):
files_to_comment = []
# If any diffs are returned, this setting needs to be commented.
diffs = comment_assignments(patterns, setting, dry_run=True)
if setting == 'LICENSE':
diffs.extend(self._comment_license_file(dry_run=True))
elif setting == 'CUSTOM_LOGIN_INFO':
diffs.extend(self._comment_local_settings_file(dry_run=True))
elif setting == 'CUSTOM_LOGO':
diffs.extend(self._comment_custom_logo_file(dry_run=True))
for diff in diffs:
for line in diff.splitlines():
if line.startswith('+++ '):
files_to_comment.append(line[4:])
return files_to_comment
def _check_if_needs_migration(self, setting):
# Check whether the current value differs from the default.
default_value = settings.DEFAULTS_SNAPSHOT.get(setting, empty)
if default_value is empty and setting != 'LICENSE':
field = settings_registry.get_setting_field(setting, read_only=True)
try:
default_value = field.get_default()
except SkipField:
pass
current_value = getattr(settings, setting, empty)
if setting == 'CUSTOM_LOGIN_INFO' and current_value in {empty, ''}:
local_settings_file = self._get_local_settings_file()
try:
if os.path.exists(local_settings_file):
local_settings = json.load(open(local_settings_file))
current_value = local_settings.get('custom_login_info', '')
except Exception as e:
if not self.skip_errors:
raise CommandError('Error reading custom login info from {0}: {1!r}'.format(local_settings_file, e))
if setting == 'CUSTOM_LOGO' and current_value in {empty, ''}:
custom_logo_file = self._get_custom_logo_file()
try:
if os.path.exists(custom_logo_file):
custom_logo_data = open(custom_logo_file).read()
if custom_logo_data:
current_value = 'data:image/png;base64,{}'.format(base64.b64encode(custom_logo_data))
else:
current_value = ''
except Exception as e:
if not self.skip_errors:
raise CommandError('Error reading custom logo from {0}: {1!r}'.format(custom_logo_file, e))
if current_value != default_value:
if current_value is empty:
current_value = None
return current_value
return empty
def _display_tbd(self, setting, files_to_comment, migrate_value, comment_error=None, migrate_error=None):
if self.verbosity >= 1:
if files_to_comment:
if migrate_value is not empty:
action = 'Migrate + Comment'
else:
action = 'Comment'
if comment_error or migrate_error:
action = self.style.ERROR('{} (skipped)'.format(action))
else:
action = self.style.OK(action)
self.stdout.write(' {}: {}'.format(
self.style.LABEL(setting),
action,
))
if self.verbosity >= 2:
if migrate_error:
self.stdout.write(' - Migrate value: {}'.format(
self.style.ERROR(migrate_error),
))
elif migrate_value is not empty:
self.stdout.write(' - Migrate value: {}'.format(
self.style.VALUE(repr(migrate_value)),
))
if comment_error:
self.stdout.write(' - Comment: {}'.format(
self.style.ERROR(comment_error),
))
elif files_to_comment:
for file_to_comment in files_to_comment:
self.stdout.write(' - Comment in: {}'.format(
self.style.VALUE(file_to_comment),
))
else:
if self.verbosity >= 2:
self.stdout.write(' {}: {}'.format(
self.style.LABEL(setting),
self.style.SKIP('No Migration'),
))
def _display_migrate(self, setting, action, display_value):
if self.verbosity >= 1:
if action == 'No Change':
action = self.style.SKIP(action)
else:
action = self.style.OK(action)
self.stdout.write(' {}: {}'.format(
self.style.LABEL(setting),
action,
))
if self.verbosity >= 2:
for line in display_value.splitlines():
self.stdout.write(' {}'.format(
self.style.VALUE(line),
))
def _display_diff_summary(self, filename, added, removed):
self.stdout.write(' {} {}{} {}{}'.format(
self.style.LABEL(filename),
self.style.ERROR('-'),
self.style.ERROR(int(removed)),
self.style.OK('+'),
self.style.OK(str(added)),
))
def _display_comment(self, diffs):
for diff in diffs:
if self.verbosity >= 2:
for line in diff.splitlines():
display_line = line
if line.startswith('--- ') or line.startswith('+++ '):
display_line = self.style.LABEL(line)
elif line.startswith('-'):
display_line = self.style.ERROR(line)
elif line.startswith('+'):
display_line = self.style.OK(line)
elif line.startswith('@@'):
display_line = self.style.VALUE(line)
if line.startswith('--- ') or line.startswith('+++ '):
self.stdout.write(' ' + display_line)
else:
self.stdout.write(' ' + display_line)
elif self.verbosity >= 1:
filename, lines_added, lines_removed = None, 0, 0
for line in diff.splitlines():
if line.startswith('+++ '):
if filename:
self._display_diff_summary(filename, lines_added, lines_removed)
filename, lines_added, lines_removed = line[4:], 0, 0
elif line.startswith('+'):
lines_added += 1
elif line.startswith('-'):
lines_removed += 1
if filename:
self._display_diff_summary(filename, lines_added, lines_removed)
def _discover_settings(self, registered_settings):
if self.verbosity >= 1:
self.stdout.write(self.style.HEADING('Discovering settings to be migrated and commented:'))
# Determine which settings need to be commented/migrated.
to_migrate = collections.OrderedDict()
to_comment = collections.OrderedDict()
patterns = self._get_settings_file_patterns()
for name in registered_settings:
comment_error, migrate_error = None, None
files_to_comment = []
try:
files_to_comment = self._check_if_needs_comment(patterns, name)
except Exception as e:
comment_error = 'Error commenting {0}: {1!r}'.format(name, e)
if not self.skip_errors:
raise CommandError(comment_error)
if files_to_comment:
to_comment[name] = files_to_comment
migrate_value = empty
if files_to_comment:
migrate_value = self._check_if_needs_migration(name)
if migrate_value is not empty:
field = settings_registry.get_setting_field(name)
assert not field.read_only
try:
data = field.to_representation(migrate_value)
setting_value = field.run_validation(data)
db_value = field.to_representation(setting_value)
to_migrate[name] = db_value
except Exception as e:
to_comment.pop(name)
migrate_error = 'Unable to assign value {0!r} to setting "{1}: {2!s}".'.format(migrate_value, name, e)
if not self.skip_errors:
raise CommandError(migrate_error)
self._display_tbd(name, files_to_comment, migrate_value, comment_error, migrate_error)
if self.verbosity == 1 and not to_migrate and not to_comment:
self.stdout.write(' No settings found to migrate or comment!')
return (to_migrate, to_comment)
def _migrate(self, to_migrate):
if self.verbosity >= 1:
if self.dry_run:
self.stdout.write(self.style.HEADING('Migrating settings to database (dry-run):'))
else:
self.stdout.write(self.style.HEADING('Migrating settings to database:'))
if not to_migrate:
self.stdout.write(' No settings to migrate!')
# Now migrate those settings to the database.
for name, db_value in to_migrate.items():
display_value = json.dumps(db_value, indent=4)
setting = Setting.objects.filter(key=name, user__isnull=True).order_by('pk').first()
action = 'No Change'
if not setting:
action = 'Migrated'
if not self.dry_run:
Setting.objects.create(key=name, user=None, value=db_value)
elif setting.value != db_value or type(setting.value) != type(db_value):
action = 'Updated'
if not self.dry_run:
setting.value = db_value
setting.save(update_fields=['value'])
self._display_migrate(name, action, display_value)
def _comment(self, to_comment):
if self.verbosity >= 1:
if bool(self.dry_run or self.no_comment):
self.stdout.write(self.style.HEADING('Commenting settings in files (dry-run):'))
else:
self.stdout.write(self.style.HEADING('Commenting settings in files:'))
if not to_comment:
self.stdout.write(' No settings to comment!')
# Now comment settings in settings files.
if to_comment:
to_comment_patterns = []
license_file_to_comment = None
local_settings_file_to_comment = None
custom_logo_file_to_comment = None
for files_to_comment in to_comment.values():
for file_to_comment in files_to_comment:
if file_to_comment == self._get_license_file():
license_file_to_comment = file_to_comment
elif file_to_comment == self._get_local_settings_file():
local_settings_file_to_comment = file_to_comment
elif file_to_comment == self._get_custom_logo_file():
custom_logo_file_to_comment = file_to_comment
elif file_to_comment not in to_comment_patterns:
to_comment_patterns.append(file_to_comment)
# Run once in dry-run mode to catch any errors from updating the files.
diffs = comment_assignments(to_comment_patterns, to_comment.keys(), dry_run=True, backup_suffix=self.backup_suffix)
# Then, if really updating, run again.
if not self.dry_run and not self.no_comment:
diffs = comment_assignments(to_comment_patterns, to_comment.keys(), dry_run=False, backup_suffix=self.backup_suffix)
if license_file_to_comment:
diffs.extend(self._comment_license_file(dry_run=False))
if local_settings_file_to_comment:
diffs.extend(self._comment_local_settings_file(dry_run=False))
if custom_logo_file_to_comment:
diffs.extend(self._comment_custom_logo_file(dry_run=False))
self._display_comment(diffs)
def _migrate_settings(self, registered_settings):
to_migrate, to_comment = self._discover_settings(registered_settings)
if not bool(self.comment_only):
self._migrate(to_migrate)
self._comment(to_comment)

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
from awx.conf.migrations import _rename_setting
def copy_session_settings(apps, schema_editor):
_rename_setting.rename_setting(apps, schema_editor, old_key='AUTH_TOKEN_PER_USER', new_key='SESSIONS_PER_USER')
_rename_setting.rename_setting(apps, schema_editor, old_key='AUTH_TOKEN_EXPIRATION', new_key='SESSION_COOKIE_AGE')
def reverse_copy_session_settings(apps, schema_editor):
_rename_setting.rename_setting(apps, schema_editor, old_key='SESSION_COOKIE_AGE', new_key='AUTH_TOKEN_EXPIRATION')
_rename_setting.rename_setting(apps, schema_editor, old_key='SESSIONS_PER_USER', new_key='AUTH_TOKEN_PER_USER')
class Migration(migrations.Migration):
dependencies = [
('conf', '0004_v320_reencrypt'),
]
operations = [
migrations.RunPython(copy_session_settings, reverse_copy_session_settings),
]

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# AWX
from awx.conf.migrations._ldap_group_type import fill_ldap_group_type_params
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('conf', '0005_v330_rename_two_session_settings'),
]
operations = [
migrations.RunPython(fill_ldap_group_type_params),
]

View File

@@ -0,0 +1,30 @@
import inspect
from django.conf import settings
from django.utils.timezone import now
def fill_ldap_group_type_params(apps, schema_editor):
group_type = settings.AUTH_LDAP_GROUP_TYPE
Setting = apps.get_model('conf', 'Setting')
group_type_params = {'name_attr': 'cn', 'member_attr': 'member'}
qs = Setting.objects.filter(key='AUTH_LDAP_GROUP_TYPE_PARAMS')
entry = None
if qs.exists():
entry = qs[0]
group_type_params = entry.value
else:
entry = Setting(key='AUTH_LDAP_GROUP_TYPE_PARAMS',
value=group_type_params,
created=now(),
modified=now())
init_attrs = set(inspect.getargspec(group_type.__init__).args[1:])
for k in group_type_params.keys():
if k not in init_attrs:
del group_type_params[k]
entry.value = group_type_params
entry.save()

View File

@@ -1,7 +1,6 @@
import base64
import hashlib
import six
from django.utils.encoding import smart_str
from cryptography.hazmat.backends import default_backend
@@ -91,7 +90,7 @@ def encrypt_field(instance, field_name, ask=False, subfield=None, skip_utf8=Fals
if skip_utf8:
utf8 = False
else:
utf8 = type(value) == six.text_type
utf8 = type(value) == str
value = smart_str(value)
key = get_encryption_key(field_name, getattr(instance, 'pk', None))
encryptor = Cipher(AES(key), ECB(), default_backend()).encryptor()

View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
from django.utils.timezone import now
from django.conf import settings
logger = logging.getLogger('awx.conf.settings')
__all__ = ['rename_setting']
def rename_setting(apps, schema_editor, old_key, new_key):
old_setting = None
Setting = apps.get_model('conf', 'Setting')
if Setting.objects.filter(key=new_key).exists() or hasattr(settings, new_key):
logger.info('Setting ' + new_key + ' unexpectedly exists before this migration, it will be replaced by the value of the ' + old_key + ' setting.')
Setting.objects.filter(key=new_key).delete()
# Look for db setting, which wouldn't be picked up by SettingsWrapper because the register method is gone
if Setting.objects.filter(key=old_key).exists():
old_setting = Setting.objects.filter(key=old_key).last().value
Setting.objects.filter(key=old_key).delete()
# Look for "on-disk" setting (/etc/tower/conf.d)
if hasattr(settings, old_key):
old_setting = getattr(settings, old_key)
if old_setting is not None:
Setting.objects.create(key=new_key,
value=old_setting,
created=now(),
modified=now()
)

View File

@@ -33,7 +33,7 @@ class Setting(CreatedModifiedModel):
on_delete=models.CASCADE,
))
def __unicode__(self):
def __str__(self):
try:
json_value = json.dumps(self.value)
except ValueError:
@@ -78,6 +78,14 @@ class Setting(CreatedModifiedModel):
def get_cache_id_key(self, key):
return '{}_ID'.format(key)
def display_value(self):
if self.key == 'LICENSE' and 'license_key' in self.value:
# don't log the license key in activity stream
value = self.value.copy()
value['license_key'] = '********'
return value
return self.value
import awx.conf.signals # noqa

View File

@@ -1,8 +1,6 @@
# Django REST Framework
from rest_framework import serializers
import six
# Tower
from awx.api.fields import VerbatimField
from awx.api.serializers import BaseSerializer
@@ -47,12 +45,12 @@ class SettingFieldMixin(object):
"""Mixin to use a registered setting field class for API display/validation."""
def to_representation(self, obj):
if getattr(self, 'encrypted', False) and isinstance(obj, six.string_types) and obj:
if getattr(self, 'encrypted', False) and isinstance(obj, str) and obj:
return '$encrypted$'
return obj
def to_internal_value(self, value):
if getattr(self, 'encrypted', False) and isinstance(value, six.string_types) and value.startswith('$encrypted$'):
if getattr(self, 'encrypted', False) and isinstance(value, str) and value.startswith('$encrypted$'):
raise serializers.SkipField()
obj = super(SettingFieldMixin, self).to_internal_value(value)
return super(SettingFieldMixin, self).to_representation(obj)

View File

@@ -2,18 +2,21 @@
from collections import namedtuple
import contextlib
import logging
import re
import sys
import threading
import time
import six
import traceback
import urllib.parse
from io import StringIO
# Django
from django.conf import LazySettings
from django.conf import settings, UserSettingsHolder
from django.core.cache import cache as django_cache
from django.core.exceptions import ImproperlyConfigured
from django.db import ProgrammingError, OperationalError
from django.db import transaction, connection
from django.db.utils import Error as DBError
from django.utils.functional import cached_property
# Django REST Framework
@@ -58,17 +61,77 @@ SETTING_CACHE_DEFAULTS = True
__all__ = ['SettingsWrapper', 'get_settings_to_cache', 'SETTING_CACHE_NOTSET']
def normalize_broker_url(value):
parts = value.rsplit('@', 1)
match = re.search('(amqp://[^:]+:)(.*)', parts[0])
if match:
prefix, password = match.group(1), match.group(2)
parts[0] = prefix + urllib.parse.quote(password)
return '@'.join(parts)
@contextlib.contextmanager
def _log_database_error():
def _ctit_db_wrapper(trans_safe=False):
'''
Wrapper to avoid undesired actions by Django ORM when managing settings
if only getting a setting, can use trans_safe=True, which will avoid
throwing errors if the prior context was a broken transaction.
Any database errors will be logged, but exception will be suppressed.
'''
rollback_set = None
is_atomic = None
try:
if trans_safe:
is_atomic = connection.in_atomic_block
if is_atomic:
rollback_set = transaction.get_rollback()
if rollback_set:
logger.debug('Obtaining database settings in spite of broken transaction.')
transaction.set_rollback(False)
yield
except (ProgrammingError, OperationalError) as e:
if get_tower_migration_version() < '310':
except DBError:
if 'migrate' in sys.argv and get_tower_migration_version() < '310':
logger.info('Using default settings until version 3.1 migration.')
else:
logger.warning('Database settings are not available, using defaults (%s)', e, exc_info=True)
# We want the _full_ traceback with the context
# First we get the current call stack, which constitutes the "top",
# it has the context up to the point where the context manager is used
top_stack = StringIO()
traceback.print_stack(file=top_stack)
top_lines = top_stack.getvalue().strip('\n').split('\n')
top_stack.close()
# Get "bottom" stack from the local error that happened
# inside of the "with" block this wraps
exc_type, exc_value, exc_traceback = sys.exc_info()
bottom_stack = StringIO()
traceback.print_tb(exc_traceback, file=bottom_stack)
bottom_lines = bottom_stack.getvalue().strip('\n').split('\n')
# Glue together top and bottom where overlap is found
bottom_cutoff = 0
for i, line in enumerate(bottom_lines):
if line in top_lines:
# start of overlapping section, take overlap from bottom
top_lines = top_lines[:top_lines.index(line)]
bottom_cutoff = i
break
bottom_lines = bottom_lines[bottom_cutoff:]
tb_lines = top_lines + bottom_lines
tb_string = '\n'.join(
['Traceback (most recent call last):'] +
tb_lines +
['{}: {}'.format(exc_type.__name__, str(exc_value))]
)
bottom_stack.close()
# Log the combined stack
if trans_safe:
if 'check_migrations' not in sys.argv:
logger.warning('Database settings are not available, using defaults, error:\n{}'.format(tb_string))
else:
logger.error('Error modifying something related to database settings.\n{}'.format(tb_string))
finally:
pass
if trans_safe and is_atomic and rollback_set:
transaction.set_rollback(rollback_set)
def filter_sensitive(registry, key, value):
@@ -104,15 +167,6 @@ class EncryptedCacheProxy(object):
def get(self, key, **kwargs):
value = self.cache.get(key, **kwargs)
value = self._handle_encryption(self.decrypter, key, value)
# python-memcached auto-encodes unicode on cache set in python2
# https://github.com/linsomniac/python-memcached/issues/79
# https://github.com/linsomniac/python-memcached/blob/288c159720eebcdf667727a859ef341f1e908308/memcache.py#L961
if six.PY2 and isinstance(value, six.binary_type):
try:
six.text_type(value)
except UnicodeDecodeError:
value = value.decode('utf-8')
logger.debug('cache get(%r, %r) -> %r', key, empty, filter_sensitive(self.registry, key, value))
return value
@@ -245,7 +299,7 @@ class SettingsWrapper(UserSettingsHolder):
self.__dict__['_awx_conf_preload_expires'] = time.time() + SETTING_CACHE_TIMEOUT
# Check for any settings that have been defined in Python files and
# make those read-only to avoid overriding in the database.
if not self._awx_conf_init_readonly and 'migrate_to_database_settings' not in sys.argv:
if not self._awx_conf_init_readonly:
defaults_snapshot = self._get_default('DEFAULTS_SNAPSHOT')
for key in get_writeable_settings(self.registry):
init_default = defaults_snapshot.get(key, None)
@@ -388,11 +442,20 @@ class SettingsWrapper(UserSettingsHolder):
def __getattr__(self, name):
value = empty
if name in self.all_supported_settings:
with _log_database_error():
with _ctit_db_wrapper(trans_safe=True):
value = self._get_local(name)
if value is not empty:
return value
return self._get_default(name)
value = self._get_default(name)
# sometimes users specify RabbitMQ passwords that contain
# unescaped : and @ characters that confused urlparse, e.g.,
# amqp://guest:a@ns:ibl3#@localhost:5672//
#
# detect these scenarios, and automatically escape the user's
# password so it just works
if name == 'BROKER_URL':
value = normalize_broker_url(value)
return value
def _set_local(self, name, value):
field = self.registry.get_setting_field(name)
@@ -420,7 +483,7 @@ class SettingsWrapper(UserSettingsHolder):
def __setattr__(self, name, value):
if name in self.all_supported_settings:
with _log_database_error():
with _ctit_db_wrapper():
self._set_local(name, value)
else:
setattr(self.default_settings, name, value)
@@ -436,14 +499,14 @@ class SettingsWrapper(UserSettingsHolder):
def __delattr__(self, name):
if name in self.all_supported_settings:
with _log_database_error():
with _ctit_db_wrapper():
self._del_local(name)
else:
delattr(self.default_settings, name)
def __dir__(self):
keys = []
with _log_database_error():
with _ctit_db_wrapper(trans_safe=True):
for setting in Setting.objects.filter(
key__in=self.all_supported_settings, user__isnull=True):
# Skip returning settings that have been overridden but are
@@ -460,7 +523,7 @@ class SettingsWrapper(UserSettingsHolder):
def is_overridden(self, setting):
set_locally = False
if setting in self.all_supported_settings:
with _log_database_error():
with _ctit_db_wrapper(trans_safe=True):
set_locally = Setting.objects.filter(key=setting, user__isnull=True).exists()
set_on_default = getattr(self.default_settings, 'is_overridden', lambda s: False)(setting)
return (set_locally or set_on_default)

View File

@@ -9,15 +9,11 @@ from django.core.cache import cache
from django.dispatch import receiver
# Tower
import awx.main.signals
from awx.conf import settings_registry
from awx.conf.models import Setting
from awx.conf.serializers import SettingSerializer
logger = logging.getLogger('awx.conf.signals')
awx.main.signals.model_serializer_mapping[Setting] = SettingSerializer
__all__ = []

View File

@@ -1,7 +1,8 @@
import urllib.parse
import pytest
from django.core.urlresolvers import resolve
from django.utils.six.moves.urllib.parse import urlparse
from django.contrib.auth.models import User
from rest_framework.test import (
@@ -33,7 +34,7 @@ def admin():
@pytest.fixture
def api_request(admin):
def rf(verb, url, data=None, user=admin):
view, view_args, view_kwargs = resolve(urlparse(url)[2])
view, view_args, view_kwargs = resolve(urllib.parse.urlparse(url)[2])
request = getattr(APIRequestFactory(), verb)(url, data=data, format='json')
if user:
force_authenticate(request, user=user)

View File

@@ -1,5 +1,5 @@
import pytest
import mock
from unittest import mock
from rest_framework import serializers
@@ -338,13 +338,14 @@ def test_setting_singleton_delete_no_read_only_fields(api_request, dummy_setting
@pytest.mark.django_db
def test_setting_logging_test(api_request):
with mock.patch('awx.conf.views.BaseHTTPSHandler.perform_test') as mock_func:
with mock.patch('awx.conf.views.AWXProxyHandler.perform_test') as mock_func:
api_request(
'post',
reverse('api:setting_logging_test'),
data={'LOG_AGGREGATOR_HOST': 'http://foobar', 'LOG_AGGREGATOR_TYPE': 'logstash'}
)
test_arguments = mock_func.call_args[0][0]
assert test_arguments.LOG_AGGREGATOR_HOST == 'http://foobar'
assert test_arguments.LOG_AGGREGATOR_TYPE == 'logstash'
assert test_arguments.LOG_AGGREGATOR_LEVEL == 'DEBUG'
call = mock_func.call_args_list[0]
args, kwargs = call
given_settings = kwargs['custom_settings']
assert given_settings.LOG_AGGREGATOR_HOST == 'http://foobar'
assert given_settings.LOG_AGGREGATOR_TYPE == 'logstash'

View File

@@ -1,38 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2017 Ansible, Inc.
# All Rights Reserved.
import pytest
import mock
from django.apps import apps
from awx.conf.migrations._reencrypt import (
replace_aesecb_fernet,
encrypt_field,
decrypt_field,
)
from awx.conf.settings import Setting
from awx.main.utils import decrypt_field as new_decrypt_field
@pytest.mark.django_db
@pytest.mark.parametrize("old_enc, new_enc, value", [
('$encrypted$UTF8$AES', '$encrypted$UTF8$AESCBC$', u'Iñtërnâtiônàlizætiøn'),
('$encrypted$AES$', '$encrypted$AESCBC$', 'test'),
])
def test_settings(old_enc, new_enc, value):
with mock.patch('awx.conf.models.encrypt_field', encrypt_field):
with mock.patch('awx.conf.settings.decrypt_field', decrypt_field):
setting = Setting.objects.create(key='SOCIAL_AUTH_GITHUB_SECRET', value=value)
assert setting.value.startswith(old_enc)
replace_aesecb_fernet(apps, None)
setting.refresh_from_db()
assert setting.value.startswith(new_enc)
assert new_decrypt_field(setting, 'value') == value
# This is here for a side-effect.
# Exception if the encryption type of AESCBC is not properly skipped, ensures
# our `startswith` calls don't have typos
replace_aesecb_fernet(apps, None)

View File

@@ -0,0 +1,6 @@
# Ensure that our autouse overwrites are working
def test_cache(settings):
assert settings.CACHES['default']['BACKEND'] == 'django.core.cache.backends.locmem.LocMemCache'
assert settings.CACHES['default']['LOCATION'].startswith('unique-')

View File

@@ -4,6 +4,7 @@
# All Rights Reserved.
from contextlib import contextmanager
import codecs
from uuid import uuid4
import time
@@ -12,7 +13,6 @@ from django.core.cache.backends.locmem import LocMemCache
from django.core.exceptions import ImproperlyConfigured
from django.utils.translation import ugettext_lazy as _
import pytest
import six
from awx.conf import models, fields
from awx.conf.settings import SettingsWrapper, EncryptedCacheProxy, SETTING_CACHE_NOTSET
@@ -67,9 +67,9 @@ def test_cached_settings_unicode_is_auto_decoded(settings):
# https://github.com/linsomniac/python-memcached/issues/79
# https://github.com/linsomniac/python-memcached/blob/288c159720eebcdf667727a859ef341f1e908308/memcache.py#L961
value = six.u('Iñtërnâtiônàlizætiøn').encode('utf-8') # this simulates what python-memcached does on cache.set()
value = 'Iñtërnâtiônàlizætiøn' # this simulates what python-memcached does on cache.set()
settings.cache.set('DEBUG', value)
assert settings.cache.get('DEBUG') == six.u('Iñtërnâtiônàlizætiøn')
assert settings.cache.get('DEBUG') == 'Iñtërnâtiônàlizætiøn'
def test_read_only_setting(settings):
@@ -262,7 +262,7 @@ def test_setting_from_db_with_unicode(settings, mocker, encrypted):
encrypted=encrypted
)
# this simulates a bug in python-memcached; see https://github.com/linsomniac/python-memcached/issues/79
value = six.u('Iñtërnâtiônàlizætiøn').encode('utf-8')
value = 'Iñtërnâtiônàlizætiøn'
setting_from_db = mocker.Mock(id=1, key='AWX_SOME_SETTING', value=value)
mocks = mocker.Mock(**{
@@ -272,8 +272,8 @@ def test_setting_from_db_with_unicode(settings, mocker, encrypted):
}),
})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks):
assert settings.AWX_SOME_SETTING == six.u('Iñtërnâtiônàlizætiøn')
assert settings.cache.get('AWX_SOME_SETTING') == six.u('Iñtërnâtiônàlizætiøn')
assert settings.AWX_SOME_SETTING == 'Iñtërnâtiônàlizætiøn'
assert settings.cache.get('AWX_SOME_SETTING') == 'Iñtërnâtiônàlizætiøn'
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
@@ -434,7 +434,7 @@ def test_sensitive_cache_data_is_encrypted(settings, mocker):
def rot13(obj, attribute):
assert obj.pk == 123
return getattr(obj, attribute).encode('rot13')
return codecs.encode(getattr(obj, attribute), 'rot_13')
native_cache = LocMemCache(str(uuid4()), {})
cache = EncryptedCacheProxy(
@@ -471,7 +471,7 @@ def test_readonly_sensitive_cache_data_is_encrypted(settings):
def rot13(obj, attribute):
assert obj.pk is None
return getattr(obj, attribute).encode('rot13')
return codecs.encode(getattr(obj, attribute), 'rot_13')
native_cache = LocMemCache(str(uuid4()), {})
cache = EncryptedCacheProxy(

View File

@@ -6,8 +6,6 @@ import glob
import os
import shutil
import six
# AWX
from awx.conf.registry import settings_registry
@@ -15,7 +13,7 @@ __all__ = ['comment_assignments', 'conf_to_dict']
def comment_assignments(patterns, assignment_names, dry_run=True, backup_suffix='.old'):
if isinstance(patterns, six.string_types):
if isinstance(patterns, str):
patterns = [patterns]
diffs = []
for pattern in patterns:
@@ -34,7 +32,7 @@ def comment_assignments(patterns, assignment_names, dry_run=True, backup_suffix=
def comment_assignments_in_file(filename, assignment_names, dry_run=True, backup_filename=None):
from redbaron import RedBaron, indent
if isinstance(assignment_names, six.string_types):
if isinstance(assignment_names, str):
assignment_names = [assignment_names]
else:
assignment_names = assignment_names[:]
@@ -102,7 +100,7 @@ def comment_assignments_in_file(filename, assignment_names, dry_run=True, backup
if not dry_run:
if backup_filename:
shutil.copy2(filename, backup_filename)
with open(filename, 'wb') as fileobj:
with open(filename, 'w') as fileobj:
fileobj.write(new_file_data)
return '\n'.join(diff_lines)

View File

@@ -21,7 +21,7 @@ from awx.api.generics import * # noqa
from awx.api.permissions import IsSuperUser
from awx.api.versioning import reverse, get_request_version
from awx.main.utils import * # noqa
from awx.main.utils.handlers import BaseHTTPSHandler, UDPHandler, LoggingConnectivityException
from awx.main.utils.handlers import AWXProxyHandler, LoggingConnectivityException
from awx.main.tasks import handle_setting_changes
from awx.conf.license import get_licensed_features
from awx.conf.models import Setting
@@ -72,7 +72,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
def get_queryset(self):
self.category_slug = self.kwargs.get('category_slug', 'all')
all_category_slugs = settings_registry.get_registered_categories(features_enabled=get_licensed_features()).keys()
all_category_slugs = list(settings_registry.get_registered_categories(features_enabled=get_licensed_features()).keys())
for slug_to_delete in VERSION_SPECIFIC_CATEGORIES_TO_EXCLUDE[get_request_version(self.request)]:
all_category_slugs.remove(slug_to_delete)
if self.request.user.is_superuser or getattr(self.request.user, 'is_system_auditor', False):
@@ -123,7 +123,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
if key == 'LICENSE' or settings_registry.is_setting_read_only(key):
continue
if settings_registry.is_setting_encrypted(key) and \
isinstance(value, basestring) and \
isinstance(value, str) and \
value.startswith('$encrypted$'):
continue
setattr(serializer.instance, key, value)
@@ -135,7 +135,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
setting.value = value
setting.save(update_fields=['value'])
settings_change_list.append(key)
if settings_change_list and 'migrate_to_database_settings' not in sys.argv:
if settings_change_list:
handle_setting_changes.delay(settings_change_list)
def destroy(self, request, *args, **kwargs):
@@ -150,7 +150,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
continue
setting.delete()
settings_change_list.append(setting.key)
if settings_change_list and 'migrate_to_database_settings' not in sys.argv:
if settings_change_list:
handle_setting_changes.delay(settings_change_list)
# When TOWER_URL_BASE is deleted from the API, reset it to the hostname
@@ -198,12 +198,9 @@ class SettingLoggingTest(GenericAPIView):
mock_settings = MockSettings()
for k, v in serializer.validated_data.items():
setattr(mock_settings, k, v)
mock_settings.LOG_AGGREGATOR_LEVEL = 'DEBUG'
AWXProxyHandler().perform_test(custom_settings=mock_settings)
if mock_settings.LOG_AGGREGATOR_PROTOCOL.upper() == 'UDP':
UDPHandler.perform_test(mock_settings)
return Response(status=status.HTTP_201_CREATED)
else:
BaseHTTPSHandler.perform_test(mock_settings)
except LoggingConnectivityException as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response(status=status.HTTP_200_OK)
@@ -213,7 +210,7 @@ class SettingLoggingTest(GenericAPIView):
# in URL patterns and reverse URL lookups, converting CamelCase names to
# lowercase_with_underscore (e.g. MyView.as_view() becomes my_view).
this_module = sys.modules[__name__]
for attr, value in locals().items():
for attr, value in list(locals().items()):
if isinstance(value, type) and issubclass(value, APIView):
name = camelcase_to_underscore(attr)
view = value.as_view()

View File

@@ -24,7 +24,12 @@ import os
import pwd
# PSUtil
import psutil
try:
import psutil
except ImportError:
raise ImportError('psutil is missing; {}bin/pip install psutil'.format(
os.environ['VIRTUAL_ENV']
))
__all__ = []

View File

@@ -27,9 +27,13 @@ import os
import stat
import threading
import uuid
import memcache
from six.moves import xrange
try:
import memcache
except ImportError:
raise ImportError('python-memcached is missing; {}bin/pip install python-memcached'.format(
os.environ['VIRTUAL_ENV']
))
__all__ = ['event_context']
@@ -50,9 +54,8 @@ class IsolatedFileWrite:
filename = '{}-partial.json'.format(event_uuid)
dropoff_location = os.path.join(self.private_data_dir, 'artifacts', 'job_events', filename)
write_location = '.'.join([dropoff_location, 'tmp'])
partial_data = json.dumps(value)
with os.fdopen(os.open(write_location, os.O_WRONLY | os.O_CREAT, stat.S_IRUSR | stat.S_IWUSR), 'w') as f:
f.write(partial_data)
f.write(value)
os.rename(write_location, dropoff_location)
@@ -148,7 +151,7 @@ class EventContext(object):
if event not in ('playbook_on_stats',) and "res" in event_data and len(str(event_data['res'])) > max_res:
event_data['res'] = {}
event_dict = dict(event=event, event_data=event_data)
for key in event_data.keys():
for key in list(event_data.keys()):
if key in ('job_id', 'ad_hoc_command_id', 'project_update_id', 'uuid', 'parent_uuid', 'created',):
event_dict[key] = event_data.pop(key)
elif key in ('verbosity', 'pid'):
@@ -159,11 +162,11 @@ class EventContext(object):
return {}
def dump(self, fileobj, data, max_width=78, flush=False):
b64data = base64.b64encode(json.dumps(data))
b64data = base64.b64encode(json.dumps(data).encode('utf-8')).decode()
with self.display_lock:
# pattern corresponding to OutputEventFilter expectation
fileobj.write(u'\x1b[K')
for offset in xrange(0, len(b64data), max_width):
for offset in range(0, len(b64data), max_width):
chunk = b64data[offset:offset + max_width]
escaped_chunk = u'{}\x1b[{}D'.format(chunk, len(chunk))
fileobj.write(escaped_chunk)
@@ -173,7 +176,7 @@ class EventContext(object):
def dump_begin(self, fileobj):
begin_dict = self.get_begin_dict()
self.cache.set(":1:ev-{}".format(begin_dict['uuid']), begin_dict)
self.cache.set(":1:ev-{}".format(begin_dict['uuid']), json.dumps(begin_dict))
self.dump(fileobj, {'uuid': begin_dict['uuid']})
def dump_end(self, fileobj):

View File

@@ -308,7 +308,8 @@ class BaseCallbackModule(CallbackBase):
if custom_artifact_data:
# create the directory for custom stats artifacts to live in (if it doesn't exist)
custom_artifacts_dir = os.path.join(os.getenv('AWX_PRIVATE_DATA_DIR'), 'artifacts')
os.makedirs(custom_artifacts_dir, mode=stat.S_IXUSR + stat.S_IWUSR + stat.S_IRUSR)
if not os.path.isdir(custom_artifacts_dir):
os.makedirs(custom_artifacts_dir, mode=stat.S_IXUSR + stat.S_IWUSR + stat.S_IRUSR)
custom_artifacts_path = os.path.join(custom_artifacts_dir, 'custom')
with codecs.open(custom_artifacts_path, 'w', encoding='utf-8') as f:
@@ -474,6 +475,15 @@ class BaseCallbackModule(CallbackBase):
with self.capture_event_data('runner_retry', **event_data):
super(BaseCallbackModule, self).v2_runner_retry(result)
def v2_runner_on_start(self, host, task):
event_data = dict(
host=host.get_name(),
task=task
)
with self.capture_event_data('runner_on_start', **event_data):
super(BaseCallbackModule, self).v2_runner_on_start(host, task)
class AWXDefaultCallbackModule(BaseCallbackModule, DefaultCallbackModule):

View File

@@ -5,11 +5,11 @@ from __future__ import absolute_import
from collections import OrderedDict
import json
import mock
import os
import shutil
import sys
import tempfile
from unittest import mock
import pytest

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,7 @@
import os
import sys
import logging
from functools import reduce
# Django
from django.conf import settings
@@ -96,8 +97,6 @@ def check_user_access(user, model_class, action, *args, **kwargs):
Return True if user can perform action against model_class with the
provided parameters.
'''
if 'write' not in getattr(user, 'oauth_scopes', ['write']) and action != 'read':
return False
access_class = access_registry[model_class]
access_instance = access_class(user)
access_method = getattr(access_instance, 'can_%s' % action)
@@ -217,6 +216,15 @@ class BaseAccess(object):
def can_copy(self, obj):
return self.can_add({'reference_obj': obj})
def can_copy_related(self, obj):
'''
can_copy_related() should only be used to check if the user have access to related
many to many credentials in when copying the object. It does not check if the user
has permission for any other related objects. Therefore, when checking if the user
can copy an object, it should always be used in conjunction with can_add()
'''
return True
def can_attach(self, obj, sub_obj, relationship, data,
skip_sub_obj_read_check=False):
if skip_sub_obj_read_check:
@@ -391,21 +399,24 @@ class BaseAccess(object):
return user_capabilities
def get_method_capability(self, method, obj, parent_obj):
if method in ['change']: # 3 args
return self.can_change(obj, {})
elif method in ['delete', 'run_ad_hoc_commands', 'copy']:
access_method = getattr(self, "can_%s" % method)
return access_method(obj)
elif method in ['start']:
return self.can_start(obj, validate_license=False)
elif method in ['attach', 'unattach']: # parent/sub-object call
access_method = getattr(self, "can_%s" % method)
if type(parent_obj) == Team:
relationship = 'parents'
parent_obj = parent_obj.member_role
else:
relationship = 'members'
return access_method(obj, parent_obj, relationship, skip_sub_obj_read_check=True, data={})
try:
if method in ['change']: # 3 args
return self.can_change(obj, {})
elif method in ['delete', 'run_ad_hoc_commands', 'copy']:
access_method = getattr(self, "can_%s" % method)
return access_method(obj)
elif method in ['start']:
return self.can_start(obj, validate_license=False)
elif method in ['attach', 'unattach']: # parent/sub-object call
access_method = getattr(self, "can_%s" % method)
if type(parent_obj) == Team:
relationship = 'parents'
parent_obj = parent_obj.member_role
else:
relationship = 'members'
return access_method(obj, parent_obj, relationship, skip_sub_obj_read_check=True, data={})
except (ParseError, ObjectDoesNotExist):
return False
return False
@@ -512,33 +523,32 @@ class UserAccess(BaseAccess):
# A user can be changed if they are themselves, or by org admins or
# superusers. Change permission implies changing only certain fields
# that a user should be able to edit for themselves.
if not settings.MANAGE_ORGANIZATION_AUTH:
if not settings.MANAGE_ORGANIZATION_AUTH and not self.user.is_superuser:
return False
return bool(self.user == obj or self.can_admin(obj, data))
def user_membership_roles(self, u):
return Role.objects.filter(
content_type=ContentType.objects.get_for_model(Organization),
role_field__in=[
'admin_role', 'member_role',
'execute_role', 'project_admin_role', 'inventory_admin_role',
'credential_admin_role', 'workflow_admin_role',
'notification_admin_role'
],
members=u
)
@staticmethod
def user_organizations(u):
'''
Returns all organizations that count `u` as a member
'''
return Organization.accessible_objects(u, 'member_role')
def is_all_org_admin(self, u):
return not self.user_membership_roles(u).exclude(
ancestors__in=self.user.roles.filter(role_field='admin_role')
'''
returns True if `u` is member of any organization that is
not also an organization that `self.user` admins
'''
return not self.user_organizations(u).exclude(
pk__in=Organization.accessible_pk_qs(self.user, 'admin_role')
).exists()
def user_is_orphaned(self, u):
return not self.user_membership_roles(u).exists()
return not self.user_organizations(u).exists()
@check_superuser
def can_admin(self, obj, data, allow_orphans=False):
if not settings.MANAGE_ORGANIZATION_AUTH:
def can_admin(self, obj, data, allow_orphans=False, check_setting=True):
if check_setting and (not settings.MANAGE_ORGANIZATION_AUTH):
return False
if obj.is_superuser or obj.is_system_auditor:
# must be superuser to admin users with system roles
@@ -566,7 +576,7 @@ class UserAccess(BaseAccess):
return False
def can_attach(self, obj, sub_obj, relationship, *args, **kwargs):
if not settings.MANAGE_ORGANIZATION_AUTH:
if not settings.MANAGE_ORGANIZATION_AUTH and not self.user.is_superuser:
return False
# Reverse obj and sub_obj, defer to RoleAccess if this is a role assignment.
@@ -576,7 +586,7 @@ class UserAccess(BaseAccess):
return super(UserAccess, self).can_attach(obj, sub_obj, relationship, *args, **kwargs)
def can_unattach(self, obj, sub_obj, relationship, *args, **kwargs):
if not settings.MANAGE_ORGANIZATION_AUTH:
if not settings.MANAGE_ORGANIZATION_AUTH and not self.user.is_superuser:
return False
if relationship == 'roles':
@@ -600,7 +610,8 @@ class OAuth2ApplicationAccess(BaseAccess):
select_related = ('user',)
def filtered_queryset(self):
return self.model.objects.filter(organization__in=self.user.organizations)
org_access_qs = Organization.accessible_objects(self.user, 'member_role')
return self.model.objects.filter(organization__in=org_access_qs)
def can_change(self, obj, data):
return self.user.is_superuser or self.check_related('organization', Organization, data, obj=obj,
@@ -742,12 +753,13 @@ class InventoryAccess(BaseAccess):
# If no data is specified, just checking for generic add permission?
if not data:
return Organization.accessible_objects(self.user, 'inventory_admin_role').exists()
return self.check_related('organization', Organization, data, role_field='inventory_admin_role')
return (self.check_related('organization', Organization, data, role_field='inventory_admin_role') and
self.check_related('insights_credential', Credential, data, role_field='use_role'))
@check_superuser
def can_change(self, obj, data):
return self.can_admin(obj, data)
return (self.can_admin(obj, data) and
self.check_related('insights_credential', Credential, data, obj=obj, role_field='use_role'))
@check_superuser
def can_admin(self, obj, data):
@@ -1071,7 +1083,7 @@ class CredentialAccess(BaseAccess):
return True
if data and data.get('user', None):
user_obj = get_object_from_data('user', User, data)
return check_user_access(self.user, User, 'change', user_obj, None)
return bool(self.user == user_obj or UserAccess(self.user).can_admin(user_obj, None, check_setting=False))
if data and data.get('team', None):
team_obj = get_object_from_data('team', Team, data)
return check_user_access(self.user, Team, 'change', team_obj, None)
@@ -1114,6 +1126,9 @@ class TeamAccess(BaseAccess):
select_related = ('created_by', 'modified_by', 'organization',)
def filtered_queryset(self):
if settings.ORG_ADMINS_CAN_SEE_ALL_USERS and \
(self.user.admin_of_organizations.exists() or self.user.auditor_of_organizations.exists()):
return self.model.objects.all()
return self.model.accessible_objects(self.user, 'read_role')
@check_superuser
@@ -1141,13 +1156,10 @@ class TeamAccess(BaseAccess):
def can_attach(self, obj, sub_obj, relationship, *args, **kwargs):
"""Reverse obj and sub_obj, defer to RoleAccess if this is an assignment
of a resource role to the team."""
if not settings.MANAGE_ORGANIZATION_AUTH:
return False
# MANAGE_ORGANIZATION_AUTH setting checked in RoleAccess
if isinstance(sub_obj, Role):
if sub_obj.content_object is None:
raise PermissionDenied(_("The {} role cannot be assigned to a team").format(sub_obj.name))
elif isinstance(sub_obj.content_object, User):
raise PermissionDenied(_("The admin_role for a User cannot be assigned to a team"))
if isinstance(sub_obj.content_object, ResourceMixin):
role_access = RoleAccess(self.user)
@@ -1159,9 +1171,7 @@ class TeamAccess(BaseAccess):
*args, **kwargs)
def can_unattach(self, obj, sub_obj, relationship, *args, **kwargs):
if not settings.MANAGE_ORGANIZATION_AUTH:
return False
# MANAGE_ORGANIZATION_AUTH setting checked in RoleAccess
if isinstance(sub_obj, Role):
if isinstance(sub_obj.content_object, ResourceMixin):
role_access = RoleAccess(self.user)
@@ -1198,13 +1208,14 @@ class ProjectAccess(BaseAccess):
def can_add(self, data):
if not data: # So the browseable API will work
return Organization.accessible_objects(self.user, 'project_admin_role').exists()
return self.check_related('organization', Organization, data, role_field='project_admin_role', mandatory=True)
return (self.check_related('organization', Organization, data, role_field='project_admin_role', mandatory=True) and
self.check_related('credential', Credential, data, role_field='use_role'))
@check_superuser
def can_change(self, obj, data):
if not self.check_related('organization', Organization, data, obj=obj, role_field='project_admin_role'):
return False
return self.user in obj.admin_role
return (self.check_related('organization', Organization, data, obj=obj, role_field='project_admin_role') and
self.user in obj.admin_role and
self.check_related('credential', Credential, data, obj=obj, role_field='use_role'))
@check_superuser
def can_start(self, obj, validate_license=True):
@@ -1264,6 +1275,7 @@ class JobTemplateAccess(BaseAccess):
'instance_groups',
'credentials__credential_type',
Prefetch('labels', queryset=Label.objects.all().order_by('name')),
Prefetch('last_job', queryset=UnifiedJob.objects.non_polymorphic()),
)
def filtered_queryset(self):
@@ -1320,6 +1332,17 @@ class JobTemplateAccess(BaseAccess):
return self.user in project.use_role
else:
return False
@check_superuser
def can_copy_related(self, obj):
'''
Check if we have access to all the credentials related to Job Templates.
Does not verify the user's permission for any other related fields (projects, inventories, etc).
'''
# obj.credentials.all() is accessible ONLY when object is saved (has valid id)
credential_manager = getattr(obj, 'credentials', None) if getattr(obj, 'id', False) else Credentials.objects.none()
return reduce(lambda prev, cred: prev and self.user in cred.use_role, credential_manager.all(), True)
def can_start(self, obj, validate_license=True):
# Check license.
@@ -1366,12 +1389,15 @@ class JobTemplateAccess(BaseAccess):
'job_tags', 'force_handlers', 'skip_tags', 'ask_variables_on_launch',
'ask_tags_on_launch', 'ask_job_type_on_launch', 'ask_skip_tags_on_launch',
'ask_inventory_on_launch', 'ask_credential_on_launch', 'survey_enabled',
'custom_virtualenv', 'diff_mode', 'timeout', 'job_slice_count',
# These fields are ignored, but it is convenient for QA to allow clients to post them
'last_job_run', 'created', 'modified',
]
for k, v in data.items():
if k not in [x.name for x in obj._meta.concrete_fields]:
continue
if hasattr(obj, k) and getattr(obj, k) != v:
if k not in field_whitelist and v != getattr(obj, '%s_id' % k, None) \
and not (hasattr(obj, '%s_id' % k) and getattr(obj, '%s_id' % k) is None and v == ''): # Equate '' to None in the case of foreign keys
@@ -1487,7 +1513,7 @@ class JobAccess(BaseAccess):
# Obtain prompts used to start original job
JobLaunchConfig = obj._meta.get_field('launch_config').related_model
try:
config = obj.launch_config
config = JobLaunchConfig.objects.prefetch_related('credentials').get(job=obj)
except JobLaunchConfig.DoesNotExist:
config = None
@@ -1495,6 +1521,12 @@ class JobAccess(BaseAccess):
if obj.job_template is not None:
if config is None:
prompts_access = False
elif not config.has_user_prompts(obj.job_template):
prompts_access = True
elif obj.created_by_id != self.user.pk:
prompts_access = False
if self.save_messages:
self.messages['detail'] = _('Job was launched with prompts provided by another user.')
else:
prompts_access = (
JobLaunchConfigAccess(self.user).can_add({'reference_obj': config}) and
@@ -1506,13 +1538,13 @@ class JobAccess(BaseAccess):
elif not jt_access:
return False
org_access = obj.inventory and self.user in obj.inventory.organization.inventory_admin_role
org_access = bool(obj.inventory) and self.user in obj.inventory.organization.inventory_admin_role
project_access = obj.project is None or self.user in obj.project.admin_role
credential_access = all([self.user in cred.use_role for cred in obj.credentials.all()])
# job can be relaunched if user could make an equivalent JT
ret = org_access and credential_access and project_access
if not ret and self.save_messages:
if not ret and self.save_messages and not self.messages:
if not obj.job_template:
pretext = _('Job has been orphaned from its job template.')
elif config is None:
@@ -1621,7 +1653,7 @@ class JobLaunchConfigAccess(BaseAccess):
if isinstance(sub_obj, Credential) and relationship == 'credentials':
return self.user in sub_obj.use_role
else:
raise NotImplemented('Only credentials can be attached to launch configurations.')
raise NotImplementedError('Only credentials can be attached to launch configurations.')
def can_unattach(self, obj, sub_obj, relationship, data, skip_sub_obj_read_check=False):
if isinstance(sub_obj, Credential) and relationship == 'credentials':
@@ -1630,7 +1662,7 @@ class JobLaunchConfigAccess(BaseAccess):
else:
return self.user in sub_obj.read_role
else:
raise NotImplemented('Only credentials can be attached to launch configurations.')
raise NotImplementedError('Only credentials can be attached to launch configurations.')
class WorkflowJobTemplateNodeAccess(BaseAccess):
@@ -1719,7 +1751,7 @@ class WorkflowJobTemplateNodeAccess(BaseAccess):
elif relationship in ('success_nodes', 'failure_nodes', 'always_nodes'):
return self.check_same_WFJT(obj, sub_obj)
else:
raise NotImplemented('Relationship {} not understood for WFJT nodes.'.format(relationship))
raise NotImplementedError('Relationship {} not understood for WFJT nodes.'.format(relationship))
def can_unattach(self, obj, sub_obj, relationship, data, skip_sub_obj_read_check=False):
if not self.wfjt_admin(obj):
@@ -1734,7 +1766,7 @@ class WorkflowJobTemplateNodeAccess(BaseAccess):
elif relationship in ('success_nodes', 'failure_nodes', 'always_nodes'):
return self.check_same_WFJT(obj, sub_obj)
else:
raise NotImplemented('Relationship {} not understood for WFJT nodes.'.format(relationship))
raise NotImplementedError('Relationship {} not understood for WFJT nodes.'.format(relationship))
class WorkflowJobNodeAccess(BaseAccess):
@@ -1754,7 +1786,7 @@ class WorkflowJobNodeAccess(BaseAccess):
def filtered_queryset(self):
return self.model.objects.filter(
workflow_job__workflow_job_template__in=WorkflowJobTemplate.accessible_objects(
workflow_job__unified_job_template__in=UnifiedJobTemplate.accessible_pk_qs(
self.user, 'read_role'))
@check_superuser
@@ -1805,8 +1837,10 @@ class WorkflowJobTemplateAccess(BaseAccess):
if 'survey_enabled' in data and data['survey_enabled']:
self.check_license(feature='surveys')
return self.check_related('organization', Organization, data, role_field='workflow_admin_role',
mandatory=True)
return (
self.check_related('organization', Organization, data, role_field='workflow_admin_role', mandatory=True) and
self.check_related('inventory', Inventory, data, role_field='use_role')
)
def can_copy(self, obj):
if self.save_messages:
@@ -1814,13 +1848,14 @@ class WorkflowJobTemplateAccess(BaseAccess):
missing_credentials = []
missing_inventories = []
qs = obj.workflow_job_template_nodes
qs = qs.prefetch_related('unified_job_template', 'inventory__use_role', 'credential__use_role')
qs = qs.prefetch_related('unified_job_template', 'inventory__use_role', 'credentials__use_role')
for node in qs.all():
node_errors = {}
if node.inventory and self.user not in node.inventory.use_role:
missing_inventories.append(node.inventory.name)
if node.credential and self.user not in node.credential.use_role:
missing_credentials.append(node.credential.name)
for cred in node.credentials.all():
if self.user not in cred.use_role:
missing_credentials.append(cred.name)
ujt = node.unified_job_template
if ujt and not self.user.can_access(UnifiedJobTemplate, 'start', ujt, validate_license=False):
missing_ujt.append(ujt.name)
@@ -1859,8 +1894,11 @@ class WorkflowJobTemplateAccess(BaseAccess):
if self.user.is_superuser:
return True
return (self.check_related('organization', Organization, data, role_field='workflow_admin_role', obj=obj) and
self.user in obj.admin_role)
return (
self.check_related('organization', Organization, data, role_field='workflow_admin_role', obj=obj) and
self.check_related('inventory', Inventory, data, role_field='use_role', obj=obj) and
self.user in obj.admin_role
)
def can_delete(self, obj):
return self.user.is_superuser or self.user in obj.admin_role
@@ -1879,7 +1917,7 @@ class WorkflowJobAccess(BaseAccess):
def filtered_queryset(self):
return WorkflowJob.objects.filter(
workflow_job_template__in=WorkflowJobTemplate.accessible_objects(
unified_job_template__in=UnifiedJobTemplate.accessible_pk_qs(
self.user, 'read_role'))
def can_add(self, data):
@@ -1911,20 +1949,42 @@ class WorkflowJobAccess(BaseAccess):
if self.user.is_superuser:
return True
wfjt = obj.workflow_job_template
template = obj.workflow_job_template
if not template and obj.job_template_id:
template = obj.job_template
# only superusers can relaunch orphans
if not wfjt:
if not template:
return False
# Obtain prompts used to start original job
JobLaunchConfig = obj._meta.get_field('launch_config').related_model
try:
config = JobLaunchConfig.objects.get(job=obj)
except JobLaunchConfig.DoesNotExist:
if self.save_messages:
self.messages['detail'] = _('Workflow Job was launched with unknown prompts.')
return False
# Check if access to prompts to prevent relaunch
if config.prompts_dict():
if obj.created_by_id != self.user.pk:
if self.save_messages:
self.messages['detail'] = _('Job was launched with prompts provided by another user.')
return False
if not JobLaunchConfigAccess(self.user).can_add({'reference_obj': config}):
if self.save_messages:
self.messages['detail'] = _('Job was launched with prompts you lack access to.')
return False
if config.has_unprompted(template):
if self.save_messages:
self.messages['detail'] = _('Job was launched with prompts no longer accepted.')
return False
# execute permission to WFJT is mandatory for any relaunch
if self.user not in wfjt.execute_role:
return False
# user's WFJT access doesn't guarentee permission to launch, introspect nodes
return self.can_recreate(obj)
return (self.user in template.execute_role)
def can_recreate(self, obj):
node_qs = obj.workflow_job_nodes.all().prefetch_related('inventory', 'credential', 'unified_job_template')
node_qs = obj.workflow_job_nodes.all().prefetch_related('inventory', 'credentials', 'unified_job_template')
node_access = WorkflowJobNodeAccess(user=self.user)
wj_add_perm = True
for node in node_qs:
@@ -2340,9 +2400,7 @@ class LabelAccess(BaseAccess):
prefetch_related = ('modified_by', 'created_by', 'organization',)
def filtered_queryset(self):
return self.model.objects.filter(
organization__in=Organization.accessible_pk_qs(self.user, 'read_role')
)
return self.model.objects.all()
@check_superuser
def can_read(self, obj):
@@ -2506,14 +2564,13 @@ class RoleAccess(BaseAccess):
# Unsupported for now
return False
def can_attach(self, obj, sub_obj, relationship, data,
skip_sub_obj_read_check=False):
return self.can_unattach(obj, sub_obj, relationship, data, skip_sub_obj_read_check)
def can_attach(self, obj, sub_obj, relationship, *args, **kwargs):
return self.can_unattach(obj, sub_obj, relationship, *args, **kwargs)
@check_superuser
def can_unattach(self, obj, sub_obj, relationship, data=None, skip_sub_obj_read_check=False):
if isinstance(obj.content_object, Team):
if not settings.MANAGE_ORGANIZATION_AUTH:
if not settings.MANAGE_ORGANIZATION_AUTH and not self.user.is_superuser:
return False
if not skip_sub_obj_read_check and relationship in ['members', 'member_role.parents', 'parents']:
@@ -2529,7 +2586,11 @@ class RoleAccess(BaseAccess):
# administrators of that Organization the ability to edit that user. To prevent
# unwanted escalations lets ensure that the Organization administartor has the abilty
# to admin the user being added to the role.
if isinstance(obj.content_object, Organization) and obj.role_field in ['member_role', 'admin_role']:
if (isinstance(obj.content_object, Organization) and
obj.role_field in (Organization.member_role.field.parent_role + ['member_role'])):
if not isinstance(sub_obj, User):
logger.error('Unexpected attempt to associate {} with organization role.'.format(sub_obj))
return False
if not UserAccess(self.user).can_admin(sub_obj, None, allow_orphans=True):
return False

View File

@@ -38,7 +38,8 @@ register(
'ORG_ADMINS_CAN_SEE_ALL_USERS',
field_class=fields.BooleanField,
label=_('All Users Visible to Organization Admins'),
help_text=_('Controls whether any Organization Admin can view all users, even those not associated with their Organization.'),
help_text=_('Controls whether any Organization Admin can view all users and teams, '
'even those not associated with their Organization.'),
category=_('System'),
category_slug='system',
)
@@ -81,7 +82,7 @@ register(
help_text=_('HTTP headers and meta keys to search to determine remote host '
'name or IP. Add additional items to this list, such as '
'"HTTP_X_FORWARDED_FOR", if behind a reverse proxy. '
'See the "Proxy Support" section of the Adminstrator guide for'
'See the "Proxy Support" section of the Adminstrator guide for '
'more details.'),
category=_('System'),
category_slug='system',
@@ -196,6 +197,18 @@ register(
category_slug='jobs',
)
register(
'AWX_ISOLATED_VERBOSITY',
field_class=fields.IntegerField,
min_value=0,
max_value=5,
label=_('Verbosity level for isolated node management tasks'),
help_text=_('This can be raised to aid in debugging connection issues for isolated task execution'),
category=_('Jobs'),
category_slug='jobs',
default=0
)
register(
'AWX_ISOLATED_CHECK_INTERVAL',
field_class=fields.IntegerField,
@@ -277,6 +290,16 @@ register(
placeholder={'HTTP_PROXY': 'myproxy.local:8080'},
)
register(
'AWX_ROLES_ENABLED',
field_class=fields.BooleanField,
default=True,
label=_('Enable Role Download'),
help_text=_('Allows roles to be dynamically downloaded from a requirements.yml file for SCM projects.'),
category=_('Jobs'),
category_slug='jobs',
)
register(
'STDOUT_MAX_BYTES_DISPLAY',
field_class=fields.IntegerField,
@@ -472,10 +495,12 @@ register(
register(
'LOG_AGGREGATOR_PROTOCOL',
field_class=fields.ChoiceField,
choices=[('https', 'HTTPS'), ('tcp', 'TCP'), ('udp', 'UDP')],
choices=[('https', 'HTTPS/HTTP'), ('tcp', 'TCP'), ('udp', 'UDP')],
default='https',
label=_('Logging Aggregator Protocol'),
help_text=_('Protocol used to communicate with log aggregator.'),
help_text=_('Protocol used to communicate with log aggregator. '
'HTTPS/HTTP assumes HTTPS unless http:// is explicitly used in '
'the Logging Aggregator hostname.'),
category=_('Logging'),
category_slug='logging',
)

View File

@@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
__all__ = [
'CLOUD_PROVIDERS', 'SCHEDULEABLE_PROVIDERS', 'PRIVILEGE_ESCALATION_METHODS',
'ANSI_SGR_PATTERN', 'CAN_CANCEL', 'ACTIVE_STATES'
'ANSI_SGR_PATTERN', 'CAN_CANCEL', 'ACTIVE_STATES', 'STANDARD_INVENTORY_UPDATE_ENV'
]
@@ -20,6 +20,20 @@ PRIVILEGE_ESCALATION_METHODS = [
]
CHOICES_PRIVILEGE_ESCALATION_METHODS = [('', _('None'))] + PRIVILEGE_ESCALATION_METHODS
ANSI_SGR_PATTERN = re.compile(r'\x1b\[[0-9;]*m')
STANDARD_INVENTORY_UPDATE_ENV = {
# Failure to parse inventory should always be fatal
'ANSIBLE_INVENTORY_UNPARSED_FAILED': 'True',
# Always use the --export option for ansible-inventory
'ANSIBLE_INVENTORY_EXPORT': 'True'
}
CAN_CANCEL = ('new', 'pending', 'waiting', 'running')
ACTIVE_STATES = CAN_CANCEL
TOKEN_CENSOR = '************'
CENSOR_VALUE = '************'
ENV_BLACKLIST = frozenset((
'VIRTUAL_ENV', 'PATH', 'PYTHONPATH', 'PROOT_TMP_DIR', 'JOB_ID',
'INVENTORY_ID', 'INVENTORY_SOURCE_ID', 'INVENTORY_UPDATE_ID',
'AD_HOC_COMMAND_ID', 'REST_API_URL', 'REST_API_TOKEN', 'MAX_EVENT_RES',
'CALLBACK_QUEUE', 'CALLBACK_CONNECTION', 'CACHE',
'JOB_CALLBACK_DEBUG', 'INVENTORY_HOSTVARS', 'FACT_QUEUE',
'AWX_HOST', 'PROJECT_REVISION'
))

View File

@@ -4,10 +4,13 @@ import logging
from channels import Group
from channels.auth import channel_session_user_from_http, channel_session_user
from django.utils.encoding import smart_str
from django.http.cookie import parse_cookie
from django.core.serializers.json import DjangoJSONEncoder
logger = logging.getLogger('awx.main.consumers')
XRF_KEY = '_auth_user_xrf'
def discard_groups(message):
@@ -18,12 +21,20 @@ def discard_groups(message):
@channel_session_user_from_http
def ws_connect(message):
headers = dict(message.content.get('headers', ''))
message.reply_channel.send({"accept": True})
message.content['method'] = 'FAKE'
if message.user.is_authenticated():
message.reply_channel.send(
{"text": json.dumps({"accept": True, "user": message.user.id})}
)
# store the valid CSRF token from the cookie so we can compare it later
# on ws_receive
cookie_token = parse_cookie(
smart_str(headers.get(b'cookie'))
).get('csrftoken')
if cookie_token:
message.channel_session[XRF_KEY] = cookie_token
else:
logger.error("Request user is not authenticated to use websocket.")
message.reply_channel.send({"close": True})
@@ -42,6 +53,20 @@ def ws_receive(message):
raw_data = message.content['text']
data = json.loads(raw_data)
xrftoken = data.get('xrftoken')
if (
not xrftoken or
XRF_KEY not in message.channel_session or
xrftoken != message.channel_session[XRF_KEY]
):
logger.error(
"access denied to channel, XRF mismatch for {}".format(user.username)
)
message.reply_channel.send({
"text": json.dumps({"error": "access denied to channel"})
})
return
if 'groups' in data:
discard_groups(message)
groups = data['groups']

View File

@@ -0,0 +1,5 @@
from django.conf import settings
def get_local_queuename():
return settings.CLUSTER_HOST_ID

View File

@@ -0,0 +1,58 @@
import logging
import socket
from django.conf import settings
from awx.main.dispatch import get_local_queuename
from kombu import Connection, Queue, Exchange, Producer, Consumer
logger = logging.getLogger('awx.main.dispatch')
class Control(object):
services = ('dispatcher', 'callback_receiver')
result = None
def __init__(self, service, host=None):
if service not in self.services:
raise RuntimeError('{} must be in {}'.format(service, self.services))
self.service = service
self.queuename = host or get_local_queuename()
self.queue = Queue(self.queuename, Exchange(self.queuename), routing_key=self.queuename)
def publish(self, msg, conn, **kwargs):
producer = Producer(
exchange=self.queue.exchange,
channel=conn,
routing_key=self.queuename
)
producer.publish(msg, expiration=5, **kwargs)
def status(self, *args, **kwargs):
return self.control_with_reply('status', *args, **kwargs)
def running(self, *args, **kwargs):
return self.control_with_reply('running', *args, **kwargs)
def control_with_reply(self, command, timeout=5):
logger.warn('checking {} {} for {}'.format(self.service, command, self.queuename))
reply_queue = Queue(name="amq.rabbitmq.reply-to")
self.result = None
with Connection(settings.BROKER_URL) as conn:
with Consumer(conn, reply_queue, callbacks=[self.process_message], no_ack=True):
self.publish({'control': command}, conn, reply_to='amq.rabbitmq.reply-to')
try:
conn.drain_events(timeout=timeout)
except socket.timeout:
logger.error('{} did not reply within {}s'.format(self.service, timeout))
raise
return self.result
def control(self, msg, **kwargs):
with Connection(settings.BROKER_URL) as conn:
self.publish(msg, conn)
def process_message(self, body, message):
self.result = body
message.ack()

406
awx/main/dispatch/pool.py Normal file
View File

@@ -0,0 +1,406 @@
import logging
import os
import random
import traceback
from uuid import uuid4
import collections
from multiprocessing import Process
from multiprocessing import Queue as MPQueue
from queue import Full as QueueFull, Empty as QueueEmpty
from django.conf import settings
from django.db import connection as django_connection, connections
from django.core.cache import cache as django_cache
from jinja2 import Template
import psutil
from awx.main.models import UnifiedJob
from awx.main.dispatch import reaper
logger = logging.getLogger('awx.main.dispatch')
class PoolWorker(object):
'''
Used to track a worker child process and its pending and finished messages.
This class makes use of two distinct multiprocessing.Queues to track state:
- self.queue: this is a queue which represents pending messages that should
be handled by this worker process; as new AMQP messages come
in, a pool will put() them into this queue; the child
process that is forked will get() from this queue and handle
received messages in an endless loop
- self.finished: this is a queue which the worker process uses to signal
that it has finished processing a message
When a message is put() onto this worker, it is tracked in
self.managed_tasks.
Periodically, the worker will call .calculate_managed_tasks(), which will
cause messages in self.finished to be removed from self.managed_tasks.
In this way, self.managed_tasks represents a view of the messages assigned
to a specific process. The message at [0] is the least-recently inserted
message, and it represents what the worker is running _right now_
(self.current_task).
A worker is "busy" when it has at least one message in self.managed_tasks.
It is "idle" when self.managed_tasks is empty.
'''
def __init__(self, queue_size, target, args):
self.messages_sent = 0
self.messages_finished = 0
self.managed_tasks = collections.OrderedDict()
self.finished = MPQueue(queue_size)
self.queue = MPQueue(queue_size)
self.process = Process(target=target, args=(self.queue, self.finished) + args)
self.process.daemon = True
def start(self):
self.process.start()
def put(self, body):
uuid = '?'
if isinstance(body, dict):
if not body.get('uuid'):
body['uuid'] = str(uuid4())
uuid = body['uuid']
logger.debug('delivered {} to worker[{}] qsize {}'.format(
uuid, self.pid, self.qsize
))
self.managed_tasks[uuid] = body
self.queue.put(body, block=True, timeout=5)
self.messages_sent += 1
self.calculate_managed_tasks()
def quit(self):
'''
Send a special control message to the worker that tells it to exit
gracefully.
'''
self.queue.put('QUIT')
@property
def pid(self):
return self.process.pid
@property
def qsize(self):
return self.queue.qsize()
@property
def alive(self):
return self.process.is_alive()
@property
def mb(self):
if self.alive:
return '{:0.3f}'.format(
psutil.Process(self.pid).memory_info().rss / 1024.0 / 1024.0
)
return '0'
@property
def exitcode(self):
return str(self.process.exitcode)
def calculate_managed_tasks(self):
# look to see if any tasks were finished
finished = []
for _ in range(self.finished.qsize()):
try:
finished.append(self.finished.get(block=False))
except QueueEmpty:
break # qsize is not always _totally_ up to date
# if any tasks were finished, removed them from the managed tasks for
# this worker
for uuid in finished:
self.messages_finished += 1
del self.managed_tasks[uuid]
@property
def current_task(self):
self.calculate_managed_tasks()
# the task at [0] is the one that's running right now (or is about to
# be running)
if len(self.managed_tasks):
return self.managed_tasks[list(self.managed_tasks.keys())[0]]
return None
@property
def orphaned_tasks(self):
orphaned = []
if not self.alive:
# if this process had a running task that never finished,
# requeue its error callbacks
current_task = self.current_task
if isinstance(current_task, dict):
orphaned.extend(current_task.get('errbacks', []))
# if this process has any pending messages requeue them
for _ in range(self.qsize):
try:
message = self.queue.get(block=False)
if message != 'QUIT':
orphaned.append(message)
except QueueEmpty:
break # qsize is not always _totally_ up to date
if len(orphaned):
logger.error(
'requeuing {} messages from gone worker pid:{}'.format(
len(orphaned), self.pid
)
)
return orphaned
@property
def busy(self):
self.calculate_managed_tasks()
return len(self.managed_tasks) > 0
@property
def idle(self):
return not self.busy
class WorkerPool(object):
'''
Creates a pool of forked PoolWorkers.
As WorkerPool.write(...) is called (generally, by a kombu consumer
implementation when it receives an AMQP message), messages are passed to
one of the multiprocessing Queues where some work can be done on them.
class MessagePrinter(awx.main.dispatch.worker.BaseWorker):
def perform_work(self, body):
print(body)
pool = WorkerPool(min_workers=4) # spawn four worker processes
pool.init_workers(MessagePrint().work_loop)
pool.write(
0, # preferred worker 0
'Hello, World!'
)
'''
debug_meta = ''
def __init__(self, min_workers=None, queue_size=None):
self.name = settings.CLUSTER_HOST_ID
self.pid = os.getpid()
self.min_workers = min_workers or settings.JOB_EVENT_WORKERS
self.queue_size = queue_size or settings.JOB_EVENT_MAX_QUEUE_SIZE
self.workers = []
def __len__(self):
return len(self.workers)
def init_workers(self, target, *target_args):
self.target = target
self.target_args = target_args
for idx in range(self.min_workers):
self.up()
def up(self):
idx = len(self.workers)
# It's important to close these because we're _about_ to fork, and we
# don't want the forked processes to inherit the open sockets
# for the DB and memcached connections (that way lies race conditions)
django_connection.close()
django_cache.close()
worker = PoolWorker(self.queue_size, self.target, (idx,) + self.target_args)
self.workers.append(worker)
try:
worker.start()
except Exception:
logger.exception('could not fork')
else:
logger.warn('scaling up worker pid:{}'.format(worker.pid))
return idx, worker
def debug(self, *args, **kwargs):
self.cleanup()
tmpl = Template(
'{{ pool.name }}[pid:{{ pool.pid }}] workers total={{ workers|length }} {{ meta }} \n'
'{% for w in workers %}'
'. worker[pid:{{ w.pid }}]{% if not w.alive %} GONE exit={{ w.exitcode }}{% endif %}'
' sent={{ w.messages_sent }}'
' finished={{ w.messages_finished }}'
' qsize={{ w.managed_tasks|length }}'
' rss={{ w.mb }}MB'
'{% for task in w.managed_tasks.values() %}'
'\n - {% if loop.index0 == 0 %}running {% else %}queued {% endif %}'
'{{ task["uuid"] }} '
'{% if "task" in task %}'
'{{ task["task"].rsplit(".", 1)[-1] }}'
# don't print kwargs, they often contain launch-time secrets
'(*{{ task.get("args", []) }})'
'{% endif %}'
'{% endfor %}'
'{% if not w.managed_tasks|length %}'
' [IDLE]'
'{% endif %}'
'\n'
'{% endfor %}'
)
return tmpl.render(pool=self, workers=self.workers, meta=self.debug_meta)
def write(self, preferred_queue, body):
queue_order = sorted(range(len(self.workers)), key=lambda x: -1 if x==preferred_queue else x)
write_attempt_order = []
for queue_actual in queue_order:
try:
self.workers[queue_actual].put(body)
return queue_actual
except QueueFull:
pass
except Exception:
tb = traceback.format_exc()
logger.warn("could not write to queue %s" % preferred_queue)
logger.warn("detail: {}".format(tb))
write_attempt_order.append(preferred_queue)
logger.warn("could not write payload to any queue, attempted order: {}".format(write_attempt_order))
return None
def stop(self, signum):
try:
for worker in self.workers:
os.kill(worker.pid, signum)
except Exception:
logger.exception('could not kill {}'.format(worker.pid))
class AutoscalePool(WorkerPool):
'''
An extended pool implementation that automatically scales workers up and
down based on demand
'''
def __init__(self, *args, **kwargs):
self.max_workers = kwargs.pop('max_workers', None)
super(AutoscalePool, self).__init__(*args, **kwargs)
if self.max_workers is None:
settings_absmem = getattr(settings, 'SYSTEM_TASK_ABS_MEM', None)
if settings_absmem is not None:
total_memory_gb = int(settings_absmem)
else:
total_memory_gb = (psutil.virtual_memory().total >> 30) + 1 # noqa: round up
# 5 workers per GB of total memory
self.max_workers = (total_memory_gb * 5)
# max workers can't be less than min_workers
self.max_workers = max(self.min_workers, self.max_workers)
@property
def should_grow(self):
if len(self.workers) < self.min_workers:
# If we don't have at least min_workers, add more
return True
# If every worker is busy doing something, add more
return all([w.busy for w in self.workers])
@property
def full(self):
return len(self.workers) == self.max_workers
@property
def debug_meta(self):
return 'min={} max={}'.format(self.min_workers, self.max_workers)
def cleanup(self):
"""
Perform some internal account and cleanup. This is run on
every cluster node heartbeat:
1. Discover worker processes that exited, and recover messages they
were handling.
2. Clean up unnecessary, idle workers.
3. Check to see if the database says this node is running any tasks
that aren't actually running. If so, reap them.
IMPORTANT: this function is one of the few places in the dispatcher
(aside from setting lookups) where we talk to the database. As such,
if there's an outage, this method _can_ throw various
django.db.utils.Error exceptions. Act accordingly.
"""
orphaned = []
for w in self.workers[::]:
if not w.alive:
# the worker process has exited
# 1. take the task it was running and enqueue the error
# callbacks
# 2. take any pending tasks delivered to its queue and
# send them to another worker
logger.error('worker pid:{} is gone (exit={})'.format(w.pid, w.exitcode))
if w.current_task:
if w.current_task != 'QUIT':
try:
for j in UnifiedJob.objects.filter(celery_task_id=w.current_task['uuid']):
reaper.reap_job(j, 'failed')
except Exception:
logger.exception('failed to reap job UUID {}'.format(w.current_task['uuid']))
orphaned.extend(w.orphaned_tasks)
self.workers.remove(w)
elif w.idle and len(self.workers) > self.min_workers:
# the process has an empty queue (it's idle) and we have
# more processes in the pool than we need (> min)
# send this process a message so it will exit gracefully
# at the next opportunity
logger.warn('scaling down worker pid:{}'.format(w.pid))
w.quit()
self.workers.remove(w)
for m in orphaned:
# if all the workers are dead, spawn at least one
if not len(self.workers):
self.up()
idx = random.choice(range(len(self.workers)))
self.write(idx, m)
# if the database says a job is running on this node, but it's *not*,
# then reap it
running_uuids = []
for worker in self.workers:
worker.calculate_managed_tasks()
running_uuids.extend(list(worker.managed_tasks.keys()))
reaper.reap(excluded_uuids=running_uuids)
def up(self):
if self.full:
# if we can't spawn more workers, just toss this message into a
# random worker's backlog
idx = random.choice(range(len(self.workers)))
return idx, self.workers[idx]
else:
return super(AutoscalePool, self).up()
def write(self, preferred_queue, body):
try:
# when the cluster heartbeat occurs, clean up internally
if isinstance(body, dict) and 'cluster_node_heartbeat' in body['task']:
self.cleanup()
if self.should_grow:
self.up()
# we don't care about "preferred queue" round robin distribution, just
# find the first non-busy worker and claim it
workers = self.workers[:]
random.shuffle(workers)
for w in workers:
if not w.busy:
w.put(body)
break
else:
return super(AutoscalePool, self).write(preferred_queue, body)
except Exception:
for conn in connections.all():
# If the database connection has a hiccup, re-establish a new
# connection
conn.close_if_unusable_or_obsolete()
logger.exception('failed to write inbound message')

View File

@@ -0,0 +1,128 @@
import inspect
import logging
import sys
from uuid import uuid4
from django.conf import settings
from kombu import Connection, Exchange, Producer
logger = logging.getLogger('awx.main.dispatch')
def serialize_task(f):
return '.'.join([f.__module__, f.__name__])
class task:
"""
Used to decorate a function or class so that it can be run asynchronously
via the task dispatcher. Tasks can be simple functions:
@task()
def add(a, b):
return a + b
...or classes that define a `run` method:
@task()
class Adder:
def run(self, a, b):
return a + b
# Tasks can be run synchronously...
assert add(1, 1) == 2
assert Adder().run(1, 1) == 2
# ...or published to a queue:
add.apply_async([1, 1])
Adder.apply_async([1, 1])
# Tasks can also define a specific target queue or exchange type:
@task(queue='slow-tasks')
def snooze():
time.sleep(10)
@task(queue='tower_broadcast', exchange_type='fanout')
def announce():
print("Run this everywhere!")
"""
def __init__(self, queue=None, exchange_type=None):
self.queue = queue
self.exchange_type = exchange_type
def __call__(self, fn=None):
queue = self.queue
exchange_type = self.exchange_type
class PublisherMixin(object):
queue = None
@classmethod
def delay(cls, *args, **kwargs):
return cls.apply_async(args, kwargs)
@classmethod
def apply_async(cls, args=None, kwargs=None, queue=None, uuid=None, **kw):
task_id = uuid or str(uuid4())
args = args or []
kwargs = kwargs or {}
queue = (
queue or
getattr(cls.queue, 'im_func', cls.queue) or
settings.CELERY_DEFAULT_QUEUE
)
obj = {
'uuid': task_id,
'args': args,
'kwargs': kwargs,
'task': cls.name
}
obj.update(**kw)
if callable(queue):
queue = queue()
if not settings.IS_TESTING(sys.argv):
with Connection(settings.BROKER_URL) as conn:
exchange = Exchange(queue, type=exchange_type or 'direct')
producer = Producer(conn)
logger.debug('publish {}({}, queue={})'.format(
cls.name,
task_id,
queue
))
producer.publish(obj,
serializer='json',
compression='bzip2',
exchange=exchange,
declare=[exchange],
delivery_mode="persistent",
routing_key=queue)
return (obj, queue)
# If the object we're wrapping *is* a class (e.g., RunJob), return
# a *new* class that inherits from the wrapped class *and* BaseTask
# In this way, the new class returned by our decorator is the class
# being decorated *plus* PublisherMixin so cls.apply_async() and
# cls.delay() work
bases = []
ns = {'name': serialize_task(fn), 'queue': queue}
if inspect.isclass(fn):
bases = list(fn.__bases__)
ns.update(fn.__dict__)
cls = type(
fn.__name__,
tuple(bases + [PublisherMixin]),
ns
)
if inspect.isclass(fn):
return cls
# if the object being decorated is *not* a class (it's a Python
# function), make fn.apply_async and fn.delay proxy through to the
# PublisherMixin we dynamically created above
setattr(fn, 'name', cls.name)
setattr(fn, 'apply_async', cls.apply_async)
setattr(fn, 'delay', cls.delay)
return fn

View File

@@ -0,0 +1,49 @@
from datetime import timedelta
import logging
from django.db.models import Q
from django.utils.timezone import now as tz_now
from django.contrib.contenttypes.models import ContentType
from awx.main.models import Instance, UnifiedJob, WorkflowJob
logger = logging.getLogger('awx.main.dispatch')
def reap_job(j, status):
if UnifiedJob.objects.get(id=j.id).status not in ('running', 'waiting'):
# just in case, don't reap jobs that aren't running
return
j.status = status
j.start_args = '' # blank field to remove encrypted passwords
j.job_explanation += ' '.join((
'Task was marked as running in Tower but was not present in',
'the job queue, so it has been marked as failed.',
))
j.save(update_fields=['status', 'start_args', 'job_explanation'])
if hasattr(j, 'send_notification_templates'):
j.send_notification_templates('failed')
j.websocket_emit_status(status)
logger.error(
'{} is no longer running; reaping'.format(j.log_format)
)
def reap(instance=None, status='failed', excluded_uuids=[]):
'''
Reap all jobs in waiting|running for this instance.
'''
me = instance or Instance.objects.me()
now = tz_now()
workflow_ctype_id = ContentType.objects.get_for_model(WorkflowJob).id
jobs = UnifiedJob.objects.filter(
(
Q(status='running') |
Q(status='waiting', modified__lte=now - timedelta(seconds=60))
) & (
Q(execution_node=me.hostname) |
Q(controller_node=me.hostname)
) & ~Q(polymorphic_ctype_id=workflow_ctype_id)
).exclude(celery_task_id__in=excluded_uuids)
for j in jobs:
reap_job(j, status)

View File

@@ -0,0 +1,3 @@
from .base import AWXConsumer, BaseWorker # noqa
from .callback import CallbackBrokerWorker # noqa
from .task import TaskWorker # noqa

View File

@@ -0,0 +1,155 @@
# Copyright (c) 2018 Ansible by Red Hat
# All Rights Reserved.
import os
import logging
import signal
from uuid import UUID
from queue import Empty as QueueEmpty
from django import db
from kombu import Producer
from kombu.mixins import ConsumerMixin
from awx.main.dispatch.pool import WorkerPool
logger = logging.getLogger('awx.main.dispatch')
def signame(sig):
return dict(
(k, v) for v, k in signal.__dict__.items()
if v.startswith('SIG') and not v.startswith('SIG_')
)[sig]
class WorkerSignalHandler:
def __init__(self):
self.kill_now = False
signal.signal(signal.SIGINT, self.exit_gracefully)
def exit_gracefully(self, *args, **kwargs):
self.kill_now = True
class AWXConsumer(ConsumerMixin):
def __init__(self, name, connection, worker, queues=[], pool=None):
self.connection = connection
self.total_messages = 0
self.queues = queues
self.worker = worker
self.pool = pool
if pool is None:
self.pool = WorkerPool()
self.pool.init_workers(self.worker.work_loop)
def get_consumers(self, Consumer, channel):
logger.debug(self.listening_on)
return [Consumer(queues=self.queues, accept=['json'],
callbacks=[self.process_task])]
@property
def listening_on(self):
return 'listening on {}'.format([
'{} [{}]'.format(q.name, q.exchange.type) for q in self.queues
])
def control(self, body, message):
logger.warn(body)
control = body.get('control')
if control in ('status', 'running'):
producer = Producer(
channel=self.connection,
routing_key=message.properties['reply_to']
)
if control == 'status':
msg = '\n'.join([self.listening_on, self.pool.debug()])
elif control == 'running':
msg = []
for worker in self.pool.workers:
worker.calculate_managed_tasks()
msg.extend(worker.managed_tasks.keys())
producer.publish(msg)
elif control == 'reload':
for worker in self.pool.workers:
worker.quit()
else:
logger.error('unrecognized control message: {}'.format(control))
message.ack()
def process_task(self, body, message):
if 'control' in body:
try:
return self.control(body, message)
except Exception:
logger.exception("Exception handling control message:")
return
if len(self.pool):
if "uuid" in body and body['uuid']:
try:
queue = UUID(body['uuid']).int % len(self.pool)
except Exception:
queue = self.total_messages % len(self.pool)
else:
queue = self.total_messages % len(self.pool)
else:
queue = 0
self.pool.write(queue, body)
self.total_messages += 1
message.ack()
def run(self, *args, **kwargs):
signal.signal(signal.SIGINT, self.stop)
signal.signal(signal.SIGTERM, self.stop)
self.worker.on_start()
super(AWXConsumer, self).run(*args, **kwargs)
def stop(self, signum, frame):
self.should_stop = True # this makes the kombu mixin stop consuming
logger.debug('received {}, stopping'.format(signame(signum)))
self.worker.on_stop()
raise SystemExit()
class BaseWorker(object):
def work_loop(self, queue, finished, idx, *args):
ppid = os.getppid()
signal_handler = WorkerSignalHandler()
while not signal_handler.kill_now:
# if the parent PID changes, this process has been orphaned
# via e.g., segfault or sigkill, we should exit too
if os.getppid() != ppid:
break
try:
body = queue.get(block=True, timeout=1)
if body == 'QUIT':
break
except QueueEmpty:
continue
except Exception as e:
logger.error("Exception on worker {}, restarting: ".format(idx) + str(e))
continue
try:
for conn in db.connections.all():
# If the database connection has a hiccup during the prior message, close it
# so we can establish a new connection
conn.close_if_unusable_or_obsolete()
self.perform_work(body, *args)
finally:
if 'uuid' in body:
uuid = body['uuid']
logger.debug('task {} is finished'.format(uuid))
finished.put(uuid)
logger.warn('worker exiting gracefully pid:{}'.format(os.getpid()))
def perform_work(self, body):
raise NotImplementedError()
def on_start(self):
pass
def on_stop(self):
pass

View File

@@ -0,0 +1,127 @@
import logging
import time
import traceback
from django.conf import settings
from django.db import DatabaseError, OperationalError, connection as django_connection
from django.db.utils import InterfaceError, InternalError
from awx.main.consumers import emit_channel_notification
from awx.main.models import (JobEvent, AdHocCommandEvent, ProjectUpdateEvent,
InventoryUpdateEvent, SystemJobEvent, UnifiedJob)
from .base import BaseWorker
logger = logging.getLogger('awx.main.commands.run_callback_receiver')
class CallbackBrokerWorker(BaseWorker):
'''
A worker implementation that deserializes callback event data and persists
it into the database.
The code that *builds* these types of messages is found in the AWX display
callback (`awx.lib.awx_display_callback`).
'''
MAX_RETRIES = 2
def perform_work(self, body):
try:
event_map = {
'job_id': JobEvent,
'ad_hoc_command_id': AdHocCommandEvent,
'project_update_id': ProjectUpdateEvent,
'inventory_update_id': InventoryUpdateEvent,
'system_job_id': SystemJobEvent,
}
if not any([key in body for key in event_map]):
raise Exception('Payload does not have a job identifier')
def _save_event_data():
for key, cls in event_map.items():
if key in body:
cls.create_from_data(**body)
job_identifier = 'unknown job'
job_key = 'unknown'
for key in event_map.keys():
if key in body:
job_identifier = body[key]
job_key = key
break
if settings.DEBUG:
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import Terminal256Formatter
from pprint import pformat
if body.get('event') == 'EOF':
event_thing = 'EOF event'
else:
event_thing = 'event {}'.format(body.get('counter', 'unknown'))
logger.info('Callback worker received {} for {} {}'.format(
event_thing, job_key[:-len('_id')], job_identifier
))
logger.debug('Body: {}'.format(
highlight(pformat(body, width=160), PythonLexer(), Terminal256Formatter(style='friendly'))
)[:1024 * 4])
if body.get('event') == 'EOF':
try:
final_counter = body.get('final_counter', 0)
logger.info('Event processing is finished for Job {}, sending notifications'.format(job_identifier))
# EOF events are sent when stdout for the running task is
# closed. don't actually persist them to the database; we
# just use them to report `summary` websocket events as an
# approximation for when a job is "done"
emit_channel_notification(
'jobs-summary',
dict(group_name='jobs', unified_job_id=job_identifier, final_counter=final_counter)
)
# Additionally, when we've processed all events, we should
# have all the data we need to send out success/failure
# notification templates
uj = UnifiedJob.objects.get(pk=job_identifier)
if hasattr(uj, 'send_notification_templates'):
retries = 0
while retries < 5:
if uj.finished:
uj.send_notification_templates('succeeded' if uj.status == 'successful' else 'failed')
break
else:
# wait a few seconds to avoid a race where the
# events are persisted _before_ the UJ.status
# changes from running -> successful
retries += 1
time.sleep(1)
uj = UnifiedJob.objects.get(pk=job_identifier)
except Exception:
logger.exception('Worker failed to emit notifications: Job {}'.format(job_identifier))
return
retries = 0
while retries <= self.MAX_RETRIES:
try:
_save_event_data()
break
except (OperationalError, InterfaceError, InternalError):
if retries >= self.MAX_RETRIES:
logger.exception('Worker could not re-establish database connectivity, giving up on event for Job {}'.format(job_identifier))
return
delay = 60 * retries
logger.exception('Database Error Saving Job Event, retry #{i} in {delay} seconds:'.format(
i=retries + 1,
delay=delay
))
django_connection.close()
time.sleep(delay)
retries += 1
except DatabaseError:
logger.exception('Database Error Saving Job Event for Job {}'.format(job_identifier))
break
except Exception as exc:
tb = traceback.format_exc()
logger.error('Callback Task Processor Raised Exception: %r', exc)
logger.error('Detail: {}'.format(tb))

View File

@@ -0,0 +1,120 @@
import inspect
import logging
import importlib
import sys
import traceback
from awx.main.tasks import dispatch_startup, inform_cluster_of_shutdown
from .base import BaseWorker
logger = logging.getLogger('awx.main.dispatch')
class TaskWorker(BaseWorker):
'''
A worker implementation that deserializes task messages and runs native
Python code.
The code that *builds* these types of messages is found in
`awx.main.dispatch.publish`.
'''
@classmethod
def resolve_callable(cls, task):
'''
Transform a dotted notation task into an imported, callable function, e.g.,
awx.main.tasks.delete_inventory
awx.main.tasks.RunProjectUpdate
'''
if not task.startswith('awx.'):
raise ValueError('{} is not a valid awx task'.format(task))
module, target = task.rsplit('.', 1)
module = importlib.import_module(module)
_call = None
if hasattr(module, target):
_call = getattr(module, target, None)
if not (
hasattr(_call, 'apply_async') and hasattr(_call, 'delay')
):
raise ValueError('{} is not decorated with @task()'.format(task))
return _call
def run_callable(self, body):
'''
Given some AMQP message, import the correct Python code and run it.
'''
task = body['task']
uuid = body.get('uuid', '<unknown>')
args = body.get('args', [])
kwargs = body.get('kwargs', {})
_call = TaskWorker.resolve_callable(task)
if inspect.isclass(_call):
# the callable is a class, e.g., RunJob; instantiate and
# return its `run()` method
_call = _call().run
# don't print kwargs, they often contain launch-time secrets
logger.debug('task {} starting {}(*{})'.format(uuid, task, args))
return _call(*args, **kwargs)
def perform_work(self, body):
'''
Import and run code for a task e.g.,
body = {
'args': [8],
'callbacks': [{
'args': [],
'kwargs': {}
'task': u'awx.main.tasks.handle_work_success'
}],
'errbacks': [{
'args': [],
'kwargs': {},
'task': 'awx.main.tasks.handle_work_error'
}],
'kwargs': {},
'task': u'awx.main.tasks.RunProjectUpdate'
}
'''
result = None
try:
result = self.run_callable(body)
except Exception as exc:
result = exc
try:
if getattr(exc, 'is_awx_task_error', False):
# Error caused by user / tracked in job output
logger.warning("{}".format(exc))
else:
task = body['task']
args = body.get('args', [])
kwargs = body.get('kwargs', {})
logger.exception('Worker failed to run task {}(*{}, **{}'.format(
task, args, kwargs
))
except Exception:
# It's fairly critical that this code _not_ raise exceptions on logging
# If you configure external logging in a way that _it_ fails, there's
# not a lot we can do here; sys.stderr.write is a final hail mary
_, _, tb = sys.exc_info()
traceback.print_tb(tb)
for callback in body.get('errbacks', []) or []:
callback['uuid'] = body['uuid']
self.perform_work(callback)
for callback in body.get('callbacks', []) or []:
callback['uuid'] = body['uuid']
self.perform_work(callback)
return result
def on_start(self):
dispatch_startup()
def on_stop(self):
inform_cluster_of_shutdown()

View File

@@ -1,18 +1,12 @@
# Copyright (c) 2018 Ansible by Red Hat
# All Rights Reserved.
import six
# Celery does not respect exception type when using a serializer different than pickle;
# and awx uses the json serializer
# https://github.com/celery/celery/issues/3586
class _AwxTaskError():
def build_exception(self, task, message=None):
if message is None:
message = six.text_type("Execution error running {}").format(task.log_format)
message = "Execution error running {}".format(task.log_format)
e = Exception(message)
e.task = task
e.is_awx_task_error = True
@@ -20,7 +14,7 @@ class _AwxTaskError():
def TaskCancel(self, task, rc):
"""Canceled flag caused run_pexpect to kill the job run"""
message=six.text_type("{} was canceled (rc={})").format(task.log_format, rc)
message="{} was canceled (rc={})".format(task.log_format, rc)
e = self.build_exception(task, message)
e.rc = rc
e.awx_task_error_type = "TaskCancel"
@@ -28,7 +22,7 @@ class _AwxTaskError():
def TaskError(self, task, rc):
"""Userspace error (non-zero exit code) in run_pexpect subprocess"""
message = six.text_type("{} encountered an error (rc={}), please see task stdout for details.").format(task.log_format, rc)
message = "{} encountered an error (rc={}), please see task stdout for details.".format(task.log_format, rc)
e = self.build_exception(task, message)
e.rc = rc
e.awx_task_error_type = "TaskError"
@@ -36,5 +30,3 @@ class _AwxTaskError():
AwxTaskError = _AwxTaskError()

1
awx/main/expect/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
authorized_keys

View File

View File

@@ -1,6 +1,5 @@
import base64
import codecs
import StringIO
import json
import os
import shutil
@@ -9,8 +8,10 @@ import tempfile
import time
import logging
from distutils.version import LooseVersion as Version
from io import StringIO
from django.conf import settings
from django.utils.encoding import smart_bytes, smart_str
import awx
from awx.main.expect import run
@@ -38,7 +39,7 @@ class IsolatedManager(object):
:param stdout_handle: a file-like object for capturing stdout
:param ssh_key_path: a filepath where SSH key data can be read
:param expect_passwords: a dict of regular expression password prompts
to input values, i.e., {r'Password:\s*?$':
to input values, i.e., {r'Password:*?$':
'some_password'}
:param cancelled_callback: a callable - which returns `True` or `False`
- signifying if the job has been prematurely
@@ -101,6 +102,8 @@ class IsolatedManager(object):
]
if extra_vars:
args.extend(['-e', json.dumps(extra_vars)])
if settings.AWX_ISOLATED_VERBOSITY:
args.append('-%s' % ('v' * min(5, settings.AWX_ISOLATED_VERBOSITY)))
return args
@staticmethod
@@ -117,10 +120,10 @@ class IsolatedManager(object):
@classmethod
def awx_playbook_path(cls):
return os.path.join(
return os.path.abspath(os.path.join(
os.path.dirname(awx.__file__),
'playbooks'
)
))
def path_to(self, *args):
return os.path.join(self.private_data_dir, *args)
@@ -142,7 +145,7 @@ class IsolatedManager(object):
# if an ssh private key fifo exists, read its contents and delete it
if self.ssh_key_path:
buff = StringIO.StringIO()
buff = StringIO()
with open(self.ssh_key_path, 'r') as fifo:
for line in fifo:
buff.write(line)
@@ -154,7 +157,10 @@ class IsolatedManager(object):
# into a variable, and will replicate the data into a named pipe on the
# isolated instance
secrets_path = os.path.join(self.private_data_dir, 'env')
run.open_fifo_write(secrets_path, base64.b64encode(json.dumps(secrets)))
run.open_fifo_write(
secrets_path,
smart_str(base64.b64encode(smart_bytes(json.dumps(secrets))))
)
self.build_isolated_job_data()
@@ -174,7 +180,7 @@ class IsolatedManager(object):
args = self._build_args('run_isolated.yml', '%s,' % self.host, extra_vars)
if self.instance.verbosity:
args.append('-%s' % ('v' * min(5, self.instance.verbosity)))
buff = StringIO.StringIO()
buff = StringIO()
logger.debug('Starting job {} on isolated host with `run_isolated.yml` playbook.'.format(self.instance.id))
status, rc = IsolatedManager.run_pexpect(
args, self.awx_playbook_path(), self.management_env, buff,
@@ -244,7 +250,7 @@ class IsolatedManager(object):
os.makedirs(self.path_to('artifacts', 'job_events'), mode=stat.S_IXUSR + stat.S_IWUSR + stat.S_IRUSR)
def _missing_artifacts(self, path_list, output):
missing_artifacts = filter(lambda path: not os.path.exists(path), path_list)
missing_artifacts = list(filter(lambda path: not os.path.exists(path), path_list))
for path in missing_artifacts:
self.stdout_handle.write('ansible did not exit cleanly, missing `{}`.\n'.format(path))
if missing_artifacts:
@@ -282,7 +288,7 @@ class IsolatedManager(object):
status = 'failed'
output = ''
rc = None
buff = StringIO.StringIO()
buff = StringIO()
last_check = time.time()
seek = 0
job_timeout = remaining = self.job_timeout
@@ -303,7 +309,7 @@ class IsolatedManager(object):
time.sleep(1)
continue
buff = StringIO.StringIO()
buff = StringIO()
logger.debug('Checking on isolated job {} with `check_isolated.yml`.'.format(self.instance.id))
status, rc = IsolatedManager.run_pexpect(
args, self.awx_playbook_path(), self.management_env, buff,
@@ -340,7 +346,7 @@ class IsolatedManager(object):
elif status == 'failed':
# if we were unable to retrieve job reults from the isolated host,
# print stdout of the `check_isolated.yml` playbook for clues
self.stdout_handle.write(output)
self.stdout_handle.write(smart_str(output))
return status, rc
@@ -355,7 +361,7 @@ class IsolatedManager(object):
}
args = self._build_args('clean_isolated.yml', '%s,' % self.host, extra_vars)
logger.debug('Cleaning up job {} on isolated host with `clean_isolated.yml` playbook.'.format(self.instance.id))
buff = StringIO.StringIO()
buff = StringIO()
timeout = max(60, 2 * settings.AWX_ISOLATED_CONNECTION_TIMEOUT)
status, rc = IsolatedManager.run_pexpect(
args, self.awx_playbook_path(), self.management_env, buff,
@@ -407,45 +413,52 @@ class IsolatedManager(object):
args = cls._build_args('heartbeat_isolated.yml', hostname_string)
args.extend(['--forks', str(len(instance_qs))])
env = cls._base_management_env()
env['ANSIBLE_STDOUT_CALLBACK'] = 'json'
buff = StringIO.StringIO()
timeout = max(60, 2 * settings.AWX_ISOLATED_CONNECTION_TIMEOUT)
status, rc = IsolatedManager.run_pexpect(
args, cls.awx_playbook_path(), env, buff,
idle_timeout=timeout, job_timeout=timeout,
pexpect_timeout=5
)
output = buff.getvalue().encode('utf-8')
buff.close()
try:
result = json.loads(output)
if not isinstance(result, dict):
raise TypeError('Expected a dict but received {}.'.format(str(type(result))))
except (ValueError, AssertionError, TypeError):
logger.exception('Failed to read status from isolated instances, output:\n {}'.format(output))
return
facts_path = tempfile.mkdtemp()
env['ANSIBLE_CACHE_PLUGIN'] = 'jsonfile'
env['ANSIBLE_CACHE_PLUGIN_CONNECTION'] = facts_path
for instance in instance_qs:
try:
task_result = result['plays'][0]['tasks'][0]['hosts'][instance.hostname]
except (KeyError, IndexError):
buff = StringIO()
timeout = max(60, 2 * settings.AWX_ISOLATED_CONNECTION_TIMEOUT)
status, rc = IsolatedManager.run_pexpect(
args, cls.awx_playbook_path(), env, buff,
idle_timeout=timeout, job_timeout=timeout,
pexpect_timeout=5
)
heartbeat_stdout = buff.getvalue().encode('utf-8')
buff.close()
for instance in instance_qs:
output = heartbeat_stdout
task_result = {}
if 'capacity_cpu' in task_result and 'capacity_mem' in task_result:
cls.update_capacity(instance, task_result, awx_application_version)
elif instance.capacity == 0:
logger.debug('Isolated instance {} previously marked as lost, could not re-join.'.format(
instance.hostname))
else:
logger.warning('Could not update status of isolated instance {}, msg={}'.format(
instance.hostname, task_result.get('msg', 'unknown failure')
))
if instance.is_lost(isolated=True):
instance.capacity = 0
instance.save(update_fields=['capacity'])
logger.error('Isolated instance {} last checked in at {}, marked as lost.'.format(
instance.hostname, instance.modified))
try:
with open(os.path.join(facts_path, instance.hostname), 'r') as facts_data:
output = facts_data.read()
task_result = json.loads(output)
except Exception:
logger.exception('Failed to read status from isolated instances, output:\n {}'.format(output))
if 'awx_capacity_cpu' in task_result and 'awx_capacity_mem' in task_result:
task_result = {
'capacity_cpu': task_result['awx_capacity_cpu'],
'capacity_mem': task_result['awx_capacity_mem'],
'version': task_result['awx_capacity_version']
}
cls.update_capacity(instance, task_result, awx_application_version)
logger.debug('Isolated instance {} successful heartbeat'.format(instance.hostname))
elif instance.capacity == 0:
logger.debug('Isolated instance {} previously marked as lost, could not re-join.'.format(
instance.hostname))
else:
logger.warning('Could not update status of isolated instance {}'.format(instance.hostname))
if instance.is_lost(isolated=True):
instance.capacity = 0
instance.save(update_fields=['capacity'])
logger.error('Isolated instance {} last checked in at {}, marked as lost.'.format(
instance.hostname, instance.modified))
finally:
if os.path.exists(facts_path):
shutil.rmtree(facts_path)
@staticmethod
def get_stdout_handle(instance, private_data_dir, event_data_key='job_id'):
@@ -468,13 +481,11 @@ class IsolatedManager(object):
return OutputEventFilter(job_event_callback)
def run(self, instance, host, private_data_dir, proot_temp_dir):
def run(self, instance, private_data_dir, proot_temp_dir):
"""
Run a job on an isolated host.
:param instance: a `model.Job` instance
:param host: the hostname (or IP address) to run the
isolated job on
:param private_data_dir: an absolute path on the local file system
where job-specific data should be written
(i.e., `/tmp/ansible_awx_xyz/`)
@@ -486,14 +497,11 @@ class IsolatedManager(object):
`ansible-playbook` run.
"""
self.instance = instance
self.host = host
self.host = instance.execution_node
self.private_data_dir = private_data_dir
self.proot_temp_dir = proot_temp_dir
status, rc = self.dispatch()
if status == 'successful':
status, rc = self.check()
else:
# If dispatch fails, attempt to consume artifacts that *might* exist
self.check()
self.cleanup()
return status, rc

View File

@@ -4,7 +4,6 @@ import argparse
import base64
import codecs
import collections
import cStringIO
import logging
import json
import os
@@ -13,8 +12,12 @@ import pipes
import re
import signal
import sys
import thread
import threading
import time
try:
from io import StringIO
except ImportError:
from StringIO import StringIO
import pexpect
import psutil
@@ -48,7 +51,10 @@ def open_fifo_write(path, data):
reads data from the pipe.
'''
os.mkfifo(path, 0o600)
thread.start_new_thread(lambda p, d: open(p, 'w').write(d), (path, data))
threading.Thread(
target=lambda p, d: open(p, 'w').write(d),
args=(path, data)
).start()
def run_pexpect(args, cwd, env, logfile,
@@ -70,7 +76,7 @@ def run_pexpect(args, cwd, env, logfile,
- signifying if the job has been prematurely
cancelled
:param expect_passwords: a dict of regular expression password prompts
to input values, i.e., {r'Password:\s*?$':
to input values, i.e., {r'Password:*?$':
'some_password'}
:param extra_update_fields: a dict used to specify DB fields which should
be updated on the underlying model
@@ -96,8 +102,8 @@ def run_pexpect(args, cwd, env, logfile,
# enforce usage of an OrderedDict so that the ordering of elements in
# `keys()` matches `values()`.
expect_passwords = collections.OrderedDict(expect_passwords)
password_patterns = expect_passwords.keys()
password_values = expect_passwords.values()
password_patterns = list(expect_passwords.keys())
password_values = list(expect_passwords.values())
child = pexpect.spawn(
args[0], args[1:], cwd=cwd, env=env, ignore_sighup=True,
@@ -201,6 +207,12 @@ def run_isolated_job(private_data_dir, secrets, logfile=sys.stdout):
env['AWX_ISOLATED_DATA_DIR'] = private_data_dir
env['PYTHONPATH'] = env.get('PYTHONPATH', '') + callback_dir + ':'
venv_path = env.get('VIRTUAL_ENV')
if venv_path and not os.path.exists(venv_path):
raise RuntimeError(
'a valid Python virtualenv does not exist at {}'.format(venv_path)
)
return run_pexpect(args, cwd, env, logfile,
expect_passwords=expect_passwords,
idle_timeout=idle_timeout,
@@ -219,7 +231,11 @@ def handle_termination(pid, args, proot_cmd, is_cancel=True):
instance's cancel_flag.
'''
try:
if proot_cmd in ' '.join(args):
if sys.version_info > (3, 0):
used_proot = proot_cmd.encode('utf-8') in args
else:
used_proot = proot_cmd in ' '.join(args)
if used_proot:
if not psutil:
os.kill(pid, signal.SIGKILL)
else:
@@ -240,8 +256,8 @@ def handle_termination(pid, args, proot_cmd, is_cancel=True):
def __run__(private_data_dir):
buff = cStringIO.StringIO()
with open(os.path.join(private_data_dir, 'env'), 'r') as f:
buff = StringIO()
with codecs.open(os.path.join(private_data_dir, 'env'), 'r', encoding='utf-8') as f:
for line in f:
buff.write(line)

View File

@@ -4,10 +4,8 @@
# Python
import copy
import json
import operator
import re
import six
import urllib
import urllib.parse
from jinja2 import Environment, StrictUndefined
from jinja2.exceptions import UndefinedError, TemplateSyntaxError
@@ -46,7 +44,7 @@ from awx.main.utils.filters import SmartFilter
from awx.main.utils.encryption import encrypt_value, decrypt_value, get_encryption_key
from awx.main.validators import validate_ssh_private_key
from awx.main.models.rbac import batch_role_ancestor_rebuilding, Role
from awx.main.constants import CHOICES_PRIVILEGE_ESCALATION_METHODS
from awx.main.constants import ENV_BLACKLIST
from awx.main import utils
@@ -80,7 +78,7 @@ class JSONField(upstream_JSONField):
class JSONBField(upstream_JSONBField):
def get_prep_lookup(self, lookup_type, value):
if isinstance(value, six.string_types) and value == "null":
if isinstance(value, str) and value == "null":
return 'null'
return super(JSONBField, self).get_prep_lookup(lookup_type, value)
@@ -95,7 +93,7 @@ class JSONBField(upstream_JSONBField):
def from_db_value(self, value, expression, connection, context):
# Work around a bug in django-jsonfield
# https://bitbucket.org/schinckel/django-jsonfield/issues/57/cannot-use-in-the-same-project-as-djangos
if isinstance(value, six.string_types):
if isinstance(value, str):
return json.loads(value)
return value
@@ -193,8 +191,10 @@ def update_role_parentage_for_instance(instance):
'''
for implicit_role_field in getattr(instance.__class__, '__implicit_role_fields'):
cur_role = getattr(instance, implicit_role_field.name)
original_parents = set(json.loads(cur_role.implicit_parents))
new_parents = implicit_role_field._resolve_parent_roles(instance)
cur_role.parents.set(new_parents)
cur_role.parents.remove(*list(original_parents - new_parents))
cur_role.parents.add(*list(new_parents - original_parents))
new_parents_list = list(new_parents)
new_parents_list.sort()
new_parents_json = json.dumps(new_parents_list)
@@ -216,6 +216,7 @@ class ImplicitRoleField(models.ForeignKey):
kwargs.setdefault('to', 'Role')
kwargs.setdefault('related_name', '+')
kwargs.setdefault('null', 'True')
kwargs.setdefault('editable', False)
super(ImplicitRoleField, self).__init__(*args, **kwargs)
def deconstruct(self):
@@ -248,6 +249,9 @@ class ImplicitRoleField(models.ForeignKey):
if type(field_name) == tuple:
continue
if type(field_name) == bytes:
field_name = field_name.decode('utf-8')
if field_name.startswith('singleton:'):
continue
@@ -370,7 +374,7 @@ class SmartFilterField(models.TextField):
# https://docs.python.org/2/library/stdtypes.html#truth-value-testing
if not value:
return None
value = urllib.unquote(value)
value = urllib.parse.unquote(value)
try:
SmartFilter().query_from_string(value)
except RuntimeError as e:
@@ -404,11 +408,8 @@ class JSONSchemaField(JSONBField):
self.schema(model_instance),
format_checker=self.format_checker
).iter_errors(value):
# strip Python unicode markers from jsonschema validation errors
error.message = re.sub(r'\bu(\'|")', r'\1', error.message)
if error.validator == 'pattern' and 'error' in error.schema:
error.message = six.text_type(error.schema['error']).format(instance=error.instance)
error.message = error.schema['error'].format(instance=error.instance)
elif error.validator == 'type':
expected_type = error.validator_value
if expected_type == 'object':
@@ -447,7 +448,7 @@ class JSONSchemaField(JSONBField):
def from_db_value(self, value, expression, connection, context):
# Work around a bug in django-jsonfield
# https://bitbucket.org/schinckel/django-jsonfield/issues/57/cannot-use-in-the-same-project-as-djangos
if isinstance(value, six.string_types):
if isinstance(value, str):
return json.loads(value)
return value
@@ -509,12 +510,9 @@ class CredentialInputField(JSONSchemaField):
properties = {}
for field in model_instance.credential_type.inputs.get('fields', []):
field = field.copy()
if field['type'] == 'become_method':
field.pop('type')
field['choices'] = map(operator.itemgetter(0), CHOICES_PRIVILEGE_ESCALATION_METHODS)
properties[field['id']] = field
if field.get('choices', []):
field['enum'] = field['choices'][:]
field['enum'] = list(field['choices'])[:]
return {
'type': 'object',
'properties': properties,
@@ -544,7 +542,7 @@ class CredentialInputField(JSONSchemaField):
v != '$encrypted$',
model_instance.pk
]):
if not isinstance(getattr(model_instance, k), six.string_types):
if not isinstance(getattr(model_instance, k), str):
raise django_exceptions.ValidationError(
_('secret values must be of type string, not {}').format(type(v).__name__),
code='invalid',
@@ -561,7 +559,7 @@ class CredentialInputField(JSONSchemaField):
format_checker=self.format_checker
).iter_errors(decrypted_values):
if error.validator == 'pattern' and 'error' in error.schema:
error.message = six.text_type(error.schema['error']).format(instance=error.instance)
error.message = error.schema['error'].format(instance=error.instance)
if error.validator == 'dependencies':
# replace the default error messaging w/ a better i18n string
# I wish there was a better way to determine the parameters of
@@ -570,10 +568,10 @@ class CredentialInputField(JSONSchemaField):
# string)
match = re.search(
# 'foo' is a dependency of 'bar'
"'" # apostrophe
"([^']+)" # one or more non-apostrophes (first group)
"'[\w ]+'" # one or more words/spaces
"([^']+)", # second group
r"'" # apostrophe
r"([^']+)" # one or more non-apostrophes (first group)
r"'[\w ]+'" # one or more words/spaces
r"([^']+)", # second group
error.message,
)
if match:
@@ -655,7 +653,7 @@ class CredentialTypeInputField(JSONSchemaField):
'items': {
'type': 'object',
'properties': {
'type': {'enum': ['string', 'boolean', 'become_method']},
'type': {'enum': ['string', 'boolean']},
'format': {'enum': ['ssh_private_key']},
'choices': {
'type': 'array',
@@ -716,17 +714,6 @@ class CredentialTypeInputField(JSONSchemaField):
# If no type is specified, default to string
field['type'] = 'string'
if field['type'] == 'become_method':
if not model_instance.managed_by_tower:
raise django_exceptions.ValidationError(
_('become_method is a reserved type name'),
code='invalid',
params={'value': value},
)
else:
field.pop('type')
field['choices'] = CHOICES_PRIVILEGE_ESCALATION_METHODS
for key in ('choices', 'multiline', 'format', 'secret',):
if key in field and field['type'] != 'string':
raise django_exceptions.ValidationError(
@@ -752,7 +739,7 @@ class CredentialTypeInjectorField(JSONSchemaField):
'file': {
'type': 'object',
'patternProperties': {
'^template(\.[a-zA-Z_]+[a-zA-Z0-9_]*)?$': {'type': 'string'},
r'^template(\.[a-zA-Z_]+[a-zA-Z0-9_]*)?$': {'type': 'string'},
},
'additionalProperties': False,
},
@@ -764,7 +751,12 @@ class CredentialTypeInjectorField(JSONSchemaField):
# of underscores, digits, and alphabetics from the portable
# character set. The first character of a name is not
# a digit.
'^[a-zA-Z_]+[a-zA-Z0-9_]*$': {'type': 'string'},
'^[a-zA-Z_]+[a-zA-Z0-9_]*$': {
'type': 'string',
# The environment variable _value_ can be any ascii,
# but pexpect will choke on any unicode
'pattern': '^[\x00-\x7F]*$'
},
},
'additionalProperties': False,
},
@@ -780,6 +772,19 @@ class CredentialTypeInjectorField(JSONSchemaField):
'additionalProperties': False
}
def validate_env_var_allowed(self, env_var):
if env_var.startswith('ANSIBLE_'):
raise django_exceptions.ValidationError(
_('Environment variable {} may affect Ansible configuration so its '
'use is not allowed in credentials.').format(env_var),
code='invalid', params={'value': env_var},
)
if env_var in ENV_BLACKLIST:
raise django_exceptions.ValidationError(
_('Environment variable {} is blacklisted from use in credentials.').format(env_var),
code='invalid', params={'value': env_var},
)
def validate(self, value, model_instance):
super(CredentialTypeInjectorField, self).validate(
value, model_instance
@@ -802,25 +807,38 @@ class CredentialTypeInjectorField(JSONSchemaField):
for field in model_instance.defined_fields
)
class ExplodingNamespace:
def __str__(self):
raise UndefinedError(_('Must define unnamed file injector in order to reference `tower.filename`.'))
class TowerNamespace:
filename = None
def __init__(self):
self.filename = ExplodingNamespace()
def __str__(self):
raise UndefinedError(_('Cannot directly reference reserved `tower` namespace container.'))
valid_namespace['tower'] = TowerNamespace()
# ensure either single file or multi-file syntax is used (but not both)
template_names = [x for x in value.get('file', {}).keys() if x.startswith('template')]
if 'template' in template_names and len(template_names) > 1:
raise django_exceptions.ValidationError(
_('Must use multi-file syntax when injecting multiple files'),
code='invalid',
params={'value': value},
)
if 'template' not in template_names:
valid_namespace['tower'].filename = TowerNamespace()
if 'template' in template_names:
valid_namespace['tower'].filename = 'EXAMPLE_FILENAME'
if len(template_names) > 1:
raise django_exceptions.ValidationError(
_('Must use multi-file syntax when injecting multiple files'),
code='invalid',
params={'value': value},
)
elif template_names:
for template_name in template_names:
template_name = template_name.split('.')[1]
setattr(valid_namespace['tower'].filename, template_name, 'EXAMPLE')
setattr(valid_namespace['tower'].filename, template_name, 'EXAMPLE_FILENAME')
for type_, injector in value.items():
if type_ == 'env':
for key in injector.keys():
self.validate_env_var_allowed(key)
for key, tmpl in injector.items():
try:
Environment(

View File

@@ -0,0 +1,12 @@
from django.db import connections
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.core.management.commands.makemigrations import Command as MakeMigrations
class Command(MakeMigrations):
def execute(self, *args, **options):
settings = connections['default'].settings_dict.copy()
settings['ENGINE'] = 'sqlite3'
connections['default'] = DatabaseWrapper(settings)
return MakeMigrations().execute(*args, **options)

View File

@@ -5,7 +5,6 @@
import datetime
import logging
import six
# Django
from django.core.management.base import BaseCommand
@@ -43,7 +42,7 @@ class Command(BaseCommand):
n_deleted_items = 0
pks_to_delete = set()
for asobj in ActivityStream.objects.iterator():
asobj_disp = '"%s" id: %s' % (six.text_type(asobj), asobj.id)
asobj_disp = '"%s" id: %s' % (str(asobj), asobj.id)
if asobj.timestamp >= self.cutoff:
if self.dry_run:
self.logger.info("would skip %s" % asobj_disp)

View File

@@ -3,6 +3,7 @@
# Python
import re
import sys
from dateutil.relativedelta import relativedelta
# Django
@@ -129,6 +130,7 @@ class Command(BaseCommand):
@transaction.atomic
def handle(self, *args, **options):
sys.stderr.write("This command has been deprecated and will be removed in a future release.\n")
if not feature_enabled('system_tracking'):
raise CommandError("The System Tracking feature is not enabled for your instance")
cleanup_facts = CleanupFacts()

View File

@@ -5,7 +5,6 @@
import datetime
import logging
import six
# Django
from django.core.management.base import BaseCommand, CommandError
@@ -68,7 +67,7 @@ class Command(BaseCommand):
jobs = Job.objects.filter(created__lt=self.cutoff)
for job in jobs.iterator():
job_display = '"%s" (%d host summaries, %d events)' % \
(six.text_type(job),
(str(job),
job.job_host_summaries.count(), job.job_events.count())
if job.status in ('pending', 'waiting', 'running'):
action_text = 'would skip' if self.dry_run else 'skipping'
@@ -89,7 +88,7 @@ class Command(BaseCommand):
ad_hoc_commands = AdHocCommand.objects.filter(created__lt=self.cutoff)
for ad_hoc_command in ad_hoc_commands.iterator():
ad_hoc_command_display = '"%s" (%d events)' % \
(six.text_type(ad_hoc_command),
(str(ad_hoc_command),
ad_hoc_command.ad_hoc_command_events.count())
if ad_hoc_command.status in ('pending', 'waiting', 'running'):
action_text = 'would skip' if self.dry_run else 'skipping'
@@ -109,7 +108,7 @@ class Command(BaseCommand):
skipped, deleted = 0, 0
project_updates = ProjectUpdate.objects.filter(created__lt=self.cutoff)
for pu in project_updates.iterator():
pu_display = '"%s" (type %s)' % (six.text_type(pu), six.text_type(pu.launch_type))
pu_display = '"%s" (type %s)' % (str(pu), str(pu.launch_type))
if pu.status in ('pending', 'waiting', 'running'):
action_text = 'would skip' if self.dry_run else 'skipping'
self.logger.debug('%s %s project update %s', action_text, pu.status, pu_display)
@@ -132,7 +131,7 @@ class Command(BaseCommand):
skipped, deleted = 0, 0
inventory_updates = InventoryUpdate.objects.filter(created__lt=self.cutoff)
for iu in inventory_updates.iterator():
iu_display = '"%s" (source %s)' % (six.text_type(iu), six.text_type(iu.source))
iu_display = '"%s" (source %s)' % (str(iu), str(iu.source))
if iu.status in ('pending', 'waiting', 'running'):
action_text = 'would skip' if self.dry_run else 'skipping'
self.logger.debug('%s %s inventory update %s', action_text, iu.status, iu_display)
@@ -155,7 +154,7 @@ class Command(BaseCommand):
skipped, deleted = 0, 0
system_jobs = SystemJob.objects.filter(created__lt=self.cutoff)
for sj in system_jobs.iterator():
sj_display = '"%s" (type %s)' % (six.text_type(sj), six.text_type(sj.job_type))
sj_display = '"%s" (type %s)' % (str(sj), str(sj.job_type))
if sj.status in ('pending', 'waiting', 'running'):
action_text = 'would skip' if self.dry_run else 'skipping'
self.logger.debug('%s %s system_job %s', action_text, sj.status, sj_display)
@@ -185,7 +184,7 @@ class Command(BaseCommand):
workflow_jobs = WorkflowJob.objects.filter(created__lt=self.cutoff)
for workflow_job in workflow_jobs.iterator():
workflow_job_display = '"{}" ({} nodes)'.format(
six.text_type(workflow_job),
str(workflow_job),
workflow_job.workflow_nodes.count())
if workflow_job.status in ('pending', 'waiting', 'running'):
action_text = 'would skip' if self.dry_run else 'skipping'
@@ -206,7 +205,7 @@ class Command(BaseCommand):
notifications = Notification.objects.filter(created__lt=self.cutoff)
for notification in notifications.iterator():
notification_display = '"{}" (started {}, {} type, {} sent)'.format(
six.text_type(notification), six.text_type(notification.created),
str(notification), str(notification.created),
notification.notification_type, notification.notifications_sent)
if notification.status in ('pending',):
action_text = 'would skip' if self.dry_run else 'skipping'

View File

@@ -0,0 +1,34 @@
# Django
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
# AWX
from awx.api.serializers import OAuth2TokenSerializer
class Command(BaseCommand):
"""Command that creates an OAuth2 token for a certain user. Returns the value of created token."""
help='Creates an OAuth2 token for a user.'
def add_arguments(self, parser):
parser.add_argument('--user', dest='user', type=str)
def handle(self, *args, **options):
if not options['user']:
raise CommandError('Username not supplied. Usage: awx-manage create_oauth2_token --user=username.')
try:
user = User.objects.get(username=options['user'])
except ObjectDoesNotExist:
raise CommandError('The user does not exist.')
config = {'user': user, 'scope':'write'}
serializer_obj = OAuth2TokenSerializer()
class FakeRequest(object):
def __init__(self):
self.user = user
serializer_obj.context['request'] = FakeRequest()
token_record = serializer_obj.create(config)
self.stdout.write(token_record.token)

View File

@@ -4,6 +4,7 @@
from django.core.management.base import BaseCommand
from crum import impersonate
from awx.main.models import User, Organization, Project, Inventory, CredentialType, Credential, Host, JobTemplate
from awx.main.signals import disable_computed_fields
class Command(BaseCommand):
@@ -14,6 +15,8 @@ class Command(BaseCommand):
def handle(self, *args, **kwargs):
# Sanity check: Is there already an organization in the system?
if Organization.objects.count():
print('An organization is already in the system, exiting.')
print('(changed: False)')
return
# Create a default organization as the first superuser found.
@@ -22,33 +25,35 @@ class Command(BaseCommand):
except IndexError:
superuser = None
with impersonate(superuser):
o = Organization.objects.create(name='Default')
p = Project(name='Demo Project',
scm_type='git',
scm_url='https://github.com/ansible/ansible-tower-samples',
scm_update_on_launch=True,
scm_update_cache_timeout=0,
organization=o)
p.save(skip_update=True)
ssh_type = CredentialType.from_v1_kind('ssh')
c = Credential.objects.create(credential_type=ssh_type,
name='Demo Credential',
inputs={
'username': superuser.username
},
created_by=superuser)
c.admin_role.members.add(superuser)
i = Inventory.objects.create(name='Demo Inventory',
organization=o,
created_by=superuser)
Host.objects.create(name='localhost',
inventory=i,
variables="ansible_connection: local",
created_by=superuser)
jt = JobTemplate.objects.create(name='Demo Job Template',
playbook='hello_world.yml',
project=p,
inventory=i)
jt.credentials.add(c)
with disable_computed_fields():
o = Organization.objects.create(name='Default')
p = Project(name='Demo Project',
scm_type='git',
scm_url='https://github.com/ansible/ansible-tower-samples',
scm_update_on_launch=True,
scm_update_cache_timeout=0,
organization=o)
p.save(skip_update=True)
ssh_type = CredentialType.from_v1_kind('ssh')
c = Credential.objects.create(credential_type=ssh_type,
name='Demo Credential',
inputs={
'username': superuser.username
},
created_by=superuser)
c.admin_role.members.add(superuser)
i = Inventory.objects.create(name='Demo Inventory',
organization=o,
created_by=superuser)
Host.objects.create(name='localhost',
inventory=i,
variables="ansible_connection: local",
created_by=superuser)
jt = JobTemplate.objects.create(name='Demo Job Template',
playbook='hello_world.yml',
project=p,
inventory=i)
jt.credentials.add(c)
print('Default organization added.')
print('Demo Credential, Inventory, and Job Template added.')
print('(changed: True)')

View File

@@ -2,7 +2,6 @@
# All Rights Reserved
import subprocess
import warnings
from django.db import transaction
from django.core.management.base import BaseCommand, CommandError
@@ -24,31 +23,28 @@ class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('--hostname', dest='hostname', type=str,
help='Hostname used during provisioning')
parser.add_argument('--name', dest='name', type=str,
help='(PENDING DEPRECIATION) Hostname used during provisioning')
@transaction.atomic
def handle(self, *args, **options):
# TODO: remove in 3.3
if options.get('name'):
warnings.warn("`--name` is depreciated in favor of `--hostname`, and will be removed in release 3.3.")
if options.get('hostname'):
raise CommandError("Cannot accept both --name and --hostname.")
options['hostname'] = options['name']
hostname = options.get('hostname')
if not hostname:
raise CommandError("--hostname is a required argument")
with advisory_lock('instance_registration_%s' % hostname):
instance = Instance.objects.filter(hostname=hostname)
if instance.exists():
isolated = instance.first().is_isolated()
instance.delete()
print("Instance Removed")
result = subprocess.Popen("rabbitmqctl forget_cluster_node rabbitmq@{}".format(hostname), shell=True).wait()
if result != 0:
print("Node deprovisioning may have failed when attempting to "
"remove the RabbitMQ instance {} from the cluster".format(hostname))
else:
if isolated:
print('Successfully deprovisioned {}'.format(hostname))
else:
result = subprocess.Popen("rabbitmqctl forget_cluster_node rabbitmq@{}".format(hostname), shell=True).wait()
if result != 0:
print("Node deprovisioning may have failed when attempting to "
"remove the RabbitMQ instance {} from the cluster".format(hostname))
else:
print('Successfully deprovisioned {}'.format(hostname))
print('(changed: True)')
else:
print('No instance found matching name {}'.format(hostname))

View File

@@ -1,17 +0,0 @@
# Copyright (c) 2017 Ansible by Red Hat
# All Rights Reserved
# Borrow from another AWX command
from awx.main.management.commands.deprovision_instance import Command as OtherCommand
# Python
import warnings
class Command(OtherCommand):
def handle(self, *args, **options):
# TODO: delete this entire file in 3.3
warnings.warn('This command is replaced with `deprovision_instance` and will '
'be removed in release 3.3.')
return super(Command, self).handle(*args, **options)

View File

@@ -0,0 +1,37 @@
# Python
from importlib import import_module
# Django
from django.utils import timezone
from django.conf import settings
from django.contrib.auth import logout
from django.http import HttpRequest
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
from django.contrib.sessions.models import Session
from django.core.exceptions import ObjectDoesNotExist
class Command(BaseCommand):
"""Expire Django auth sessions for a user/all users"""
help='Expire Django auth sessions. Will expire all auth sessions if --user option is not supplied.'
def add_arguments(self, parser):
parser.add_argument('--user', dest='user', type=str)
def handle(self, *args, **options):
# Try to see if the user exist
try:
user = User.objects.get(username=options['user']) if options['user'] else None
except ObjectDoesNotExist:
raise CommandError('The user does not exist.')
# We use the following hack to filter out sessions that are still active,
# with consideration for timezones.
start = timezone.now()
sessions = Session.objects.filter(expire_date__gte=start).iterator()
request = HttpRequest()
for session in sessions:
user_id = session.get_decoded().get('_auth_user_id')
if (user is None) or (user_id and user.id == int(user_id)):
request.session = import_module(settings.SESSION_ENGINE).SessionStore(session.session_key)
logout(request)

View File

@@ -1,6 +1,7 @@
# Copyright (c) 2015 Ansible, Inc.
# All Rights Reserved
import datetime
from django.utils.encoding import smart_str
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
@@ -35,10 +36,10 @@ class Command(BaseCommand):
).save()
pemfile = Setting.objects.create(
key='AWX_ISOLATED_PUBLIC_KEY',
value=key.public_key().public_bytes(
value=smart_str(key.public_key().public_bytes(
encoding=serialization.Encoding.OpenSSH,
format=serialization.PublicFormat.OpenSSH
) + " generated-by-awx@%s" % datetime.datetime.utcnow().isoformat()
)) + " generated-by-awx@%s" % datetime.datetime.utcnow().isoformat()
)
pemfile.save()
print(pemfile.value)

View File

@@ -4,6 +4,7 @@
# Python
import json
import logging
import fnmatch
import os
import re
import subprocess
@@ -15,12 +16,20 @@ import shutil
# Django
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.core.exceptions import ImproperlyConfigured
from django.db import connection, transaction
from django.utils.encoding import smart_text
# AWX
from awx.main.models import * # noqa
# AWX inventory imports
from awx.main.models.inventory import (
Inventory,
InventorySource,
InventoryUpdate,
Host
)
from awx.main.utils.mem_inventory import MemInventory, dict_to_mem_data
# other AWX imports
from awx.main.models.rbac import batch_role_ancestor_rebuilding
from awx.main.utils import (
ignore_inventory_computed_fields,
check_proot_installed,
@@ -28,8 +37,8 @@ from awx.main.utils import (
build_proot_temp_dir,
get_licenser
)
from awx.main.utils.mem_inventory import MemInventory, dict_to_mem_data
from awx.main.signals import disable_activity_stream
from awx.main.constants import STANDARD_INVENTORY_UPDATE_ENV
logger = logging.getLogger('awx.main.commands.inventory_import')
@@ -62,57 +71,62 @@ class AnsibleInventoryLoader(object):
use the ansible-inventory CLI utility to convert it into in-memory
representational objects. Example:
/usr/bin/ansible/ansible-inventory -i hosts --list
If it fails to find this, it uses the backported script instead
'''
def __init__(self, source, group_filter_re=None, host_filter_re=None, is_custom=False):
def __init__(self, source, is_custom=False, venv_path=None):
self.source = source
self.source_dir = functioning_dir(self.source)
self.is_custom = is_custom
self.tmp_private_dir = None
self.method = 'ansible-inventory'
self.group_filter_re = group_filter_re
self.host_filter_re = host_filter_re
self.is_vendored_source = False
if self.source_dir == os.path.join(settings.BASE_DIR, 'plugins', 'inventory'):
self.is_vendored_source = True
if venv_path:
self.venv_path = venv_path
else:
self.venv_path = settings.ANSIBLE_VENV_PATH
def build_env(self):
env = dict(os.environ.items())
env['VIRTUAL_ENV'] = settings.ANSIBLE_VENV_PATH
env['PATH'] = os.path.join(settings.ANSIBLE_VENV_PATH, "bin") + ":" + env['PATH']
env['ANSIBLE_INVENTORY_UNPARSED_FAILED'] = '1'
venv_libdir = os.path.join(settings.ANSIBLE_VENV_PATH, "lib")
env['VIRTUAL_ENV'] = self.venv_path
env['PATH'] = os.path.join(self.venv_path, "bin") + ":" + env['PATH']
# Set configuration items that should always be used for updates
for key, value in STANDARD_INVENTORY_UPDATE_ENV.items():
if key not in env:
env[key] = value
venv_libdir = os.path.join(self.venv_path, "lib")
env.pop('PYTHONPATH', None) # default to none if no python_ver matches
if os.path.isdir(os.path.join(venv_libdir, "python2.7")):
env['PYTHONPATH'] = os.path.join(venv_libdir, "python2.7", "site-packages") + ":"
for version in os.listdir(venv_libdir):
if fnmatch.fnmatch(version, 'python[23].*'):
if os.path.isdir(os.path.join(venv_libdir, version)):
env['PYTHONPATH'] = os.path.join(venv_libdir, version, "site-packages") + ":"
break
# For internal inventory updates, these are not reported in the job_env API
logger.info('Using VIRTUAL_ENV: {}'.format(env['VIRTUAL_ENV']))
logger.info('Using PATH: {}'.format(env['PATH']))
logger.info('Using PYTHONPATH: {}'.format(env.get('PYTHONPATH', None)))
return env
def get_path_to_ansible_inventory(self):
venv_exe = os.path.join(self.venv_path, 'bin', 'ansible-inventory')
if os.path.exists(venv_exe):
return venv_exe
elif os.path.exists(
os.path.join(self.venv_path, 'bin', 'ansible')
):
# if bin/ansible exists but bin/ansible-inventory doesn't, it's
# probably a really old version of ansible that doesn't support
# ansible-inventory
raise RuntimeError(
"{} does not exist (please upgrade to ansible >= 2.4)".format(
venv_exe
)
)
return shutil.which('ansible-inventory')
def get_base_args(self):
# get ansible-inventory absolute path for running in bubblewrap/proot, in Popen
for path in os.environ["PATH"].split(os.pathsep):
potential_path = os.path.join(path.strip('"'), 'ansible-inventory')
if os.path.isfile(potential_path) and os.access(potential_path, os.X_OK):
logger.debug('Using system install of ansible-inventory CLI: {}'.format(potential_path))
return [potential_path, '-i', self.source]
# Stopgap solution for group_vars, do not use backported module for official
# vendored cloud modules or custom scripts TODO: remove after Ansible 2.3 deprecation
if self.is_vendored_source or self.is_custom:
self.method = 'inventory script invocation'
return [self.source]
# ansible-inventory was not found, look for backported module TODO: remove after Ansible 2.3 deprecation
abs_module_path = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', '..', 'plugins',
'ansible_inventory', 'backport.py'))
self.method = 'ansible-inventory backport'
if not os.path.exists(abs_module_path):
raise ImproperlyConfigured('Cannot find inventory module')
logger.debug('Using backported ansible-inventory module: {}'.format(abs_module_path))
return [abs_module_path, '-i', self.source]
bargs= [self.get_path_to_ansible_inventory(), '-i', self.source]
logger.debug('Using base command: {}'.format(' '.join(bargs)))
return bargs
def get_proot_args(self, cmd, env):
cwd = os.getcwd()
@@ -135,10 +149,12 @@ class AnsibleInventoryLoader(object):
self.tmp_private_dir = build_proot_temp_dir()
logger.debug("Using fresh temporary directory '{}' for isolation.".format(self.tmp_private_dir))
kwargs['proot_temp_dir'] = self.tmp_private_dir
# Run from source's location so that custom script contents are in `show_paths`
cwd = functioning_dir(self.source)
kwargs['proot_show_paths'] = [functioning_dir(self.source)]
logger.debug("Running from `{}` working directory.".format(cwd))
if self.venv_path != settings.ANSIBLE_VENV_PATH:
kwargs['proot_custom_virtualenv'] = self.venv_path
return wrap_args_with_proot(cmd, cwd, **kwargs)
def command_to_json(self, cmd):
@@ -152,6 +168,8 @@ class AnsibleInventoryLoader(object):
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
stdout, stderr = proc.communicate()
stdout = smart_text(stdout)
stderr = smart_text(stderr)
if self.tmp_private_dir:
shutil.rmtree(self.tmp_private_dir, True)
@@ -174,80 +192,7 @@ class AnsibleInventoryLoader(object):
base_args = self.get_base_args()
logger.info('Reading Ansible inventory source: %s', self.source)
data = self.command_to_json(base_args + ['--list'])
# TODO: remove after we run custom scripts through ansible-inventory
if self.is_custom and '_meta' not in data or 'hostvars' not in data['_meta']:
# Invoke the executable once for each host name we've built up
# to set their variables
data.setdefault('_meta', {})
data['_meta'].setdefault('hostvars', {})
logger.warning('Re-calling script for hostvars individually.')
for group_name, group_data in data.iteritems():
if group_name == '_meta':
continue
if isinstance(group_data, dict):
group_host_list = group_data.get('hosts', [])
elif isinstance(group_data, list):
group_host_list = group_data
else:
logger.warning('Group data for "%s" is not a dict or list',
group_name)
group_host_list = []
for hostname in group_host_list:
logger.debug('Obtaining hostvars for %s' % hostname.encode('utf-8'))
hostdata = self.command_to_json(
base_args + ['--host', hostname.encode("utf-8")]
)
if isinstance(hostdata, dict):
data['_meta']['hostvars'][hostname] = hostdata
else:
logger.warning(
'Expected dict of vars for host "%s" when '
'calling with `--host`, got %s instead',
k, str(type(data))
)
logger.info('Processing JSON output...')
inventory = MemInventory(
group_filter_re=self.group_filter_re, host_filter_re=self.host_filter_re)
inventory = dict_to_mem_data(data, inventory=inventory)
return inventory
def load_inventory_source(source, group_filter_re=None,
host_filter_re=None, exclude_empty_groups=False,
is_custom=False):
'''
Load inventory from given source directory or file.
'''
# Sanity check: We sanitize these module names for our API but Ansible proper doesn't follow
# good naming conventions
source = source.replace('rhv.py', 'ovirt4.py')
source = source.replace('satellite6.py', 'foreman.py')
source = source.replace('vmware.py', 'vmware_inventory.py')
if not os.path.exists(source):
raise IOError('Source does not exist: %s' % source)
source = os.path.join(os.getcwd(), os.path.dirname(source),
os.path.basename(source))
source = os.path.normpath(os.path.abspath(source))
inventory = AnsibleInventoryLoader(
source=source,
group_filter_re=group_filter_re,
host_filter_re=host_filter_re,
is_custom=is_custom).load()
logger.debug('Finished loading from source: %s', source)
# Exclude groups that are completely empty.
if exclude_empty_groups:
inventory.delete_empty_groups()
logger.info('Loaded %d groups, %d hosts', len(inventory.all_group.all_groups),
len(inventory.all_group.all_hosts))
return inventory.all_group
return self.command_to_json(base_args + ['--list'])
class Command(BaseCommand):
@@ -265,6 +210,8 @@ class Command(BaseCommand):
parser.add_argument('--inventory-id', dest='inventory_id', type=int,
default=None, metavar='i',
help='id of inventory to sync')
parser.add_argument('--venv', dest='venv', type=str, default=None,
help='absolute path to the AWX custom virtualenv to use')
parser.add_argument('--overwrite', dest='overwrite', action='store_true', default=False,
help='overwrite the destination hosts and groups')
parser.add_argument('--overwrite-vars', dest='overwrite_vars',
@@ -344,7 +291,7 @@ class Command(BaseCommand):
if enabled is not default:
enabled_value = getattr(self, 'enabled_value', None)
if enabled_value is not None:
enabled = bool(unicode(enabled_value) == unicode(enabled))
enabled = bool(str(enabled_value) == str(enabled))
else:
enabled = bool(enabled)
if enabled is default:
@@ -354,6 +301,19 @@ class Command(BaseCommand):
else:
raise NotImplementedError('Value of enabled {} not understood.'.format(enabled))
def get_source_absolute_path(self, source):
# Sanity check: We sanitize these module names for our API but Ansible proper doesn't follow
# good naming conventions
source = source.replace('rhv.py', 'ovirt4.py')
source = source.replace('satellite6.py', 'foreman.py')
source = source.replace('vmware.py', 'vmware_inventory.py')
if not os.path.exists(source):
raise IOError('Source does not exist: %s' % source)
source = os.path.join(os.getcwd(), os.path.dirname(source),
os.path.basename(source))
source = os.path.normpath(os.path.abspath(source))
return source
def load_inventory_from_database(self):
'''
Load inventory and related objects from the database.
@@ -366,9 +326,9 @@ class Command(BaseCommand):
try:
self.inventory = Inventory.objects.get(**q)
except Inventory.DoesNotExist:
raise CommandError('Inventory with %s = %s cannot be found' % q.items()[0])
raise CommandError('Inventory with %s = %s cannot be found' % list(q.items())[0])
except Inventory.MultipleObjectsReturned:
raise CommandError('Inventory with %s = %s returned multiple results' % q.items()[0])
raise CommandError('Inventory with %s = %s returned multiple results' % list(q.items())[0])
logger.info('Updating inventory %d: %s' % (self.inventory.pk,
self.inventory.name))
@@ -466,9 +426,9 @@ class Command(BaseCommand):
# Build list of all host pks, remove all that should not be deleted.
del_host_pks = set(hosts_qs.values_list('pk', flat=True))
if self.instance_id_var:
all_instance_ids = self.mem_instance_id_map.keys()
all_instance_ids = list(self.mem_instance_id_map.keys())
instance_ids = []
for offset in xrange(0, len(all_instance_ids), self._batch_size):
for offset in range(0, len(all_instance_ids), self._batch_size):
instance_ids = all_instance_ids[offset:(offset + self._batch_size)]
for host_pk in hosts_qs.filter(instance_id__in=instance_ids).values_list('pk', flat=True):
del_host_pks.discard(host_pk)
@@ -476,19 +436,19 @@ class Command(BaseCommand):
del_host_pks.discard(host_pk)
all_host_names = list(set(self.mem_instance_id_map.values()) - set(self.all_group.all_hosts.keys()))
else:
all_host_names = self.all_group.all_hosts.keys()
for offset in xrange(0, len(all_host_names), self._batch_size):
all_host_names = list(self.all_group.all_hosts.keys())
for offset in range(0, len(all_host_names), self._batch_size):
host_names = all_host_names[offset:(offset + self._batch_size)]
for host_pk in hosts_qs.filter(name__in=host_names).values_list('pk', flat=True):
del_host_pks.discard(host_pk)
# Now delete all remaining hosts in batches.
all_del_pks = sorted(list(del_host_pks))
for offset in xrange(0, len(all_del_pks), self._batch_size):
for offset in range(0, len(all_del_pks), self._batch_size):
del_pks = all_del_pks[offset:(offset + self._batch_size)]
for host in hosts_qs.filter(pk__in=del_pks):
host_name = host.name
host.delete()
logger.info('Deleted host "%s"', host_name)
logger.debug('Deleted host "%s"', host_name)
if settings.SQL_DEBUG:
logger.warning('host deletions took %d queries for %d hosts',
len(connection.queries) - queries_before,
@@ -506,8 +466,8 @@ class Command(BaseCommand):
groups_qs = self.inventory_source.groups.all()
# Build list of all group pks, remove those that should not be deleted.
del_group_pks = set(groups_qs.values_list('pk', flat=True))
all_group_names = self.all_group.all_groups.keys()
for offset in xrange(0, len(all_group_names), self._batch_size):
all_group_names = list(self.all_group.all_groups.keys())
for offset in range(0, len(all_group_names), self._batch_size):
group_names = all_group_names[offset:(offset + self._batch_size)]
for group_pk in groups_qs.filter(name__in=group_names).values_list('pk', flat=True):
del_group_pks.discard(group_pk)
@@ -519,13 +479,13 @@ class Command(BaseCommand):
del_group_pks.discard(self.inventory_source.deprecated_group_id)
# Now delete all remaining groups in batches.
all_del_pks = sorted(list(del_group_pks))
for offset in xrange(0, len(all_del_pks), self._batch_size):
for offset in range(0, len(all_del_pks), self._batch_size):
del_pks = all_del_pks[offset:(offset + self._batch_size)]
for group in groups_qs.filter(pk__in=del_pks):
group_name = group.name
with ignore_inventory_computed_fields():
group.delete()
logger.info('Group "%s" deleted', group_name)
logger.debug('Group "%s" deleted', group_name)
if settings.SQL_DEBUG:
logger.warning('group deletions took %d queries for %d groups',
len(connection.queries) - queries_before,
@@ -546,7 +506,7 @@ class Command(BaseCommand):
db_groups = self.inventory_source.groups
for db_group in db_groups.all():
if self.inventory_source.deprecated_group_id == db_group.id: # TODO: remove in 3.3
logger.info(
logger.debug(
'Group "%s" from v1 API child group/host connections preserved',
db_group.name
)
@@ -558,25 +518,25 @@ class Command(BaseCommand):
for mem_group in mem_children:
db_children_name_pk_map.pop(mem_group.name, None)
del_child_group_pks = list(set(db_children_name_pk_map.values()))
for offset in xrange(0, len(del_child_group_pks), self._batch_size):
for offset in range(0, len(del_child_group_pks), self._batch_size):
child_group_pks = del_child_group_pks[offset:(offset + self._batch_size)]
for db_child in db_children.filter(pk__in=child_group_pks):
group_group_count += 1
db_group.children.remove(db_child)
logger.info('Group "%s" removed from group "%s"',
db_child.name, db_group.name)
logger.debug('Group "%s" removed from group "%s"',
db_child.name, db_group.name)
# FIXME: Inventory source group relationships
# Delete group/host relationships not present in imported data.
db_hosts = db_group.hosts
del_host_pks = set(db_hosts.values_list('pk', flat=True))
mem_hosts = self.all_group.all_groups[db_group.name].hosts
all_mem_host_names = [h.name for h in mem_hosts if not h.instance_id]
for offset in xrange(0, len(all_mem_host_names), self._batch_size):
for offset in range(0, len(all_mem_host_names), self._batch_size):
mem_host_names = all_mem_host_names[offset:(offset + self._batch_size)]
for db_host_pk in db_hosts.filter(name__in=mem_host_names).values_list('pk', flat=True):
del_host_pks.discard(db_host_pk)
all_mem_instance_ids = [h.instance_id for h in mem_hosts if h.instance_id]
for offset in xrange(0, len(all_mem_instance_ids), self._batch_size):
for offset in range(0, len(all_mem_instance_ids), self._batch_size):
mem_instance_ids = all_mem_instance_ids[offset:(offset + self._batch_size)]
for db_host_pk in db_hosts.filter(instance_id__in=mem_instance_ids).values_list('pk', flat=True):
del_host_pks.discard(db_host_pk)
@@ -584,15 +544,15 @@ class Command(BaseCommand):
for db_host_pk in all_db_host_pks:
del_host_pks.discard(db_host_pk)
del_host_pks = list(del_host_pks)
for offset in xrange(0, len(del_host_pks), self._batch_size):
for offset in range(0, len(del_host_pks), self._batch_size):
del_pks = del_host_pks[offset:(offset + self._batch_size)]
for db_host in db_hosts.filter(pk__in=del_pks):
group_host_count += 1
if db_host not in db_group.hosts.all():
continue
db_group.hosts.remove(db_host)
logger.info('Host "%s" removed from group "%s"',
db_host.name, db_group.name)
logger.debug('Host "%s" removed from group "%s"',
db_host.name, db_group.name)
if settings.SQL_DEBUG:
logger.warning('group-group and group-host deletions took %d queries for %d relationships',
len(connection.queries) - queries_before,
@@ -611,9 +571,9 @@ class Command(BaseCommand):
if db_variables != all_obj.variables_dict:
all_obj.variables = json.dumps(db_variables)
all_obj.save(update_fields=['variables'])
logger.info('Inventory variables updated from "all" group')
logger.debug('Inventory variables updated from "all" group')
else:
logger.info('Inventory variables unmodified')
logger.debug('Inventory variables unmodified')
def _create_update_groups(self):
'''
@@ -632,7 +592,7 @@ class Command(BaseCommand):
if len(v.parents) == 1 and v.parents[0].name == 'all':
root_group_names.add(k)
existing_group_names = set()
for offset in xrange(0, len(all_group_names), self._batch_size):
for offset in range(0, len(all_group_names), self._batch_size):
group_names = all_group_names[offset:(offset + self._batch_size)]
for group in self.inventory.groups.filter(name__in=group_names):
mem_group = self.all_group.all_groups[group.name]
@@ -645,11 +605,11 @@ class Command(BaseCommand):
group.variables = json.dumps(db_variables)
group.save(update_fields=['variables'])
if self.overwrite_vars:
logger.info('Group "%s" variables replaced', group.name)
logger.debug('Group "%s" variables replaced', group.name)
else:
logger.info('Group "%s" variables updated', group.name)
logger.debug('Group "%s" variables updated', group.name)
else:
logger.info('Group "%s" variables unmodified', group.name)
logger.debug('Group "%s" variables unmodified', group.name)
existing_group_names.add(group.name)
self._batch_add_m2m(self.inventory_source.groups, group)
for group_name in all_group_names:
@@ -663,7 +623,7 @@ class Command(BaseCommand):
'description':'imported'
}
)[0]
logger.info('Group "%s" added', group.name)
logger.debug('Group "%s" added', group.name)
self._batch_add_m2m(self.inventory_source.groups, group)
self._batch_add_m2m(self.inventory_source.groups, flush=True)
if settings.SQL_DEBUG:
@@ -702,24 +662,24 @@ class Command(BaseCommand):
if update_fields:
db_host.save(update_fields=update_fields)
if 'name' in update_fields:
logger.info('Host renamed from "%s" to "%s"', old_name, mem_host.name)
logger.debug('Host renamed from "%s" to "%s"', old_name, mem_host.name)
if 'instance_id' in update_fields:
if old_instance_id:
logger.info('Host "%s" instance_id updated', mem_host.name)
logger.debug('Host "%s" instance_id updated', mem_host.name)
else:
logger.info('Host "%s" instance_id added', mem_host.name)
logger.debug('Host "%s" instance_id added', mem_host.name)
if 'variables' in update_fields:
if self.overwrite_vars:
logger.info('Host "%s" variables replaced', mem_host.name)
logger.debug('Host "%s" variables replaced', mem_host.name)
else:
logger.info('Host "%s" variables updated', mem_host.name)
logger.debug('Host "%s" variables updated', mem_host.name)
else:
logger.info('Host "%s" variables unmodified', mem_host.name)
logger.debug('Host "%s" variables unmodified', mem_host.name)
if 'enabled' in update_fields:
if enabled:
logger.info('Host "%s" is now enabled', mem_host.name)
logger.debug('Host "%s" is now enabled', mem_host.name)
else:
logger.info('Host "%s" is now disabled', mem_host.name)
logger.debug('Host "%s" is now disabled', mem_host.name)
self._batch_add_m2m(self.inventory_source.hosts, db_host)
def _create_update_hosts(self):
@@ -736,7 +696,7 @@ class Command(BaseCommand):
mem_host_instance_id_map = {}
mem_host_name_map = {}
mem_host_names_to_update = set(self.all_group.all_hosts.keys())
for k,v in self.all_group.all_hosts.iteritems():
for k,v in self.all_group.all_hosts.items():
mem_host_name_map[k] = v
instance_id = self._get_instance_id(v.variables)
if instance_id in self.db_instance_id_map:
@@ -746,7 +706,7 @@ class Command(BaseCommand):
# Update all existing hosts where we know the PK based on instance_id.
all_host_pks = sorted(mem_host_pk_map.keys())
for offset in xrange(0, len(all_host_pks), self._batch_size):
for offset in range(0, len(all_host_pks), self._batch_size):
host_pks = all_host_pks[offset:(offset + self._batch_size)]
for db_host in self.inventory.hosts.filter( pk__in=host_pks):
if db_host.pk in host_pks_updated:
@@ -758,7 +718,7 @@ class Command(BaseCommand):
# Update all existing hosts where we know the instance_id.
all_instance_ids = sorted(mem_host_instance_id_map.keys())
for offset in xrange(0, len(all_instance_ids), self._batch_size):
for offset in range(0, len(all_instance_ids), self._batch_size):
instance_ids = all_instance_ids[offset:(offset + self._batch_size)]
for db_host in self.inventory.hosts.filter( instance_id__in=instance_ids):
if db_host.pk in host_pks_updated:
@@ -770,7 +730,7 @@ class Command(BaseCommand):
# Update all existing hosts by name.
all_host_names = sorted(mem_host_name_map.keys())
for offset in xrange(0, len(all_host_names), self._batch_size):
for offset in range(0, len(all_host_names), self._batch_size):
host_names = all_host_names[offset:(offset + self._batch_size)]
for db_host in self.inventory.hosts.filter( name__in=host_names):
if db_host.pk in host_pks_updated:
@@ -793,9 +753,9 @@ class Command(BaseCommand):
host_attrs['instance_id'] = instance_id
db_host = self.inventory.hosts.update_or_create(name=mem_host_name, defaults=host_attrs)[0]
if enabled is False:
logger.info('Host "%s" added (disabled)', mem_host_name)
logger.debug('Host "%s" added (disabled)', mem_host_name)
else:
logger.info('Host "%s" added', mem_host_name)
logger.debug('Host "%s" added', mem_host_name)
self._batch_add_m2m(self.inventory_source.hosts, db_host)
self._batch_add_m2m(self.inventory_source.hosts, flush=True)
@@ -812,22 +772,22 @@ class Command(BaseCommand):
'''
if settings.SQL_DEBUG:
queries_before = len(connection.queries)
all_group_names = sorted([k for k,v in self.all_group.all_groups.iteritems() if v.children])
all_group_names = sorted([k for k,v in self.all_group.all_groups.items() if v.children])
group_group_count = 0
for offset in xrange(0, len(all_group_names), self._batch_size):
for offset in range(0, len(all_group_names), self._batch_size):
group_names = all_group_names[offset:(offset + self._batch_size)]
for db_group in self.inventory.groups.filter(name__in=group_names):
mem_group = self.all_group.all_groups[db_group.name]
group_group_count += len(mem_group.children)
all_child_names = sorted([g.name for g in mem_group.children])
for offset2 in xrange(0, len(all_child_names), self._batch_size):
for offset2 in range(0, len(all_child_names), self._batch_size):
child_names = all_child_names[offset2:(offset2 + self._batch_size)]
db_children_qs = self.inventory.groups.filter(name__in=child_names)
for db_child in db_children_qs.filter(children__id=db_group.id):
logger.info('Group "%s" already child of group "%s"', db_child.name, db_group.name)
logger.debug('Group "%s" already child of group "%s"', db_child.name, db_group.name)
for db_child in db_children_qs.exclude(children__id=db_group.id):
self._batch_add_m2m(db_group.children, db_child)
logger.info('Group "%s" added as child of "%s"', db_child.name, db_group.name)
logger.debug('Group "%s" added as child of "%s"', db_child.name, db_group.name)
self._batch_add_m2m(db_group.children, flush=True)
if settings.SQL_DEBUG:
logger.warning('Group-group updates took %d queries for %d group-group relationships',
@@ -839,31 +799,31 @@ class Command(BaseCommand):
# belongs.
if settings.SQL_DEBUG:
queries_before = len(connection.queries)
all_group_names = sorted([k for k,v in self.all_group.all_groups.iteritems() if v.hosts])
all_group_names = sorted([k for k,v in self.all_group.all_groups.items() if v.hosts])
group_host_count = 0
for offset in xrange(0, len(all_group_names), self._batch_size):
for offset in range(0, len(all_group_names), self._batch_size):
group_names = all_group_names[offset:(offset + self._batch_size)]
for db_group in self.inventory.groups.filter(name__in=group_names):
mem_group = self.all_group.all_groups[db_group.name]
group_host_count += len(mem_group.hosts)
all_host_names = sorted([h.name for h in mem_group.hosts if not h.instance_id])
for offset2 in xrange(0, len(all_host_names), self._batch_size):
for offset2 in range(0, len(all_host_names), self._batch_size):
host_names = all_host_names[offset2:(offset2 + self._batch_size)]
db_hosts_qs = self.inventory.hosts.filter(name__in=host_names)
for db_host in db_hosts_qs.filter(groups__id=db_group.id):
logger.info('Host "%s" already in group "%s"', db_host.name, db_group.name)
logger.debug('Host "%s" already in group "%s"', db_host.name, db_group.name)
for db_host in db_hosts_qs.exclude(groups__id=db_group.id):
self._batch_add_m2m(db_group.hosts, db_host)
logger.info('Host "%s" added to group "%s"', db_host.name, db_group.name)
logger.debug('Host "%s" added to group "%s"', db_host.name, db_group.name)
all_instance_ids = sorted([h.instance_id for h in mem_group.hosts if h.instance_id])
for offset2 in xrange(0, len(all_instance_ids), self._batch_size):
for offset2 in range(0, len(all_instance_ids), self._batch_size):
instance_ids = all_instance_ids[offset2:(offset2 + self._batch_size)]
db_hosts_qs = self.inventory.hosts.filter(instance_id__in=instance_ids)
for db_host in db_hosts_qs.filter(groups__id=db_group.id):
logger.info('Host "%s" already in group "%s"', db_host.name, db_group.name)
logger.debug('Host "%s" already in group "%s"', db_host.name, db_group.name)
for db_host in db_hosts_qs.exclude(groups__id=db_group.id):
self._batch_add_m2m(db_group.hosts, db_host)
logger.info('Host "%s" added to group "%s"', db_host.name, db_group.name)
logger.debug('Host "%s" added to group "%s"', db_host.name, db_group.name)
self._batch_add_m2m(db_group.hosts, flush=True)
if settings.SQL_DEBUG:
logger.warning('Group-host updates took %d queries for %d group-host relationships',
@@ -923,6 +883,7 @@ class Command(BaseCommand):
self.set_logging_level()
self.inventory_name = options.get('inventory_name', None)
self.inventory_id = options.get('inventory_id', None)
venv_path = options.get('venv', None)
self.overwrite = bool(options.get('overwrite', False))
self.overwrite_vars = bool(options.get('overwrite_vars', False))
self.keep_vars = bool(options.get('keep_vars', False))
@@ -935,7 +896,7 @@ class Command(BaseCommand):
self.exclude_empty_groups = bool(options.get('exclude_empty_groups', False))
self.instance_id_var = options.get('instance_id_var', None)
self.celery_invoked = False if os.getenv('INVENTORY_SOURCE_ID', None) is None else True
self.invoked_from_dispatcher = False if os.getenv('INVENTORY_SOURCE_ID', None) is None else True
# Load inventory and related objects from database.
if self.inventory_name and self.inventory_id:
@@ -983,12 +944,26 @@ class Command(BaseCommand):
self.inventory_update.status = 'running'
self.inventory_update.save()
# Load inventory from source.
self.all_group = load_inventory_source(self.source,
self.group_filter_re,
self.host_filter_re,
self.exclude_empty_groups,
self.is_custom)
source = self.get_source_absolute_path(self.source)
data = AnsibleInventoryLoader(source=source, is_custom=self.is_custom, venv_path=venv_path).load()
logger.debug('Finished loading from source: %s', source)
logger.info('Processing JSON output...')
inventory = MemInventory(
group_filter_re=self.group_filter_re, host_filter_re=self.host_filter_re)
inventory = dict_to_mem_data(data, inventory=inventory)
del data # forget dict from import, could be large
logger.info('Loaded %d groups, %d hosts', len(inventory.all_group.all_groups),
len(inventory.all_group.all_hosts))
if self.exclude_empty_groups:
inventory.delete_empty_groups()
self.all_group = inventory.all_group
if settings.DEBUG:
# depending on inventory source, this output can be
# *exceedingly* verbose - crawling a deeply nested
@@ -1002,37 +977,43 @@ class Command(BaseCommand):
self.all_group.debug_tree()
with batch_role_ancestor_rebuilding():
# Ensure that this is managed as an atomic SQL transaction,
# and thus properly rolled back if there is an issue.
with transaction.atomic():
# Merge/overwrite inventory into database.
if settings.SQL_DEBUG:
logger.warning('loading into database...')
with ignore_inventory_computed_fields():
if getattr(settings, 'ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC', True):
self.load_into_database()
else:
with disable_activity_stream():
# If using with transaction.atomic() with try ... catch,
# with transaction.atomic() must be inside the try section of the code as per Django docs
try:
# Ensure that this is managed as an atomic SQL transaction,
# and thus properly rolled back if there is an issue.
with transaction.atomic():
# Merge/overwrite inventory into database.
if settings.SQL_DEBUG:
logger.warning('loading into database...')
with ignore_inventory_computed_fields():
if getattr(settings, 'ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC', True):
self.load_into_database()
if settings.SQL_DEBUG:
queries_before2 = len(connection.queries)
self.inventory.update_computed_fields()
if settings.SQL_DEBUG:
logger.warning('update computed fields took %d queries',
len(connection.queries) - queries_before2)
try:
else:
with disable_activity_stream():
self.load_into_database()
if settings.SQL_DEBUG:
queries_before2 = len(connection.queries)
self.inventory.update_computed_fields()
if settings.SQL_DEBUG:
logger.warning('update computed fields took %d queries',
len(connection.queries) - queries_before2)
# Check if the license is valid.
# If the license is not valid, a CommandError will be thrown,
# and inventory update will be marked as invalid.
# with transaction.atomic() will roll back the changes.
self.check_license()
except CommandError as e:
self.mark_license_failure(save=True)
raise e
except CommandError as e:
self.mark_license_failure()
raise e
if settings.SQL_DEBUG:
logger.warning('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
else:
logger.info('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
status = 'successful'
if settings.SQL_DEBUG:
logger.warning('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
else:
logger.info('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
status = 'successful'
# If we're in debug mode, then log the queries and time
# used to do the operation.
@@ -1053,14 +1034,16 @@ class Command(BaseCommand):
exc = e
transaction.rollback()
if self.celery_invoked is False:
if self.invoked_from_dispatcher is False:
with ignore_inventory_computed_fields():
self.inventory_update = InventoryUpdate.objects.get(pk=self.inventory_update.pk)
self.inventory_update.result_traceback = tb
self.inventory_update.status = status
self.inventory_update.save(update_fields=['status', 'result_traceback'])
self.inventory_source.status = status
self.inventory_source.save(update_fields=['status'])
if exc and isinstance(exc, CommandError):
sys.exit(1)
elif exc:
raise
raise exc

Some files were not shown because too many files have changed in this diff Show More