Compare commits

...

1529 Commits

Author SHA1 Message Date
Shane McDonald
14f42af700 Update CHANGELOG.md 2021-03-23 10:30:59 -04:00
softwarefactory-project-zuul[bot]
9b702e46fe Merge pull request #9655 from ansible/jakemcdermott-patch-changelog
Update some links and notes in the changelog

SUMMARY
Fix typo, remove duplicate change note, fix a wrong link, add link to the ui virtualenv removal

Reviewed-by: Ryan Petrello <None>
2021-03-22 19:47:22 +00:00
softwarefactory-project-zuul[bot]
9608539710 Merge pull request #9596 from nixocio/ui_issue_9592
Allow one to select non-global execution environments for organizations

Allow one to select non-global EE when editing an Organization.
See: #9592
All those EE should be present as a choice when editing the Default organization.

Editing Default organization.

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-22 19:38:44 +00:00
Jake McDermott
23ac8d346f Update some links and notes in the changelog 2021-03-22 14:59:04 -04:00
Shane McDonald
ff00239c09 Update CHANGELOG.md 2021-03-22 13:05:52 -04:00
Shane McDonald
fc7b2212e6 Merge pull request #9652 from shanemcd/fix-changelog-dates
Fix changelog dates
2021-03-22 12:53:36 -04:00
Shane McDonald
ade0734af7 Fix changelog dates 2021-03-22 12:42:40 -04:00
Shane McDonald
1efd189d52 Revert "Remove search filtering from changelog"
This reverts commit f6fb3e0b41.
2021-03-22 12:40:11 -04:00
softwarefactory-project-zuul[bot]
52799c169e Merge pull request #9605 from fosterseth/fix_dev_cluster_port_conflict
fix port conflict in dev cluster

SUMMARY

problem: loop adds 100 to ports 7899 and 7999, which would yield 7999 to 8099 on the next iteration, so the 7999 is conflicting
fix: add 1000 instead
Also, haproxy was being defined twice, now it renders once.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 17.0.1

Reviewed-by: Seth Foster <None>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-22 15:30:18 +00:00
softwarefactory-project-zuul[bot]
73f819b632 Merge pull request #9647 from jbradberry/ignore-vscode
Instruct git to ignore the .vscode/ directory

SUMMARY
Instruct git to ignore the .vscode/ directory
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION
awx: 18.0.0

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-03-22 15:18:38 +00:00
softwarefactory-project-zuul[bot]
f3116a3250 Merge pull request #9648 from tiagodread/ouiaid-01
add ouiaID to select and cancel buttons on modals

SUMMARY
Add ouiaId prop to select and cancel button within modals

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-22 15:14:55 +00:00
softwarefactory-project-zuul[bot]
43522d30e6 Merge pull request #9576 from AlexSCorey/9373-InventorySourceSilentFailure
Fixes silent error on SCM subform

SUMMARY
This addresses #9373.  It disallows the user to select both Update on launch and update on project update. It also adds a bit of info to the tool tip including a link to the project in question so the user can edit the project to allow them to update on launch and on project update
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-22 15:10:50 +00:00
Seth Foster
f8641bfa5e fix port conflict in dev cluster. Output only one haproxy def 2021-03-22 10:45:50 -04:00
Tiago Goes
8b9a92f306 add ouiaID to select and cancel buttons on modals 2021-03-22 11:41:51 -03:00
Jeff Bradberry
c508695ed0 Instruct git to ignore the .vscode/ directory 2021-03-22 10:24:11 -04:00
softwarefactory-project-zuul[bot]
305f717e88 Merge pull request #9646 from shanemcd/pdd-wrapper
Create a wrapper directory for the private data dir

Reviewed-by: None <None>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Elijah DeLee <kdelee@redhat.com>
2021-03-22 14:15:40 +00:00
softwarefactory-project-zuul[bot]
7d190da1c4 Merge pull request #9544 from AlexSCorey/9485-9319-7516-fix
Fixes Several Bugs

SUMMARY
This address #9485 (Job template project field validate), #9319 (Job Details view only would show job type run, even if it was a job type check, #7516 (changes the Completed Jobs tab for a JT or WFJT to show Jobs since it show completed and pending/running jobs).
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: John Mitchell <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-22 14:00:08 +00:00
Shane McDonald
fd63937fa2 Create a wrapper directory for the private data dir 2021-03-22 09:24:48 -04:00
softwarefactory-project-zuul[bot]
5e64e8771e Merge pull request #9613 from mabashian/8921-node-cred-password
Prevent users from selecting credentials that prompt for passwords on workflow nodes and schedules

SUMMARY
link #8921
If a user selects a job template with default credentials that prompt for passwords (but does not prompt for credentials) then the user should not be allowed to create the node and a different JT must be selected:

If a user selects a credential that prompts for passwords when creating/editing a workflow node or schedule then we show this error:

If a user removes a credential that exists in the default collection of credentials on the JT then it must be replaced.  This is the error we show:

If a user attempts to create a schedule for a job template with default credentials that prompt (but does not prompt for credentials) then the API responds with this error:

I believe this UX is consistent with the old UI but I am double checking that now.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-22 13:17:26 +00:00
softwarefactory-project-zuul[bot]
597435141d Merge pull request #9563 from AlexSCorey/8769-WizardFailure
Fixes crashing wizard, and adds error handle on adding role

SUMMARY
This addresses #8769.  It also adds error handling if there is some sort of request error during the submit request.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: John Mitchell <None>
2021-03-22 12:16:48 +00:00
softwarefactory-project-zuul[bot]
f11bc1154a Merge pull request #9637 from mabashian/ouiaids
Adds ouiaId's to various buttons

SUMMARY
@tiagodread @unlikelyzero @one-t @akus062381 this will likely break something because I changed some existing ouia-id's so that they are a consistent structure.
^^ Let's let one of them merge this
I also removed an unused component

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: John Hill <johill@redhat.com>
2021-03-21 19:55:56 +00:00
softwarefactory-project-zuul[bot]
cfff30f024 Merge pull request #9519 from mabashian/7603-custom-login
Adds support for html in custom login text

SUMMARY
link #7603
I couldn't come up with a way to do this without breaking up the component and discontinuing use of the LoginPage PF component.  This is because LoginPage expects the textContent component (what we use to display the custom login text) to be a string.  By using the underlying LoginPage components I reconstructed the login page and got more control over that prop.
The custom message in the old UI supported both strings and HTML:

So we need to support rendering HTML but we need to do it in a safe way.  Our solution to that was https://docs.angularjs.org/api/ngSanitize.  React doesn't seem to have anything like this built in so I went looking for outside help.  html-entities is already included in our project but as best as I can tell that lib is mainly focused on swapping special characters out for html entities.  I wanted something that was going to strip the HTML of bits that could be exploited by a malicious actor.
I settled on https://www.npmjs.com/package/sanitize-html because it was a) small and b) actively maintained.  The API was simple and let me sanitize the HTML before setting it using dangerouslySetInnerHTML.  If we need to tweak the configuration away from the default values then we can certainly do that.


ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-19 22:45:42 +00:00
mabashian
3cbb516bac Fixed changelog 2021-03-19 18:07:51 -04:00
mabashian
467536f93f Prevent users from selecting credentials that prompt for passwords on workflow nodes and schedules 2021-03-19 18:04:23 -04:00
softwarefactory-project-zuul[bot]
3878d8f7d8 Merge pull request #9642 from mabashian/9640-workflow-output
Only attempt to fetch event options on non workflow jobs

SUMMARY
link #9640
This was fallout from output search filtering.  We need this request for non workflow jobs so that we can build the search options.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-19 21:42:21 +00:00
mabashian
112bab274d Fixes linting errors 2021-03-19 17:21:16 -04:00
mabashian
9b3aa60468 Only attempt to fetch event options on non workflow jobs 2021-03-19 16:52:26 -04:00
mabashian
1d01efa024 Adds data-cy attributes to some login components 2021-03-19 15:55:22 -04:00
softwarefactory-project-zuul[bot]
f98c6b5c5b Merge pull request #9638 from mabashian/cred-type-ouia-ids
Adds identifiers to various credential elements

SUMMARY
See commits

Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-19 19:37:06 +00:00
mabashian
854da96976 Add line to changelog 2021-03-19 15:12:18 -04:00
mabashian
3211323a4e Adds support for html in custom login text 2021-03-19 15:06:51 -04:00
mabashian
2d396927dd Adds identifiers to credential details 2021-03-19 14:59:17 -04:00
mabashian
54e2608cf4 Adds identifier to credential type options 2021-03-19 14:50:07 -04:00
mabashian
44cd8819f4 Remove CollapsibleSection as it's no longer used in the app. Adds ouiaId's to various buttons. 2021-03-19 14:33:06 -04:00
softwarefactory-project-zuul[bot]
5c0850b279 Merge pull request #9368 from mabashian/7256-cred-password-replace
Add support for replace/revert on secret credential fields

SUMMARY
link #7256
Note that this only applies to editing an existing credential.  You should not see this button on fields when adding a new credential.
When editing an existing credential the replace button should show up on fields where secret is true and the field has an existing value that is not an external credential.  Examples:



Fields with external credentials should look the same:

Initially the button tooltip should say Replace.  Clicking Replace will clear out the previously saved value and enable the form field:

The tooltip will change to Revert.  Clicking Revert will take the field back to it's original state.
I also noticed a race condition which would result in the input fields (subform) not being populated due to the form rendering before the request(s) were completed.  I fixed this.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-19 17:40:16 +00:00
softwarefactory-project-zuul[bot]
7a512c1de7 Merge pull request #9208 from mabashian/job-output-search-2
Add support for filtering and pagination on job output

SUMMARY
link #6612
link #5906
This PR adds the ability to filter job events and also includes logic to handle fetching filtered job events across different pages.
Note that the verbosity dropdown included in #5906 is not included in this work.  I don't think that's possible without api changes.
As part of this work, I converted JobOutput.jsx from a class based component to a functional component.  I've tried my best to make sure that all existing functionality has remained the same by comparing the experience of this branch to devel.
Like the old UI, the output filter is disabled while the job is running.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
2021-03-19 16:38:23 +00:00
softwarefactory-project-zuul[bot]
5bdc8b0015 Merge pull request #9497 from ryanpetrello/bump-18
Bump version to 18.0.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Jim Ladd <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-19 16:00:08 +00:00
mabashian
385ef0b0a4 Adds ouiaId's to output page control buttons 2021-03-19 11:27:43 -04:00
mabashian
6495779e40 Fix bug where output was not loading after job finished and cancel button was shown instead of delete 2021-03-19 10:48:05 -04:00
softwarefactory-project-zuul[bot]
012902f4fe Merge pull request #9598 from beeankha/ansible_version_analytics
Enable Ansible version to be collected from EEs

SUMMARY

Connecting issue #9473
This PR, along with this Ansible-Runner PR, enables us to obtain the Ansible (core) version for each execution environment that is utilized. This info can be gathered from the new ansible_version column on the main_unifiedjobs table.

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 17.0.1

ADDITIONAL INFORMATION
Screenshot/example of the DB output:

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Ladislav Smola <lsmola@redhat.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-19 14:06:03 +00:00
mabashian
65bdf0baf7 Add support for replace/revert on secret credential fields 2021-03-19 09:59:13 -04:00
Shane McDonald
f6fb3e0b41 Remove search filtering from changelog
This has not landed yet
2021-03-19 09:01:33 -04:00
softwarefactory-project-zuul[bot]
6fae6168d9 Merge pull request #9619 from mabashian/9568-session-modal-ouia
Adds ouiaId's to session modal and buttons

SUMMARY
link #9568

Reviewed-by: Kersom <None>
2021-03-19 12:57:25 +00:00
Shane McDonald
9f91190f4b Add changelog entries for installer directory and custom venv removals 2021-03-18 18:56:47 -04:00
Ryan Petrello
23f2ac4cbc Bump version to 18.0.0
Co-Authored-By: Shane McDonald <me@shanemcd.com>
Co-Authored-By: AlanCoding <arominge@redhat.com>
Co-Authored-By: Rebeccah Hunter <rhunter@redhat.com>
Co-Authored-By: Graham Mainwaring <graham@mhn.org>
Co-Authored-By: Jeff Bradberry <jeff.bradberry@gmail.com>
Co-Authored-By: beeankha <beeankha@gmail.com>
Co-Authored-By: Elyézer Rezende <elyezermr@gmail.com>
Co-Authored-By: Yanis Guenane <yguenane@redhat.com>
Co-Authored-By: Jim Ladd <jladd@redhat.com>
Co-Authored-By: Seth Foster <fosterbseth@gmail.com>
Co-Authored-By: Elijah DeLee <kdelee@redhat.com>
Co-Authored-By: Tiago Góes <tiago.goes2009@gmail.com>
Co-Authored-By: Yago Marques <yagomarquesja@gmail.com>
Co-Authored-By: shebangbash <ndasilva@redhat.com>
Co-Authored-By: Jake McDermott <jmcdermott@ansible.com>
Co-Authored-By: Christian Adams <rooftopcellist@gmail.com>
Co-Authored-By: nixocio <nixocio@gmail.com>
Co-Authored-By: Caleb Boylan <calebboylan@gmail.com>
2021-03-18 18:56:47 -04:00
softwarefactory-project-zuul[bot]
f06141eb00 Merge pull request #9616 from shanemcd/awx-logos
Fix paths used for detecting and copying awx-logos

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Ryan Petrello <None>
2021-03-18 22:23:11 +00:00
softwarefactory-project-zuul[bot]
a971e20e05 Merge pull request #9618 from beeankha/fix_cred_input_source_test_lint_errors
Fix Linting Errors in Credential Input Source Test File

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-18 22:10:57 +00:00
softwarefactory-project-zuul[bot]
edc97a24b2 Merge pull request #9617 from shanemcd/derp
Use correct image for awx-manage inventory_import

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
2021-03-18 22:09:11 +00:00
mabashian
8dec13a25d Adds ouiaId's to session modal and buttons 2021-03-18 16:58:07 -04:00
beeankha
586019fe8f Fix linting errors in credential input source test file 2021-03-18 15:18:57 -04:00
Shane McDonald
d7b8a20a75 Use correct image for awx-manage inventory_import 2021-03-18 15:18:47 -04:00
Shane McDonald
d98e4c304f Fix paths used for detecting and copying awx-logos 2021-03-18 15:09:45 -04:00
mabashian
eb4dca9dc1 Fix padding on output search 2021-03-18 14:15:14 -04:00
mabashian
74460fa2d7 Adds ouiaId's to output page buttons 2021-03-18 14:08:55 -04:00
mabashian
ac06f9e432 Fix output search styling 2021-03-18 14:08:34 -04:00
mabashian
2c8d524b1a Revert "Fix output search styling"
This reverts commit 46728a0931.
2021-03-18 14:07:44 -04:00
mabashian
46728a0931 Fix output search styling 2021-03-18 14:07:13 -04:00
beeankha
39d785070c Check for the existence of ansible.txt file explicitly 2021-03-18 13:51:54 -04:00
beeankha
dca29e756d Update migration file order and name 2021-03-18 13:50:19 -04:00
beeankha
2a9d728b70 Set max string length to a wayyyy bigger number just in case 2021-03-18 12:55:48 -04:00
beeankha
ef6297377b Enable Ansible version to be collected from EEs 2021-03-18 12:55:48 -04:00
mabashian
73fb332af3 Adds line to changelog for output pagination 2021-03-18 09:57:11 -04:00
mabashian
16ad68a6b0 Fix typo after merge conflict 2021-03-18 09:53:50 -04:00
mabashian
88c4feb3ae Fix test after updating page index 2021-03-18 09:53:50 -04:00
mabashian
f65839ec8f Move loading spinner inside output panel 2021-03-18 09:53:50 -04:00
mabashian
8e0a22c766 Fix page number when only fetching one row 2021-03-18 09:53:50 -04:00
mabashian
c0fb2ddbdc Adds ability to cancel jobs from output page back in 2021-03-18 09:53:50 -04:00
mabashian
d60bec8155 Use delete item hook for job output delete 2021-03-18 09:53:50 -04:00
mabashian
98da019d12 Add support for filtering and pagination on job output 2021-03-18 09:53:50 -04:00
Alex Corey
40f0f5ddf7 fixes erroneous validation warning, template Jobs tab, job detail job type 2021-03-17 17:39:21 -04:00
softwarefactory-project-zuul[bot]
31124e07c6 Merge pull request #9589 from nixocio/ui_issue_9250
Do not allow user to modify EE managed by tower

Do not allow user to attempt to modify EE managed by tower.
See: #9250

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-17 21:22:10 +00:00
softwarefactory-project-zuul[bot]
cb1ab742e8 Merge pull request #9595 from nixocio/ui_issue_9307
Add copy functionality to EE

Add copy functionality to EE.
See: #9307

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-17 16:44:08 -04:00
softwarefactory-project-zuul[bot]
93093b9bc6 Merge pull request #9595 from nixocio/ui_issue_9307
Add copy functionality to EE

Add copy functionality to EE.
See: #9307

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-17 20:33:56 +00:00
nixocio
5fa44c61d2 Add copy functionality to EE
Add copy functionality to EE.

See: https://github.com/ansible/awx/issues/9307
2021-03-17 15:49:39 -04:00
Alex Corey
7290de22e2 addes better tooltip selector 2021-03-17 15:38:58 -04:00
Alex Corey
10d95c9aef Fixes silent error on SCM subform 2021-03-17 15:32:14 -04:00
softwarefactory-project-zuul[bot]
da74c61a09 Merge pull request #9606 from nixocio/ui_add_selectors
Improve selectors to ease testing

Improve selectors to ease testing

Reviewed-by: Keith Grant <None>
2021-03-17 18:12:22 +00:00
Tiago Goes
d93ef9f6de add ouiaID 2021-03-17 14:35:00 -03:00
softwarefactory-project-zuul[bot]
209c5c9378 Merge pull request #9599 from kdelee/refactor_awxkit_fk_fields
refactor payload construction for awxkit

This fixes container_group creation to allow passing
"is_container_group" and "credential" to the "create" method
on instance groups, and refactors other page objects
to use a common utility function to eliminate copy-pasted code
This will help us update to set is_container_group correctly as is now needed since de52ade

Reviewed-by: Ryan Petrello <None>
2021-03-17 17:10:59 +00:00
softwarefactory-project-zuul[bot]
6b1110f1c3 Merge pull request #9570 from nixocio/ui_issue_9190
Remove custom virtual env

Remove custom virtual from the UI.
Also, surface missing-resource warnings on list items for UJTs that were using
custom virtualenvs. And related details page.
See: #9190
Also: #9207

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Mat Wilson <mawilson@redhat.com>
2021-03-17 16:57:41 +00:00
nixocio
ec08997b63 Improve selectors to ease testing
Improve selectors to ease testing
2021-03-17 12:19:31 -04:00
softwarefactory-project-zuul[bot]
09150fe21d Merge pull request #9542 from ryanpetrello/centrify
Add support for Centrify Vault as a credential plugin

replaces #8952
cc @surbhijain1502 @Asharma-bhavna @badrogh

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Chris Meyers <None>
2021-03-17 14:52:25 +00:00
Elijah DeLee
3562be8317 refactor payload construction for awxkit
This fixes container_group creation to allow passing
"is_container_group" and "credential" to the "create" method
on instance groups, and refactors other page objects
to use a common utility function to eliminate copy-pasted code
2021-03-17 10:40:00 -04:00
Ryan Petrello
dc8115681a bump the migration version number for Centrify 2021-03-17 10:20:11 -04:00
Ryan Petrello
6f0f56f4f6 verify all Centrify HTTPS requests 2021-03-17 10:19:03 -04:00
Ryan Petrello
1b2d457090 fix a bug in the Centrify Vault plugin 2021-03-17 10:19:03 -04:00
Ryan Petrello
764322b87b more centrify fixes 2021-03-17 10:19:03 -04:00
Asharma-bhavna
51005c0342 Bugs identified during flake8 testing 2021-03-17 10:19:03 -04:00
Asharma-bhavna
cccd021d8b Removed explicitly calling of python json module 2021-03-17 10:19:03 -04:00
Asharma-bhavna
18752a637f Code changes suggested by AWX repo reviewer team 2021-03-17 10:19:03 -04:00
surbhijain1502
bbf283d1fd Change namespace placing in the array 2021-03-17 10:19:03 -04:00
surbhijain1502
f83126643a Removed account name as secret, query changed 2021-03-17 10:19:03 -04:00
surbhijain1502
d913d622d3 Centrify Vault Plugin
To read Inputs and fetch the data from PAS Portal
2021-03-17 10:19:03 -04:00
surbhijain1502
f062554e82 To test Centrify Vault Credential Source 2021-03-17 10:19:03 -04:00
surbhijain1502
2d0eae26bc Adding Centrify plugin namespace to test 2021-03-17 10:19:03 -04:00
surbhijain1502
45937f0be3 Registering Centrify Plugin as entrypoint
Register Plugin
2021-03-17 10:19:03 -04:00
softwarefactory-project-zuul[bot]
e0d9100dc4 Merge pull request #9597 from shanemcd/oops
Dont require is_container_group in payload when creating InstanceGroups

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Ryan Petrello <None>
2021-03-16 21:19:58 +00:00
Shane McDonald
19d0524461 Dont require is_container_group in payload when creating InstanceGroups 2021-03-16 16:46:24 -04:00
nixocio
4db5c496d0 Allow one to select non-global execution environments for organizations
Allow one to select non-global EE when editing an Organization.

See: https://github.com/ansible/awx/issues/9592
2021-03-16 16:32:21 -04:00
nixocio
babea5d599 Remove custom virtual env
Remove custom virtual from the UI.

Also, surface missing-resource warnings on list items for UJTs that were using
custom virtualenvs.

Fix some uni-tests warnings.

See: https://github.com/ansible/awx/issues/9190
Also: https://github.com/ansible/awx/issues/9207
2021-03-16 14:51:27 -04:00
softwarefactory-project-zuul[bot]
a2e3bf1030 Merge pull request #9590 from jerem991/devel
Hashicorp Vault Credential Plugin : Support for namespace

SUMMARY

Added the support for Vault Namespace (Enterprise feature)
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

credential_plugins/hashivault.py
AWX VERSION
1.7.0
ADDITIONAL INFORMATION
Adding specific X-Vault-Namespace header when Namespace option is set.

Reviewed-by: Ryan Petrello <None>
2021-03-16 14:40:17 +00:00
Jérémie Ben Arros
1550989482 add vault namespace support 2021-03-16 09:27:22 -04:00
Jérémie
d94a49ac74 Update hashivault.py 2021-03-16 09:16:55 -04:00
softwarefactory-project-zuul[bot]
de52adedef Merge pull request #9584 from shanemcd/explicit-is_container_group
Explicit db field for is_container_group

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Ryan Petrello <None>
2021-03-15 18:57:01 +00:00
Shane McDonald
876d4316e1 Fix collection tests 2021-03-15 14:14:03 -04:00
Shane McDonald
4a4d25329b Update instance_group module with is_container_group 2021-03-15 13:34:45 -04:00
Shane McDonald
e6f06a95da Remove unnecessary code from launch script
- Ansible is no longer installed on the control plane
- We register the instance / instance group at dispatcher startup
2021-03-15 13:30:31 -04:00
Shane McDonald
b15a75676d Fix container group tests 2021-03-15 13:28:40 -04:00
Jake McDermott
098ec63944 Add container group flag to add/edit data 2021-03-15 13:28:40 -04:00
Shane McDonald
1c4a376758 Explicit db field for is_container_group
We now have Container Groups that dont require a credential.
2021-03-15 13:28:39 -04:00
softwarefactory-project-zuul[bot]
a52f050f44 Merge pull request #9505 from shanemcd/inventory_import-podman
Update inventory_import to run inside of an EE

Option 2 identified in #9504

Reviewed-by: Ryan Petrello <None>
2021-03-15 16:47:35 +00:00
Shane McDonald
836335b4c5 Update inventory_import to run inside of an EE 2021-03-15 12:17:19 -04:00
softwarefactory-project-zuul[bot]
f10bf4c067 Merge pull request #9344 from mabashian/5990-translate-start-node
Mark start node for translation

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2021-03-15 14:17:17 +00:00
softwarefactory-project-zuul[bot]
138211da64 Merge pull request #9468 from mabashian/8789-workflow-inv-prompt
Adds warning message to inventory step when launching wfjt or creating node with wfjt

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-15 13:53:35 +00:00
softwarefactory-project-zuul[bot]
44befa7847 Merge pull request #9581 from saito-hideki/pr/proper_format_with_flake8_v3.9
Removed trailing whitespace to pass awx-api-lint check

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-15 13:50:22 +00:00
Hideki Saito
b9950deaf9 Modify to address flake8 v3.9 format check
* Removed trailing whitespace to pass awx-api-lint check

Signed-off-by: Hideki Saito <saito@fgrep.org>
2021-03-15 17:30:08 +09:00
softwarefactory-project-zuul[bot]
8ba9eef97b Merge pull request #9281 from keithjgrant/8905-codemirror-replacement
AceEditor - codemirror replacement

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2021-03-12 23:22:26 +00:00
softwarefactory-project-zuul[bot]
9342cb012a Merge pull request #9374 from sean-m-sullivan/copy_awx_collection
Add Copy to option to awx collection modules.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-12 22:00:48 +00:00
Sean Sullivan
0f04851ab7 Merge branch 'devel' into copy_awx_collection 2021-03-12 15:26:59 -06:00
Keith J. Grant
c90dfbb7e0 debounce CodeEditor onChange for performance improvement 2021-03-12 12:26:07 -08:00
Keith J. Grant
05f93032f5 fix CodeEditor tests 2021-03-12 08:54:19 -08:00
Keith J. Grant
726b5ddc26 fix lint error 2021-03-12 08:28:26 -08:00
softwarefactory-project-zuul[bot]
9c8dbdc7a5 Merge pull request #9558 from jainnikhil30/fix_tower_user
fix the tower_user module to update the fields properly

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-12 15:21:06 +00:00
softwarefactory-project-zuul[bot]
c170d4c4f6 Merge pull request #9575 from jainnikhil30/tower_collection_integration_test_fix
fix tower collection integration test race condition

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-12 14:01:36 +00:00
Nikhil Jain
0ee49dae76 fix tower collection integration test race condition 2021-03-12 14:57:52 +05:30
Keith J. Grant
4ea7c8a534 CodeEditor bugfixes
* fix typing space character
* hide cursor when editor doesn't have user focus
* show help text any time editor is in focus
* fix content shifting when help text appears/disappears
* remove 80 character "print limit" line
2021-03-11 16:20:05 -08:00
softwarefactory-project-zuul[bot]
8298b76dff Merge pull request #9569 from jbradberry/further-fix-for-ee-deletion
Undo the polymorphic.SET_NULL for Organization

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 21:47:59 +00:00
softwarefactory-project-zuul[bot]
52a46dd765 Merge pull request #9566 from wenottingham/version-note
Note that we need to match python versions.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 21:27:56 +00:00
Jeff Bradberry
5bec4a51c6 Undo the polymorphic.SET_NULL for Organization
It isn't polymorphic.
2021-03-11 15:50:57 -05:00
Bill Nottingham
fd658d44c9 Note that we need to match python versions.
(Some libraries don't have the same deps across python versions.)
2021-03-11 15:48:41 -05:00
softwarefactory-project-zuul[bot]
6a296419d2 Merge pull request #9360 from kdelee/log_request_time
create performance logger to log api response time

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-03-11 20:02:48 +00:00
softwarefactory-project-zuul[bot]
5b5f07d639 Merge pull request #9481 from kdelee/pin_websocket
pin websocket-client lib

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 19:39:11 +00:00
softwarefactory-project-zuul[bot]
27c56d4148 Merge pull request #9523 from jbradberry/ee-association-rbac
Fix the RBAC for attaching an EE to various objects

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 19:34:19 +00:00
softwarefactory-project-zuul[bot]
ae7396b0cf Merge pull request #9562 from jbradberry/ee-polymorphic-set-null
Make sure that EE foreign keys are polymorphic.SET_NULL

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 19:34:08 +00:00
softwarefactory-project-zuul[bot]
c677e4b18e Merge pull request #9557 from ryanpetrello/no-more-ansible-requirements
remove requirements_ansible logic from the update script

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 18:40:08 +00:00
softwarefactory-project-zuul[bot]
32f02fc91c Merge pull request #9561 from ryanpetrello/fork-you
clean stale dispatcher connections closer to post-fork

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-11 17:20:56 +00:00
Ryan Petrello
588cb1e403 fix some requirements updater breakage
- remove requirements_ansible logic from the update script
- removed the need for py2-specific system dependencies
- update to the latest pip-tools and move to the new long format
  (https://github.com/jazzband/pip-tools/pull/1237)
- fixed a few busted references to receptorctl @ devel
2021-03-11 11:54:01 -05:00
Alex Corey
5971a84e74 fixes crashing wizard, and adds error handle on adding role 2021-03-11 11:50:17 -05:00
Jeff Bradberry
e31fc37215 Make sure that EE foreign keys are polymorphic.SET_NULL
Deleting EEs that had been attached to something was failing.
2021-03-11 11:25:59 -05:00
Ryan Petrello
572c0fbb74 clean stale dispatcher connections closer to post-fork
see: https://github.com/ansible/awx/issues/9559
2021-03-11 11:14:13 -05:00
Nikhil Jain
2aa30226f4 removing some invalid chars 2021-03-11 20:07:31 +05:30
Nikhil Jain
53da8e0775 removing some invalid chars 2021-03-11 19:50:11 +05:30
Nikhil Jain
8e53453737 remove the extra result in test 2021-03-11 19:35:53 +05:30
Nikhil Jain
80023017a2 fix the tower_user module to update the fields properly 2021-03-11 19:14:50 +05:30
Sean Sullivan
10c357d0f1 Merge pull request #52 from ansible/devel
Rebase
2021-03-10 11:25:03 -06:00
softwarefactory-project-zuul[bot]
e8b2072ea5 Merge pull request #9536 from rooftopcellist/dev-db-test
consolidate conditional pytest sqlite3 db settings

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-10 15:57:14 +00:00
softwarefactory-project-zuul[bot]
9e89c16b38 Merge pull request #9533 from jbradberry/less-chatty-logs
Reduce the log level for some of the more spammy sources

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-10 15:26:43 +00:00
Christian M. Adams
ca19b9e9d4 consolidate conditional pytest sqlite3 db settings 2021-03-10 10:16:37 -05:00
Ryan Petrello
269e71c069 clarify this migration is only for 17.x -> 18.x 2021-03-10 09:41:50 -05:00
sean-m-ssullivan
857a5718e5 update logic 2021-03-09 18:40:15 -06:00
Keith J. Grant
6f7a717664 hide CodeEditor touch controls menu 2021-03-09 15:01:00 -08:00
Keith J. Grant
0b57522dce CodeEditor: don't type newline when pressing enter to start edit mode 2021-03-09 15:01:00 -08:00
Keith J. Grant
c2a2bf39d5 don't show CodeEditor control help text in readonly mode 2021-03-09 15:01:00 -08:00
Keith J. Grant
6b2cee2f69 add tests ensuring forms pass correct value to CodeEditor fields 2021-03-09 15:01:00 -08:00
Keith J. Grant
4e55c98bc6 add more code editor tests 2021-03-09 15:01:00 -08:00
Keith J. Grant
143d41fb2a add value assertions to code editor tests 2021-03-09 15:01:00 -08:00
Keith J. Grant
c975f65bbc CodeEditor: fix hidden error message 2021-03-09 15:01:00 -08:00
Keith J. Grant
2995cde7cb add AceEditor to changelog 2021-03-09 15:01:00 -08:00
Keith J. Grant
221021a798 disable interactive elements of CodeEditor in readOnly mode 2021-03-09 15:00:26 -08:00
Keith J. Grant
411d69204b remove codemirror dependencies 2021-03-09 15:00:26 -08:00
Keith J. Grant
19f4de0d05 add keyboard navigation help text to CodeEditor 2021-03-09 15:00:26 -08:00
Keith J. Grant
070c67ffe8 rename CodeMirror to CodeEditor 2021-03-09 15:00:26 -08:00
Keith Grant
5c38011ad5 styling Ace CodeEditor 2021-03-09 15:00:25 -08:00
Keith Grant
4e9c6a956d add code editor focus/blur keyboard controls 2021-03-09 15:00:25 -08:00
Keith Grant
1afdd7ac1d Ace editor POC 2021-03-09 15:00:25 -08:00
softwarefactory-project-zuul[bot]
3312db61c3 Merge pull request #9460 from mabashian/6528-unit-tests
Adds tests for workflow save error handling

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2021-03-09 19:55:43 +00:00
Jeff Bradberry
0ca8fd7752 Update the debugging docs 2021-03-09 14:42:10 -05:00
softwarefactory-project-zuul[bot]
5bdf9a108c Merge pull request #9439 from mabashian/9410-workflow-node-disable-jt
Disable job templates in node modal that are missing inv or project

Reviewed-by: Mat Wilson <mawilson@redhat.com>
             https://github.com/one-t
2021-03-09 19:41:18 +00:00
Jeff Bradberry
0a6d13c1b9 Reduce the log level for some of the more spammy sources 2021-03-09 14:16:37 -05:00
softwarefactory-project-zuul[bot]
3673e7c3f4 Merge pull request #9530 from ryanpetrello/more-docker-install-notes
restore note about cloning the stable release branch for Docker installs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-09 17:44:04 +00:00
softwarefactory-project-zuul[bot]
b0324acd0e Merge pull request #9318 from mabashian/9223-notif-toast
Adds toast to notification template list whenever test notification finishes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-09 17:25:26 +00:00
Ryan Petrello
b6eeb2e77f restore note about cloning the stable release branch for Docker installs 2021-03-09 12:09:11 -05:00
softwarefactory-project-zuul[bot]
6bbbe23a96 Merge pull request #9528 from ryanpetrello/17.1.0-notes
update the changelog w/ notes for 17.1.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2021-03-09 16:32:35 +00:00
Jeff Bradberry
097f465f39 Fix the RBAC for attaching an EE to various objects
- Organization.default_environment
- Project.default_environment
- JobTemplate.execution_environment
- WorkflowJobTemplate.execution_environment

System jobs are not editable by anyone other than a system admin, so
we don't need to check.  It appears that unified job templates can't
be created or edited outside of the endpoints for the specific types.
2021-03-09 11:00:03 -05:00
Ryan Petrello
58337b9e2e update the changelog w/ notes for 17.1.0 2021-03-09 10:58:50 -05:00
softwarefactory-project-zuul[bot]
2601631f28 Merge pull request #9489 from nixocio/ui_issue_9487
Fix diassociate EE from JT and WFJT 

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-09 15:25:54 +00:00
softwarefactory-project-zuul[bot]
48537e8202 Merge pull request #9398 from nixocio/ui_fix_variable_name
Update variables as returned by useRequest

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-09 14:37:56 +00:00
mabashian
0345a0c8e2 Remove Start from linter ignore array 2021-03-09 08:30:40 -05:00
mabashian
65c71b812e Mount with contexts now that i18n is used on workflow start node 2021-03-09 08:30:40 -05:00
mabashian
510b4197ac Mark start node for translation 2021-03-09 08:30:40 -05:00
sean-m-ssullivan
55855e9e63 fix lint and update test 2021-03-08 21:56:16 -06:00
mabashian
6a32164438 Adds support for ouiaId's on copy buttons 2021-03-08 16:11:22 -05:00
mabashian
811186308c Adds note to changelog about notification toasts 2021-03-08 15:23:39 -05:00
mabashian
d96383b317 Fixes bug where some toasts would reappear after being closed 2021-03-08 15:22:08 -05:00
mabashian
83a9c3470e Adds toast to notification template list whenever test notification finishes 2021-03-08 15:22:08 -05:00
sean-m-ssullivan
701a69b5e5 Merge branch 'ansible-devel' into copy_awx_collection 2021-03-08 10:18:47 -06:00
sean-m-ssullivan
295e40002e update 2021-03-08 10:18:34 -06:00
nixocio
7c2f6c95a6 Update variables as returned by useRequest
Update variables to be consistent with variables returned by useRequest.
2021-03-07 17:37:52 -05:00
nixocio
fbd46f7799 Fix diassociate EE from JT and WFJT
Allow EE to be removed from JT and WFJT.

Also, add unit-test related to those changes.

See: https://github.com/ansible/awx/issues/9487
2021-03-07 13:34:25 -05:00
softwarefactory-project-zuul[bot]
c9ec0d31f1 Merge pull request #9498 from ryanpetrello/bye-bye-virtualenv
remove custom_virtualenv support from the AWX collection and docs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-06 14:12:32 +00:00
softwarefactory-project-zuul[bot]
85f7dc4222 Merge pull request #9500 from shanemcd/fix-sdb
Fix sdb in dev env

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 23:14:31 +00:00
softwarefactory-project-zuul[bot]
1c8851b716 Merge pull request #9499 from elyezer/update-collection
Linter fixes for Execution Environments module

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 22:56:31 +00:00
Shane McDonald
afe8dc6ad9 Fix sdb in dev env 2021-03-05 17:41:25 -05:00
Elyézer Rezende
f294aabcc9 Linter fixes for Execution Environments module
Fix linter for the recently added Execution Environments module

Signed-off-by: Elyézer Rezende <elyezermr@gmail.com>
2021-03-05 16:13:21 -05:00
Ryan Petrello
4c60999161 remove custom_virtualenv support from the AWX collection and docs 2021-03-05 15:38:46 -05:00
softwarefactory-project-zuul[bot]
18ba40506f Merge pull request #9480 from wenottingham/burn-it
Remove ansible venvs & collection infrastructure.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 19:29:05 +00:00
softwarefactory-project-zuul[bot]
2ae82b9302 Merge pull request #9452 from ryanpetrello/rsyslogd-last-ditch
make rsyslogd socket emit failures a bit less verbose (but still write to stderr)

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 19:14:33 +00:00
softwarefactory-project-zuul[bot]
ec3b225c76 Merge pull request #9494 from ryanpetrello/older-install-instructions-warning
point people at install instructions for older stable releases

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 17:13:13 +00:00
Ryan Petrello
53d8e8b332 point people at install instructions for older stable releases 2021-03-05 11:38:19 -05:00
softwarefactory-project-zuul[bot]
3fd0c29a95 Merge pull request #9490 from shanemcd/delete-old-installer
Delete old installer / update INSTALL.md

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 15:31:37 +00:00
softwarefactory-project-zuul[bot]
8fb17cfbdb Merge pull request #9488 from nixocio/ui_fix_rerererender
Fix extra re-render for Job Template

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 15:12:05 +00:00
softwarefactory-project-zuul[bot]
e4d227a791 Merge pull request #9483 from rooftopcellist/rm_messages
Remove messages.js files that do not need to be committed to the repo

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 14:02:50 +00:00
softwarefactory-project-zuul[bot]
0123469e7e Merge pull request #9492 from chrismeyersfsu/fix-docker-compose-cluster-for-real
default cluster node count env var to 1

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-05 13:40:11 +00:00
Jake McDermott
d494645914 Add i18n config file to frontend container image 2021-03-05 08:24:31 -05:00
Chris Meyers
80c2249bdb default cluster node count env var to 1 2021-03-05 08:00:53 -05:00
Shane McDonald
6df65c95a7 Update INSTALL.md 2021-03-04 18:34:39 -05:00
Shane McDonald
119e80c717 Delete the old installer directory 2021-03-04 18:28:49 -05:00
nixocio
b7e614beee Fix extra re-render for Job Template
Fix extra re-render for Job Template.

Also, update a few unit-tests.

See: https://github.com/ansible/awx/issues/9479
2021-03-04 16:47:07 -05:00
softwarefactory-project-zuul[bot]
f231216584 Merge pull request #9471 from chrismeyersfsu/fix-docker_cluster
fix up awx docker cluster

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-04 21:24:54 +00:00
Chris Meyers
16a6fb5adc add docs for cluster dev mode 2021-03-04 15:23:04 -05:00
Chris Meyers
7b1edda368 support receptor in multi cluster nodes 2021-03-04 15:04:36 -05:00
Shane McDonald
69edef430c Get clustered dev env working 2021-03-04 14:56:22 -05:00
Chris Meyers
6f1f64118b wip 2021-03-04 14:54:41 -05:00
softwarefactory-project-zuul[bot]
e1e0bb30a9 Merge pull request #9450 from jakemcdermott/fix-9230
Use credential_type for prompted multicred select categories

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-04 19:51:59 +00:00
Jake McDermott
95ec009758 Add language catalog compile step before test commands 2021-03-04 13:25:31 -05:00
Jake McDermott
55b948bf39 Remove checkout from Makefile 2021-03-04 13:13:32 -05:00
Christian M. Adams
34df47ceba Remove messages.js files that do not need to be committed to the repo
* also clean up old .PHONY entries
2021-03-04 13:13:27 -05:00
Bill Nottingham
0505e38071 Remove ansible venvs & collection infrastructure. 2021-03-04 13:06:06 -05:00
softwarefactory-project-zuul[bot]
eb131f64cc Merge pull request #9482 from shanemcd/create_preload_data-on-dev-boot
Create admin user / run create_preload_data when dev env boots

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-04 17:05:44 +00:00
Shane McDonald
a3a47834fd Create admin user / run create_preload_data when dev env boots 2021-03-04 11:26:43 -05:00
Elijah DeLee
88a91cfeba pin websocket-client lib
They've made breaking changes that is going to take
some deeper investigation to update awxkit to use

This is only used for development purposes, and should
have not impact on the "awx" cli entry point
2021-03-04 11:09:32 -05:00
softwarefactory-project-zuul[bot]
6aab88259a Merge pull request #8030 from ansible/execution-environments
Execution Environments

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-04 14:15:13 +00:00
nixocio
0a4a1bed0a Add EE to inventory sources
Add EE to inventory sources

See: https://github.com/ansible/awx/issues/9189
2021-03-03 18:56:07 -05:00
nixocio
62215ca432 Add organization to EE details page
Add organization to EE details page.

See: https://github.com/ansible/awx/issues/9432
2021-03-03 18:56:07 -05:00
nixocio
fd21603c0e Update EE breadcrumb to use name instead of image
Update EE breadcrumb to use name instead of image to be consistent with
the other screens.

See: https://github.com/ansible/awx/issues/9087
2021-03-03 18:56:07 -05:00
Shane McDonald
aab58f5ae7 Dont require credential for Container Groups
Might want to follow up and make this only apply to Tower on Kubernetes
2021-03-03 18:56:07 -05:00
Shane McDonald
29ff69a774 For container group pods, use namespace Tower is deployed into by default 2021-03-03 18:56:07 -05:00
nixocio
33d7342ffe Linkify reference to EE on details page
Linkify reference to EE on a few details page.

See: https://github.com/ansible/awx/issues/9189
2021-03-03 18:56:07 -05:00
Shane McDonald
609b17aa20 Use receptor 0.9.6 2021-03-03 18:56:07 -05:00
Shane McDonald
e23a2b4506 Use var instead of set_fact 2021-03-03 18:56:07 -05:00
Shane McDonald
eba12a6207 Add ui_next to .dockerignore 2021-03-03 18:56:07 -05:00
Shane McDonald
03c5cc779b Only install podman in local dev env 2021-03-03 18:56:07 -05:00
Shane McDonald
065b943870 Fix mode for k8s launch scripts 2021-03-03 18:56:07 -05:00
nixocio
6e67ae68fd Add Execution Environments into a few screens
Add EE to the following screens:

* Job Template
* Organization
* Project
* Workflow Job Template

Also, add a new lookup component - ExecutionEnvironmentLoookup.

See: https://github.com/ansible/awx/issues/9189
2021-03-03 18:56:05 -05:00
Shane McDonald
adf708366a Add "copy" to EE related links 2021-03-03 18:52:55 -05:00
Rebeccah
4d2fcfd8c1 add a functional test for creating an EE, remove bum copy function because it's not needed, copy works from the base class
moved AWXKit pull additions to separate PR and made some changes that were causing linting errors in tests and add copy to show_capabilities for the ee serializer
2021-03-03 18:52:55 -05:00
Rebeccah
0921de5d2b adding needed url endpoint for copy functionality and the beginning of some testing that can be fleshed out more fully in later work 2021-03-03 18:52:55 -05:00
nixocio
f2801e0c03 Minor update EE tables
* Add table header `actions`
* Add `name` as default search

See: https://github.com/ansible/awx/issues/7884
Also: https://github.com/ansible/awx/issues/9087
2021-03-03 18:52:55 -05:00
Shane McDonald
befc658042 Wire up --pull option for EEs 2021-03-03 18:52:55 -05:00
Shane McDonald
883fa4906a Fix receptor.conf path in dev env 2021-03-03 18:52:55 -05:00
beeankha
60827143bb Bump up unified_jobs_table version for new column addition 2021-03-03 18:52:55 -05:00
beeankha
5b17ab6873 Enable EE collections info to be loaded as valid JSON vs stringified JSON 2021-03-03 18:52:55 -05:00
beeankha
0e80f663ab Add installed_collections column to unified job query 2021-03-03 18:52:55 -05:00
beeankha
cb95de0862 Assign entire file path to variable 2021-03-03 18:52:55 -05:00
beeankha
86a3a79be4 Enable utilized EE Collections name and version info to be detected 2021-03-03 18:52:55 -05:00
Jeff Bradberry
b417fc3803 Turn off permissions check bypassing for admins when hitting the execution environment list and detail views. 2021-03-03 18:52:55 -05:00
Jeff Bradberry
5b2adc89cf Make the managed_by_tower field read-only for EEs (similar to how we deal with it not being settable for Credentials) and add permissions checking for Org EE Admins.
can_add: gets an explicit role to check against, `'execution_environment_admin_role'`
can_change: leverages `self.check_related()` for the case where the Org is not changing, but also adds an explicit check for the EE Admin Role when the Org is changing to an explicit different Org.
2021-03-03 18:52:55 -05:00
Rebeccah
41fb21911e add execution_environment_admin_role to the an organizations read role, which access.py uses for determining access to reading an ee within an organization,
add migration file for execution_env_admin role addition to read_roles within an organization,

and set check related to mandatory
2021-03-03 18:52:55 -05:00
Rebeccah
eaa74b40c1 add org admins as able to control EEs even if they don't have the ee_admin role for the specific ee and prevent managed_by_tower EEs from being edited/deleted 2021-03-03 18:52:55 -05:00
Jake McDermott
cf513b33ee Add name field 2021-03-03 18:52:55 -05:00
nixocio
a39e1a528b Add execution environment list to Organizations
Add execution environment list to Organizations

See: https://github.com/ansible/awx/issues/8210
2021-03-03 18:52:55 -05:00
Elijah DeLee
05dded397d make sure we use built in credential type
this way we can pass kind="registry" to akit creat method and
we get the correct built in type
2021-03-03 18:52:55 -05:00
Shane McDonald
ae5a1117d4 Use official Receptor 0.9.5 release 2021-03-03 18:52:55 -05:00
Rebeccah
b1361c8fe2 edit original migration file, add blank string as acceptable to model 2021-03-03 18:52:55 -05:00
Rebeccah
20ee73ce73 default pull options for container images to None, also adding pull options to awxkit 2021-03-03 18:52:55 -05:00
nixocio
0bd8012fd9 Update selectors on EE details page to ease testing
Update selectors on EE details page to ease testing.
2021-03-03 18:52:55 -05:00
Shane McDonald
05ef51f710 Add migration to reset custom pod specs 2021-03-03 18:52:55 -05:00
nixocio
d6b5990cd2 Migrate EE list to tables
Migrate EE list to tables.

See:https://github.com/ansible/awx/issues/7884
2021-03-03 18:52:55 -05:00
nixocio
26f7a2ba81 Update Job Detail container group variable
`is_containerized` was updated on the API side to be
`is_container_group`.
2021-03-03 18:52:55 -05:00
Shane McDonald
0381a3ac8c Container Pull Option -> Pull
Co-authored-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-03 18:52:55 -05:00
Rebeccah
4b40cb3abb changed the field name from 'container_options' to simply 'pull' 2021-03-03 18:52:55 -05:00
Jake McDermott
b0265b060b Remove client-side url validator 2021-03-03 18:52:55 -05:00
Jake McDermott
4ca33579a5 Add an interface for new ee options 2021-03-03 18:52:55 -05:00
Rebeccah
31e7e10f30 migration for container options for EE model
Co-authored-by: Shane McDonald <me@shanemcd.com>
2021-03-03 18:52:55 -05:00
Rebeccah
92f0af684c execution model pull container options added 2021-03-03 18:52:55 -05:00
Shane McDonald
6a7520d10f Handle quota exceeded in Container Groups v2 2021-03-03 18:52:55 -05:00
Shane McDonald
f2dfa132a7 Install Ansible only for collection tests 2021-03-03 18:52:55 -05:00
Shane McDonald
ddcbc408b9 Remove Ansible from control plane
Execution Environments or bust!
2021-03-03 18:52:55 -05:00
Shane McDonald
ea39cbce73 Update receptor.conf in dev env 2021-03-03 18:52:55 -05:00
Shane McDonald
44d7d68322 Update default ee image 2021-03-03 18:52:55 -05:00
Shane McDonald
9f39bab2b8 Quick fix for jobs failing in dev environment / VMs
The other alternative here is to go all the way with
https://github.com/ansible/ansible-runner/pull/617, which is proving to be
difficult if not impossible.
2021-03-03 18:52:55 -05:00
Shane McDonald
8eb4dafb17 Fix missing postgresql module 2021-03-03 18:52:55 -05:00
Shane McDonald
428f8addf8 Create default EE as a part of create_preload_data 2021-03-03 18:52:55 -05:00
Shane McDonald
57b317d440 Get system jobs working under new deployment model (#9221) 2021-03-03 18:52:55 -05:00
nixocio
68f9c5137d Mark string to translation
Mark string to translation
2021-03-03 18:52:55 -05:00
Shane McDonald
9f97efece8 Stop and kill dispatcher and callback reciever as group 2021-03-03 18:52:55 -05:00
Shane McDonald
1a68df275c Set correct SDB_NOTIFY_HOST in minikube env 2021-03-03 18:52:55 -05:00
Shane McDonald
86363e260e Provide new default pod defintion in CG metadata (#9181) 2021-03-03 18:52:55 -05:00
Alan Rominger
8f66793276 Assure that unit_id is always defined (#9180) 2021-03-03 18:52:55 -05:00
Alan Rominger
c7e0e30f93 Make sure project updates run in default EE (#9172)
* Make sure project updates run in default EE

* Remove project execution_environment field from collection
2021-03-03 18:52:55 -05:00
Yago Marques
8ab7745e3a WIP Inclusion of the EE option in the payloads within the Organization and Projects. (#9145)
* add ee option on factories for organizations

* add new lines

* remove inventory from the options

* remove line

* remove line from projects

* fix the tuple

* fix lint problems
2021-03-03 18:52:55 -05:00
Shane McDonald
fd0c4ec869 Pin to latest version of PyYAML
Fixes https://github.com/yaml/pyyaml/issues/478
2021-03-03 18:52:55 -05:00
Alan Rominger
a435843f23 Exception handling to always release work units 2021-03-03 18:52:55 -05:00
Ryan Petrello
f850f8d3e0 introduce a new global flag for denoating K8S-based deployments
- In K8S-based installs, only container groups are intended to be used
  for playbook execution (JTs, adhoc, inventory updates), so in this
  scenario, other job types have a task impact of zero.
- In K8S-based installs, traditional instances have *zero* capacity
  (because they're only members of the control plane where services
  - http/s, local control plane execution - run)
- This commit also includes some changes that allow for the task manager
  to launch tasks with task_impact=0 on instances that have capacity=0
  (previously, an instance with zero capacity would never be selected
  as the "execution node"

This means that when IS_K8S=True, any Job Template associated with an
Instance Group will never actually go from pending -> running (because
there's no capacity - all playbooks must run through Container Groups).
For an improved ux, our intention is to introduce logic into the
operator install process such that the *default* group that's created at
install time is a *Container Group* that's configured to point at the
K8S cluster where awx itself is deployed.
2021-03-03 18:52:55 -05:00
Alan Rominger
c29d476919 Fix obvious code error with foreman inventory 2021-03-03 18:52:55 -05:00
Alan Rominger
b05b6b2e03 Fix minor syntax error failing AdHocCommands 2021-03-03 18:52:55 -05:00
Alan Rominger
3f76499c56 Use the fully qualified inventory plugin name only for foreman 2021-03-03 18:52:55 -05:00
Shane McDonald
e63383bde6 Add PATH to blocked inventory source vars
This used to be skiped because PATH was already present in the env we
constructed for runner.
2021-03-03 18:52:55 -05:00
Shane McDonald
c6be92cdf6 Create awx group in container 2021-03-03 18:52:55 -05:00
Shane McDonald
341e1e34e3 Dont zip/unzip private data dir for local jobs 2021-03-03 18:52:55 -05:00
Shane McDonald
70755a395b Make receptorctl easier to use in dev env 2021-03-03 18:52:55 -05:00
Shane McDonald
fe9b24cde2 flake8 2021-03-03 18:52:55 -05:00
Shane McDonald
70f7a082bb Minimally functional container group v2 w/ receptor 2021-03-03 18:52:55 -05:00
Shane McDonald
9df29e8fc4 Use official awx-ee by default 2021-03-03 18:52:55 -05:00
Shane McDonald
d37cb64aaf Delete some old container group v1 code 2021-03-03 18:52:55 -05:00
Shane McDonald
1d9f01a201 Deleted unused build_params_process_isolation method 2021-03-03 18:52:55 -05:00
Shane McDonald
373bb443aa UnifiedJob#is_containerized -> UnifiedJob#is_container_group_task 2021-03-03 18:52:55 -05:00
Shane McDonald
286b1d4e25 InstanceGroup#is_containerized -> InstanceGroup#is_container_group 2021-03-03 18:52:55 -05:00
Shane McDonald
7b7465f168 Update receptor config to allow for runtime options 2021-03-03 18:52:55 -05:00
Shane McDonald
e453afa064 FOLLOW UP ON THIS: Fix fact_cache directory location
The part where we pass in the runner params to the processor phase is
legit. Need to investigate why the fact_cache directory is no longer nested
under job.id.
2021-03-03 18:52:55 -05:00
Shane McDonald
cf96275f1b Pull awx -> receptor job code into its own class 2021-03-03 18:52:54 -05:00
Shane McDonald
be8168b555 Surface errors when launching jobs through Receptor
This will raise errors such as:

exec: "ansible-runner": executable file not found in $PATH
2021-03-03 18:52:54 -05:00
Shane McDonald
fd92ba0c0b Actually cancel things 2021-03-03 18:52:54 -05:00
Shane McDonald
0184a7c267 Create receptor mesh in cluster development environment 2021-03-03 18:52:54 -05:00
Shane McDonald
81f6d36a3a Set SDB_NOTIFY_HOST for all processes 2021-03-03 18:52:54 -05:00
Shane McDonald
f1df4c54f8 Begin integrating receptor 2021-03-03 18:52:54 -05:00
Shane McDonald
521d3d5edb Initial EE integration 2021-03-03 18:52:54 -05:00
Shane McDonald
acee22435b Update ExecutionEnvironments.jsx with breadcrumb replacement 2021-03-03 18:52:54 -05:00
Shane McDonald
0c497fa682 Get podman-in-docker working under cgroups v2 2021-03-03 18:52:54 -05:00
Alan Rominger
90b9c7861c Allow jobs to run in the base ansible-runner image (#8949) 2021-03-03 18:52:54 -05:00
Alan Rominger
eb5bf599e3 Fix raw archive project updates
Several squashed commits

Fix git bug introduced by setting remote tmp in project path
change shebang back to py3 again
Revert shebang change
2021-03-03 18:52:54 -05:00
Alan Rominger
10e68c6fb3 Fix unit test fallout 2021-03-03 18:52:54 -05:00
Alan Rominger
49bdadcdbf Fix yet another host vs container path bug 2021-03-03 18:52:54 -05:00
Alan Rominger
015fc29c1c Fix another svn issue due to pre-existing folder 2021-03-03 18:52:54 -05:00
Alan Rominger
0dfb183cb6 Fix another credential path-in-container bug 2021-03-03 18:52:54 -05:00
Alan Rominger
ba14634318 Fix collection pep8 failure 2021-03-03 18:52:54 -05:00
Alan Rominger
b953478225 Change the default EE location 2021-03-03 18:52:54 -05:00
Jeff Bradberry
9964ba7c9a Improve the behavior of EE resolution for ad hoc commands
- call resolve_execution_environment during AdHocCommand.save()
- wrap the fallback call of the resolver in tasks.py in disable_activity_stream()
2021-03-03 18:52:54 -05:00
Shane McDonald
12b8349e88 Show EE images that are managed by tower in UI 2021-03-03 18:52:54 -05:00
Jeff Bradberry
c74d60f3f3 Make sure that the new credential type is in the choices list 2021-03-03 18:52:54 -05:00
Jeff Bradberry
44ad6bfdce Insert a default EE into the development environment 2021-03-03 18:52:54 -05:00
Jeff Bradberry
fde7a1e3e5 Ensure that the updated job instance is used
when attaching an EE.
2021-03-03 18:52:54 -05:00
Jeff Bradberry
4a0fc3e1af Ensure that a fallback EE is available to be found
for the failing tests.
2021-03-03 18:52:54 -05:00
Jeff Bradberry
5f1da2b923 Adjust ExecutionEnvironmentAccess to account for the new EE admin role 2021-03-03 18:52:54 -05:00
Jeff Bradberry
e7bf81883b Populate the EE name field in awxkit 2021-03-03 18:52:54 -05:00
Jeff Bradberry
4993a9e6ec Move the resolve_execution_environment method to the mixin class
so that it can be used with AdHocCommands as well.
2021-03-03 18:52:54 -05:00
Jeff Bradberry
8562c378c0 Make use of the EE resolver code when launching jobs 2021-03-03 18:52:54 -05:00
Jeff Bradberry
6d935f740c Fill in the new execution environment collection module
as well as changes to other ones that need to be able to attach EEs.
2021-03-03 18:52:54 -05:00
Jeff Bradberry
c1133b3f6d Add in more model changes around execution environments
- a new unique name field to EE
- a new configure-Tower-in-Tower setting DEFAULT_EXECUTION_ENVIRONMENT
- an Org-level execution_environment_admin_role
- a default_environment field on Project
- a new Container Registry credential type
- order EEs by reverse of the created timestamp
- a method to resolve which EE to use on jobs
2021-03-03 18:52:54 -05:00
Alan Rominger
c0faa39b53 Remove files moved to the ansible/awx-ee repo
These have been moved to:

https://github.com/ansible/awx-ee

that will be the home for the processes needed to
build this execution environment.
2021-03-03 18:52:54 -05:00
Alan Rominger
7a433f4e8f Change the shebang back to just python 2021-03-03 18:52:54 -05:00
Alan Rominger
2302496724 Add back in the subversion requirement 2021-03-03 18:52:54 -05:00
Alan Rominger
54681eb055 Add utility method to get controller private_data_dir 2021-03-03 18:52:54 -05:00
Alan Rominger
b716e2b099 Make insights integration tests pass again 2021-03-03 18:52:54 -05:00
Alan Rominger
69dcbe0865 More inventory update containerization fixes 2021-03-03 18:52:54 -05:00
Shane McDonald
14a8e3da5e WIP: containerized inventory updates. Thanks ALAN!! 2021-03-03 18:52:54 -05:00
Shane McDonald
6ff1424e8c Fix tests after rebasing in inventory update refactor 2021-03-03 18:52:54 -05:00
nixocio
9786dc08d3 Add organization as part of creating/editing an execution environments
Add organization as part of creating/editing an execution environments

If one is a `system admin` the Organization is an optional field. Not
providing an Organization makes the execution environment globally
available.

If one is a `org admin` the Organization is a required field.

See: https://github.com/ansible/awx/issues/7887
2021-03-03 18:52:54 -05:00
Shane McDonald
ecaa66c13b Fix linter 2021-03-03 18:52:54 -05:00
Shane McDonald
ee1d322336 WIP: Module for EEs 2021-03-03 18:52:54 -05:00
Shane McDonald
1f4a45a698 Remove "pull" field from EE mixin
I think this should go on the EE definition itself
2021-03-03 18:52:54 -05:00
Shane McDonald
966bb6fc74 Back to green 2021-03-03 18:52:54 -05:00
Shane McDonald
f554f45288 Add license for receptor 2021-03-03 18:52:54 -05:00
Shane McDonald
5c2b2dea0c REVERT ME: Install community.general in image
This is needed for the wait_fors in the launch scripts to work
2021-03-03 18:52:54 -05:00
Shane McDonald
fd9373a9ec Use official receptor image 2021-03-03 18:52:54 -05:00
Shane McDonald
82a641e173 Add AWX EE definition 2021-03-03 18:52:54 -05:00
Shane McDonald
490f719fd9 Add new ee container 2021-03-03 18:52:54 -05:00
Shane McDonald
46f5cb6b7a Install receptorctl in awx venv 2021-03-03 18:52:54 -05:00
Shane McDonald
efb25b7b9e Use WIP version of collections_requirements.yml
Pulled from ansible-builder/test/data/awx
2021-03-03 18:52:54 -05:00
Shane McDonald
87b13ead12 REVERT ME: Install ansible/devel for now 2021-03-03 18:52:54 -05:00
Alan Rominger
7c6975baec Collections volume permission fix, and container group fix
Use same image for both types of container isolation

Inventory move fix related to container groups
2021-03-03 18:52:54 -05:00
Kersom
6e6cd51b4d Update usage of summary_fields for execution environments (#8217)
Update usage of summary_fields for execution environments. Also, update
unit-tests to cover this change.

See: https://github.com/ansible/awx/issues/8216
2021-03-03 18:52:54 -05:00
Jeff Bradberry
3d233faed8 Expose the user capabilities dict for EEs (#8208) 2021-03-03 18:52:54 -05:00
Kersom
54d0f173dc Add details page for Execution Environments (#8172)
* Add feature to Add/Edit Execution Environments

Add feature to Add/Edit Execution Environments.

Also, add key for `ExecutionEnvironmentsList`.

See: https://github.com/ansible/awx/issues/7887

* Add details page for execution environments

Add details page for execution environments

See: https://github.com/ansible/awx/issues/8171
2021-03-03 18:52:54 -05:00
Kersom
684b9bd47a Add feature to Add/Edit Execution Environments (#8165)
* Add feature to Add/Edit Execution Environments

Add feature to Add/Edit Execution Environments.

Also, add key for `ExecutionEnvironmentsList`.

See: https://github.com/ansible/awx/issues/7887

* Update registry credential label
2021-03-03 18:52:54 -05:00
Alan Rominger
9530c6ca50 Changes to get execution environments factories working (#8126) 2021-03-03 18:52:54 -05:00
Kersom
b7209d1694 Add list Execution Environments (#8148)
See: https://github.com/ansible/awx/issues/7886
2021-03-03 18:52:54 -05:00
Alan Rominger
9d806ddb82 Initial minimal hooking up of JT EEs to jobs 2021-03-03 18:52:54 -05:00
Alan Rominger
332c802317 Deal with missing HOME env var 2021-03-03 18:52:54 -05:00
Alan Rominger
9660e27246 Fix project folder deletion
Fix another absolute path reference in containers
2021-03-03 18:52:54 -05:00
Alan Rominger
64f45da4d2 Fix pathing issue for credential file references 2021-03-03 18:52:54 -05:00
Alan Rominger
73418e41f3 Fix pathing issue with custom credentials
also fix some minor flake8 issues
2021-03-03 18:52:54 -05:00
Alan Rominger
6e2010ca40 Respect user proot show paths when using containers 2021-03-03 18:52:54 -05:00
Alan Rominger
50433789ae Purge environment variables to work with ansible-runner changes
Remove inventory scripts show because they no longer exist

Remove reference to non-existent callback directory

Remove more references to removed paths
2021-03-03 18:52:54 -05:00
Alan Rominger
a3f0158a94 Add Z to volume mount
Update to AWX execution environment
  use the special 2.9 container image
  revert setting back for merge

Fix another permission error by mapping 2 folders
  also create folders before running
2021-03-03 18:52:54 -05:00
Alan Rominger
130bf076f4 Add Z to volume mount
Set ansible-runner back to main fork due to merge
2021-03-03 18:52:54 -05:00
Shane McDonald
06d7a61ca1 Initial EE integration 2021-03-03 18:52:54 -05:00
Kersom
297fecba3a Add execution environments files (#7909)
Update navigation bar and routing system to add execution environments.
Also, add stub files for the remaining related work.

See: https://github.com/ansible/awx/issues/7885
Also: https://github.com/ansible/awx/issues/7884
2021-03-03 18:52:54 -05:00
Jeff Bradberry
3cbf384ad1 Run a receptor node in the dev environment 2021-03-03 18:52:54 -05:00
Jeff Bradberry
45a0084f78 Add a sublist api view for the UJTs that use a given execution environment 2021-03-03 18:52:54 -05:00
Jeff Bradberry
f9741b619c Make changes to support capture by the activity stream
Including exposing a new API view for a particular EE's activity
stream objects.
2021-03-03 18:52:54 -05:00
Jeff Bradberry
5ec7378135 Add a new Swagger topic 2021-03-03 18:52:54 -05:00
Jeff Bradberry
c05e4e07ee Expose execution environments in awxkit and awx-cli 2021-03-03 18:52:54 -05:00
Jeff Bradberry
cc429f9741 Expose an API view for all of the execution environments under an org 2021-03-03 18:52:54 -05:00
Jeff Bradberry
cb766c6a95 Add execution_environment and pull to the fields for UJs and UJTs 2021-03-03 18:52:54 -05:00
Jeff Bradberry
3c637cd54c Change OrganizationSerializer to show and set default_environment 2021-03-03 18:52:53 -05:00
Jeff Bradberry
61cbd34586 Add in the basic list and detail api views 2021-03-03 18:52:53 -05:00
Jeff Bradberry
9697999ddd Create the RBAC access class for execution environments 2021-03-03 18:52:53 -05:00
Jeff Bradberry
41613ff544 Add a new ExecutionEnvironment model 2021-03-03 18:52:53 -05:00
softwarefactory-project-zuul[bot]
0af7f046f0 Merge pull request #9474 from ryanpetrello/badges
add some new fancy badges

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-03 21:55:51 +00:00
Ryan Petrello
efe03c396b add some new fancy badges 2021-03-03 16:27:04 -05:00
mabashian
9b1d6ab441 Adds ouiaId to inventory warning 2021-03-03 13:38:12 -05:00
mabashian
e9d524ebc0 Space out the inventory warning 2021-03-03 13:36:06 -05:00
sean-m-ssullivan
c4d8d5ee9e Merge branch 'copy_awx_collection' of github.com:sean-m-sullivan/awx into copy_awx_collection 2021-03-03 12:20:53 -06:00
mabashian
75746f2c69 Adds warning message to inventory step when launching wfjt or creating node with wfjt 2021-03-03 13:20:30 -05:00
sean-m-ssullivan
6d88a81cbd update logic 2021-03-03 12:20:13 -06:00
Sean Sullivan
56d6479cd8 Merge pull request #48 from ansible/devel
Rebase
2021-03-03 09:56:54 -06:00
softwarefactory-project-zuul[bot]
7be129f9fa Merge pull request #9464 from beeankha/test_playbook_cleanup
Integration Test Playbook Cleanup for Collections

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-03 15:55:24 +00:00
softwarefactory-project-zuul[bot]
4d21d699bb Merge pull request #9465 from nixocio/ui_unfix_async
Revert change on WorkflowJobTemplateAdd

Reviewed-by: Kersom
             https://github.com/nixocio
2021-03-03 15:40:39 +00:00
nixocio
899a5fca0b Revert change on WorkflowJobTemplateAdd
Revert removal of `await` on WorkflowJobTemplateAdd

See: https://github.com/ansible/awx/pull/9459
2021-03-03 10:05:42 -05:00
Ryan Petrello
4456ae2d71 if rsyslogd cannot be reached, note the failure in sys.stderr
see: https://github.com/ansible/awx/issues/8505
2021-03-03 09:46:33 -05:00
beeankha
3153587c90 Clean up Collections test playbooks 2021-03-03 09:44:35 -05:00
Sean
a0090c7c52 update logic 2021-03-02 23:55:03 -06:00
softwarefactory-project-zuul[bot]
3903e88a47 Merge pull request #8992 from saito-hideki/awx/issue/8839
Add inventory source and project links to details view of Jobs list

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-03 02:09:06 +00:00
softwarefactory-project-zuul[bot]
11b8ca1ef9 Merge pull request #9443 from rooftopcellist/update_translations_targets
Update translations targets

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-02 23:52:56 +00:00
softwarefactory-project-zuul[bot]
0b54ee65f5 Merge pull request #9459 from nixocio/ui_fix_minor_issues
Fix minor UI issues

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-02 19:51:07 +00:00
Christian M. Adams
6b8267d2b8 add extract-template to pot target 2021-03-02 14:45:34 -05:00
mabashian
1f93d3ad69 Adds tests for workflow save error handling. Removes unnecessary code that was attempting to remove credentials from a new node. 2021-03-02 14:27:48 -05:00
nixocio
5969d9e3e2 Fix minor UI issues
Fix minor UI issues

* fix typo
* add string to be translated
* remove not necessary `await`
2021-03-02 14:13:56 -05:00
Sean Sullivan
e05db68bde Reverted tower credential test
Reverted tower credential test
2021-03-02 13:00:08 -06:00
Jake McDermott
e92f1187d2 Use credential_type for prompted multicred select categories 2021-03-02 10:27:49 -05:00
Christian M. Adams
53d0611cf8 Update translation make targets and add init PO files 2021-03-02 09:51:04 -05:00
softwarefactory-project-zuul[bot]
d1c49d45bf Merge pull request #9047 from AlexSCorey/8923-JTPOLPagination
Fixes pagination issue on modal

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-03-01 20:04:12 +00:00
mabashian
a293a60d5c Disable job templates in node modal that are missing inv or project 2021-03-01 11:47:34 -05:00
softwarefactory-project-zuul[bot]
4cdec9c297 Merge pull request #9417 from mabashian/typeahead-select-ouia
Adds ouia id's to typeahead select components

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-27 19:52:07 +00:00
softwarefactory-project-zuul[bot]
4baada37d8 Merge pull request #9037 from dejongm/devel
Update defaults.py RH Satellite settings to use new Foreman plugin variables.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-25 16:34:31 +00:00
mabashian
cb3f7b9ef5 Remove duplicate ouia id 2021-02-25 11:15:56 -05:00
mabashian
1c7fbc2806 Adds ouia id's to typeahead select components 2021-02-25 11:15:10 -05:00
softwarefactory-project-zuul[bot]
060578b30b Merge pull request #9196 from keithjgrant/6189-admin-list-tables
Convert admin pages lists to tables

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-25 13:40:50 +00:00
softwarefactory-project-zuul[bot]
cb05b54404 Merge pull request #9224 from jakemcdermott/add-mgmt-jobs
Add system jobs interface w/ configurable data retention

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
             https://github.com/jakemcdermott
2021-02-24 19:08:55 +00:00
Jake McDermott
218b97883d Fix schedule loading flicker 2021-02-24 12:20:37 -05:00
Jake McDermott
d337948bd6 Use system job type as identifier 2021-02-24 12:20:30 -05:00
Jake McDermott
5d51a4e781 Fix system job list item key 2021-02-24 12:20:27 -05:00
Jake McDermott
a0beb9e445 Remove instructions to add on empty mgmt jobs 2021-02-24 12:20:24 -05:00
Jake McDermott
a9aa91d9f2 Remove duplicate notification admin request 2021-02-24 12:20:20 -05:00
Jake McDermott
2f56a20484 Add data retention field for schedule creation 2021-02-24 12:20:17 -05:00
Jake McDermott
4985fb6ffa Add case insensitive search for Name 2021-02-24 12:20:14 -05:00
Jake McDermott
b545a6510f Fix Data retention label 2021-02-24 12:20:12 -05:00
Jake McDermott
df7b168911 Add actions column
Co-authored-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-02-24 12:20:09 -05:00
Jake McDermott
83b449fd30 Add sysjob data retention to schedules
* Migate management jobs list to tables
 * Use cancel link variant for consistency with other prompts
 * Add basic test coverage for sysjobs
 * Remove select-all from mgmt jobs
 * Remove unneeded component variables
 * Fix missing schedule breadcrumb
 * Optimize data fetching with useCallback
2021-02-24 12:20:05 -05:00
Jake McDermott
a00c8920ce Remove default sysjob days 2021-02-24 12:20:03 -05:00
Jake McDermott
a07b1a19f3 Add system prompt and config 2021-02-24 12:20:00 -05:00
Jake McDermott
a95e554a16 Only render edit control if editable 2021-02-24 12:19:57 -05:00
Jake McDermott
4c92d02540 Add mgmt job details 2021-02-24 12:19:54 -05:00
Jake McDermott
a0bdf8cdae Add default sysjob days 2021-02-24 12:19:52 -05:00
Jake McDermott
daaabd935c Add mgmt job launch 2021-02-24 12:19:49 -05:00
Jake McDermott
eaf55728d8 Add mgmt job list 2021-02-24 12:19:46 -05:00
Jake McDermott
45acd15c82 Add mgmt job notifications 2021-02-24 12:19:43 -05:00
Jake McDermott
3f936cd5e7 Add mgmt job schedules 2021-02-24 12:19:40 -05:00
Jake McDermott
5d9d486f9c Resolve notification admin status with config 2021-02-24 12:19:37 -05:00
Jake McDermott
d3f2dedbd5 Add routing system for mgmt jobs 2021-02-24 12:19:31 -05:00
softwarefactory-project-zuul[bot]
fe605596b5 Merge pull request #9406 from nixocio/ui_issue_9323
Do not show tooltip with empty content

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-24 15:52:56 +00:00
nixocio
bf601fc988 Do not show tooltip with empty content
Do not show tooltip with empty content.

See: https://github.com/ansible/awx/issues/9323
2021-02-24 09:29:53 -05:00
softwarefactory-project-zuul[bot]
7f36efe8dd Merge pull request #9400 from ansible/local-docker-update-notes
some more data migration notes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-24 14:19:32 +00:00
softwarefactory-project-zuul[bot]
615cc11d0d Merge pull request #9120 from AlexSCorey/9043-InventoryFileField
Inventory File field and playbook field are both now type ahead.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-24 14:15:28 +00:00
softwarefactory-project-zuul[bot]
3b520cdeee Merge pull request #9391 from sean-m-sullivan/collections_md_update
Collections md update

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2021-02-23 23:01:20 +00:00
Ryan Petrello
c245abefcb some more data migration notes
some things I noticed while going through an upgrade
2021-02-23 17:23:37 -05:00
softwarefactory-project-zuul[bot]
6a093c8e8b Merge pull request #9395 from rooftopcellist/migrate-path
fix dev env migrate.yml path in docs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-23 21:38:27 +00:00
Christian M. Adams
2097b014e8 fix dev env migrate.yml path in docs 2021-02-23 16:04:22 -05:00
softwarefactory-project-zuul[bot]
fb6ce4bed3 Merge pull request #9387 from rooftopcellist/secret_key_dev
Mount SECRET_KEY into dev env & document it

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-23 20:22:58 +00:00
Shane McDonald
7ae19a8ba3 Fix tests 2021-02-23 14:50:27 -05:00
softwarefactory-project-zuul[bot]
240556b5d6 Merge pull request #9392 from rooftopcellist/update-docs-ansible-install
Add ansible requirement for dev env docs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-23 18:37:36 +00:00
Christian M. Adams
1b6976205c Add ansible requirement for dev env docs 2021-02-23 13:03:47 -05:00
sean-m-sullivan
ce21dec0d0 update 2021-02-23 11:50:29 -06:00
softwarefactory-project-zuul[bot]
22df3047e6 Merge pull request #9381 from wenottingham/no-more-email
Make email not required for a user in the UI.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-23 16:27:56 +00:00
softwarefactory-project-zuul[bot]
79cb11d905 Merge pull request #9385 from ryanpetrello/buildkit
build images using Buildkit

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-23 15:20:06 +00:00
Ryan Petrello
be79b6e907 build images using Buildkit 2021-02-23 09:32:00 -05:00
Christian M. Adams
2239c8d6e5 Add full path to data migration example in docs 2021-02-23 09:07:37 -05:00
Shane McDonald
7394535022 Remove default SECRET_KEY
We should never be using default values for sensitive information
2021-02-23 08:46:42 -05:00
Christian M. Adams
ec40f62c4d Mount SECRET_KEY into dev env & document it 2021-02-22 18:46:47 -05:00
softwarefactory-project-zuul[bot]
5e6c978a47 Merge pull request #9289 from rooftopcellist/docker-community
Replace Local Docker Install with Community Docker-Compose

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-22 23:25:24 +00:00
Alex Corey
a54352898e makes the inventory file field creatable 2021-02-22 18:05:09 -05:00
Christian M. Adams
b583aeb646 Pass docker project_name whenever docker-compose is used
- Also, do no explicitly name containers
2021-02-22 17:05:51 -05:00
Christian M. Adams
af6af052d0 Remove unneeded roles from the installer directory 2021-02-22 15:37:24 -05:00
Shane McDonald
70325fd249 Remove nodejs from list of required dependencies to install 2021-02-22 13:44:22 -05:00
Shane McDonald
e935b06c39 Fix docker-compose-clean 2021-02-22 13:44:22 -05:00
Shane McDonald
8f9758803e Set compose project dir for backwards compatibility 2021-02-22 13:44:22 -05:00
Christian M. Adams
9672e72834 Consolidate the Local Docker installer and the dev env
- removes local_docker installer and points community users to our development environment (make docker-compose)
  - provides a migration path from Local Docker Compose installations --> the dev environment
  - the dev env can now be configured to use an external database
  - consolidated the Local Docker and dev env docker-compose.yml files into one template file, used by the dockerfile role
  - added a 'sources' role to template out config files
  - the postgres data dir is no longer a bind-mount, it is a docker volume
  - the redis socket is not longer a bind-mount, it is a docker volume
  - the local_settings.py.docker-compose file no longer needs to be copied over in the dev env
  - Create tmp rsyslog.conf in rsyslog volume to avoid cross-linking. Previously, the tmp code-generated rsyslog.conf was being written to /tmp (by default).  As a result, we were attempting to shutil.move() across volumes.
  - move k8s image build and push roles under tools/ansible
  - See tools/docker-compose/README.md for usage of these changes
2021-02-22 13:44:19 -05:00
Bill Nottingham
fb07be36b5 Make email not required for a user in the UI.
It's already not required in the API.
2021-02-22 13:28:03 -05:00
softwarefactory-project-zuul[bot]
0f6d2c36a0 Merge pull request #9131 from sezanzeb/patch-1
Document admin_password in INSTALL.md

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-22 17:36:55 +00:00
softwarefactory-project-zuul[bot]
805ba2568c Merge pull request #9322 from jainnikhil30/workflow_launch_type_metavar
add workflow_job_launch_type in metavars

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-22 17:27:32 +00:00
softwarefactory-project-zuul[bot]
e0bbd36b99 Merge pull request #9378 from tchellomello/guid-configmap-k8s
Added GUID filters for k8s/OCP environment

Reviewed-by: awxbot
             https://github.com/awxbot
2021-02-22 15:00:28 +00:00
softwarefactory-project-zuul[bot]
3b1b55946e Merge pull request #9334 from mabashian/8372-pending-approvals
Add pending approvals badge to application header

Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
             https://github.com/tiagodread
2021-02-22 14:47:30 +00:00
Alex Corey
189804932e Inventory File field and playbook field are both now type ahead. 2021-02-22 09:15:27 -05:00
Marcelo Moreira de Mello
61da965d54 Added GUID filters for k8s/OCP environment 2021-02-22 09:13:22 -05:00
softwarefactory-project-zuul[bot]
1f1657d880 Merge pull request #9210 from AlexSCorey/7692-PromptsOnSchedules
Prompts on schedules

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-22 13:25:12 +00:00
sean-m-sullivan
57f4db25d2 linting 2021-02-21 23:51:21 -06:00
sean-m-sullivan
115726ed83 fix completness 2021-02-21 23:29:30 -06:00
sean-m-sullivan
9a7dd38cbb add copy to modules 2021-02-21 19:49:14 -06:00
Sean Sullivan
74a5247d9d Merge pull request #42 from ansible/devel
Rebase
2021-02-20 05:58:30 -06:00
softwarefactory-project-zuul[bot]
cc18cf650e Merge pull request #9369 from jbradberry/fix-broken-logos
Fix the broken paths to the favicon and logo in the API browser

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
             https://github.com/jakemcdermott
2021-02-19 20:30:01 +00:00
Jeff Bradberry
78ccf3c674 Fix the broken paths to the favicon and logo in the API browser 2021-02-19 14:56:26 -05:00
Alex Corey
96531eff7a fixes survey row alignment issue 2021-02-19 14:27:50 -05:00
Alex Corey
561390d405 Refactors to add warning icon and disable save if schedule has missing values 2021-02-19 14:27:50 -05:00
Alex Corey
c608d761a2 Adds Prompting for schedule 2021-02-19 14:27:50 -05:00
Alex Corey
61c0beccff Updates props being passed to Schedules to more accuratly reflect what they are 2021-02-19 14:27:49 -05:00
softwarefactory-project-zuul[bot]
182a7e8e5c Merge pull request #9251 from Saurabh-Thakre/Saurabh-Thakre-patch-1
Fixed the Customized Notification returning incorrect values for host_status_counts

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-19 16:07:30 +00:00
Elijah DeLee
0e6c14e707 create performance logger to log api response time
this middleware allready existed, and we were trying to log this
data but it was not working.

Hope is these logs will be able to be shipped via external logging
and we could use kibana to track response time of different endpoints
2021-02-18 18:39:12 -05:00
softwarefactory-project-zuul[bot]
080c430b82 Merge pull request #9356 from mabashian/fix-test-warnings
Fix a few unit test console warnings

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-18 15:14:44 +00:00
mabashian
40c6b346c1 Adds note to changelog about pending workflow approval count 2021-02-18 09:43:44 -05:00
mabashian
1c61fafbc7 Add pending approvals badge to application header 2021-02-18 09:42:51 -05:00
mabashian
afe36974de Fix a few unit test console warnings 2021-02-18 09:14:15 -05:00
softwarefactory-project-zuul[bot]
99460a76d8 Merge pull request #9347 from AlexSCorey/TestCoverageScript
Don't instrument for coverage by default unless CI

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-18 13:51:47 +00:00
softwarefactory-project-zuul[bot]
efbbbc0bdc Merge pull request #9188 from nixocio/ui_issue_8707
Allow user to remove organization from credentials

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-18 13:51:39 +00:00
Alex Corey
9090cb830d Don't instrument for coverage by default unless CI 2021-02-18 08:09:19 -05:00
Saurabh Thakre
6aca9d80bb Updated notifications.py
Fixed the customized notification returning incorrect values for host_status_counts

Update notifications.py

Removed if condition

Added exception handling

A nitpick
2021-02-18 12:24:14 +00:00
nixocio
33deaa7d0b Allow user to remove organization from credentials
Allow user to remove organization from credentials.

See: https://github.com/ansible/awx/issues/8707
2021-02-17 16:11:09 -05:00
softwarefactory-project-zuul[bot]
0bd4a8c16d Merge pull request #9340 from ansible/jakemcdermott-changelog
Add some items to the upcoming changelog

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-17 21:08:43 +00:00
softwarefactory-project-zuul[bot]
c98c6db664 Merge pull request #8640 from AlexSCorey/8130-DiplayOrgAdmins
Adds filter by role on Org access lists

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-17 21:00:09 +00:00
Jake McDermott
31e6d7cc0a Add some items to the upcoming changelog 2021-02-17 15:36:12 -05:00
softwarefactory-project-zuul[bot]
c758e6f8cf Merge pull request #9343 from beeankha/remove_unused_files
Remove Unused JSON Test Files

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-02-17 20:27:51 +00:00
softwarefactory-project-zuul[bot]
242c4e2533 Merge pull request #9338 from amolgautam25/fix-for-tower-issue-4696
fix for issue 4696(tower) , Upstream commit for tower PR 4840

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-17 20:15:59 +00:00
softwarefactory-project-zuul[bot]
d7d496553e Merge pull request #9332 from ryanpetrello/guid-trace
add a per-request GUID and log as it travels through background services

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-17 20:07:44 +00:00
Alex Corey
1f59d6182b Adds filtering for system level roles 2021-02-17 15:05:31 -05:00
beeankha
64b49feeee Remove functional test files that are no longer in use 2021-02-17 14:42:50 -05:00
Keith Grant
2419a592b4 convert NotificationList to tables 2021-02-17 11:10:35 -08:00
Keith Grant
eb66a03a30 fix duplicate tooltip on notification template edit button 2021-02-17 11:09:25 -08:00
Keith Grant
87cf797153 convert application list to tables 2021-02-17 11:08:33 -08:00
Keith Grant
a481fc3cc9 convert instance group list to tables 2021-02-17 11:08:33 -08:00
Keith Grant
c3bab52a61 convert notification template list to tables 2021-02-17 11:08:33 -08:00
Keith Grant
b3cdefec23 convert CredentialTypeList to tables 2021-02-17 11:07:47 -08:00
Ryan Petrello
3cc3cf1f80 add a per-request GUID and log as it travels through background services
see: https://github.com/ansible/awx/issues/9329
2021-02-17 12:54:13 -05:00
Alex Corey
2a9a471181 adds sorting by role on org access lists 2021-02-17 11:17:20 -05:00
softwarefactory-project-zuul[bot]
2a37430eab Merge pull request #9336 from mabashian/9310-cred-edit
Fix bug where credential inputs were not filled on edit

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-17 16:02:37 +00:00
fedora
29520f1ca6 fix for issue 4696(tower) , Upstream commit for tower PR 4840 2021-02-17 10:14:06 -05:00
mabashian
051efa4a19 Adds unit test coverage for input rendering on credential edit 2021-02-17 09:56:48 -05:00
mabashian
e26015a084 Fix bug where credential inputs were not filled on edit 2021-02-16 18:50:24 -05:00
softwarefactory-project-zuul[bot]
4cb0366fcf Merge pull request #9320 from nixocio/ui_fix_minor_typo
Fix typo

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-16 16:58:57 +00:00
softwarefactory-project-zuul[bot]
365b3a2366 Merge pull request #9313 from sean-m-sullivan/job_template_limit
Fix defaults that were set to empty string in collections.

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2021-02-16 16:40:13 +00:00
softwarefactory-project-zuul[bot]
5c35bb335a Merge pull request #9324 from ansible/dependabot/pip/requirements/atomicwrites-1.4.0
Bump atomicwrites from 1.1.5 to 1.4.0 in /requirements

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-16 16:33:16 +00:00
softwarefactory-project-zuul[bot]
0df85b0a27 Merge pull request #9277 from nixocio/ui_7777_update_pf4
Update Patternfly to allow access to slider component

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-16 16:28:10 +00:00
nixocio
02c8f4cc59 Update Patternfly to allow access to slider component
Update Patternfly to allow access to slider component

See: https://github.com/ansible/awx/issues/7777
2021-02-16 10:44:22 -05:00
dependabot[bot]
fbe5832d5a Bump atomicwrites from 1.1.5 to 1.4.0 in /requirements
Bumps [atomicwrites](https://github.com/untitaker/python-atomicwrites) from 1.1.5 to 1.4.0.
- [Release notes](https://github.com/untitaker/python-atomicwrites/releases)
- [Commits](https://github.com/untitaker/python-atomicwrites/compare/1.1.5...1.4.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-16 14:43:53 +00:00
softwarefactory-project-zuul[bot]
b4956de6e4 Merge pull request #9306 from jlosito/dependabot-config
Allow dependabot to check python dependencies

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-16 14:43:24 +00:00
John Losito
5e91ae7b03 Change dependabot schedule to monthly 2021-02-16 09:07:31 -05:00
Nikhil Jain
1468e5908a add workflow_job_launch_type in metavars 2021-02-16 18:19:37 +05:30
softwarefactory-project-zuul[bot]
6e8c71a231 Merge pull request #9304 from wenottingham/stacks-n-such
Fix Openstack credential region implementation.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-16 03:40:12 +00:00
softwarefactory-project-zuul[bot]
56868dbedd Merge pull request #9225 from nixocio/ui_issue_8670
Add relaunch against failed hosts

Reviewed-by: Mat Wilson <mawilson@redhat.com>
             https://github.com/one-t
2021-02-16 00:18:07 +00:00
nixocio
3c8f5f666f Fix typo
Fix typo on error message
2021-02-15 17:41:32 -05:00
Sean Sullivan
c7bfc60be3 Merge pull request #41 from ansible/devel
Rebase
2021-02-15 14:23:29 -06:00
sean-m-sullivan
62d91365a7 add test for ad hoc no module arg 2021-02-15 12:23:18 -06:00
softwarefactory-project-zuul[bot]
4e48118704 Merge pull request #9287 from mabashian/7679-copy-inv-w-source
Disable inventory copy button when inventory has sources

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-15 17:19:49 +00:00
softwarefactory-project-zuul[bot]
8bcc91518e Merge pull request #9295 from jainnikhil30/add_diff_support
add support for diff mode in tower_settings module

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-15 16:52:32 +00:00
mabashian
f6bddfd336 Fix linting error in CopyButton test 2021-02-15 11:33:38 -05:00
mabashian
a691caf346 Disable inventory copy button when inventory has sources. Refactor copy button props since tooltip is now handled by the ActionItem component. 2021-02-15 11:19:01 -05:00
Nikhil Jain
3ad2bb1bb9 remove whitespaces 2021-02-15 09:31:16 +05:30
sean-m-sullivan
5548f7e91d fix default value bug 2021-02-14 17:17:04 -06:00
Sean Sullivan
6d08c11506 Merge pull request #39 from ansible/devel
Rebase
2021-02-14 01:29:54 -06:00
John Losito
055222bb82 Allow dependabot to check python dependencies 2021-02-13 20:37:33 -05:00
Hideki Saito
82a226d1fe Add links to inventory source and project to inventory update details view of Jobs list
* Addresses #8839

Signed-off-by: Hideki Saito <saito@fgrep.org>
2021-02-13 22:08:35 +09:00
Bill Nottingham
e93518a030 Fix Openstack credential region implementation.
The injector wasn't using the same variable name as the model.
2021-02-12 17:44:44 -05:00
nixocio
33b1028882 Add relaunch against failed hosts
Add relaunch against failed hosts

See: https://github.com/ansible/awx/issues/8670
2021-02-12 17:29:00 -05:00
softwarefactory-project-zuul[bot]
67f1f9ac69 Merge pull request #9278 from AlexSCorey/PreLingUI-Upgrade-3
Fixes final files in preparation for lingui upgrade

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-12 22:00:46 +00:00
softwarefactory-project-zuul[bot]
f99f183d53 Merge pull request #9301 from jbradberry/bump-ansible-runner
Bump ansible-runner to get the pexpect fix

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-12 19:59:59 +00:00
softwarefactory-project-zuul[bot]
2e179609d9 Merge pull request #9300 from darrenjones24/devel
Fix #9298 by upgrading pip allowing use of custom_venvs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-12 17:21:35 +00:00
Jeff Bradberry
8fb0b401ce Bump ansible-runner to get the pexpect fix 2021-02-12 12:08:21 -05:00
darren
ed124c693a remove unecessary --update 2021-02-12 16:47:14 +00:00
softwarefactory-project-zuul[bot]
949c777546 Merge pull request #9284 from sean-m-sullivan/fix-awx_collection-docs
Fix awx collection docs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-12 16:31:13 +00:00
darren
3f5cb645f2 fix 9298 by upgrading pip allowing use of custom_venvs 2021-02-12 16:24:18 +00:00
sean-m-sullivan
d83771f082 revert changes 2021-02-12 08:35:27 -06:00
Nikhil Jain
b177c7b558 add support diff mode in tower_settings module 2021-02-12 08:19:32 +05:30
sean-m-sullivan
2b664d6958 add default 2021-02-11 12:28:55 -06:00
softwarefactory-project-zuul[bot]
909c2513ac Merge pull request #9116 from AlexSCorey/8944-CredTypeLookup
Fixes missing credential types and makes credential type field a type ahead

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-11 04:02:44 +00:00
softwarefactory-project-zuul[bot]
5f7c056f13 Merge pull request #9290 from jakemcdermott/relax-yall
Relax client-side email validator

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-11 02:27:58 +00:00
softwarefactory-project-zuul[bot]
56881c25c9 Merge pull request #9288 from mabashian/9060-job-tags
Show job and skip tags on job detail view

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-10 23:38:34 +00:00
softwarefactory-project-zuul[bot]
aa855c1d57 Merge pull request #9170 from nixocio/ui_issue_7676_tables
Add tooltips to inventory sync status

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-10 22:54:37 +00:00
Jake McDermott
09b097d6b9 Relax client-side email validator 2021-02-10 17:35:30 -05:00
sean-m-sullivan
ed8b4a3c70 Merge branch 'fix-awx_collection-docs' of github.com:sean-m-sullivan/awx into fix-awx_collection-docs 2021-02-10 15:45:38 -06:00
sean-m-sullivan
d4f86e8999 update test 2021-02-10 15:45:17 -06:00
Alex Corey
17627ed6ce Closes select on selection and truncates list items 2021-02-10 14:56:53 -05:00
Alex Corey
32ddfdf590 adds static ID for testing 2021-02-10 14:56:53 -05:00
Alex Corey
4a2a6949a8 Fixes missing credential types and makes credential type drop down a typeahead component 2021-02-10 14:56:53 -05:00
mabashian
5ba6d14e4d Show job and skip tags on job detail view 2021-02-10 13:42:27 -05:00
Sean Sullivan
c7793e0b9c Merge pull request #38 from ansible/devel
Rebase
2021-02-10 10:22:40 -06:00
Sean Sullivan
44d7915993 Merge pull request #37 from ansible/devel
Rebase
2021-02-10 10:21:50 -06:00
softwarefactory-project-zuul[bot]
2ef08b1d13 Merge pull request #9052 from jgroom33/patch-1
Update custom_virtualenvs.md

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-10 16:20:18 +00:00
Sean Sullivan
16aa73fc2c Update inventory source req fields
As per the gui, and testing, source is a required field.
2021-02-10 08:47:51 -06:00
Sean Sullivan
5013d74f46 Remove required field in doc
new name is not a required field, removing that designation from the docs.
2021-02-10 08:42:06 -06:00
softwarefactory-project-zuul[bot]
3d54ab9a0f Merge pull request #8897 from wenottingham/right-on-schedule
Add schedule info from summary fields to allowed notification content.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-09 22:41:13 +00:00
Alex Corey
9420837dae Fixes final files in preparation for lingui upgrade 2021-02-09 17:24:15 -05:00
softwarefactory-project-zuul[bot]
a613cb2f78 Merge pull request #9227 from sean-m-sullivan/project_update
Add project update to project module

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-09 22:00:19 +00:00
softwarefactory-project-zuul[bot]
92c9f6b0f7 Merge pull request #9268 from fosterseth/fix_requirements_json_log_formatter
Add version to json-log-formatter in requirements.txt file

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-09 16:32:19 +00:00
softwarefactory-project-zuul[bot]
c7a558b027 Merge pull request #9274 from constreference/9273
[9273]: Add missing symlinks for awx-manage

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-09 16:21:28 +00:00
Siva Renganathan
4f40381b46 [9273]: Add missing symlinks for awx-manage
This fixes the issue addressed in 9273
The symlinks are created on the build container as opposed to the final
container causing awx-manage command to break.

Signed-off-by: Siva Renganathan <siva.rg@protonmail.com>
2021-02-09 20:37:11 +05:30
softwarefactory-project-zuul[bot]
2c9ef3bae6 Merge pull request #9182 from keithjgrant/6189-hosts-users-teams-tables
Convert Hosts/Users/Teams list to tables

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-09 13:16:59 +00:00
sean-m-sullivan
f82163499c update python 2021-02-08 23:10:34 -06:00
Seth Foster
6f7bdc04c0 fix requirements file 2021-02-08 23:06:07 -05:00
softwarefactory-project-zuul[bot]
9fc8144f8e Merge pull request #9265 from shanemcd/fix-notification-tests
Fix test notifications

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-02-08 23:24:24 +00:00
softwarefactory-project-zuul[bot]
f670a01bf7 Merge pull request #9264 from jakemcdermott/fix-output-error-attr-no-stdout
Handle error state with traceback and no stdout

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
             https://github.com/jakemcdermott
2021-02-08 23:13:12 +00:00
Shane McDonald
0e2fb02185 Fix test notifications 2021-02-08 17:49:20 -05:00
Jake McDermott
b0520ae0e4 Handle error state with traceback and no stdout 2021-02-08 17:20:24 -05:00
softwarefactory-project-zuul[bot]
471ee46171 Merge pull request #9240 from marshmalien/7040-cancel-btn-style
Update cancel button style to "link"

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-08 19:21:09 +00:00
softwarefactory-project-zuul[bot]
fc6acbd9d1 Merge pull request #9148 from keithjgrant/6189-credentials-table
Convert Credentials & Projects lists to PaginatedTable

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-08 13:21:45 +00:00
Jim Ladd
5b3bb1e81d set schedule.next_run to datetime.datetime
* Update JobNotificationMixin.context_stub
* .. TestJobNotificationMixin.CONTEXT_STRUCTURE
2021-02-05 13:56:56 -08:00
Bill Nottingham
7b757f17a9 Add schedule info from summary fields to allowed notification content. 2021-02-05 13:56:56 -08:00
softwarefactory-project-zuul[bot]
753749d2b4 Merge pull request #9123 from nixocio/ui_issue_8355
Update migration page

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-05 18:38:09 +00:00
softwarefactory-project-zuul[bot]
73d4d14a62 Merge pull request #9199 from jakemcdermott/fix-8848
Add ability to cancel running jobs from output view

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-05 03:21:02 +00:00
Keith Grant
13131e96b6 delete unused import 2021-02-04 16:21:57 -08:00
Keith Grant
aaaeb37812 hide table scrollbar when not needed 2021-02-04 14:04:21 -08:00
Keith Grant
dfcfdc7a4e add actions column header to host, user, team lists 2021-02-04 13:52:37 -08:00
Keith Grant
4ca8862b51 convert TeamsList to tables 2021-02-04 13:52:37 -08:00
Keith Grant
e886ce57aa convent UsersList to tables 2021-02-04 13:52:27 -08:00
Keith Grant
f747edca0c convert HostList to PaginatedTable 2021-02-04 13:52:14 -08:00
softwarefactory-project-zuul[bot]
ba318f8670 Merge pull request #9130 from fosterseth/feat_wip_job_lifecycle
log job lifecycle

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-04 19:40:12 +00:00
sean-m-sullivan
9d359a080b updating completeness parameters 2021-02-04 11:33:49 -06:00
Seth Foster
41d0a2f7b9 Add job lifecycle logging
Various	points (e.g. created, running, processing events), are
structured into	json format and	output to /var/log/tower/job_lifecycle.log

As part	of this	work, the DependencyGraph is reworked to return
which job object is doing the blocking, rather than a boolean.
2021-02-04 12:25:51 -05:00
Marliana Lara
379824bbf7 Update cancel buttons to link style 2021-02-04 12:22:52 -05:00
softwarefactory-project-zuul[bot]
47de2ddcb5 Merge pull request #9231 from jakemcdermott/fix-9229
Prevent url smashing from prompted inputs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-04 16:44:24 +00:00
Jake McDermott
14686e8b16 Prevent enter-submit on prompt steps 2021-02-03 23:22:42 -05:00
sean-m-sullivan
f35c16e4f0 update 2021-02-03 18:47:32 -06:00
Sean Sullivan
226a689f7b Merge pull request #36 from ansible/devel
Rebase
2021-02-03 18:40:12 -06:00
softwarefactory-project-zuul[bot]
54d63ee437 Merge pull request #8726 from jakemcdermott/fix-8709
Show job traceback stdout and error details

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-03 19:42:09 +00:00
Alex Corey
fe9bd37c74 fixes pagination issue on modal 2021-02-03 12:33:33 -05:00
Keith Grant
0b633c2b6c convert project list to PaginatedTable 2021-02-03 09:01:43 -08:00
Keith Grant
8081d66872 convert credentials list to table 2021-02-03 09:01:22 -08:00
softwarefactory-project-zuul[bot]
40cf4ff209 Merge pull request #9045 from keithjgrant/6189-schedules-list
Convert SchedulesList, WorkflowApprovalList to tables

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-03 14:08:53 +00:00
softwarefactory-project-zuul[bot]
554f96ccef Merge pull request #8869 from mabashian/6510-schedule-detail-prompts
Fix prompted values section of schedule details

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-03 00:56:23 +00:00
mabashian
1a5cdd05c5 Adds more test coverage around Prompted Values and when those fields get shown 2021-02-02 18:58:08 -05:00
mabashian
bb67d62d81 Adds variables to track showing limit/job type/scm branch/verbosity fields in Prompted Values 2021-02-02 18:58:08 -05:00
mabashian
a9288c82fc Adds missing verbosity detail. Adds flag for showing the diff mode detail. 2021-02-02 18:58:08 -05:00
mabashian
5a70989ff5 Hide Prompted Fields section when tags/skip tags are prompted but have no values 2021-02-02 18:58:08 -05:00
mabashian
56139423d9 Use PF variables where possible in styles 2021-02-02 18:58:08 -05:00
mabashian
ffd9a239ba Fix prompted values section of schedule details and updated PromptDetail to match ScheduleDetail prompt UX 2021-02-02 18:58:08 -05:00
Keith Grant
00b47f1dbf add table header to ScheduleList 2021-02-02 15:12:41 -08:00
Keith Grant
eb2a9baadd Convert WorkflowApprovalList to table 2021-02-02 15:12:41 -08:00
Keith Grant
953fa3fe0d convert Schedules list to PaginatedTable 2021-02-02 15:12:41 -08:00
softwarefactory-project-zuul[bot]
b20adac33d Merge pull request #9114 from keithjgrant/6189-template-list-tables
Convert TemplateList to PaginatedTable

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-02 20:28:58 +00:00
Keith Grant
186aa6cc99 update snapshot 2021-02-02 11:59:17 -08:00
Keith Grant
27b0f874cc remove unused var 2021-02-02 11:45:34 -08:00
Keith Grant
669e963e38 combine TemplateList/DashboardTemplateList into shared component 2021-02-02 11:45:34 -08:00
Keith Grant
03eb9bafb7 add missing template list data; add ids to relevant page elements 2021-02-02 11:44:20 -08:00
Keith Grant
78ef11d558 update Template list tests 2021-02-02 11:44:20 -08:00
Keith Grant
ad71dc3e98 add expandable row details to template list 2021-02-02 11:44:20 -08:00
Keith Grant
f3410f6517 convert TemplateList to tables 2021-02-02 11:44:20 -08:00
softwarefactory-project-zuul[bot]
7d432e484c Merge pull request #9205 from beeankha/fix_pylint_error
Fix Pylint Error

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-02 19:19:46 +00:00
softwarefactory-project-zuul[bot]
271eb4043a Merge pull request #9094 from AlexSCorey/TransLintPOC
Adds translation linting and addresses issues the linter found

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-02 17:28:31 +00:00
softwarefactory-project-zuul[bot]
cc9ee550d9 Merge pull request #9185 from sean-m-sullivan/add_orgs_job_launch
Add orgs job launch

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2021-02-02 16:05:42 +00:00
softwarefactory-project-zuul[bot]
7a8d9394be Merge pull request #6106 from egmar/ghe-auth-support
Support for Github Enteprise for authentication

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-02 15:59:22 +00:00
Jake McDermott
339d430de1 Add ability to cancel jobs 2021-02-02 10:39:19 -05:00
softwarefactory-project-zuul[bot]
6f24fda168 Merge pull request #9104 from sean-m-sullivan/survey_logic
Survey logic for awx modules

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2021-02-02 15:33:20 +00:00
beeankha
3ad9aa902d Fix pylint throwaway variable error 2021-02-02 08:56:42 -05:00
softwarefactory-project-zuul[bot]
3408f5270e Merge pull request #9203 from ryanpetrello/new-logo
Update with the new logo

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-01 21:40:27 +00:00
Ryan Petrello
d365705e05 Revert "Remove old logo"
This reverts commit b24a1746ae.
2021-02-01 16:00:07 -05:00
Alex Corey
1f81592b5c adds translation linting and addresses issues the linter found 2021-02-01 13:14:54 -05:00
softwarefactory-project-zuul[bot]
0f0857747d Merge pull request #9198 from Zokormazo/ui-next-typo
Docs: Fix npm install command line

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-02-01 14:19:18 +00:00
Julen Landa Alustiza
ff27c486bf Fix npm install command line
Signed-off-by: Julen Landa Alustiza <jlandaal@redhat.com>
2021-02-01 12:05:41 +01:00
Jake McDermott
e7719e3fdc Splice result_traceback into first row stdout 2021-01-31 22:15:51 -05:00
Jake McDermott
7a6cbe2685 Display status explanation message when available 2021-01-31 22:15:49 -05:00
Jake McDermott
b2328d17a4 Render result tracebacks as stdout 2021-01-31 22:15:43 -05:00
Egor Margineanu
b8790db84a [PATCH] Rebase and update the Settings options file. Source: 65b4811
Fixed Github Enterprise labels
2021-01-29 23:41:12 +01:00
softwarefactory-project-zuul[bot]
89646e7799 Merge pull request #8661 from marshmalien/setting-jobs-ui
Add job settings form and unit tests

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-29 21:01:40 +00:00
softwarefactory-project-zuul[bot]
1b32dad745 Merge pull request #9192 from jakemcdermott/fix-9191
Fix container group detail link outs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-29 19:38:40 +00:00
softwarefactory-project-zuul[bot]
5ab0b91a0d Merge pull request #9057 from keithjgrant/9049-inventory-table-responsiveness
Fix inventory list responsive behavior

Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
             https://github.com/tiagodread
2021-01-29 19:14:37 +00:00
Keith Grant
da6f793468 delete unused import 2021-01-29 10:41:48 -08:00
Sean Sullivan
ce44a056ad Merge pull request #35 from ansible/devel
Rebase
2021-01-29 09:27:42 -06:00
Sean Sullivan
54aababd0f Merge pull request #34 from ansible/devel
Rebase
2021-01-29 09:26:40 -06:00
Marliana Lara
8a58a73cb0 Handle reverting falsy values that are not null or undefined 2021-01-29 09:27:21 -05:00
Marliana Lara
db4d84b94c Add job settings form and unit tests 2021-01-29 09:24:51 -05:00
Egor Margineanu
604b42929d Improved labels and help text for Github Enterprise SSO configuration fields.
Signed-off-by: Egor Margineanu <egor.margineanu@gmail.com>
2021-01-29 13:09:40 +01:00
Egor Margineanu
a90ff45e98 Added changes from 645701a and 4692e2f 2021-01-29 13:09:40 +01:00
mabashian
d461090415 Adds support for github enterprise auth methods in ui_next 2021-01-29 13:09:27 +01:00
Egor Margineanu
9ccee200f3 Removed GHE forms from ui folder
Fixed org/team field names based on @constreference feedback
Added support for Github Enteprise for authentication
2021-01-29 13:01:08 +01:00
Keith Grant
a74fe57691 remove extra inventory columns; add horizontal scroll to wide tables 2021-01-28 16:34:46 -08:00
nixocio
3f5e1518ee Update migration page
Update migration to add styling. Also, use django template and context
to inject variables into the migration page.

See: https://github.com/ansible/awx/issues/8355
2021-01-28 17:46:36 -05:00
sean-m-sullivan
e433e3ebc2 update logic 2021-01-28 15:19:28 -06:00
softwarefactory-project-zuul[bot]
88cd154c97 Merge pull request #9038 from AlexSCorey/8998-BrokenLink
fixes broken link and adds test

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-28 20:58:59 +00:00
Jake McDermott
6fcaba6540 Fix container group detail link outs 2021-01-28 15:45:25 -05:00
sean-m-sullivan
cc0d658b1c fix typo 2021-01-28 10:16:27 -06:00
softwarefactory-project-zuul[bot]
792928aae8 Merge pull request #9069 from chrismeyersfsu/logrotate
remove python log rotation in favor of system

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-28 14:48:33 +00:00
sean-m-sullivan
aa5219cf30 fix verbage 2021-01-28 08:36:13 -06:00
Sean Sullivan
9e7882fce2 Merge pull request #33 from ansible/devel
Rebase
2021-01-28 08:32:50 -06:00
sean-m-sullivan
c40ca718d0 add org to job launch 2021-01-28 08:31:52 -06:00
Chris Meyers
67daca04e0 remove python log rotation in favor of system
* The cron ran logrotate will now rotate our log files instead of python
* If not error log file is specified in the config then do not include
it as a paremter to rsyslog omhttp module. This is useful for
containers.
2021-01-28 09:19:08 -05:00
Keith Grant
c3ca43d9bc hide inventory groups/hosts/sources columns when screen width doesn't allow 2021-01-27 15:45:57 -08:00
softwarefactory-project-zuul[bot]
a534a80360 Merge pull request #8970 from keithjgrant/6189-job-list-tables
Convert JobList to PaginatedTable

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-27 21:44:16 +00:00
Sean Sullivan
012189cb10 Merge pull request #32 from ansible/devel
Rebase
2021-01-27 12:47:08 -06:00
Keith Grant
0feeaf0453 fix select boxes in JobList 2021-01-27 09:26:19 -08:00
Keith Grant
7bf7cebd72 Add id to table sort headers 2021-01-27 08:36:30 -08:00
softwarefactory-project-zuul[bot]
b7475442fb Merge pull request #9135 from jainnikhil30/fix_wrong_survey_spec_handling_collection
Fix the handling of wrong survey spec in awx collection

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-27 15:48:15 +00:00
softwarefactory-project-zuul[bot]
11874d38e2 Merge pull request #8783 from marshmalien/setting-saml-ui-edit-forms
Add SAML and UI setting edit forms

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-27 01:30:37 +00:00
softwarefactory-project-zuul[bot]
ce59f1817a Merge pull request #9035 from mabashian/8915-source-workflow-link
Display source workflow job when available on job details view

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-26 22:31:59 +00:00
Keith Grant
2e7b53cf90 remove job data duplicated in expanded view 2021-01-26 14:22:50 -08:00
Keith Grant
afdb4f9709 add id to expanded job rows 2021-01-26 14:18:10 -08:00
Keith Grant
2c17d56acd create LaunchedByDetail to consolidate shared code between detail & list 2021-01-26 14:09:49 -08:00
Keith Grant
8bde6060c4 add expandable rows to JobList 2021-01-26 14:09:49 -08:00
Keith Grant
da16785201 convert JobList to PaginatedTable 2021-01-26 14:09:49 -08:00
softwarefactory-project-zuul[bot]
b7eb1a4c59 Merge pull request #9156 from shanemcd/minikube-dev-env
Minikube-based development environment

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-26 21:10:08 +00:00
Shane McDonald
47740f62f4 Add ingress variable to minikube doc 2021-01-26 15:18:37 -05:00
Shane McDonald
fb7b36cfbd Add note about needing openshift python lib 2021-01-26 15:14:06 -05:00
Shane McDonald
ba8c44f8a6 Add note on how to access AWX in minikube 2021-01-26 15:07:04 -05:00
nixocio
287d181af7 Add tooltips to inventory sync status
Add tooltips to inventory sync status on Inventory List.

See: https://github.com/ansible/awx/issues/7676
2021-01-26 13:50:01 -05:00
softwarefactory-project-zuul[bot]
dfa65225d9 Merge pull request #9048 from AlexSCorey/8961-AuditorCanAddUserRoles
fixes erroneous render of add button

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-26 18:48:43 +00:00
softwarefactory-project-zuul[bot]
aa4ca300f5 Merge pull request #9169 from rooftopcellist/version-1101
Bump version to 17.0.1 & update changelog

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-26 18:22:28 +00:00
Marliana Lara
12f6c05a4a Format certificates/keys in setting detail and hide pendo when off 2021-01-26 12:47:28 -05:00
Marliana Lara
bbde149ab1 Add UI settings form 2021-01-26 12:47:27 -05:00
Marliana Lara
9cf3066591 Add SAML settings edit form 2021-01-26 12:47:27 -05:00
Christian M. Adams
8d8aadb193 Bump version to 17.0.1 & update changelog 2021-01-26 12:35:14 -05:00
softwarefactory-project-zuul[bot]
3194690e5f Merge pull request #9093 from marshmalien/fix-setting-toggle-id
Fix setting toggle on click behavior

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2021-01-26 17:16:43 +00:00
softwarefactory-project-zuul[bot]
6cc3ac2e99 Merge pull request #9167 from djj106/devel
fix workflow url

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-01-26 15:40:56 +00:00
Shane McDonald
bda4db462f Enable inline caching for image builds 2021-01-26 10:24:35 -05:00
djj106
c4c1b9799e fix workflow url
Signed-off-by: djj106 <djj106@gmail.com>
2021-01-26 08:48:08 -06:00
Sean Sullivan
a825cf3583 Merge pull request #31 from ansible/devel
Rebase
2021-01-25 21:38:47 -06:00
Shane McDonald
7c8bd47198 Minikube-based development environment
Works in conjunction with https://github.com/ansible/awx-operator/pull/71

See docs/development/minikube.md
2021-01-25 18:03:17 -05:00
softwarefactory-project-zuul[bot]
9f691a048d Merge pull request #9152 from rooftopcellist/awxcompose-perm
Pre-create pgdocker dir ahead of time with proper permissions

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-25 17:28:46 +00:00
softwarefactory-project-zuul[bot]
da68e613e3 Merge pull request #9155 from sezanzeb/patch-2
document postgres_data_dir

Reviewed-by: awxbot
             https://github.com/awxbot
2021-01-25 16:58:03 +00:00
sezanzeb
b9a9d645de document postgres_data_dir 2021-01-25 17:26:39 +01:00
softwarefactory-project-zuul[bot]
7032927ba3 Merge pull request #9150 from mamercad/mamercad/named_url_typo
Fixing a small typo

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-25 15:19:36 +00:00
Christian M. Adams
e62035fa5e Pre-create pgdocker dir ahead of time with proper permissions 2021-01-25 09:52:02 -05:00
Mark Mercado
5fe6e75255 Fixing a small typo 2021-01-24 12:40:29 -05:00
Sean Sullivan
916f919fcb Merge pull request #30 from ansible/devel
rebase
2021-01-23 19:39:56 -06:00
softwarefactory-project-zuul[bot]
83372d6f03 Merge pull request #9149 from vladdoster/patch-1
(docs) update README.md

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-24 00:23:20 +00:00
vlad doster
7c53bf3681 (docs) update README.md
- correct punctuation
- fix spelling
2021-01-23 14:11:40 -06:00
softwarefactory-project-zuul[bot]
e40e646211 Merge pull request #9143 from ryanpetrello/org-host-count
expose active host count on the Organization detail view

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-22 19:14:58 +00:00
softwarefactory-project-zuul[bot]
b913d8411a Merge pull request #9142 from ryanpetrello/bye-bigint
stop detecting the need for event data migration

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-22 18:46:13 +00:00
Ryan Petrello
2017504c51 expose active host count on the Organization detail view 2021-01-22 13:42:27 -05:00
Sean Sullivan
ac280e1446 Merge pull request #29 from ansible/devel
Rebase
2021-01-22 12:01:25 -06:00
Ryan Petrello
16848e9154 stop detecting the need for event data migration
related: https://github.com/ansible/awx/issues/6010

as noted in the comment removed from this diff, it's probably time
to stop calling this function on every dispatcher service restart
2021-01-22 09:22:00 -05:00
Ryan Petrello
3e03c726cb Merge pull request #9133 from ryanpetrello/more-changelog-bits
Change the 17.0.0 date and make room for a bit more to land.
2021-01-22 01:11:39 -05:00
Nikhil Jain
81875f0971 fix the handling of wrong survey spec 2021-01-22 11:03:44 +05:30
softwarefactory-project-zuul[bot]
a2c2588383 Merge pull request #9083 from jlmitch5/actStream
Update Breadcrumbs/Add Activity Stream UI

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2021-01-21 23:45:23 +00:00
Ryan Petrello
67066a3fa5 Change the 17.0.0 date and make room for a bit more to land. 2021-01-21 17:12:25 -05:00
softwarefactory-project-zuul[bot]
bd76d1a75f Merge pull request #9050 from ryanpetrello/bump-17-0-0
Bump version to 17.0.0

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-21 21:01:21 +00:00
Ryan Petrello
c77ca928cc Bump version to 17.0.0 2021-01-21 15:31:46 -05:00
John Mitchell
7d495713ee updated aria label for activity stream type select 2021-01-21 15:31:08 -05:00
softwarefactory-project-zuul[bot]
b78fee1f01 Merge pull request #9011 from AlexSCorey/PreLingUI2
Updates files to pre lingUI upgrade work

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-21 20:30:18 +00:00
sezanzeb
7d58ae3c8c dot 2021-01-21 20:27:33 +01:00
sezanzeb
5445de7d01 Document admin_password in INSTALL.md
Because the first user that ever logs in shouldn't be an automated bot looking for vulnerable webservers.
2021-01-21 20:25:06 +01:00
Marliana Lara
ee59ac957a Assert checkbox label click event updates checkbox value 2021-01-21 12:49:57 -05:00
Marliana Lara
6b7d712f9f Give setting toggle form group a unique form field id 2021-01-21 12:36:20 -05:00
John Mitchell
00e837c17c update grouping of activity stream type select and remove inv scripts 2021-01-21 10:01:49 -05:00
John Mitchell
06ff178f9e update activity stream file structure to be consistent with other routes and aid in testing 2021-01-21 10:01:49 -05:00
John Mitchell
f07818f04a check if breadcrumbs should update by name (which changes), not ID 2021-01-21 10:01:49 -05:00
John Mitchell
7a3002f218 fix routes with breadcrumb issues:
team roles title crumb missing
various inventory crums missing
make it so inventories and templates don't get rid of data needed to generate the crumb config
2021-01-21 10:01:49 -05:00
John Mitchell
a0ded889f9 add min height to title to keep page redrwaw from flashing 2021-01-21 10:01:49 -05:00
John Mitchell
8d46e78606 fix lint issue with urlParam name 2021-01-21 10:01:49 -05:00
John Mitchell
6b53ea51fc fix spacing issues with activity stream description builder 2021-01-21 10:01:49 -05:00
John Mitchell
ce28968a11 reset page to 1 after activity stream type changes 2021-01-21 10:01:49 -05:00
John Mitchell
c793b3a9c8 fix issues from rebase fallout 2021-01-21 10:01:49 -05:00
John Mitchell
77cd875a9c add initiated by sort on activity stream 2021-01-21 10:01:49 -05:00
John Mitchell
fd708456df fix workflow event activity steam linking 2021-01-21 10:01:49 -05:00
John Mitchell
2f7a7b453f add workflow node based events to be shown when templates is selected in activity streram 2021-01-21 10:01:49 -05:00
John Mitchell
cec5a77762 add username-based search to activity stream 2021-01-21 10:01:49 -05:00
John Mitchell
7c57a8e5d0 add activity stream ui 2021-01-21 10:01:49 -05:00
John Mitchell
87a2039ded don't strip out non-namespaced params when encoding url search params 2021-01-21 10:01:49 -05:00
John Mitchell
90edb3b551 update Breadcrumb component to ScreenHeader:
- show last breadcrum item as Title on new line
- add activity stream type (to display activity stream icon link in header)
2021-01-21 10:01:49 -05:00
softwarefactory-project-zuul[bot]
f37471c858 Merge pull request #8782 from marshmalien/setting-radius-tacacs-edit-forms
Add RADIUS and TACACS+ setting forms

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-20 22:55:51 +00:00
softwarefactory-project-zuul[bot]
41a855fa6a Merge pull request #9121 from shanemcd/devel
Dont fail image builds because of debuginfo repo problems

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-20 21:12:37 +00:00
Shane McDonald
54e1a802c5 Dont fail imagee builds because of debuginfo repo problems 2021-01-20 15:34:38 -05:00
softwarefactory-project-zuul[bot]
8a7c714613 Merge pull request #9028 from mabashian/7015-prompt-cred-passwords-v2
Add support for credential password prompting on job launch

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-20 19:32:48 +00:00
Alex Corey
0a88d42645 Updates files to pre lingUI upgrade work 2021-01-20 13:31:03 -05:00
softwarefactory-project-zuul[bot]
93160fa4fd Merge pull request #9113 from rooftopcellist/fix-pg12-upgrades
Fix bind-mount problem with pg12 upgrades

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-19 22:04:23 +00:00
mabashian
f738f52c5c Remove credential password mapping in favor of using keys that the api accepts 2021-01-19 16:56:23 -05:00
Christian M. Adams
ac925a03b5 Fix bind-mount problem with pg12 upgrades 2021-01-19 16:34:24 -05:00
mabashian
90caea2273 Separate vault password from id with vertical separator 2021-01-19 13:49:01 -05:00
softwarefactory-project-zuul[bot]
a06366ccc9 Merge pull request #9106 from cl1ent/patch-1
fixed default location for docker_compose_dir variable

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-19 17:49:05 +00:00
softwarefactory-project-zuul[bot]
f4fb13492b Merge pull request #9111 from shanemcd/no-default-password
Do not set default admin_password

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-01-19 17:04:29 +00:00
mabashian
7f78018386 Fix job relaunch where credentials are needed 2021-01-19 11:34:19 -05:00
Shane McDonald
aabb55810b Do not set default admin_password 2021-01-19 11:32:06 -05:00
mabashian
fb62e0ec2c Revert changes to isValid 2021-01-19 09:59:18 -05:00
mabashian
448e49ae43 Add support for password prompting on job launch 2021-01-19 09:59:18 -05:00
cl1ent
9d53bab050 fixed default location for docker_compose_dir variable 2021-01-19 13:17:24 +01:00
softwarefactory-project-zuul[bot]
3a467067f3 Merge pull request #9086 from ryanpetrello/more-callback-tinkering
further optimize callback receiver buffering for certain situations

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-18 19:13:23 +00:00
sean-m-sullivan
3ae133d39d syntax and lint fix 2021-01-18 13:05:28 -06:00
softwarefactory-project-zuul[bot]
3f759d8ddb Merge pull request #8896 from mabashian/7700-smart-inv-button
Adds smart inventory button on host list

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-18 18:54:52 +00:00
sean-m-sullivan
b8bd6d2472 Merge branch 'survey_logic' of github.com:sean-m-sullivan/awx into survey_logic 2021-01-18 12:46:53 -06:00
sean-m-sullivan
d32461388f syntax and lint fix 2021-01-18 12:46:43 -06:00
Sean Sullivan
0e9f7f37e0 Delete test file
Delete test file
2021-01-18 12:21:25 -06:00
Sean Sullivan
e8ea6bc946 Delete test file
Delete test file
2021-01-18 12:20:27 -06:00
Sean Sullivan
91045534d0 Merge pull request #28 from sean-m-sullivan/survey_update
Add logic Rebase
2021-01-18 11:26:09 -06:00
softwarefactory-project-zuul[bot]
5959bfc4ae Merge pull request #9089 from sean-m-sullivan/survey_update
Survey update to workflows

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2021-01-18 17:22:43 +00:00
softwarefactory-project-zuul[bot]
7ffbc7ed1e Merge pull request #9078 from rooftopcellist/pg12-upgrade-migrations
Fix Local Docker partial migration and unavailable superuser issues

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-18 15:51:25 +00:00
sean-m-sullivan
74d1859552 add alias 2021-01-18 09:12:30 -06:00
sean-m-sullivan
1042c1cc28 add logic for survey 2021-01-17 10:32:07 -06:00
Sean Sullivan
1ce9c00d77 Merge pull request #26 from ansible/devel
Rebase
2021-01-16 22:58:41 -06:00
Sean Sullivan
e4cb50921e Merge pull request #27 from ansible/devel
Rebase
2021-01-16 22:51:21 -06:00
softwarefactory-project-zuul[bot]
d1e5dc1eae Merge pull request #9099 from rooftopcellist/rm_launch_configmap
Remove launch script config mapping for k8s and ocp

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-15 21:46:18 +00:00
mabashian
6a7f7a0256 Move smart inventory button out to it's own component to properly handle kebabification 2021-01-15 14:50:41 -05:00
mabashian
bb2248cb24 Adds tooltip around host filter lookup when an organization is not selected 2021-01-15 14:14:34 -05:00
mabashian
fa6de04e79 Remove object import as its not used 2021-01-15 14:14:34 -05:00
mabashian
87604749b7 Adds smart inventory button on host list 2021-01-15 14:14:34 -05:00
softwarefactory-project-zuul[bot]
684998cd51 Merge pull request #8580 from ryanpetrello/fork-race
forcibly close DB and cache socket connection post-fork

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-15 19:00:43 +00:00
softwarefactory-project-zuul[bot]
2d4a3bc943 Merge pull request #8802 from AlexSCorey/4212-LoadingState
Adds Spinner to Loading state

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-15 13:23:14 +00:00
sean-m-sullivan
73c46030bc update completeness 2021-01-14 16:19:39 -06:00
Ryan Petrello
b744c4ebb7 further optimize callback receiver buffering for certain situations
see: https://github.com/ansible/awx/issues/9085
2021-01-14 17:17:12 -05:00
sean-m-sullivan
328435d435 update to survey option on workflow module. 2021-01-14 15:37:59 -06:00
Marliana Lara
62eae017cf Add tacacs category setting edit form 2021-01-14 14:23:12 -05:00
Marliana Lara
dcb1773918 Add radius category setting edit form 2021-01-14 14:23:06 -05:00
Christian M. Adams
a1514a3b26 Remove launch scrip config mapping for k8s and ocp
* Related to https://github.com/ansible/awx/pull/8968
2021-01-14 13:48:33 -05:00
Christian M. Adams
88a0d98447 Run migrations via a task, not in the container
* Issue: https://github.com/ansible/awx/issues/9077
  * Fixes problem with migrations not completing
2021-01-14 09:50:26 -05:00
softwarefactory-project-zuul[bot]
d88ed19edf Merge pull request #8781 from marshmalien/setting-ldap-edit-forms
Add all LDAP (Default, 1-5) setting forms

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-14 12:49:25 +00:00
Alex Corey
47c1dc8171 Adds spinner to loadiing and updating states 2021-01-13 18:15:05 -05:00
Marliana Lara
28733beee8 Show placeholder for codemirror inputs and expand width of "DN" ldap fields 2021-01-13 18:02:40 -05:00
Marliana Lara
c90a459837 Fix bug where revert all reverted all ldap categories 2021-01-13 17:58:00 -05:00
Marliana Lara
ba8cf1aaf2 Add all LDAP (Default-5) setting forms 2021-01-13 17:57:55 -05:00
Christian M. Adams
57c3b9ab17 Run PG upgrade tasks in container because of permissions
* update pg references
2021-01-13 17:27:03 -05:00
Ryan Petrello
b24a1746ae Remove old logo 2021-01-13 13:55:45 -05:00
softwarefactory-project-zuul[bot]
2f16b361f7 Merge pull request #8656 from nixocio/ui_issue_8194
Fix Inventory/Project rbac broken on JT form

Reviewed-by: Kersom
             https://github.com/nixocio
2021-01-13 18:23:35 +00:00
softwarefactory-project-zuul[bot]
5bb59246af Merge pull request #8761 from marshmalien/setting-github-edit-forms
Add all github category setting edit forms

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2021-01-13 15:23:34 +00:00
Alex Corey
766b2f774d convert PaginatedDataList to function 2021-01-13 10:13:15 -05:00
nixocio
b8369defd6 Fix Inventory/Project rbac broken on JT form
Fix Inventory/Project rbac broken on JT form.

Also, update ProjectLookup to filter using `role_level: 'use_role'` as
per old UI implementation.

Also, update InventoryLookup to filter using `role_level: 'use_role'` as
per old UI implementation.

See: https://github.com/ansible/awx/issues/8194
2021-01-13 09:23:12 -05:00
softwarefactory-project-zuul[bot]
7daa1fe786 Merge pull request #8860 from CUB-OIT-PE/jinja-chain-undefined
Enabled jinja2.ChainableUndefined for custom webhook notifications

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-01-12 20:35:46 +00:00
softwarefactory-project-zuul[bot]
74daa49e6f Merge pull request #9063 from ryanpetrello/activity-stream-analytics-gather
don't record AUTOMATION_ANALYTICS_LAST_GATHER updates

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-12 19:17:45 +00:00
softwarefactory-project-zuul[bot]
c7b51176a4 Merge pull request #9046 from jbradberry/export-inventory-source-inventories
Do not drop inventories marked as has_inventory_sources

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-12 18:58:11 +00:00
softwarefactory-project-zuul[bot]
b50e72ab20 Merge pull request #8776 from nixocio/ui_issue_7708
Show access tab when credential does not belong to an organization

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-12 18:46:27 +00:00
Ryan Petrello
b3d4b57ae9 don't record AUTOMATION_ANALYTICS_LAST_GATHER updates
this is noisy in the activity stream
2021-01-12 11:21:11 -05:00
Marliana Lara
1c2605be8e Add ouiaId props to button and alert components 2021-01-11 16:38:32 -05:00
Marliana Lara
7662a67a65 Add all github category setting edit forms 2021-01-11 16:37:28 -05:00
willhaines
e2cb6a8caf Merge pull request #1 from jladdjr/jladd_jinja-chain-undefined
minor dep changes for jinja2.ChainableUndefined fix
2021-01-11 13:03:12 -07:00
Jim Ladd
60dee83481 revert jinja2 dep changes for ansible venv 2021-01-11 11:48:39 -08:00
Will Haines
d59e172f53 Pinned Jinja2 to ensure ChainableUndefined is present
Signed-off-by: Will Haines <william.haines@colorado.edu>
2021-01-11 11:56:04 -07:00
softwarefactory-project-zuul[bot]
b22aa3e99e Merge pull request #9054 from Spredzy/downgrade_cryptography
Pin cryptography to pre 3 release

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-11 16:13:25 +00:00
Yanis Guenane
7275db8d66 Pin cryptography to pre 3 release 2021-01-11 14:36:56 +01:00
Jeff Groom
22aaf765a5 Update custom_virtualenvs.md 2021-01-09 10:54:33 -07:00
softwarefactory-project-zuul[bot]
938725c86c Merge pull request #8943 from rooftopcellist/pg12
Upgrade PostgreSQL from 10 to 12

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2021-01-08 21:44:40 +00:00
Alex Corey
186a1b04b4 fixes erronous render of add button 2021-01-08 15:34:56 -05:00
Jeff Bradberry
a3723db357 Do not drop inventories marked as has_inventory_sources 2021-01-08 14:32:33 -05:00
nixocio
682b06be5a Show access tab when credential does not belong to an organization
Credential access tab should be shown when cred doesn't belong to an organization.

Also, update unit-tests to reflect change.

See: https://github.com/ansible/awx/issues/7708
2021-01-08 14:30:08 -05:00
softwarefactory-project-zuul[bot]
aa87a99441 Merge pull request #9044 from kdelee/awx_silent_delete_conflict
silent_delete also needs to handle Confict

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-08 16:25:54 +00:00
Elijah DeLee
a157a3598f silent_delete also needs to handle Confict 2021-01-08 10:55:55 -05:00
Christian M. Adams
36466b9694 Upgrade PostgreSQL from 10 to 12 2021-01-08 10:54:00 -05:00
softwarefactory-project-zuul[bot]
1dec79b62d Merge pull request #8880 from vguillard/issue_5080_openstack_region_field_missing
Related #5080 openstack region field missing

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-08 14:39:03 +00:00
Will Haines
9ec958f839 Added test for Chainable Undefined Behavior
Signed-off-by: Will Haines <william.haines@colorado.edu>
2021-01-07 23:25:19 -07:00
softwarefactory-project-zuul[bot]
98b25f619e Merge pull request #9040 from kdelee/new_teardown_error
When deleting a job sometimes we get this error

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-07 22:38:29 +00:00
Elijah DeLee
908291dd3c When deleting a job sometimes we get this error
For the silent delete method, we should let this one slide
because it is an expected error that may occur if there are still
events processing.
2021-01-07 15:37:57 -05:00
softwarefactory-project-zuul[bot]
764511f33f Merge pull request #8738 from AlexSCorey/8532-VaultIdsOnCredChips
Adds vault IDs to Vault credential chips

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-07 19:49:13 +00:00
softwarefactory-project-zuul[bot]
b0c3c2b16a Merge pull request #8654 from mabashian/8530-data-list-toolbar-ids
Swap underscores for hyphens in qs namespace strings

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-07 19:12:44 +00:00
mabashian
dcd79cdb98 Swap underscores for hyphens in qs namespace strings 2021-01-07 13:19:05 -05:00
Alex Corey
1cd7f42a27 fixes broken link and adds test 2021-01-07 13:13:45 -05:00
softwarefactory-project-zuul[bot]
e1fb6542c3 Merge pull request #9002 from nixocio/ui_update_dep
Update dependencies

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-07 16:43:51 +00:00
Alex Corey
9cc3579189 Adds vault IDs to Vault credential chips 2021-01-07 11:39:57 -05:00
softwarefactory-project-zuul[bot]
c8594edc0b Merge pull request #9009 from chrismeyersfsu/purge_devel_settings
consolidate settings and delete dead settings

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-07 15:56:11 +00:00
dejongm
8cae728ea0 Update defaults.py 2021-01-07 10:27:03 -05:00
mabashian
c0690cddc8 Display source workflow job when available on job details view 2021-01-07 09:32:59 -05:00
nixocio
a1b0fa252a Update dependencies
Update dependencies
2021-01-07 09:06:43 -05:00
softwarefactory-project-zuul[bot]
e640bde42c Merge pull request #9003 from AlexSCorey/8847-fix
Adds sync button to project details page

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-06 22:39:26 +00:00
Alex Corey
d1fcb96ee2 Adds sync button to project details page 2021-01-06 15:47:11 -05:00
softwarefactory-project-zuul[bot]
b6f032bf88 Merge pull request #8762 from marshmalien/setting-google-oauth2-edit-form
Add Google OAuth 2.0 setting edit form

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-06 19:48:11 +00:00
softwarefactory-project-zuul[bot]
8e104417a6 Merge pull request #9008 from jbradberry/autobahn-cve
Update autobahn to address CVE-2020-35678

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-06 18:14:22 +00:00
softwarefactory-project-zuul[bot]
148e4ef10c Merge pull request #9017 from rh-dluong/fix-timeout-description
Changed task to job in job timeout description, fixes #9016

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-06 15:31:19 +00:00
dluong
3e8eb7f23e Changed task to job in job timeout description, fixes #9016 2021-01-06 09:52:48 -05:00
Jeff Bradberry
0eff06318f Update autobahn to address CVE-2020-35678 2021-01-05 13:44:05 -05:00
Chris Meyers
ad621a7da2 consolidate settings and delete dead settings 2021-01-05 13:02:25 -05:00
softwarefactory-project-zuul[bot]
96a7fe0035 Merge pull request #9005 from AlanCoding/assert_workflow_failure
Make workflow_job.assert_successful() give specifics

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-05 17:28:28 +00:00
softwarefactory-project-zuul[bot]
545119fb56 Merge pull request #9006 from ryanpetrello/pin-pip-tools-updater
pin pip-tools for now

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-05 16:15:11 +00:00
Ryan Petrello
f40ee7ca15 pin pip-tools for now
a new version of pip-tools changed the format of dependency annotations
in generated requirements.txt files

we should probably change to the new format at some point, but maybe
*after* we merge a few of our long-running branches that touch these
files (otherwise, managing conflicts could be pretty hellish)
2021-01-05 10:45:40 -05:00
softwarefactory-project-zuul[bot]
c6e61395f5 Merge pull request #9001 from chrismeyersfsu/fix-iso_manager_log
specify isolated_manager.log path

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-05 15:41:06 +00:00
Alan Rominger
d3c51ce75d Minor organization clarity for workflow failure summary 2021-01-05 10:33:35 -05:00
Alan Rominger
9a16e9f787 Condense logic for handling null job 2021-01-05 10:26:38 -05:00
Alan Rominger
d79b96b6cc Make workflow_job.assert_successful() give specifics 2021-01-05 10:15:32 -05:00
softwarefactory-project-zuul[bot]
b667162496 Merge pull request #8892 from AlexSCorey/8603-fix
Adds searchable keys and related keys to Credentials list

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-05 15:14:43 +00:00
softwarefactory-project-zuul[bot]
72cab99cd7 Merge pull request #9000 from nixocio/ui_fix_contrib_docs
Small docs update

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-05 14:56:09 +00:00
Chris Meyers
474252dbff specify isolated_manager.log path
* By default, log files are created in the dir relative to the awx
source. For production, explicitly specify the log file path
2021-01-05 09:22:56 -05:00
nixocio
45e9bdcf86 Small docs update
Small docs update. Fix broken link, and update node version used.

See: https://github.com/ansible/awx/pull/8766/files
2021-01-05 09:16:44 -05:00
softwarefactory-project-zuul[bot]
f52b23f298 Merge pull request #8658 from mabashian/5683-created-modified-details
Move jt/wfjt created/modified details to the end right before the full width details

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-04 22:49:40 +00:00
mabashian
0b3d9b026d Adds created/modified details to several areas 2021-01-04 16:17:46 -05:00
Alex Corey
1dbadca78e Adds searchable keys and related keys 2021-01-04 15:35:54 -05:00
softwarefactory-project-zuul[bot]
13861dee85 Merge pull request #8836 from chrismeyersfsu/sustaining-improve_iso_logging_devel
Sustaining improve iso logging devel

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-04 20:18:24 +00:00
mabashian
4ea757c91a Move jt/wfjt created/modified details to the end right before the full width details 2021-01-04 15:04:34 -05:00
softwarefactory-project-zuul[bot]
7e74f823f4 Merge pull request #8996 from robled/license_module_docs_fix
Fixed link to Content Hub in Tower module documentation

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2021-01-04 16:54:15 +00:00
David Roble
e611a67be7 Fixed link to Content Hub in Tower module documentation
Signed-off-by: David Roble <droble@redhat.com>
2021-01-04 11:21:30 -05:00
softwarefactory-project-zuul[bot]
a98dfc978e Merge pull request #8980 from shanemcd/simplify-image-build
Simplify image build

Reviewed-by: Alan Rominger <arominge@redhat.com>
             https://github.com/AlanCoding
2021-01-04 15:47:58 +00:00
Shane McDonald
642e6f792c Remove unnecessary conditional from image build task 2020-12-29 19:14:16 -05:00
Shane McDonald
b857fb5074 Remove use_container_for_build from inventory 2020-12-29 19:14:05 -05:00
Shane McDonald
6f9862c72e Sweeping replace of old dev venv paths 2020-12-26 21:29:22 -05:00
Shane McDonald
1033c4d251 Explicitly run image_build and image_push on localhost 2020-12-26 13:16:42 -05:00
Shane McDonald
ab6430e50d Dramatically simplify image_build role
This does a few things:

- Removes need for awx_sdist_builder image
- Reorders Dockerfile steps to optimize image cache between prod and dev builds
- Unifies VENV_BASE and COLLECTION_BASE in prod and dev builds
2020-12-26 13:16:42 -05:00
Shane McDonald
8ceb505977 Add standalone target for rendering official Dockerfile
With the next commit it will be possible to run:

```
$ make Dockerfile
$ docker build .
```
2020-12-26 13:16:40 -05:00
Sean Sullivan
d9ca825935 Merge pull request #23 from ansible/devel
Rebase
2020-12-24 21:08:13 -05:00
softwarefactory-project-zuul[bot]
cb5c16918c Merge pull request #8928 from mabashian/8207-cancel-button-disable
Disable cancel button on jobs list when one or more selected jobs is not running

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-23 01:27:47 +00:00
softwarefactory-project-zuul[bot]
2a353a809b Merge pull request #8959 from jakemcdermott/fix-8884
Default to lang in catalog when browser preference unavailable

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-22 23:09:27 +00:00
softwarefactory-project-zuul[bot]
0b364b2918 Merge pull request #8972 from shanemcd/sorry-jake
Restore old behavior of ui-devel

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-22 22:58:17 +00:00
Shane McDonald
4219089166 Restore old behavior of ui-devel 2020-12-22 17:20:20 -05:00
Jake McDermott
8db88e979e Default to lang in catalog when browser preference unavailable
When strings aren't available for the browser's preferred locale,
default to one with strings to avoid displaying raw javascript
variables.
2020-12-22 15:36:33 -05:00
softwarefactory-project-zuul[bot]
3077cb9802 Merge pull request #8963 from marshmalien/8962-fix-output-navigation
Fix navigation bug in job output 

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-22 20:16:01 +00:00
softwarefactory-project-zuul[bot]
70f7bd957d Merge pull request #8968 from shanemcd/refactor-image-build
Refactor official image build process

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-22 20:04:27 +00:00
Shane McDonald
f951aa24bf More sane way of building the official AWX image 2020-12-22 14:27:47 -05:00
Shane McDonald
225c3d6a39 Speed up subsequent invocations of ui-devel / ui-release 2020-12-22 14:27:45 -05:00
mabashian
8f8c4e6b7b Wrap permissions v. running tooltip contents so that they appear on different lines 2020-12-22 13:08:56 -05:00
mabashian
e4c708f458 Disable cancel button when one or more selected jobs is not running. Separate messaging for jobs that you don't have permission to cancel v. jobs that cannot be canceled because they aren't running. 2020-12-22 13:08:56 -05:00
softwarefactory-project-zuul[bot]
983d377a93 Merge pull request #8657 from mabashian/7816-user-role-empty-name
Display 'System' for user role resource name when summary_fields.resource_name not present

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-22 17:17:32 +00:00
softwarefactory-project-zuul[bot]
efcc1bf262 Merge pull request #8967 from shanemcd/less-config
Remove launch scripts from configmaps

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-22 14:50:51 +00:00
Shane McDonald
106d90aeb3 Remove launch scripts from configmaps
The duplication of these scripts has been bothering me for a while. They dont
get enough usage to justify their existence.
2020-12-22 09:12:03 -05:00
Marliana Lara
b695f583dd Fix job output loading state 2020-12-21 15:19:26 -05:00
softwarefactory-project-zuul[bot]
6d577feeba Merge pull request #8951 from robled/license_module_docs_fix
Added module prefix to awx license module example documentation

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-18 21:13:08 +00:00
softwarefactory-project-zuul[bot]
f8edb6b4f6 Merge pull request #8912 from Saurabh-Thakre/patch-1
Update consumers.py

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-18 19:35:15 +00:00
softwarefactory-project-zuul[bot]
66b9a65a14 Merge pull request #8667 from mabashian/7522-survey-q-breadcrumb
Fix issue with broken survey question edit breadcrumb by altering the url scheme

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-18 18:55:39 +00:00
softwarefactory-project-zuul[bot]
5632f72bb1 Merge pull request #8729 from keithjgrant/6189-list-tables
Create PaginatedTable component

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-18 17:44:43 +00:00
mabashian
4d448510b4 Fixes bug where navigating from one survey question form directly to another wasn't reloading the form. 2020-12-18 12:19:14 -05:00
mabashian
f44faf4e61 Fix issue with broken survey question edit breadcrumb by altering the url scheme 2020-12-18 12:19:14 -05:00
David Roble
3bd976bda9 Added module prefix to awx license module example documentation
Signed-off-by: David Roble <droble@redhat.com>
2020-12-18 11:58:27 -05:00
Jake McDermott
c8d471466c Resolve most console errors in tests 2020-12-18 11:34:39 -05:00
Jake McDermott
fa1ef87f20 Use location hook in routed tabs
Fix a unit test that is failing due to history.location
not updating as expected when a routed tab is selected.
2020-12-18 11:01:22 -05:00
Jake McDermott
f09120a973 Replace chip key with non-array index
Address a lint error (rule: react/no-array-index-key) by using
chip.key prop val instead of an array index for the component key.
2020-12-18 11:01:19 -05:00
Jake McDermott
6223a78ff4 Address errors from type system 2020-12-18 11:01:16 -05:00
Jake McDermott
d05ffd24f4 Regenerate lockfile 2020-12-18 11:01:10 -05:00
Keith Grant
ee1ed2aaa7 handle null values on inventories pending deletion
Co-authored-by: Jake McDermott <yo@jakemcdermott.me>
2020-12-17 11:29:45 -08:00
Keith Grant
a9d7fea86f flush out tests for PaginatedTable and related components 2020-12-17 11:29:45 -08:00
Keith Grant
204af9ec91 update tests for PaginatedTable lists 2020-12-17 11:29:45 -08:00
Keith Grant
9da636e294 table header cleanup; fix inventory status labels 2020-12-17 11:29:45 -08:00
Keith Grant
6a47899dbb simplify ActionsTd interface; add ActionItem component 2020-12-17 11:29:45 -08:00
Keith Grant
a8159273eb convert InventoryList to use PaginatedTable 2020-12-17 11:29:45 -08:00
Keith Grant
1816280a15 convert PaginatedTable to function component 2020-12-17 11:29:45 -08:00
Keith Grant
b9d3beaa7f add HeaderRow component with table sorting 2020-12-17 11:29:45 -08:00
Keith Grant
cfc4c3a1a7 add patternfly tables; add PaginatedTable 2020-12-17 11:29:45 -08:00
softwarefactory-project-zuul[bot]
e08e88d940 Merge pull request #8939 from mabashian/8937-org-tabs-requests
Wrap breadcrumb function in useCallback to prevent infinite requests on org tabs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-17 15:49:56 +00:00
softwarefactory-project-zuul[bot]
1937c0cc08 Merge pull request #8938 from jakemcdermott/fix-8936
Don't build job redirect until data available

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-17 15:24:40 +00:00
Jake McDermott
19f855717d Don't build redirect until data available 2020-12-17 09:45:44 -05:00
mabashian
82f6799c34 Wrap breadcrumb function in useCallback to prevent infinite requests on org tabs 2020-12-17 09:19:44 -05:00
Jake McDermott
d35732c4b7 Add missing slash to routing key 2020-12-17 09:15:10 -05:00
softwarefactory-project-zuul[bot]
793764283d Merge pull request #8683 from jakemcdermott/fix-8605
Avoid prop reference error when saving cred

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 22:27:25 +00:00
softwarefactory-project-zuul[bot]
fc8d2300af Merge pull request #8866 from jakemcdermott/fix-ldap-group-param-500
Fix 500 on unhandled group param type

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 22:02:46 +00:00
softwarefactory-project-zuul[bot]
846d2a0cbd Merge pull request #8908 from wenottingham/instance-karma
Flip the instance ID var for AWS to `instance_id`

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 22:00:03 +00:00
softwarefactory-project-zuul[bot]
7706ef415a Merge pull request #8706 from AlexSCorey/PreLinguiUpgrade
Pre-lingui upgrade 

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
             https://github.com/jakemcdermott
2020-12-16 21:46:31 +00:00
Jake McDermott
b2341408b9 Fix 500 on unhandled group param type 2020-12-16 16:06:29 -05:00
softwarefactory-project-zuul[bot]
a5e54c3858 Merge pull request #8780 from mabashian/7879-notif-copy-search
Add support for notification template copy and advanced search

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 20:39:52 +00:00
softwarefactory-project-zuul[bot]
7c96677510 Merge pull request #8922 from fosterseth/fix_move_deletion_to_utils
Move deletion.py to utils

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 20:02:08 +00:00
mabashian
3d03c473d6 Change Type to Notification type since this endpoint has both type and notification_type attributes. 2020-12-16 14:55:19 -05:00
Jake McDermott
5cb580be7a Refactor top-level template routes
* Fix repeated api calls from useEffect hook by wrapping the breadcrumb
setter with useCallback

* Rework the top-level routes to remove some old patterns and bring it more
into alignment with how it's done on the projects screen
2020-12-16 13:46:59 -05:00
softwarefactory-project-zuul[bot]
6900ded80b Merge pull request #8399 from AlexSCorey/5913-WFNODEPOL
Add WF Node Promptability

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 17:36:40 +00:00
Seth Foster
81dd54504e move custom deletion tool for cleanup jobs to utils 2020-12-16 11:14:33 -05:00
softwarefactory-project-zuul[bot]
1c0ac75782 Merge pull request #8920 from jakemcdermott/fix-lockfile
Generate package lock file with recent dependency updates

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 15:50:30 +00:00
Alex Corey
d82f68c88e moves some files to hooks in preparation for lingUI upgrade 2020-12-16 10:34:45 -05:00
mabashian
a345675a97 Cleanup handling of extra_vars in workflow node prompting 2020-12-16 09:46:00 -05:00
mabashian
d95373f2b7 Fixes bug where page would crash on preview step if extra vars was malformed 2020-12-16 09:46:00 -05:00
mabashian
6abc981a5e Wrap the sparkline down to the next line instead of overflowing 2020-12-16 09:46:00 -05:00
mabashian
0ac38ef5fc Fix run step title 2020-12-16 09:46:00 -05:00
mabashian
ca1e597a4d Adds blanket error handling to visualizer save process 2020-12-16 09:46:00 -05:00
mabashian
7a3382dd76 Fix initial multiplechoice survey question value when no default present. 2020-12-16 09:46:00 -05:00
mabashian
b7c729c96f Adds ID's to prompt wizard steps 2020-12-16 09:46:00 -05:00
mabashian
1be1fad610 Fixes display of multi-select survey question fields 2020-12-16 09:46:00 -05:00
Alex Corey
307c9eafb3 addresses missing name property and fixes tests 2020-12-16 09:46:00 -05:00
Alex Corey
7d5b198ce6 resloves outstanding issues 2020-12-16 09:46:00 -05:00
Alex Corey
72c6ff095f adds tests 2020-12-16 09:46:00 -05:00
Alex Corey
60751dfa16 adds edit functionality 2020-12-16 09:46:00 -05:00
Alex Corey
2545f14a93 refactoring for adding modal 2020-12-16 09:46:00 -05:00
Alex Corey
20231041e6 Adds Node Modal Promptability
Adds steps for NodeType, RunType, Inventory, Credentials, updates Reducers, adds API calls, adds Add functionality to Visualizer;

Adds other prompt step

Adds SurveyStep

refactors add node functionality
2020-12-16 09:45:59 -05:00
mabashian
a0afe0bdb7 Fix disabled prop on notification button 2020-12-16 09:20:30 -05:00
mabashian
e9a51c0bcc Fix casing on quick search labels 2020-12-16 09:20:12 -05:00
Jake McDermott
1321895e83 Generate package lock file with recent dependency updates 2020-12-16 09:17:49 -05:00
mabashian
d58b4807d9 Disable copy button while copy request is outstanding 2020-12-16 08:52:38 -05:00
Saurabh Thakre
dae1f8dc7f Update consumers.py
Caught a syntax issue at line number 78, modified the syntax to return correct value of nonce_diff.
2020-12-16 09:45:53 +05:30
softwarefactory-project-zuul[bot]
33c3a6d89b Merge pull request #8888 from jakemcdermott/fix-8856
Make display type unique for different job types and consistent between job list and details

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-16 02:07:20 +00:00
softwarefactory-project-zuul[bot]
a756b4400a Merge pull request #8867 from nixocio/ui_schedules
Wrap functions in useCallback to avoid extra requests

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 22:52:28 +00:00
softwarefactory-project-zuul[bot]
3f35ea66fb Merge pull request #8909 from mabashian/fix-test-warning
Fix console being thrown in Dashboard test

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 22:46:15 +00:00
nixocio
4958a428ec Wrap functions in useCallback to avoid extra requests
Wrap functions in useCallback to avoid extra requests.
2020-12-15 17:14:36 -05:00
mabashian
ad20d6c93f Configure advanced search on notification templates list 2020-12-15 17:09:35 -05:00
mabashian
77da8c6994 Adds copy button to notification templates list rows 2020-12-15 17:09:35 -05:00
mabashian
a2d5d9e320 Display 'System' for user role resource name when summary_fields.resource_name not present 2020-12-15 17:07:49 -05:00
Jake McDermott
4033e0f218 Align display types for job list and details 2020-12-15 17:05:38 -05:00
Jake McDermott
1a4eab6f25 Use type field as key for job display type 2020-12-15 17:05:31 -05:00
Jake McDermott
7f89eb324a Fix key for adhoc command display type 2020-12-15 17:05:22 -05:00
mabashian
70b90dbb24 Fix console being thrown in Dashboard test 2020-12-15 17:01:55 -05:00
Bill Nottingham
a1934823ba Flip the instance ID var for AWS to instance_id
This is always returned by the plugin, ec2_id was what the old script returned.
2020-12-15 16:56:08 -05:00
softwarefactory-project-zuul[bot]
de0967a587 Merge pull request #8250 from jakemcdermott/session-timeout
Add session timeout support

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 20:56:34 +00:00
softwarefactory-project-zuul[bot]
3ae6ea9cdc Merge pull request #8877 from jakemcdermott/ws-proto
Support ws or wss proto

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 19:40:17 +00:00
softwarefactory-project-zuul[bot]
44df90686a Merge pull request #8887 from jakemcdermott/fix-8878
Use credential_type for multicred distinction

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 19:40:13 +00:00
softwarefactory-project-zuul[bot]
50d3b69629 Merge pull request #8899 from marshmalien/patternfly-upgrade
Upgrade PatternFly dependencies

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 19:36:49 +00:00
softwarefactory-project-zuul[bot]
bbcf12b4fc Merge pull request #8891 from AlexSCorey/8817-fix
Fix misnamed webhook field

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 18:50:24 +00:00
softwarefactory-project-zuul[bot]
f66485ff12 Merge pull request #8886 from jakemcdermott/make-readme-updates
More readme and makefile updates

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
             https://github.com/jakemcdermott
2020-12-15 17:05:36 +00:00
softwarefactory-project-zuul[bot]
a98fe1955a Merge pull request #8900 from ansible/jakemcdermott-patch-instructions
Update wording of getting started section

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-15 16:46:16 +00:00
Alex Corey
d31851820a Fixes mis labeled HHTP field 2020-12-15 11:31:28 -05:00
Jake McDermott
3398452197 Update wording of getting started section 2020-12-14 19:22:13 -05:00
Jake McDermott
487bf50544 Don't display a negative time
If the remaining session time dips below 0 imediately before auto-
logout, ceil the display value to 0 to avoid showing negative
seconds left.
2020-12-14 17:05:47 -05:00
Jake McDermott
997200dd19 Unchunkify session warning string 2020-12-14 17:05:39 -05:00
Jake McDermott
aa048049ea Add logout button, remove close button 2020-12-14 17:05:36 -05:00
Jake McDermott
d7949e3db9 Clamp timeout to maximum allowed by js 2020-12-14 17:05:32 -05:00
Jake McDermott
838a3822a5 Debounce storage calls on http intercept 2020-12-14 17:05:28 -05:00
Jake McDermott
5ccee4aea2 Add session timeout support
Intercept all http(s) responses and store expiration time from headers
in local storage. Drive expiration timers in app container across all
tabs with browser storage events and accompanying react hooks
integration. Show a warning with logout countdown and continue button
when session is nearly expired.
2020-12-14 17:05:18 -05:00
Marliana Lara
ae38c11211 Upgrade PatternFly dependencies 2020-12-14 16:44:25 -05:00
softwarefactory-project-zuul[bot]
3b2ff25f3c Merge pull request #8803 from marshmalien/8699-wf-notifications-approval-toggle
Show WFJT notification list approval toggle 

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-14 19:57:34 +00:00
softwarefactory-project-zuul[bot]
4c36183343 Merge pull request #7255 from unlikelyzero/instrumented
Add cypress black box code cov instrumentation to ui_next 

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-14 16:42:06 +00:00
Jake McDermott
d88ba5873b Use credential_type for multicred distinction 2020-12-14 10:11:42 -05:00
Jake McDermott
8b32b61072 More readme and makefile updates
* Set log levels for build commands
* Add locale build dirs to cleanup commands
* Move container dev environment build section closer to top of readme
2020-12-14 08:53:03 -05:00
VGU
14f2803ea7 Add 'Region Name' label for openstack credential 2020-12-13 20:20:47 +01:00
VGU
8153d60a5f Rollback to origin file 2020-12-13 20:15:12 +01:00
VGU
e35f1afd57 Fix lint 2020-12-13 19:05:29 +01:00
VGU
bfb00aecbe Add project_region_name input 2020-12-13 18:57:13 +01:00
VGU
06fa2a9e26 Add test_openstack_client_config_generation_with_project_region_name test 2020-12-13 18:56:20 +01:00
Jake McDermott
2cd9a05329 Support ws or wss proto 2020-12-11 19:22:37 -05:00
softwarefactory-project-zuul[bot]
058cfc55a6 Merge pull request #8875 from ansible/jakemcdermott-add-make-to-readme
Add make target info to readme

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-11 22:33:40 +00:00
Jake McDermott
4be9008821 Add make target info to readme 2020-12-11 16:33:36 -05:00
softwarefactory-project-zuul[bot]
e5436a0147 Merge pull request #8833 from AlanCoding/is_superuser
Sync the is_superuser flag when the members relationship changes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-11 20:42:40 +00:00
John Hill
6e4c3b9a51 New Instrumented script, package, and ignored files 2020-12-11 16:20:19 -03:00
softwarefactory-project-zuul[bot]
13cadbc779 Merge pull request #8868 from jakemcdermott/deps-autofix-12-11
Autofix problematic dependency

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-11 17:40:07 +00:00
Jake McDermott
9687c09108 Autofix problematic dependency 2020-12-11 12:06:47 -05:00
softwarefactory-project-zuul[bot]
4376365931 Merge pull request #8841 from nixocio/ui_a11y
Upgrade jsx-a11y plugin

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-11 16:49:59 +00:00
softwarefactory-project-zuul[bot]
6c59111e6c Merge pull request #8862 from ansible/jakemcdermott-update-readme
Update readme requirements

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-11 16:12:18 +00:00
softwarefactory-project-zuul[bot]
d72f8eaf2c Merge pull request #8684 from mabashian/8666-app-token-modal
Show modals with app/token info after creation

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-11 13:52:26 +00:00
Jake McDermott
a0ce1350ec Update readme requirements 2020-12-10 22:17:34 -05:00
Will Haines
fc2a2e538f Enabled jinja2.ChainableUndefined for custom webhook notifications
Signed-off-by: Will Haines <william.haines@colorado.edu>
2020-12-10 18:06:59 -07:00
nixocio
ff78156945 Upgrade jsx-a11y plugin
Upgrade jsx-a11y plugin. Also enable strict rules.

See: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y

See: https://github.com/ansible/awx/issues/8443
2020-12-10 16:18:08 -05:00
Chris Meyers
32ad6cdea6 enable iso logger
* The namespace for isolated logging was not enabled. Add a handler and
logger so that it's enabled. This is particularly useful when the
logging level is switched to DEBUG
2020-12-10 15:22:14 -05:00
Chris Meyers
566913fcec log time it took to run check_isolated.yml
* Knowing how long check_isolated.yml ran can be helpful in debuging the
isolated execution path. Especially if you suspect the connection speed
or reliability of the control node -> execution node
2020-12-10 15:05:27 -05:00
Chris Meyers
d39d4d9a9e add job id to iso management playbook output
* It's hard/impossible to know what job a check_isolated.yml playbook
runs for by just looking at the logs.
* Forward the job id for which an iso management playbook is running for
and output that job id so it can be found in the logs.
2020-12-10 15:05:20 -05:00
Chris Meyers
daeba1a898 output timing data for isolated playbook runs
* We batch logging isolated management playbook output. This results in
the timestamp of the log being useless when trying to determine when
each task in the playbook ran.
* To fix this, we enable timestamp logging at the playbook level via
ansible `profile_tasks` callback plugin.
2020-12-10 15:04:55 -05:00
Alan Rominger
da3e521566 Fix the reverse association and edge cases 2020-12-10 14:36:53 -05:00
Alan Rominger
d27afe9691 Small tweaks to logic to make is_superuser change take effect 2020-12-10 13:59:46 -05:00
softwarefactory-project-zuul[bot]
9bf721665d Merge pull request #8723 from ryanpetrello/bump-16
Bump version to 16.0.0

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-10 17:39:28 +00:00
Rebeccah
ee111be261 move away from signals towards the origin of the POST to see if I can impact the data sent within the POST so that it can impact the User model, this may not work because the POST is related only to the Roles model 2020-12-10 12:26:31 -05:00
Rebeccah
b3f15a1e61 added function in signals to corroborate the RBAC to the database, prior it was only corroborating from the DB to RBAC and we need both ways 2020-12-10 12:26:31 -05:00
Ryan Petrello
5f6a383ebe Bump version to 16.0.0 2020-12-10 12:12:51 -05:00
softwarefactory-project-zuul[bot]
871b862731 Merge pull request #8799 from jakemcdermott/fix-8355-part0
Place some initial files for migration view

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-10 16:31:28 +00:00
softwarefactory-project-zuul[bot]
851f7b4c7e Merge pull request #8812 from gamuniz/change_galaxy_token_logger_warning
log galaxy token message as warning

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-10 16:22:13 +00:00
softwarefactory-project-zuul[bot]
c78a50b44d Merge pull request #8728 from mabashian/social-auth
Adds support for GitHub, Azure AD, Google and SAML auth to the UI

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-10 16:13:56 +00:00
Jake McDermott
704029459f Place some initial files for migration view
This restores some of the original files and routes from the migration
view of the classic ui with the eventual goal of fully reintegrating this
system with the new ui.

See: b39db745d4
2020-12-10 11:00:43 -05:00
Gabe Muniz
b78cacb4d8 log galaxy token message as warning 2020-12-10 10:36:02 -05:00
softwarefactory-project-zuul[bot]
4c5757b3bd Merge pull request #8754 from ryanpetrello/strict-csp
Introduce a strict Content-Security-Policy

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-10 15:32:53 +00:00
Jake McDermott
ca2f67e0a9 FFox ESR 78 Compatibility 2020-12-10 09:39:25 -05:00
Marliana Lara
ccd39a60db Show workflow template notification list approval toggle 2020-12-09 15:25:26 -05:00
mabashian
889eb2331c Adds support for GitHub, Azure AD, Google and SAML auth to the UI 2020-12-08 17:28:03 -05:00
softwarefactory-project-zuul[bot]
8e46166313 Merge pull request #8790 from rooftopcellist/quantity_not_exported
Aggregate quantity per sub allocation, not exported

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-08 21:52:49 +00:00
Christian M. Adams
b81f082a18 Aggregate quantity per sub allocation, not exported
* The exported field shows total quantity exported to a manifest for a given sub.  We want to sum the quantities of each sub allocation in a manifest instead.
2020-12-08 16:23:43 -05:00
nixocio
51b18aa012 Fix JobEvent tests
Fix JobEvent tests
2020-12-08 14:49:26 -05:00
mabashian
86d289c375 Adds dataCy id's to app/token details 2020-12-08 14:26:36 -05:00
softwarefactory-project-zuul[bot]
5e51dd2ff7 Merge pull request #8787 from shanemcd/remove-fsgroup-hack
Remove fsgroup hack

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-08 19:20:26 +00:00
mabashian
f2c86cc962 Fix tests after delete button cleanup 2020-12-08 14:12:57 -05:00
mabashian
97837a05e6 Add messaging that certain fields are only available in success modal 2020-12-08 13:54:58 -05:00
mabashian
1a270bfc8b Removes token edit button from details. Removes unnecessary request/props that were used to determine whether a user could delete a token. 2020-12-08 13:38:55 -05:00
Jake McDermott
15704e55e1 Move INLINE_RUNTIME_CHUNK flag to scripts definition
We _always_ want INLINE_RUNTIME_CHUNK to be false when building the ui,
even if someone happens to unexpectedly make a production build without
using the top-level make targets for some reason.
2020-12-08 13:26:10 -05:00
Jake McDermott
b3266f6c62 Avoid prop reference error in test 2020-12-08 13:26:07 -05:00
Jake McDermott
c120b731a4 Add global mock for webpack csp var 2020-12-08 13:26:05 -05:00
Jake McDermott
ab61675c2d Add system for strict-csp stdout html generation 2020-12-08 13:26:02 -05:00
Jake McDermott
548ebd5999 Add w3c-compliant reporting for CSP violations 2020-12-08 13:25:59 -05:00
Jake McDermott
12077627e4 Integrate CSP config with frontend framework 2020-12-08 13:25:56 -05:00
Ryan Petrello
3d5f28f790 Introduce a strict Content-Security-Policy 2020-12-08 13:25:46 -05:00
mabashian
f7a51fe658 Change Name strings to Application name in user token search/sort dropdowns 2020-12-08 13:15:48 -05:00
mabashian
920eda9999 Show token/refresh token/expires in modal after successful token add 2020-12-08 13:15:48 -05:00
mabashian
957ab9bf7c Show client id/secret in modal after successful application add 2020-12-08 13:15:48 -05:00
Shane McDonald
8788c904c8 Revert: Force containers in k8s to run under root group
This reverts most of:
423df6618d

Since https://github.com/sclorg/redis-container/pull/62 is now shipped downstream
2020-12-08 13:06:00 -05:00
Shane McDonald
e85a32d463 Fix typo in deployment template 2020-12-08 13:00:14 -05:00
Jake McDermott
05ae6df80b Avoid prop reference error when saving cred 2020-12-08 10:36:06 -05:00
softwarefactory-project-zuul[bot]
be08e0ce69 Merge pull request #8766 from Spredzy/bump_to_nodejs14
NodeJS: Bump to actively maintained LTS 14.15.1

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-08 15:30:26 +00:00
softwarefactory-project-zuul[bot]
3aba1e9db5 Merge pull request #8614 from jctanner/COLLECTION_PLAYBOOK_STATS
analytics: include modified column and full event_data for playbook_on_stats

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-08 13:08:41 +00:00
softwarefactory-project-zuul[bot]
4992fed5a3 Merge pull request #8770 from rooftopcellist/sat_include_port
Read in and use the Sat port if applicable for Subscriptions

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-07 21:41:41 +00:00
Marliana Lara
8d6a6198dc Add Google OAuth 2.0 setting edit form 2020-12-07 15:33:00 -05:00
Christian M. Adams
aa7514a993 Read in and use the Sat port if applicable for Subscriptions 2020-12-07 13:59:58 -05:00
softwarefactory-project-zuul[bot]
ea8ebe8a9f Merge pull request #8619 from mabashian/login-functional
Convert Login.jsx to functional component

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-07 17:57:03 +00:00
mabashian
7ff82db691 Fix login after source variables change 2020-12-07 12:26:39 -05:00
mabashian
8a8bfc5176 Convert Login.jsx to functional component in preparation for social auth integration 2020-12-07 12:26:39 -05:00
Yanis Guenane
14685b9157 NodeJS: Bump to actively maintained LTS 14.15.1 2020-12-07 18:14:35 +01:00
softwarefactory-project-zuul[bot]
87e564026e Merge pull request #8775 from rooftopcellist/powertools
Fix image build - powertools repo ref changed

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-07 16:53:39 +00:00
Christian M. Adams
8795d860d6 Fix image build - powertools repo ref changed 2020-12-07 11:08:00 -05:00
softwarefactory-project-zuul[bot]
d14fa93ce9 Merge pull request #8758 from hjkatz/patch-7
Use literal quotation marks for Kubernetes annotations instead of quo…

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 20:03:33 +00:00
softwarefactory-project-zuul[bot]
e7090a6f8a Merge pull request #8757 from hjkatz/patch-6
Add kubernetes_pod_annotations to management-pod.yml.j2

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 19:38:17 +00:00
Harrison Katz
b6b87aea76 Use literal quotation marks for Kubernetes annotations instead of quote filter 2020-12-04 14:34:08 -05:00
softwarefactory-project-zuul[bot]
e6d1810844 Merge pull request #8756 from hjkatz/patch-5
Fix typo for kubernetes_service_account_annotations variable

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 19:33:49 +00:00
Harrison Katz
720e8055f8 Add kubernetes_pod_annotations to management-pod.yml.j2 2020-12-04 14:08:55 -05:00
Harrison Katz
182ff3464e Fix typo for kubernetes_service_account_annotations variable 2020-12-04 14:02:51 -05:00
softwarefactory-project-zuul[bot]
973c9d313e Merge pull request #8751 from hjkatz/patch-4
Separate Kubernetes Ingress TLS spec from backend spec

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 17:03:26 +00:00
softwarefactory-project-zuul[bot]
a89a683eb4 Merge pull request #8733 from balonik/no-preload-data
make preload data optional again

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 15:59:12 +00:00
softwarefactory-project-zuul[bot]
52646362c3 Merge pull request #8747 from hjkatz/patch-3
Add Kubernetes Service support for annotations

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 15:53:39 +00:00
softwarefactory-project-zuul[bot]
8a433f30e4 Merge pull request #8746 from hjkatz/patch-2
Add quotes to kubernetes annotations

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 15:53:35 +00:00
softwarefactory-project-zuul[bot]
496eea9647 Merge pull request #8743 from hjkatz/patch-1
Remove duplicate spec key from Ingress for kubernetes template

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 15:53:30 +00:00
Harrison Katz
6ab3d5301c Separate Kubernetes Ingress TLS spec from backend spec 2020-12-04 10:50:49 -05:00
softwarefactory-project-zuul[bot]
d93d0f00ee Merge pull request #8721 from rooftopcellist/remove_available_instance
Remove redundant available_instances field

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 15:45:29 +00:00
softwarefactory-project-zuul[bot]
4cc947d65d Merge pull request #8722 from jakemcdermott/fix-8695
Handle prompted inventory without value on schedules

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-04 14:33:58 +00:00
Harrison Katz
8b4b54d2c4 Add Kubernetes Service support for annotations 2020-12-03 18:36:02 -05:00
Harrison Katz
701deb2268 Add quotes to kubernetes annotations 2020-12-03 18:28:50 -05:00
Harrison Katz
85adc4a0ab Remove duplicate spec key from Ingress for kubernetes template 2020-12-03 18:18:18 -05:00
softwarefactory-project-zuul[bot]
9fc5579a50 Merge pull request #8737 from nixocio/ui_fix_select_translation
Add string to translation

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-03 17:05:36 +00:00
softwarefactory-project-zuul[bot]
7faf9c6267 Merge pull request #8624 from nixocio/ui_issue_8620
Hide instance group for Inventory Details if the data is not available

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-03 13:24:05 +00:00
nixocio
8cb9341d8f Add string to translation
Add string to translation.
2020-12-02 16:42:15 -05:00
softwarefactory-project-zuul[bot]
8e024c234c Merge pull request #8732 from AlanCoding/save_the_hg
Change to manual instead of deleting hg projects

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-02 15:56:37 +00:00
JAKUBIS Peter H50R8VA
a5f676c3e1 make preload data optional again
Signed-off-by: JAKUBIS Peter H50R8VA <peter.jakubis@erstegroup.com>
2020-12-02 16:17:25 +01:00
Alan Rominger
99f3825826 Change to manual instead of deleting hg projects 2020-12-02 09:08:18 -05:00
softwarefactory-project-zuul[bot]
29926ba5d9 Merge pull request #8727 from AlanCoding/mercury_drops
Remove mercurial support

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-01 22:11:42 +00:00
Alan Rominger
db9fbf1493 Add log for the case that hg projects were deleted 2020-12-01 15:53:55 -05:00
Alan Rominger
590d64f40e Remove hg updates and projects in migration 2020-12-01 15:38:40 -05:00
Alan Rominger
64fa18cafe Run the UI prettier tool for CI fix 2020-12-01 14:49:49 -05:00
Alan Rominger
634df240ed Attempt to fix UI test with hg,svn replacement 2020-12-01 14:25:11 -05:00
Alan Rominger
44e6e9344b Remove mercurial support 2020-12-01 14:06:34 -05:00
nixocio
4b5b95a0f8 Hide instance group for Inventory Details if the data is not available
Hide instance group for Inventory Details if the data is not available.
This is the the same approach used in other details screens.

See: https://github.com/ansible/awx/issues/8620
2020-12-01 13:10:24 -05:00
softwarefactory-project-zuul[bot]
f5e1f2ed14 Merge pull request #8710 from wenottingham/herein-lies-the-extent-of-my-radius-knowledge
Remove old radius library from requirements

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-01 18:07:35 +00:00
softwarefactory-project-zuul[bot]
c232289323 Merge pull request #8534 from tapled/update-helm-chart-location
Updated Helm Chart Location

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-01 17:07:46 +00:00
Jake McDermott
db8c56caf4 Handle prompted inventory without value on schedules 2020-12-01 11:53:19 -05:00
Christian M. Adams
8e66172ed4 Remove redundant available_instances field 2020-12-01 11:20:21 -05:00
softwarefactory-project-zuul[bot]
62be4defa2 Merge pull request #8719 from ryanpetrello/tzid-support
correct a note about TZID support

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-01 14:58:28 +00:00
softwarefactory-project-zuul[bot]
cb590be095 Merge pull request #8718 from chrismeyersfsu/fix-inv_migration
add missing imports

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-01 14:49:07 +00:00
Ryan Petrello
72c3339719 correct a note about TZID support 2020-12-01 09:10:03 -05:00
softwarefactory-project-zuul[bot]
7ca35634a7 Merge pull request #8633 from marshmalien/refactor-project-functional
Fix notification list toolbar filter keys and convert Project/* to functional components

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-12-01 13:52:22 +00:00
Chris Meyers
4ab4f2f8f9 add missing imports 2020-12-01 08:40:18 -05:00
Marliana Lara
3e64e8225a Add ouiaIds to Select component 2020-11-30 16:13:35 -05:00
softwarefactory-project-zuul[bot]
b65d9ede81 Merge pull request #8323 from AlanCoding/prepare_your_containers
Refactor to hook in programmatic use of inventory import saving-to-DB code

Reviewed-by: Jim Ladd
             https://github.com/jladdjr
2020-11-30 20:41:58 +00:00
Bill Nottingham
12edbdab11 Remove old radius library from requirements
If it's not required by django-radius, we probably don't need it.
2020-11-30 15:12:52 -05:00
softwarefactory-project-zuul[bot]
fcdb38469b Merge pull request #8700 from jerosa/patch-1
Add Git-LFS to build image

Reviewed-by: Bill Nottingham
             https://github.com/wenottingham
2020-11-30 19:40:06 +00:00
Alan Rominger
900127fde7 Fix bug in inventory update canceling 2020-11-30 14:39:02 -05:00
softwarefactory-project-zuul[bot]
ffb2198eab Merge pull request #8594 from nixocio/ui_issue_8276
Mark organization as a required field for Galaxy crendentials

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-30 18:44:56 +00:00
softwarefactory-project-zuul[bot]
503a753241 Merge pull request #8672 from wenottingham/if-you-are-sneakerneting-does-it-become-a-pedifest
Allow combining multiple subscriptions if they are in a manifest.

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-30 18:30:11 +00:00
Alan Rominger
7734def856 Fix inventory log timestamp, organize logging code
The fixes and issue where the timestaps in the stdout for
inventory updates gave the time since the start of the dispatcher
instead of the time since the start of the update.

This commit also moves the handler into the utils module where
other custom AWX handlers live, instead of tasks.py
this is to keep tasks.py relatively clean, as best as possible
2020-11-30 11:36:16 -05:00
Alan Rominger
d6e84b54c9 Some fixes for line numbering, and fixes for license error handling (#8)
* Change handling of error cases to global post_run_hook
* handle license errors correctly again
* Fix some issues with line ordering from the custom logger thing
* Remove debug log statement
* Use PermissionDenied for license errors
* More elegant handling of line initialization

Update tests to new exception type

Catch all save errors, fix timing offset bug

Fix license error handling inside import command
2020-11-30 11:35:33 -05:00
Alan Rominger
ec93af4ba8 Not all license errors are caught, do not assume they are 2020-11-30 11:35:32 -05:00
Jim Ladd
197d50bc44 patch test_inventory_update_injected_content
* proot now enabled at task-level
  since tasks are no longer calling
  awx-manage (which would set up its own proot)
* dropping proot env var since it's not
  relevant to the test
2020-11-30 11:35:32 -05:00
Jim Ladd
5ad60a3ed4 use inventory_id to get advisory_lock 2020-11-30 11:35:32 -05:00
Jim Ladd
38638b4a6b add note to remove private_dir when proot removed 2020-11-30 11:35:32 -05:00
Jim Ladd
232801e0ba cache end_line for RunInventoryUpdate jobs 2020-11-30 11:35:32 -05:00
Jim Ladd
d55f36eb90 add clarifying comment
* noting that the inv update task only uses the
  inventory update management command to
  save the inv to the database
  (it doesn't do the work of fetching hosts / groups)
2020-11-30 11:35:31 -05:00
Jim Ladd
277c47ba4e add TODO reminders to remove proot / venv code
* won't be needed once we move to container-based
  execution
2020-11-30 11:35:31 -05:00
Jim Ladd
12cbc9756b inventory updates should use custom venv 2020-11-30 11:35:31 -05:00
Jim Ladd
72df8723f6 lint 2020-11-30 11:35:31 -05:00
Jim Ladd
a8710bf2f1 restore proot for inventory updates
- in the past, inv. update jobs called `awx-manage inventory_update`
  which took care of setting up process isolation
- at this point, though, inv. update jobs call runner / ansible-inventory
  directly, so we need another way to put process isolation in place
- thankfully, there was already support for providing process isolation
  for other types of jobs (namely JT Jobs, Project Updates and Ad Hoc
  commands)
- so, we do what those other jobs do and override the stub for should_use_proot
  (which by default returns false) so that it keys off of the
  `AWX_PROOT_ENABLED` setting
2020-11-30 11:35:31 -05:00
Jim Ladd
4bdc488fe7 restore proot code
* add TODOs to note where proot-related code
  can be removed in the future
  (after moving to container-based execution)
2020-11-30 11:35:31 -05:00
Jim Ladd
9633714c49 create lock for perform_update
* perform_update can be called from either awx-manage
  or the RunInventoryUpdate task
* need to make sure that the inventory updates
  that happen with perform_update are atomic
2020-11-30 11:35:31 -05:00
Shane McDonald
66bdcee854 Address rebase fallout 2020-11-30 11:35:31 -05:00
Shane McDonald
e61f79c8c3 Fix tests 2020-11-30 11:35:30 -05:00
Alan Rominger
96fc38d182 Swap in-memory logger to write stdout in post_save_hook
This commit makes the needed changes to inventory update
post_save_hook logic so that the historic log lines that
inventory updates write will be written to stdout,
but this hack bypasses the ansible-runner verbose event
logic and dispatches verbose events directly.

Fix the venv application with the ansible-inventory system
(note: much of this is undone in a later commit)

Deal with some minor test updates for
the ansible-inventory interface changes
2020-11-30 11:32:26 -05:00
Alan Rominger
ae9ae14e5a Migrate inventory CLI options to programatic interface
POC, successfully importing with this commit

Attempt to surface saving related errors as a part of that
2020-11-30 11:31:38 -05:00
Alan Rominger
39fa70c58b Start on refactor to hook in inventory programatic use 2020-11-30 11:28:49 -05:00
nixocio
4f132e302f Mark organization as a required field for Galaxy crendentials
Mark organization as a required field for Galaxy credential type.

See: https://github.com/ansible/awx/issues/8276
2020-11-30 11:27:06 -05:00
softwarefactory-project-zuul[bot]
a45f586599 Merge pull request #8655 from mabashian/8606-adhoc-detail-cred
Display machine credential in job details when present

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-30 14:09:28 +00:00
softwarefactory-project-zuul[bot]
170e64070b Merge pull request #8659 from mabashian/7989-group-action-buttons
Hide edit/delete buttons on group details view for users that don't have permissions

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-30 13:37:35 +00:00
jerosa
7e0d2aabbd Add Git-LFS to build image 2020-11-28 14:13:59 +01:00
softwarefactory-project-zuul[bot]
ff3f5fd529 Merge pull request #8628 from nixocio/ui_issue_7681
Hide sync icon for smart inventory rows in Inventory List

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-27 21:21:30 +00:00
Bill Nottingham
52db0bf0c0 Allow combining multiple subscriptions if they are in a manifest.
The rules:
- subs must be of same SKU type (all MCTxxxx, all SERxxxx, etc)
- when combining, we take the earliest end date
2020-11-25 17:03:12 -05:00
softwarefactory-project-zuul[bot]
1e66a977c7 Merge pull request #8375 from mabashian/workflow-approvals
Adds workflow approval list and details

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-25 21:09:04 +00:00
softwarefactory-project-zuul[bot]
1b233aa8cc Merge pull request #8682 from jakemcdermott/fix-8669
Only display inventory file for scm sources

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-25 17:01:55 +00:00
Jake McDermott
294b9c8910 Only display inventory file for scm sources 2020-11-25 11:02:07 -05:00
softwarefactory-project-zuul[bot]
6f43784c47 Merge pull request #8671 from AlanCoding/weird_fail
Avoid copies made from failed updates

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-25 15:58:51 +00:00
softwarefactory-project-zuul[bot]
9921887ce8 Merge pull request #8679 from AlanCoding/text_soup
Apply more rigor to asserting text in stdout

Reviewed-by: awxbot
             https://github.com/awxbot
2020-11-25 15:49:29 +00:00
sean-m-sullivan
bbed8ec704 add update to tower project 2020-11-25 09:36:03 -06:00
Alan Rominger
501cf297df Apply more rigor to asserting text in stdout 2020-11-25 10:04:48 -05:00
Sean Sullivan
318274c70f Merge pull request #22 from ansible/devel
Rebase
2020-11-25 09:36:11 -05:00
softwarefactory-project-zuul[bot]
169f55c908 Merge pull request #8668 from jakemcdermott/zuul-updates-ship-ui-next
Remove *-next make targets

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-24 21:24:19 +00:00
Jake McDermott
c0d8474ac6 Undo staged locale changes after devel build 2020-11-24 15:39:54 -05:00
Alan Rominger
44949b73cf Avoid copies made from failed updates 2020-11-24 15:33:44 -05:00
softwarefactory-project-zuul[bot]
b55c5f7de2 Merge pull request #8612 from fosterseth/fix-8501_delete_workflow_app_temp_500
Allow deletion of workflow approval template

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-24 19:07:10 +00:00
Jake McDermott
ef27ebfed8 Remove *-next make targets 2020-11-24 13:58:19 -05:00
Seth Foster
a66eca82c2 can delete approval node 2020-11-24 12:27:42 -05:00
softwarefactory-project-zuul[bot]
7248e2c6d0 Merge pull request #8607 from ansible/ship-ui-next
Ship the new ui

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-24 16:48:21 +00:00
mabashian
24f3499bd9 Hide edit/delete buttons on group details view for users that don't have permissions 2020-11-23 16:20:24 -05:00
softwarefactory-project-zuul[bot]
a50034be3c Merge pull request #8651 from wenottingham/not-any-more
Clean up some old sourve var settings in unit tests

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-23 20:34:52 +00:00
softwarefactory-project-zuul[bot]
470db2bc91 Merge pull request #8588 from nixocio/ui_async
Update usage of useDeleteItems

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-23 20:27:53 +00:00
Jake McDermott
02021fe2c9 Source variables provided at build time 2020-11-23 15:14:55 -05:00
softwarefactory-project-zuul[bot]
4882ca0481 Merge pull request #8643 from AlexSCorey/8642-InventoryonWFJTForm
Inventory Lookup on WFJT Form should not be required

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-23 18:57:22 +00:00
Jake McDermott
526a4c303f Include awx logos for official installs 2020-11-23 13:52:25 -05:00
softwarefactory-project-zuul[bot]
bb5f494fbd Merge pull request #8626 from nixocio/ui_minor_strings_update
Add minor update to strings

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-23 18:24:21 +00:00
Jake McDermott
c81bc60a33 Source default login logo from static files 2020-11-23 13:22:45 -05:00
Jake McDermott
a28c44e509 Source header logo from static files 2020-11-23 13:22:38 -05:00
Jake McDermott
27219d34eb Remove vestigal django stuff for old ui 2020-11-23 13:22:34 -05:00
Jake McDermott
f49e4a646f Remove legacy make targets 2020-11-23 13:22:30 -05:00
Jake McDermott
b699864f00 remove classic ui 2020-11-23 13:22:25 -05:00
Jake McDermott
abaeec40ae Ship the new ui with awx installation and builds 2020-11-23 13:22:12 -05:00
mabashian
f81f6cf114 Remove fullWidth prop from machine credential detail field as it's not needed 2020-11-23 11:45:59 -05:00
mabashian
81bccc1c7f Display machine credential in job details when present 2020-11-23 11:41:07 -05:00
nixocio
e23b47b997 Add minor update to strings
Add minor update to strings. And adjust the usage of `toTitleCase` to
dynamic strings.
2020-11-23 09:29:20 -05:00
nixocio
faec21ed08 Update usage of useDeleteItems
* Update usage of useDeleteItems.
* Remove async when not necessary
* Update return of promises
2020-11-23 09:15:23 -05:00
softwarefactory-project-zuul[bot]
1deb4ff5e4 Merge pull request #8472 from marshmalien/setting-misc-system-forms
Add setting "system" category forms and tests

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-20 22:49:55 +00:00
Bill Nottingham
13788c4568 Clean up some old sourve var settings in unit tests
Also if you want to use assert, use assert.
2020-11-20 16:32:47 -05:00
softwarefactory-project-zuul[bot]
69b818ff83 Merge pull request #8587 from nixocio/ui_issue_8548
Add updates related to smart inventories

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-20 15:19:48 +00:00
nixocio
a8400e4b7c Add updates related to smart inventories
Add updates related to smart inventories.

* Add popover for `Smart host filter`.
* Add popover for `Instance Groups` on Smart Inventory screen.
* Rename `Host filter` to `Smart host filter` per mockup.
* Add inventory as part of dynamic host filter.

See: https://github.com/ansible/awx/issues/8581
Also: https://github.com/ansible/awx/issues/8548
2020-11-19 17:17:23 -05:00
nixocio
9141e789aa Hide sync icon for smart inventory rows in Inventory List
Hide sync icon for smart inventory rows in Inventory List

See: https://github.com/ansible/awx/issues/7681
2020-11-19 17:12:02 -05:00
Alex Corey
60ccdfa4e6 removes asterisk from wfjt form inventory field 2020-11-19 14:33:55 -05:00
Marliana Lara
0d7f7df043 Update failed project sync error message 2020-11-19 14:32:42 -05:00
softwarefactory-project-zuul[bot]
b6a55e53d5 Merge pull request #8622 from mabashian/nav-expanded
Fix nav console error

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-19 17:39:25 +00:00
Marliana Lara
1a33f7ce1a Fix notification template type search query key 2020-11-18 16:00:02 -05:00
softwarefactory-project-zuul[bot]
f22fa9c5b0 Merge pull request #8617 from AlanCoding/valid_groups
Avoid invalid group characters in default inventory script factory

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-18 20:26:28 +00:00
James Tanner
3e7554974a set a column name so it doesnt end up as "case" 2020-11-18 12:12:29 -05:00
mabashian
d3928a0c0f Get rid of onExpand but keep isExpanded on side nav 2020-11-18 11:34:54 -05:00
James Tanner
153a1ecd39 bump minor 2020-11-18 11:30:48 -05:00
James Tanner
d6f9c5a0b6 get the modified column too 2020-11-18 11:28:22 -05:00
Marliana Lara
2f47bacb4f Convert project/* components into functional components 2020-11-18 10:54:38 -05:00
Alan Rominger
91eff51390 Avoid invalid group characters in default inventory script factory 2020-11-18 10:16:08 -05:00
James Tanner
9cf294f3d7 implement ryanp suggestion 2020-11-18 09:57:22 -05:00
softwarefactory-project-zuul[bot]
691b4512b5 Merge pull request #8615 from jakemcdermott/fix-navbar
Fix the navbar

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-18 00:41:30 +00:00
Jake McDermott
471e22a4e2 Start with nav expanded 2020-11-17 18:54:11 -05:00
James Tanner
a1c2d458de get a csv of playbook_on_stats event data 2020-11-17 17:48:13 -05:00
mabashian
ef1da5d5de Wrap status label in a div so that it doesn't vertically stretch with it's parent. 2020-11-17 17:05:49 -05:00
Marliana Lara
865f348167 Add descriptive helper text when log aggregator toggle is disabled 2020-11-17 11:01:34 -05:00
Marliana Lara
30f5fbb07a Use ouiaId instead of data-cy id in RevertButton 2020-11-17 11:01:34 -05:00
Marliana Lara
d57fee7b63 Do not render setting field if config is empty 2020-11-17 11:01:34 -05:00
Marliana Lara
79930347f9 Fix number input validation bug 2020-11-17 11:01:33 -05:00
Marliana Lara
e0feda780b Add setting system category forms and tests
* Add activity stream, logging, and misc system forms
 * Hookup logging test alert
 * Hookup revert buttons
 * Add useModal helper hook
 * Swap VariablesDetail for CodeDetail within setting detail views
 * Update SettingDetail import path in setting detail views
2020-11-17 11:01:30 -05:00
mabashian
76c39e38c0 Update snapshot after adding cannotDelete prop to ToolbarDeleteButton 2020-11-17 09:18:59 -05:00
mabashian
8cd4d06903 Hide the delete button on workflow approval details when job is pending 2020-11-17 08:42:35 -05:00
mabashian
8c263f17ab Adds data-cy attributes to the fields in the workflow approval details 2020-11-17 08:42:35 -05:00
mabashian
a4e4f0aa98 Show 'Deleted' when the source workflow job is deleted in workflow approvals list/details 2020-11-17 08:42:35 -05:00
mabashian
ebf9bf429c Add description to the list of default search keys on workflow approvals list 2020-11-17 08:42:35 -05:00
mabashian
30e461c18e Fix basic name filtering on workflow approvals list 2020-11-17 08:42:35 -05:00
mabashian
b8b3424c1f Prevent users from attempting to delete pending approvals 2020-11-17 08:42:35 -05:00
mabashian
929be1652a Move all mock workflow approvals out to data.workflowApprovals.json 2020-11-17 08:42:35 -05:00
mabashian
2be5ae3b2d Remove old TODO 2020-11-17 08:42:35 -05:00
mabashian
aba14bfb8c Combine approve/deny modals into one modal 2020-11-17 08:42:35 -05:00
mabashian
a9c3484387 Move approval action buttons from rows to to level list actions. UX updates to the display of the status. 2020-11-17 08:42:35 -05:00
mabashian
ee7f73623f Adds /#/workflow_approvals list and details and allows users to approve or deny workflow approvals from these interfaces 2020-11-17 08:42:35 -05:00
softwarefactory-project-zuul[bot]
b338da40c5 Merge pull request #8482 from jakemcdermott/fix-8465
Fix inconsistent screen title bars

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-16 21:14:25 +00:00
softwarefactory-project-zuul[bot]
00fb955544 Merge pull request #8563 from AlexSCorey/8535-UpgradePF
Updates PF dependency

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-16 18:16:17 +00:00
softwarefactory-project-zuul[bot]
74711a55bb Merge pull request #8552 from DeloitteHux/ng-helm-install
Add helm installation (#8551)

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-16 17:47:31 +00:00
Jake McDermott
d30dd97c96 Fix inconsistent screen title bars 2020-11-16 11:39:04 -05:00
softwarefactory-project-zuul[bot]
10664d1931 Merge pull request #8582 from wenottingham/collect-again
Revert portions of 40a10dcc5f

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-13 22:54:23 +00:00
Bill Nottingham
7b04fa114e Revert portions of 40a10dcc5f
Keep some of the collectors, while removing ones we calculate
in other ways.
2020-11-13 14:50:04 -05:00
softwarefactory-project-zuul[bot]
0d843899e1 Merge pull request #8519 from nixocio/ui_issue_8098
Remove groups/hosts when deleting inventory sources

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-13 18:37:07 +00:00
Alex Corey
54e1991ff4 Update PF Dependency and associated components and tests 2020-11-13 10:11:05 -05:00
Ryan Petrello
adfd8ed26b forcibly close DB and cache socket connection post-fork
we've seen evidence of a race condition on fork for awx.conf.Setting
access; in the past, we've attempted to solve this by explicitly closing
connections pre-fork, but we've seen evidence that this isn't always
good enough

this patch is an attempt to close connections post-fork so that sockets
aren't inherited post fork, leading to bizarre race conditions in
setting access
2020-11-12 15:13:16 -05:00
softwarefactory-project-zuul[bot]
76fd63ba5f Merge pull request #8463 from nixocio/ui_issue_7130
Add feature to associate teams to users

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-12 18:21:25 +00:00
nixocio
07edf505e7 Add feature to associate teams to users
Add feature to associate teams to users. For the time being when
associating Users to a team, the User will be associated with `member_role` only. And when `diassociating` the User from a team all related roles - member, read, and admin will be removed.

Also, fix a bug related to search not being cleared after closing/cancel
the `AssociateModal`.
2020-11-12 10:06:33 -05:00
softwarefactory-project-zuul[bot]
1078bf76ad Merge pull request #8575 from ryanpetrello/yet-more-downstream-bits
more downstream changes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-11 19:27:28 +00:00
softwarefactory-project-zuul[bot]
cb4fcb9d80 Merge pull request #8566 from AlexSCorey/8539-SurveyRequiredFields
Adds asterisk to required survey questions in preview modal

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-11 18:58:30 +00:00
Ryan Petrello
32e149c76e Merge branch 'downstream' into devel 2020-11-11 13:30:28 -05:00
Ryan Petrello
4d8176e6af Merge remote-tracking branch 'downstream' into downstream 2020-11-11 13:30:21 -05:00
Ryan Petrello
ddd109059f Merge pull request #4682 from wenottingham/subs-corner-cases
Use the exported count in the manifest for the node count, if present.
2020-11-11 13:13:01 -05:00
softwarefactory-project-zuul[bot]
4d480cb95f Merge pull request #8413 from sean-m-sullivan/role_list
Tower_role Improvements, Approvals and use of Lists

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-11 17:37:21 +00:00
softwarefactory-project-zuul[bot]
69c3acfb39 Merge pull request #8570 from ryanpetrello/analytics-cleanup
removed unused analytics metrics

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2020-11-11 17:26:27 +00:00
Bill Nottingham
a092406543 Use the exported count in the manifest for the node count, if present. 2020-11-11 12:20:32 -05:00
Christian Adams
a65008f762 Merge pull request #4680 from ansible/i18n_release_3.8.0_translations
(More) UI translation strings for release_3.8.0 branch
2020-11-11 12:07:35 -05:00
ansible-translation-bot
2a44a72024 UI translation strings for release_3.8.0 branch 2020-11-11 15:42:54 +00:00
Ryan Petrello
40a10dcc5f removed unused analytics metrics 2020-11-11 09:56:20 -05:00
ansible-translation-bot
d25d5762e0 UI translation strings for release_3.8.0 branch 2020-11-11 14:12:48 +00:00
softwarefactory-project-zuul[bot]
073e518c16 Merge pull request #8503 from AlexSCorey/8237-FixKebabifiedToolbarBtns
Fixes toolbar buttons in Advanced Search mode

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-11 13:25:15 +00:00
Ryan Petrello
454c8e66e0 Merge pull request #4678 from beeankha/delete_cloudforms_from_collections
Remove Cloudforms as a credential type from collections
2020-11-10 17:12:16 -05:00
softwarefactory-project-zuul[bot]
cd5553a1dc Merge pull request #8567 from ryanpetrello/busted-cf-migration
avoid breaking upgrades from certain AWX versions

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-10 21:18:13 +00:00
Christian Adams
e4d9cd4000 Merge pull request #4676 from ansible/i18n_release_3.8.0_translations
UI translation strings for release_3.8.0 branch
2020-11-10 16:07:22 -05:00
beeankha
400c55faaa Remove Cloudforms as a credential type from collections 2020-11-10 15:49:55 -05:00
Ryan Petrello
fabd2eec63 avoid breaking upgrades from certain AWX versions
the prior version of this migration was rewritten, so we should
run the function again to really make sure that cleanup happens
2020-11-10 15:18:49 -05:00
Alex Corey
619fabc3a1 adds asterisk to required survey questions in preview modal 2020-11-10 11:47:30 -05:00
sean-m-sullivan
4e4f1d3cce update comment 2020-11-10 10:04:05 -06:00
sean-m-sullivan
e2e3d30b49 update comment 2020-11-10 09:16:08 -06:00
Christian Adams
ff78cade3a Merge pull request #4677 from rooftopcellist/fix_hover_help
Fix hover-over help text for subscriptions
2020-11-10 09:56:08 -05:00
Christian M. Adams
97381f6810 Fix hover-over help text for subscriptions 2020-11-10 09:32:16 -05:00
sean-m-sullivan
999086968c Merge branch 'role_list' of github.com:sean-m-sullivan/awx into role_list 2020-11-10 08:17:09 -06:00
sean-m-sullivan
ab4abf4e3b update comment 2020-11-10 08:17:01 -06:00
Sean Sullivan
0fd0f0c1bd Merge pull request #21 from ansible/devel
Rebase
2020-11-10 08:13:52 -06:00
softwarefactory-project-zuul[bot]
d16055806b Merge pull request #8520 from AlexSCorey/7636-WFJTSurveyNotEnabled
Toggles WFJT survey on and off

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-10 12:25:57 +00:00
ansible-translation-bot
e09ac530d5 UI translation strings for release_3.8.0 branch 2020-11-09 16:27:11 +00:00
ansible-translation-bot
1923926422 UI translation strings for release_3.8.0 branch 2020-11-09 15:09:59 +00:00
softwarefactory-project-zuul[bot]
7d3bf36227 Merge pull request #8559 from ryanpetrello/yet-anooooooother-downstream-merge
Merge in some downstream bug fixes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-06 19:29:18 +00:00
Ryan Petrello
d653c05da8 Merge branch 'downstream' into devel 2020-11-06 13:22:26 -05:00
softwarefactory-project-zuul[bot]
862a6835fe Merge pull request #8545 from nixocio/ui_issue_4968
Mark `Host Config Key` as a required field

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-06 17:23:16 +00:00
Ryan Petrello
33f3ad17cb Merge pull request #4671 from ryanpetrello/cloudforms-minus-minus
entirely remove CloudForms inventory sources instead of converting
2020-11-06 11:30:23 -05:00
Ryan Petrello
52d9fbce73 update cloudforms-specific tests 2020-11-06 10:39:14 -05:00
softwarefactory-project-zuul[bot]
0933a94ae7 Merge pull request #8528 from AlexSCorey/7673-AddOrgToInventoryList
Adds Organization to Inventory List item

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-06 14:09:58 +00:00
Ryan Petrello
0b701b3b24 entirely remove CloudForms inventory sources instead of converting 2020-11-06 01:02:55 -05:00
Nicolas G
b4a45e4cf4 Add helm installation (#8551)
Update to address https://github.com/ansible/awx/issues/8551
Install `helm` binaries along with `kubectl`
2020-11-05 17:49:04 -05:00
softwarefactory-project-zuul[bot]
0567a2a3bf Merge pull request #8540 from marshmalien/8461-notification-detail-link
Fix notification list to notification list item detail link

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-05 22:23:47 +00:00
Alex Corey
e372f4f8f6 Adds list item label 2020-11-05 16:54:48 -05:00
softwarefactory-project-zuul[bot]
dccddfffe6 Merge pull request #8483 from AlexSCorey/8261-AddRelatedGroups
Supports Associating Related Inventory Group

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-05 21:08:21 +00:00
softwarefactory-project-zuul[bot]
948e4c13d2 Merge pull request #8549 from jakemcdermott/remove-cf-form
Delete cloudforms

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-05 19:43:49 +00:00
softwarefactory-project-zuul[bot]
13f2b3f632 Merge pull request #8531 from AlexSCorey/8196-PrivilegeEscalation
Fixes broken select

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-05 19:06:15 +00:00
Alex Corey
944c32da24 resolve cyclical group association 2020-11-05 13:41:43 -05:00
Ryan Petrello
b8f1fa1a13 Merge pull request #4666 from ryanpetrello/dont-test-me
update a janky old test
2020-11-05 13:36:24 -05:00
Jake McDermott
10ab12c99a Delete cloudforms 2020-11-05 12:40:03 -05:00
Ryan Petrello
662ee6fa36 update a janky old test
UJT list views don't work this way anymore after
a929e82060
2020-11-05 12:29:06 -05:00
Alex Corey
314fdd6066 add identifier 2020-11-05 11:44:33 -05:00
softwarefactory-project-zuul[bot]
94352c9a72 Merge pull request #8446 from nixocio/ui_issue_4950
Hide max hosts field on org form

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-05 16:03:07 +00:00
nixocio
4268f1aeeb Mark Host Config Key as a required field
Mark `Host Config Key` as a required field

See:https://github.com/ansible/awx/issues/4968
2020-11-05 09:52:33 -05:00
softwarefactory-project-zuul[bot]
31c85dd89f Merge pull request #8510 from keithjgrant/7952-host-filter-lookup-fix
Host filter lookup fix

Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
             https://github.com/tiagodread
2020-11-05 13:38:11 +00:00
Ryan Petrello
e9f1f8c6fe Merge pull request #4670 from wenottingham/pendoh-no
Put everyone in the 'anonymous' pendo bucket regardless of setting
2020-11-05 08:36:13 -05:00
Keith Grant
8d87d9e6e7 mark Clear filters button for translation 2020-11-04 15:36:40 -08:00
nixocio
d324baf1b0 Hide max hosts field on org form
Hide max hosts field on org form.

Also, simplify the usage of context API to read the value of me
parameter.

Hide max hosts field on org form.

See: https://github.com/ansible/awx/issues/4950
2020-11-04 17:23:22 -05:00
Marliana Lara
52c8033a08 Fix notification list item detail pathname link 2020-11-04 15:31:00 -05:00
Bill Nottingham
28a70ced56 Put everyone in the 'anonymous' pendo bucket regardless of setting
We no longer have the key detailed accounts are indexed on.
2020-11-04 15:18:12 -05:00
softwarefactory-project-zuul[bot]
bf6064db21 Merge pull request #8508 from marshmalien/8493-enable-all-inv-src-vars
Add Source Vars to all inventory source types

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-04 18:48:09 +00:00
Ryan Petrello
e406e4298b Merge pull request #4660 from beeankha/fix_import_export_failures
Change import/export Collections Module to Detect Errors vs Warnings
2020-11-04 09:59:25 -05:00
Johannes Gross
591a3e7a60 Updated Helm Chart Location
Signed-off-by: Johannes Gross <jgross@bright-skies.de>
2020-11-04 13:16:05 +01:00
softwarefactory-project-zuul[bot]
370440f63d Merge pull request #8526 from mabashian/convert-WorkflowJobTemplatejsx-functional
Convert WorkflowJobTemplate.jsx to functional component

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-04 01:14:45 +00:00
Marliana Lara
330625b565 Enable source vars for all inventory types 2020-11-03 17:55:00 -05:00
nixocio
5de34a9c0b Remove groups/hosts when deleting inventory sources
Remove related resources groups/hosts when deleting inventory sources.

The current UI deletes `groups` and `hosts` once the inventory source is
deleted. Add this behavior to the new UI.

See: https://github.com/ansible/awx/issues/8098
2020-11-03 16:51:37 -05:00
Ryan Petrello
35eda3a9a7 Merge pull request #4664 from ryanpetrello/pin-collections-requirements
pin known working collections in 3.8.0
2020-11-03 15:23:29 -05:00
Ryan Petrello
ac4b38bc30 Merge remote-tracking branch 'downstream/release_3.8.0' into devel 2020-11-03 15:11:50 -05:00
mabashian
3052e2077d Import WorkflowJobTemplateEdit from the correct place 2020-11-03 14:29:11 -05:00
Ryan Petrello
439302b38e pin known working collections in 3.8.0 2020-11-03 14:26:31 -05:00
Alex Corey
22029b9d7c fixes broken select 2020-11-03 14:09:13 -05:00
softwarefactory-project-zuul[bot]
114bcd0349 Merge pull request #8487 from epfl-si/feature/I-want-my-own-metadata
[feature] Keep pod_spec_override-provided pod labels

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2020-11-03 17:38:57 +00:00
softwarefactory-project-zuul[bot]
6f8725c680 Merge pull request #8529 from ryanpetrello/old-pending-notifications
allow deleting NotificationTemplates w/ old pending notifications

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-03 16:37:38 +00:00
Ryan Petrello
4a75ae9869 allow deleting NotificationTemplates w/ old pending notifications
see: https://github.com/ansible/awx/issues/8525
2020-11-03 11:09:30 -05:00
Alex Corey
68b399fdef Adds Organization to Inventory List item 2020-11-03 10:49:53 -05:00
mabashian
514cba6467 Convert WorkflowJobTemplate to functional component 2020-11-03 10:14:30 -05:00
beeankha
7dfa957619 Change import/export logging detection to detect errors vs warnings 2020-11-02 16:24:51 -05:00
Chris Meyers
cd9838d579 Merge pull request #4661 from ansible/fix-flake8_3.8.0
fix flake8
2020-11-02 15:48:07 -05:00
Chris Meyers
d8ca3ba894 fix flake8 2020-11-02 15:45:16 -05:00
Alex Corey
8ff2c5b576 Supports Associating Related Inventory Group
This also adds support for creating a new inventory group and
associating it at the same time.
2020-11-02 14:59:54 -05:00
Keith Grant
8df6dc0ca0 fix SmartInventoryForm chips 2020-11-02 11:24:01 -08:00
Alex Corey
a1fa21d5a9 toggles WFJT survey on and off 2020-11-02 14:23:04 -05:00
softwarefactory-project-zuul[bot]
df54a1edb5 Merge pull request #8516 from wenottingham/no-version-file
Don't write a tower_version file in awx

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-02 18:52:22 +00:00
Jake McDermott
cc89608d2c Merge pull request #4659 from jakemcdermott/fix-4658
Disable edit mode cred form unless edit capability is true
2020-11-02 13:26:05 -05:00
Jake McDermott
da7896dbc4 Disable edit mode cred form unless edit capability is true 2020-11-02 13:20:44 -05:00
Bill Nottingham
7a9eff7e65 Don't write a tower_version file in awx 2020-11-02 12:54:51 -05:00
softwarefactory-project-zuul[bot]
48ecd2400c Merge pull request #8491 from nixocio/ui_issue_8467
Remove activity from inventory details page

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-02 15:39:54 +00:00
nixocio
78ce54bc4a Remove activity from inventory details page
Remove activity from inventory details page

This information is already present on the `Complete jobs` tab.

See: https://github.com/ansible/awx/issues/8467
2020-11-02 10:09:09 -05:00
softwarefactory-project-zuul[bot]
1a4f2f43b7 Merge pull request #8492 from nixocio/ui_issue_7706
Remove Type from ScheduleList Sort

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-11-02 14:54:20 +00:00
Alex Corey
15ad6a0180 Fixes toolbar buttons in Advanced Search mode 2020-11-02 09:54:15 -05:00
nixocio
7cb3cf4e37 Remove Type from ScheduleList Sort
Remove Type from ScheduleList Sort, and make `name` as default sort.

See: https://github.com/ansible/awx/issues/7706
2020-11-02 09:18:41 -05:00
Keith Grant
c58c7e285c use Promise.all to make requests in parallel 2020-10-30 14:48:02 -07:00
Keith Grant
adc68b672d add advanced search keys to host filter lookup 2020-10-30 14:45:05 -07:00
softwarefactory-project-zuul[bot]
17b5b531bf Merge pull request #8506 from ryanpetrello/yet-another-downstream-merge
merge in some downstream changes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-30 21:15:20 +00:00
softwarefactory-project-zuul[bot]
52ffcc9f7c Merge pull request #8496 from jainnikhil30/fix_tower_inventory_empty__child_group
Add empty child group to inventory groups before adding it to the parent group

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-30 21:02:11 +00:00
Ryan Petrello
3ce9a778f8 fix busted webhook notifications
whoops, I broke it
2020-10-30 16:40:02 -04:00
Christian M. Adams
3e9a98170e Update tool tip for RH username & password settings 2020-10-30 16:40:02 -04:00
Jake McDermott
5ce9e5b03d Use SUBSCRIPTION_* variables in config route 2020-10-30 16:40:02 -04:00
Ryan Petrello
94b6b31185 fix a minor bug in the way we report certain license upload errors 2020-10-30 16:40:02 -04:00
Christian M. Adams
b031e1f05e Properly record the license type when sub is a trial 2020-10-30 16:40:02 -04:00
Elyézer Rezende
aae0b29008 Separate page object for config/attach endpoint 2020-10-30 16:40:02 -04:00
Christian M. Adams
422c7308fd Update compliance wording in UI on license page 2020-10-30 16:40:01 -04:00
Ryan Petrello
23f1cea29b correct manifest argument spec for the tower_license module 2020-10-30 16:40:01 -04:00
Christian M. Adams
633dc60d49 Simplify link to fit UI column 2020-10-30 16:40:01 -04:00
Bill Nottingham
b9960abea6 Add a help popover that points to the docs 2020-10-30 16:40:01 -04:00
Bill Nottingham
2388758f8a Update the license wording and UX 2020-10-30 16:40:01 -04:00
Christian M. Adams
b05c34a969 Valid key always set correctly, compliant field set correctly 2020-10-30 16:40:01 -04:00
Christian M. Adams
bfca3d9910 Update get subscriptions button name in UI 2020-10-30 16:40:01 -04:00
Ryan Petrello
f9511ed7da fix a typo in the tower_license module documentation 2020-10-30 16:40:01 -04:00
mabashian
2e93d9f022 Fix failing license test after rhCreds was changed to subscriptionCreds 2020-10-30 16:40:00 -04:00
Ryan Petrello
478111e7df cut down on queries necessary to generate the X-API-Product-Name header 2020-10-30 16:40:00 -04:00
Christian M. Adams
dd459e23e2 Add migration to prefill rh username and password for subscriptions 2020-10-30 16:40:00 -04:00
Ryan Petrello
e50c2c2867 warn about legacy license usage in the licensing UI 2020-10-30 16:40:00 -04:00
Ryan Petrello
7f9784c443 clarify that the manifest file is a .zip file 2020-10-30 16:40:00 -04:00
Ryan Petrello
1294efdeb9 consolidate a few license code function calls 2020-10-30 16:40:00 -04:00
Christian M. Adams
be4e4ff47c Clean up unnecessary comments 2020-10-30 16:40:00 -04:00
Bill Nottingham
309396f199 flake8 2020-10-30 16:39:59 -04:00
Bill Nottingham
393e1b75e9 Return more user-friendly errors for assorted manifest failures 2020-10-30 16:39:59 -04:00
Ryan Petrello
c139a998b8 simplify how awx "open" licensing works 2020-10-30 16:39:59 -04:00
Ryan Petrello
e591f1f002 update the tower_license module to properly upload manifests 2020-10-30 16:39:59 -04:00
Christian M. Adams
67000f0ce9 Remove license_key check & fix docker-compose make command 2020-10-30 16:39:59 -04:00
Ryan Petrello
0ddf47740c fix incorrect detection of license on inventory updates 2020-10-30 16:39:59 -04:00
Christian M. Adams
05de875ace Fix flake8 2020-10-30 16:39:59 -04:00
Christian M. Adams
d8b7791375 Revert subman install and setfacl 2020-10-30 16:39:59 -04:00
Christian M. Adams
b609e4ee84 remove outdated license references 2020-10-30 16:39:58 -04:00
Christian M. Adams
0a23bb6e36 Install subman and set ACL for rhsm.conf for dev 2020-10-30 16:39:58 -04:00
Ryan Petrello
74c7883b3b cleanup more old licensing cruft 2020-10-30 16:39:58 -04:00
Ryan Petrello
0a36959ef1 clarify some Sat6 verbiage in the license screen 2020-10-30 16:39:58 -04:00
Ryan Petrello
2ae429b4ac remove unnneeded licenses 2020-10-30 16:39:58 -04:00
Ryan Petrello
13f2e90a82 change rhsm candlepin crt location 2020-10-30 16:39:58 -04:00
Ryan Petrello
74ad1f36ac remove some entitlements config we no longer need 2020-10-30 16:39:58 -04:00
Christian M. Adams
cb86193459 Fallback to RH Candlepin Verify setting for OCP 2020-10-30 16:39:57 -04:00
Ryan Petrello
86d0ee590f clarify messaging and behavior when subscription-manager isn't installed 2020-10-30 16:39:57 -04:00
Christian M. Adams
10242cd6c4 Add error handling for missing rhsm.conf 2020-10-30 16:39:57 -04:00
Ryan Petrello
3bb930c769 cleanup up some unused code/comments, and simplify the license migration 2020-10-30 16:39:57 -04:00
Ryan Petrello
ef43d85271 remove Organization label from RHSM/Sat6 license form 2020-10-30 16:39:57 -04:00
Ryan Petrello
927b055e65 change license uploading to parse RHSM manifests
Co-authored-by: Christian Adams <chadams@redhat.com>
2020-10-30 16:39:57 -04:00
Ryan Petrello
4445d096f5 reimplement licensing to work with RHSM and entitlement uploads
Co-authored-by: Christian Adams <chadams@redhat.com>
2020-10-30 16:39:57 -04:00
Bill Nottingham
48934e8544 Enable source vars for all inventory types
Update plugin popover to point to the plugin docs.
2020-10-30 16:39:57 -04:00
Jeff Bradberry
cb570a2ba1 Fix the 'absent' state in tower_instance_group 2020-10-30 16:39:56 -04:00
Jeff Bradberry
607bc07887 Rework the export of full dependent objects
and include hosts and groups in the export.
2020-10-30 16:39:56 -04:00
Ryan Petrello
df874966a6 fix a display bug in webhook notifications with unicode characters
see: https://github.com/ansible/awx/issues/7400
2020-10-30 16:39:56 -04:00
Caleb Boylan
b5c2a6ad65 fix lookup plugin fqcn issue 2020-10-30 16:39:54 -04:00
softwarefactory-project-zuul[bot]
e38d082394 Merge pull request #8509 from ryanpetrello/daylight-wastings-time
Abolish Daylight Savings Time

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-30 20:39:31 +00:00
Ryan Petrello
b9bce03f71 fix a test related to proximity to the DST boundary
technically speaking, this test could still fail on the Saturday before
DST boundaries

...but I don't care
2020-10-30 16:10:07 -04:00
Ryan Petrello
024d148b7f Merge pull request #4648 from rebeccahhh/non_admin_jt_copy
Allow user to copy job templates as permissions intended
2020-10-30 15:46:58 -04:00
Ryan Petrello
8775afc5ea Merge pull request #4656 from ryanpetrello/ryan-broke-webhooks
fix busted webhook notifications
2020-10-30 13:09:46 -04:00
Ryan Petrello
2f738415b8 fix busted webhook notifications
whoops, I broke it
2020-10-30 13:05:37 -04:00
Ryan Petrello
57cd474beb Merge pull request #4634 from ryanpetrello/licensing-rhsm-changes-380
reimplement licensing to work with RHSM and entitlement uploads
2020-10-30 13:03:08 -04:00
softwarefactory-project-zuul[bot]
9b00421ec3 Merge pull request #8468 from nixocio/ui_issue_8453
Fix username as a required field

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-30 15:27:13 +00:00
Nikhil Jain
23a852bdab add the empty child group to groups before adding it to the parent group 2020-10-30 14:23:57 +05:30
softwarefactory-project-zuul[bot]
52d178bbe4 Merge pull request #8489 from sean-m-sullivan/workflow_node_logic
Update Logic for workflow node creation/deletion

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-29 18:36:40 +00:00
sean-m-sullivan
5703aa8af5 pep8 fixing 2020-10-29 11:50:29 -05:00
Christian M. Adams
a4e76db672 Update tool tip for RH username & password settings 2020-10-29 12:15:24 -04:00
Jake McDermott
31275122a1 Merge pull request #4653 from wenottingham/taking-inventory-of-ourselves
Enable source vars for all inventory types
2020-10-29 11:06:39 -04:00
sean-m-sullivan
beb329c31e update logic for node creation 2020-10-29 09:52:13 -05:00
Dominique Quatravaux
deb56bf4f8 [fix] Now with doctest that actually passes 2020-10-29 14:03:19 +01:00
Dominique Quatravaux
87b97530ff [fix] flake8 2020-10-29 13:35:24 +01:00
Dominique Quatravaux
3335ea953e [feature] Keep pod_spec_override-provided pod labels
- Write a deepmerge() implementation, keeping only the test suite of
https://stackoverflow.com/a/20666342/435004

- Use it to deep-merge pod['metadata'] with user input,
instead of replacing fields in it
2020-10-29 13:35:24 +01:00
Bill Nottingham
0fbc02864e Enable source vars for all inventory types
Update plugin popover to point to the plugin docs.
2020-10-28 19:58:14 -04:00
Jake McDermott
94eec401c3 Use SUBSCRIPTION_* variables in config route 2020-10-28 19:03:38 -04:00
Keith Grant
fa07889f39 switch host filter lookup to use icontains searches for name/group 2020-10-28 15:41:03 -07:00
softwarefactory-project-zuul[bot]
82a42d1db7 Merge pull request #8476 from jlmitch5/fixSearchLabelBug
fix issue where adding a search tag could cause an error

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-28 21:05:53 +00:00
softwarefactory-project-zuul[bot]
a672022a6a Merge pull request #8479 from jlmitch5/fixUserDetailLink
fix malformed user details link in toolbar

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-28 18:44:52 +00:00
Ryan Petrello
a75874a5d0 Merge pull request #4650 from jbradberry/tower-instance-group-absent
Fix a typo in checking the 'absent' state for the tower_instance_group module
2020-10-28 14:38:01 -04:00
Jeff Bradberry
ff7fe2acdf Fix the 'absent' state in tower_instance_group 2020-10-28 14:27:03 -04:00
Ryan Petrello
98d2e1a898 Merge pull request #4622 from jbradberry/import-export-groups-hosts
Rework the export of full dependent objects
2020-10-28 13:55:12 -04:00
John Mitchell
9517bf01ce fix malformed user details link in toolbar 2020-10-28 13:52:59 -04:00
Jeff Bradberry
b8b1e3d760 Rework the export of full dependent objects
and include hosts and groups in the export.
2020-10-28 13:43:14 -04:00
Ryan Petrello
e5c0889361 Merge pull request #4649 from ryanpetrello/webhook-unicode-bug
fix a display bug in webhook notifications with unicode characters
2020-10-28 13:08:15 -04:00
Ryan Petrello
41d3b164ea fix a display bug in webhook notifications with unicode characters
see: https://github.com/ansible/awx/issues/7400
2020-10-28 13:03:34 -04:00
John Mitchell
3a512f39ae fix issue where adding a search tag could cause an error 2020-10-28 11:36:05 -04:00
nixocio
40e821d0d8 Fix username as a required field
Fix username as a required field. `UserForm` is used for adding and
editing an user. When adding an user, the initial user value is a `{}`
update logic to cover this case.

Also, add unit-tests to cover this particular case.

See: https://github.com/ansible/awx/issues/8453
2020-10-28 10:11:38 -04:00
Ryan Petrello
ee06df97a4 fix a minor bug in the way we report certain license upload errors 2020-10-28 09:58:39 -04:00
softwarefactory-project-zuul[bot]
0d3c9ebc2b Merge pull request #8471 from ryanpetrello/whoops-scm
fix a minor bug introduced in Project save validation

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-27 20:13:53 +00:00
Christian M. Adams
6d412fd8e7 Properly record the license type when sub is a trial 2020-10-27 16:05:43 -04:00
Ryan Petrello
e0af178968 fix a minor bug introduced in Project save validation 2020-10-27 15:42:36 -04:00
softwarefactory-project-zuul[bot]
720d705df3 Merge pull request #8466 from jlmitch5/dashboardInvSyncFailureFix
update inventory sync failure count to look at correct data

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-27 19:31:01 +00:00
softwarefactory-project-zuul[bot]
e35b0d1441 Merge pull request #8430 from AlexSCorey/8361-MergeAddDropDown
Merges 2 tool bar add buttons that use dropdowns

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-27 19:22:28 +00:00
Elyézer Rezende
ddcbb1f9c2 Separate page object for config/attach endpoint 2020-10-27 15:13:13 -04:00
Alex Corey
2e90cd8d31 fixes failing tests and template list dropdown 2020-10-27 14:54:47 -04:00
Alex Corey
a2ca2729ba Merges 2 tool bar add buttons that use dropdowns 2020-10-27 14:37:23 -04:00
softwarefactory-project-zuul[bot]
51600986c9 Merge pull request #8462 from jakegatsby/devel
cast create_preload_data to boolean with `create_preload_data | bool` in launch_awx_task.sh.j2

Reviewed-by: Ryan Petrello
             https://github.com/ryanpetrello
2020-10-27 15:32:21 +00:00
Christian M. Adams
0a839430e7 Update compliance wording in UI on license page 2020-10-27 10:51:11 -04:00
John Mitchell
abaefd0319 update inventory sync failure count to look at correct data 2020-10-27 10:44:00 -04:00
softwarefactory-project-zuul[bot]
5a67aa7fff Merge pull request #8447 from thedoubl3j/local_path_mod
related #7665 added 400 if user attempts an edit to local_path in a SCM project

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-27 13:30:28 +00:00
Ryan Petrello
22e68fe973 correct manifest argument spec for the tower_license module 2020-10-27 09:09:39 -04:00
softwarefactory-project-zuul[bot]
4db5447db8 Merge pull request #8394 from chrismeyersfsu/enhancement-profiling_code
centralize reusable profiling code

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-27 12:57:02 +00:00
Chris Meyers
eb47c8dbc6 centralize reusable profiling code 2020-10-27 08:21:41 -04:00
Jake Jackson
abd0eb53bf fix tests 2020-10-27 00:39:51 -04:00
Jake Jackson
dbc4b677f6 related #7665 added 400 if user attempts an edit to local_path in a SCM project and test case 2020-10-26 22:47:37 -04:00
Christian M. Adams
f83e4cf092 Simplify link to fit UI column 2020-10-26 22:17:20 -04:00
Bill Nottingham
bb38940638 Add a help popover that points to the docs 2020-10-26 20:04:18 -04:00
Bill Nottingham
a72a688506 Update the license wording and UX 2020-10-26 18:35:16 -04:00
Christian M. Adams
1f5df7e39c Valid key always set correctly, compliant field set correctly 2020-10-26 16:25:25 -04:00
odroid
8a325d40e4 create_preload_data | bool in launch_awx_task.sh.j2 2020-10-26 15:22:29 -04:00
Caleb Boylan
581a0b67f0 Merge pull request #4645 from squidboylan/fix_collections_tests
fix lookup plugin fqcn issue
2020-10-26 11:37:31 -07:00
softwarefactory-project-zuul[bot]
a71261d5fd Merge pull request #8419 from keithjgrant/8331-number-survey-fields
Fix integer/float errors in survey

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-26 18:14:44 +00:00
Caleb Boylan
98f572a50e fix lookup plugin fqcn issue 2020-10-26 10:02:11 -07:00
Christian M. Adams
44633c2ba7 Update get subscriptions button name in UI 2020-10-26 12:16:53 -04:00
softwarefactory-project-zuul[bot]
53dede734f Merge pull request #8345 from donald-picard-kr/update-tower-job-wait-for-workflow
add support for wait of project_updates jobs, inventory_update, and w…

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-26 15:47:27 +00:00
softwarefactory-project-zuul[bot]
95a4cc7b76 Merge pull request #8457 from ryanpetrello/downstream-sync
merge in some downstream bug fixes

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-26 14:46:23 +00:00
softwarefactory-project-zuul[bot]
db3e79e240 Merge pull request #8449 from lennart/local_docker_labels
allow labelling docker web container

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-26 14:30:31 +00:00
Ryan Petrello
b7f1393c33 fix a typo in the tower_license module documentation 2020-10-26 10:18:58 -04:00
mabashian
3c1cc7fcef Fix failing license test after rhCreds was changed to subscriptionCreds 2020-10-26 10:14:16 -04:00
Ryan Petrello
6097066cd8 Merge branch 'downstream' into devel 2020-10-26 09:32:00 -04:00
Ryan Petrello
048e35850a cut down on queries necessary to generate the X-API-Product-Name header 2020-10-26 09:19:46 -04:00
Chris Meyers
d2ceb39d73 Merge pull request #4616 from chrismeyersfsu/fix-same_jt_abuse
Fix same jt abuse
2020-10-26 09:13:08 -04:00
Lennart Melzer
2991ddfc52 allow labelling docker web container 2020-10-25 14:34:48 +01:00
Keith Grant
a8bb3519c5 fix multiselect survey question on launch 2020-10-23 14:37:32 -07:00
Christian M. Adams
98b2ac77c8 Add migration to prefill rh username and password for subscriptions 2020-10-23 17:01:14 -04:00
softwarefactory-project-zuul[bot]
d550487bc8 Merge pull request #8433 from Malizor/devel
Expose the SCM Branch name in the playbook environment

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-23 17:40:07 +00:00
Ryan Petrello
942d7ccfc6 warn about legacy license usage in the licensing UI 2020-10-23 11:42:35 -04:00
softwarefactory-project-zuul[bot]
02fa85206f Merge pull request #8441 from nixocio/ui_issue_7595
Rename users and access tabs

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-23 15:39:49 +00:00
Ryan Petrello
b36afa3c3e clarify that the manifest file is a .zip file 2020-10-23 11:08:50 -04:00
Ryan Petrello
3fe9d1c096 consolidate a few license code function calls 2020-10-23 11:05:08 -04:00
Christian M. Adams
8a9f75c291 Clean up unnecessary comments 2020-10-23 11:00:08 -04:00
Bill Nottingham
bfb8e384a8 flake8 2020-10-23 10:58:29 -04:00
Bill Nottingham
9bc17db45d Return more user-friendly errors for assorted manifest failures 2020-10-23 10:57:43 -04:00
Ryan Petrello
7c63a6592e simplify how awx "open" licensing works 2020-10-23 10:56:19 -04:00
Ryan Petrello
1f0b1923d7 update the tower_license module to properly upload manifests 2020-10-23 10:30:51 -04:00
Chris Meyers
6e8996f59f Merge pull request #4626 from chrismeyersfsu/enhancement-graph_jobs_3_8_0
terminal graph of job status changes
2020-10-23 10:22:04 -04:00
Chris Meyers
79d7c6d9b3 make optimization code work with container groups
* Task manager fit_ optimization code caused problems with container
group code.
* Note that we don't actually get the benefit of the optimization for
container groups. We just make it so that the code doesn't blow up. It
will take another pass to apply optimizations to the container group
task manager path.
2020-10-23 10:17:30 -04:00
Chris Meyers
ce052922c6 terminal graph of job status changes
* Visualize how jobs go from pending, waiting, running over time
2020-10-23 10:15:32 -04:00
softwarefactory-project-zuul[bot]
20e2472329 Merge pull request #8442 from beeankha/revert_to_satellite6
Revert "Kind" Choice from 'satellite' to 'satellite6'

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-23 13:54:11 +00:00
beeankha
26ebf47c71 Revert choice from 'satellite' to 'satellite6' 2020-10-22 18:03:09 -04:00
softwarefactory-project-zuul[bot]
f54116afbb Merge pull request #8431 from wenottingham/pg-ate-ten
Move to rhel8 PG10 container for persistent PG

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-22 21:38:51 +00:00
Bill Nottingham
f1d2d79f00 Move to rhel8 PG10 container for persistent PG
Merge in updated liveness checks from upstream template
2020-10-22 17:08:16 -04:00
Christian M. Adams
25ace77048 Remove license_key check & fix docker-compose make command 2020-10-22 16:49:13 -04:00
Ryan Petrello
91f72672a1 fix incorrect detection of license on inventory updates 2020-10-22 16:07:28 -04:00
Christian M. Adams
44e9ba1117 Fix flake8 2020-10-22 15:47:54 -04:00
Christian M. Adams
a5b644c23c Revert subman install and setfacl 2020-10-22 15:40:05 -04:00
softwarefactory-project-zuul[bot]
3ff1d77c03 Merge pull request #8438 from beeankha/add_cred_kind_options
Update Doc String for tower_credential Module "Kind" Choices

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-22 19:09:16 +00:00
Christian M. Adams
784c924d88 remove outdated license references 2020-10-22 14:59:48 -04:00
softwarefactory-project-zuul[bot]
466dff96e9 Merge pull request #8402 from jlmitch5/dashboardAug20
add ui_next dashboard

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-22 18:45:11 +00:00
Christian M. Adams
fbde4797f8 Install subman and set ACL for rhsm.conf for dev 2020-10-22 14:39:31 -04:00
Ryan Petrello
2df924ae78 cleanup more old licensing cruft 2020-10-22 14:37:26 -04:00
Ryan Petrello
be5ff0a088 clarify some Sat6 verbiage in the license screen 2020-10-22 14:32:03 -04:00
Ryan Petrello
d8514851bf remove unnneeded licenses 2020-10-22 14:29:34 -04:00
Ryan Petrello
849079316a change rhsm candlepin crt location 2020-10-22 14:08:19 -04:00
Ryan Petrello
f266325fb0 remove some entitlements config we no longer need 2020-10-22 13:46:36 -04:00
nixocio
dcc3422484 Rename users and access tabs
Rename users and access tabs

See: https://github.com/ansible/awx/issues/7595
2020-10-22 13:42:41 -04:00
Christian M. Adams
f812d2e318 Fallback to RH Candlepin Verify setting for OCP 2020-10-22 13:33:41 -04:00
Ryan Petrello
0c63e6a624 clarify messaging and behavior when subscription-manager isn't installed 2020-10-22 13:20:55 -04:00
softwarefactory-project-zuul[bot]
a532421eef Merge pull request #8436 from jbradberry/profile-sql-message
Improve handling of 0 and negative thresholds in the profile_sql command

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-22 17:04:40 +00:00
Christian M. Adams
23f365786c Add error handling for missing rhsm.conf 2020-10-22 12:29:29 -04:00
softwarefactory-project-zuul[bot]
8206874158 Merge pull request #8434 from nicolas-g/patch-1
Add support for Kubernetes Pod annotations

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-22 16:07:09 +00:00
Chris Meyers
7baf681b55 Merge pull request #4623 from chrismeyersfsu/enhancement-db_application_name_3_8_0
fill in postgres application_name on connection
2020-10-22 12:04:41 -04:00
Ryan Petrello
fcf56b4ba6 cleanup up some unused code/comments, and simplify the license migration 2020-10-22 11:56:47 -04:00
Ryan Petrello
afc028147a remove Organization label from RHSM/Sat6 license form 2020-10-22 11:56:47 -04:00
Ryan Petrello
a7c7ac714f change license uploading to parse RHSM manifests
Co-authored-by: Christian Adams <chadams@redhat.com>
2020-10-22 11:56:41 -04:00
beeankha
4b625f0f13 Update credential 'kind' choices 🔑 2020-10-22 11:54:42 -04:00
Jeff Bradberry
d6e39376c8 Improve handling of 0 and negative thresholds in the profile_sql command
- output a profiling disabled message when appropriate
- specify that we are doing SQL profiling in the enabled case
- treat negative thresholds the same as zero, disabling profiling
2020-10-22 11:27:21 -04:00
Ryan Petrello
ffab48c77f reimplement licensing to work with RHSM and entitlement uploads
Co-authored-by: Christian Adams <chadams@redhat.com>
2020-10-22 11:10:28 -04:00
Donald Picard
8f66cfa2c0 related #8344 add support for wait of project_updates jobs, inventory_update, and workflow_job.
Signed-off-by: Donald Picard <donald.picard@sogeti.com>
2020-10-22 09:05:02 -04:00
Nicolas G
a50e32d4ea Add support for Kubernetes Pod annotations
Variable `kubernetes_pod_annotations` will add annotations to Kubernetes pods
2020-10-21 19:59:11 -04:00
Nicolas Delvaux
a58e37e31f Expose {awx,tower}_job_scm_branch variables in the environment
related #8429
2020-10-22 00:09:18 +02:00
Nicolas Delvaux
51aed19b29 Expose {awx,tower}_project_scm_branch variables in the environment 2020-10-21 23:54:48 +02:00
Tiago Góes
e30569cc1b Change the id from / to - 2020-10-21 18:26:19 -03:00
softwarefactory-project-zuul[bot]
81a79c30cb Merge pull request #7976 from bbayszczak/missing_creds_type_to_tower_credentials_module
add missing creds types to tower_credential module

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-21 19:03:41 +00:00
John Mitchell
2c0de9ce3d update render dashboard default unit t est 2020-10-21 12:52:38 -04:00
softwarefactory-project-zuul[bot]
3b3dfb6dbe Merge pull request #8424 from ansible/deps-autofix-10-21
Autofix dependencies

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2020-10-21 16:33:42 +00:00
Bianca Henderson
143831ffd0 Add required whitespace 2020-10-21 12:21:30 -04:00
softwarefactory-project-zuul[bot]
6bd573cf07 Merge pull request #8263 from AlexSCorey/8238-AddRelatedGroups
8238 add related groups

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-21 15:42:55 +00:00
softwarefactory-project-zuul[bot]
447bc4b4da Merge pull request #8364 from sean-m-sullivan/workflow_approval
Workflow approval

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
             https://github.com/beeankha
2020-10-21 15:08:01 +00:00
softwarefactory-project-zuul[bot]
7c038c9329 Merge pull request #8348 from nesanton/feature/8347
Rename inventory_source param to name in tower_inventory_source_update

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-21 14:53:27 +00:00
Ryan Petrello
a26d20cbf2 Merge pull request #4631 from ryanpetrello/galaxy-creds-cli
allow the CLI to associate Galaxy credentials to Organizations
2020-10-21 10:40:55 -04:00
John Mitchell
52deb7fd86 update dashboard and graph code to aid in automated testing 2020-10-21 10:32:37 -04:00
Ryan Petrello
c373d5307f allow the CLI to associate Galaxy credentials to Organizations
$ awx organizations associate Default --galaxy_credential "Ansible Galaxy"
2020-10-21 09:39:33 -04:00
Jake McDermott
1ab0e318f9 Fix vulnerable dependencies 2020-10-21 08:57:41 -04:00
softwarefactory-project-zuul[bot]
062ce5f735 Merge pull request #7281 from mabashian/7127-cred-input-details
Updates credential details to support plugin and prompt fields

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2020-10-21 00:32:26 +00:00
Keith Grant
9b5e59f045 add number validator support for negative numbers, large numbers 2020-10-20 15:44:17 -07:00
Alex Corey
8cb8cfe3d5 fixes search and sort 2020-10-20 17:53:54 -04:00
John Mitchell
5f4d6daf1b update dashboard to 3 tab single pane 2020-10-20 17:33:37 -04:00
Alex Corey
bebaf2d97e Uses existing kebabified workflow for run command 2020-10-20 17:07:01 -04:00
Alex Corey
ef85a321bc brings all lists in line with exsiting Ad Hoc workflow 2020-10-20 17:05:51 -04:00
Alex Corey
b919d4885c reformats long string, removes unneeded key 2020-10-20 17:05:51 -04:00
Alex Corey
f604065246 Refactors to show add button properly in Advanced Search mode 2020-10-20 17:05:51 -04:00
Alex Corey
9620da287c Adds Related Groups List 2020-10-20 17:05:51 -04:00
sean-m-sullivan
1ca46893bb update 2020-10-20 15:55:15 -05:00
softwarefactory-project-zuul[bot]
717861fb46 Merge pull request #8339 from keithjgrant/7515-form-error-polish
Refactor FormSubmitError for easier testing, better error display

Reviewed-by: John Hill <johill@redhat.com>
             https://github.com/unlikelyzero
2020-10-20 20:52:09 +00:00
John Mitchell
8839fb9af3 remove unused comment from template lists 2020-10-20 16:42:28 -04:00
John Mitchell
a3c5f50bbf add dashboard (including counts, line chart and portal mode style lists) to ui_next 2020-10-20 16:42:28 -04:00
John Mitchell
5ea98ab02a add copy of template list for dashboard use, moving around shared ws hook to util 2020-10-20 16:42:28 -04:00
John Mitchell
782e8d5875 add two_weeks filter to dashbaord job graph api view 2020-10-20 16:42:28 -04:00
Jake McDermott
36abc9b123 Merge pull request #4630 from jakemcdermott/current-date
[3.8] Use current year in about modal
2020-10-20 15:31:31 -04:00
Anton Nesterov
130f6300c5 Fix missing alias in argument_spec and add tests for it 2020-10-20 21:15:28 +02:00
Jake McDermott
7bc7cb00ac Use current year in about modal 2020-10-20 15:13:58 -04:00
softwarefactory-project-zuul[bot]
f3ac57e3b6 Merge pull request #8346 from marshmalien/popover-component
Merge FieldTooltip and DetailPopover into single Popover component

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-20 18:55:02 +00:00
Keith Grant
a9c01e891f remove console log
Co-authored-by: Jake McDermott <yo@jakemcdermott.me>
2020-10-20 11:18:40 -07:00
Keith Grant
acd8a8dd3c fix integer/float errors in survey 2020-10-20 10:47:26 -07:00
Jake McDermott
f85548abeb Merge pull request #4628 from mabashian/4310-license-string
Replace SETTINGS > SYSTEM with SETTINGS &gt; SYSTEM to get around issue with translating this string
2020-10-20 12:34:19 -04:00
softwarefactory-project-zuul[bot]
44776189de Merge pull request #8162 from nixocio/ui_instance_groups_update_labels
Update labels to display isolated and controller instance groups

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-20 16:11:55 +00:00
Rebeccah
a929e82060 replacing capabilities prefetch definition with empty braces and removing the dunder. Explanation: Originally _capabilities_prefetch was populated with: ['admin', 'execute', {'copy': ['jobtemplate.project.use', 'jobtemplate.inventory.use', 'organization.workflow_admin']}]
This was problematic because it was overwriting the original values that had been defined in the other serializers. Additionally, there are no other dunders for other capabilities prefetch
this was likely added because UnifiedJobTemplateSerializer does not have it's own capabilities, but rather derives them from JTSerializer and WFJTSeralizer, but it worked better without the dunder once I removed the data that was overwriting the data from the WFJT and JT serializers.
2020-10-20 11:58:53 -04:00
Marliana Lara
5d0b001764 Fix prop type errors in unit tests 2020-10-20 11:57:32 -04:00
Marliana Lara
f369f8535d Add default aria label to Popover component 2020-10-20 11:55:04 -04:00
Marliana Lara
35ba74d265 Merge FieldTooltip and DetailPopover into single Popover component 2020-10-20 11:55:00 -04:00
nixocio
c8b9cbe0d5 Update labels to display isolated and controller instance groups
Update labels to display isolated and controller instance groups.

See: https://github.com/ansible/awx/issues/8244
Also: https://github.com/ansible/awx/issues/7467
2020-10-20 11:39:17 -04:00
softwarefactory-project-zuul[bot]
677fb594e8 Merge pull request #8281 from mabashian/7835-galaxy-cred-org-2
Add Galaxy Credentials field to organizations form

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-20 15:37:08 +00:00
softwarefactory-project-zuul[bot]
439e872a05 Merge pull request #8404 from mabashian/fix-test-consoles
Fix issues with prop types that were causing errors to be logged during tests

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-20 15:33:53 +00:00
mabashian
d27c482e5e Pass actual error to ContentError so it can be displayed 2020-10-20 11:16:38 -04:00
mabashian
34e85dea8b Check for existence of data.next before checking it 2020-10-20 11:16:38 -04:00
mabashian
6df173ce1d Update return structure of readInputSources to match what the edit component is expecting. This also required me to make corresponding updates to the detail component so that it matched. 2020-10-20 11:16:38 -04:00
mabashian
e6a1ad0127 Ran prettier 2020-10-20 11:16:38 -04:00
mabashian
c3c7e120c8 Removes use of Trans tag in favor of t/i18n 2020-10-20 11:16:38 -04:00
mabashian
81822dfd1c Adds an upper limit on recursive calls set statically in the method at 5. 2020-10-20 11:16:38 -04:00
mabashian
a71a9057a2 Wraps GET requests in useRequest in order to handle unmounting more gracefully if the requests are still pending. 2020-10-20 11:16:38 -04:00
mabashian
a1d1a1078b Adds logic to recursively fetch input sources in the model method. This way we don't have to duplicate this logic every place that calls the method. 2020-10-20 11:16:38 -04:00
mabashian
e7cd9bbb98 Display fields that have plugins configured. 2020-10-20 11:16:38 -04:00
mabashian
908e583c69 Display prompt on launch passwords properly 2020-10-20 11:16:38 -04:00
mabashian
19ae4eadfb Add galaxy credentials field to organizations form 2020-10-20 11:03:27 -04:00
mabashian
485cee56bc Fix issues with prop types that were causing errors to be logged during tests 2020-10-20 10:59:39 -04:00
softwarefactory-project-zuul[bot]
9e4a236c64 Merge pull request #8417 from nicolas-g/patch-1
Add Kubernetes Deployment support for annotations

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
2020-10-20 14:53:44 +00:00
Sean Sullivan
3a34a079aa Merge pull request #18 from ansible/devel
rebase to ansible/awx
2020-10-20 09:41:56 -05:00
sean-m-sullivan
03c7504d2b fix existing item error 2020-10-20 09:40:45 -05:00
mabashian
7a9b55c21b Replace SETTINGS > SYSTEM with SETTINGS &gt; SYSTEM to get around issue with translating this string 2020-10-20 10:31:30 -04:00
Chris Meyers
84cb7be079 fill in postgres application_name on connection
* Tried to fill in application_name in awx/__init__.py but I think that
is too late
* Fill in database application_name with enough information to easily
trace the connection from postgres back to the node and pid that
initiated the connection.
* Set application_name in django settings so that application_name is
set _before_ the first postgres connection is established.
2020-10-20 08:32:09 -04:00
Sean Sullivan
dc26580466 Update to response code
set response code for current versions of tower/awx
2020-10-19 19:46:49 -05:00
sean-m-sullivan
1636f0cb25 linting 2020-10-19 17:35:18 -05:00
Sean Sullivan
f6a1707684 Merge pull request #17 from ansible/devel
Rebase
2020-10-19 15:56:04 -05:00
sean-m-sullivan
fe55dca661 make workflow approval creation return an HTTP 201, not 200 OK 2020-10-19 15:55:49 -05:00
sean-m-sullivan
a8159c0391 revert check 2020-10-19 15:35:36 -05:00
Nicolas G
23c386223c Add Kubernetes Deployment support for annotations
Annotations are only supported for ingress and service accounts
This PR will allow you now to specify annotations for Kubernetes Deployment
 resources by defining `kubernetes_deployment_annotations` var list
2020-10-19 16:33:54 -04:00
sean-m-sullivan
5959809fed make workflow approval creation return an HTTP 201, not 200 OK 2020-10-19 15:19:01 -05:00
sean-m-sullivan
e416b55b1a update to fix missing options and fix pep8 2020-10-19 15:15:33 -05:00
sean-m-sullivan
91ef686fe0 update to incorporate requested changes, change approve to 201 response. 2020-10-19 15:11:19 -05:00
sean-m-sullivan
862cd974ff linting 2020-10-19 12:12:08 -05:00
Chris Meyers
11cc6362b5 reduce per-job database query count
* Do not query the database for the set of Instance that belong to the
group for which we are trying to fit a job on, for each job.
* Instead, cache the set of instances per-instance group.
2020-10-19 11:01:11 -04:00
Chris Meyers
bdabe36029 reduce parent->child lock contention
* We update the parent unified job template to point at new jobs
created. We also update a similar foreign key when the job finishes
running. This causes lock contention when the job template is
allow_simultaneous and there are a lot of jobs from that job template
running in parallel. I've seen as bad as 5 minutes waiting for the lock
when a job finishes.
* This change moves the parent->child update to OUTSIDE of the
transaction if the job is allow_simultaneous (inherited from the parent
unified job). We sacrafice a bit of correctness for performance. The
logic is, if you are launching 1,000 parallel jobs do you really care
that the job template contains a pointer to the last one you launched?
Probably not. If you do, you can always query jobs related to the job
template sorted by created time.
2020-10-19 11:01:05 -04:00
Anton Nesterov
2e237661f8 Add the inventory_source as alias. 2020-10-17 17:33:53 +02:00
Anton Nesterov
8a09731a52 Rename inventory_source param to name
* fixes #8347
* Rename inventory_source to name in the tower_inventory_source_update
* Allow to specify both name or id for `name` and `inventory` params
2020-10-17 17:33:53 +02:00
sean-m-sullivan
4151361420 linting 2020-10-17 01:13:50 -05:00
sean-m-sullivan
c0e1ac266c add tests 2020-10-17 01:00:14 -05:00
Sean Sullivan
6c1f688bf1 Merge pull request #16 from sean-m-sullivan/approval_role
update to approval role
2020-10-17 00:10:00 -05:00
sean-m-sullivan
0393d537de rewrite to use lists 2020-10-17 00:08:39 -05:00
sean-m-sullivan
82bb8033ec update to approval role 2020-10-16 13:27:28 -05:00
Sean Sullivan
106b19a05d Merge pull request #13 from ansible/devel
Rebase
2020-10-16 12:15:47 -05:00
sean-m-sullivan
7ca2f33112 update test 2020-10-16 11:22:12 -05:00
sean-m-sullivan
ad1937b394 update test 2020-10-16 11:16:15 -05:00
sean-m-sullivan
0fee6d8b86 update test 2020-10-16 10:52:56 -05:00
sean-m-sullivan
237727dd62 update pytest 2020-10-13 20:56:50 -05:00
sean-m-sullivan
d9184e02f5 update pytest 2020-10-13 20:40:35 -05:00
sean-m-sullivan
3b903a7459 fix typo 2020-10-13 18:41:52 -05:00
sean-m-sullivan
c72c335b0c fix pep8 issues 2020-10-13 18:27:27 -05:00
sean-m-sullivan
51eb4e6d6b update to auto_exit, add tests, add mutual exclusive parameters 2020-10-13 18:17:22 -05:00
sean-m-sullivan
e16a910062 updated workflow task name 2020-10-13 14:24:56 -05:00
sean-m-sullivan
6b27ee6a3c updated workflow name 2020-10-13 14:24:22 -05:00
sean-m-sullivan
226046dd16 update 2020-10-12 12:03:37 -05:00
sean-m-sullivan
c205ee81f0 update delete 2020-10-12 00:17:18 -05:00
sean-m-sullivan
c57ec1ea79 update delete 2020-10-10 13:25:09 -05:00
sean-m-sullivan
c3045f6a29 update delete 2020-10-10 13:02:58 -05:00
sean-m-sullivan
7ffa70422a remove typo changes 2020-10-10 11:57:34 -05:00
sean-m-sullivan
5655f766f0 linting 2020-10-10 11:56:00 -05:00
sean-m-sullivan
a2c8e3d87e clean up and tests added 2020-10-10 11:53:50 -05:00
sean-m-sullivan
9bcb5ef0c9 intial update for workflow approval nodes 2020-10-10 04:06:49 -05:00
Sean Sullivan
501c91f035 Merge pull request #12 from ansible/devel
rebase
2020-10-09 23:25:32 -05:00
Keith Grant
2133b83db4 fix handling of nested API form errors 2020-10-08 09:14:51 -07:00
Keith Grant
f5e4147502 add comment to tests 2020-10-07 08:30:11 -07:00
Keith Grant
52f37242fc clean up & unit test form error handling 2020-10-06 14:48:23 -07:00
Benoit Bayszczak
d49a61b63e add missing creds types to tower_credential module
Add the following native credentials types to the tower_credential module
 - 'satellite': 'Red Hat Satellite 6' # renaming of satellite6
 - 'aim': 'CyberArk AIM Central Credential Provider Lookup'
 - 'conjur': 'CyberArk Conjur Secret Lookup'
 - 'hashivault_kv': 'HashiCorp Vault Secret Lookup'
 - 'hashivault_ssh': 'HashiCorp Vault Signed SSH'
 - 'azure_kv': 'Microsoft Azure Key Vault'
 - 'kubernetes_bearer_token': 'OpenShift or Kubernetes API Bearer Token'
 - 'github_token': 'GitHub Personal Access Token'
 - 'gitlab_token': 'GitLab Personal Access Token'
2020-08-25 17:24:17 +02:00
2578 changed files with 118237 additions and 229009 deletions

View File

@@ -1,2 +1,3 @@
.git
awx/ui/node_modules
awx/ui_next/node_modules
Dockerfile

2
.env
View File

@@ -1,3 +1,3 @@
PYTHONUNBUFFERED=true
SELENIUM_DOCKER_TAG=latest
COMPOSE_PROJECT_NAME=tools

7
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,7 @@
---
version: 2
updates:
- package-ecosystem: "pip"
directory: "/requirements"
schedule:
interval: "monthly"

17
.gitignore vendored
View File

@@ -29,15 +29,18 @@ awx/ui/client/languages
awx/ui/templates/ui/index.html
awx/ui/templates/ui/installing.html
awx/ui_next/node_modules/
awx/ui_next/src/locales/
awx/ui_next/src/locales/*/messages.js
awx/ui_next/coverage/
awx/ui_next/build
awx/ui_next/.env.local
awx/ui_next/instrumented
rsyslog.pid
/tower-license
/tower-license/**
tools/prometheus/data
tools/docker-compose/ansible/awx_dump.sql
tools/docker-compose/Dockerfile
tools/docker-compose/_build
tools/docker-compose/_sources
tools/docker-compose/overrides/
# Tower setup playbook testing
setup/test/roles/postgresql
@@ -88,6 +91,9 @@ awx/awx_test.sqlite3-journal
# Mac OS X
*.DS_Store
# VSCode
.vscode/
# Editors
*.sw[poj]
*~
@@ -147,3 +153,8 @@ use_dev_supervisor.txt
.idea/*
*.unison.tmp
*.#
/awx/ui_next/.ui-built
/Dockerfile
/_build/
/_build_kube_dev/
/Dockerfile.kube-dev

View File

@@ -2,6 +2,102 @@
This is a list of high-level changes for each release of AWX. A full list of commits can be found at `https://github.com/ansible/awx/releases/tag/<version>`.
# 18.0.0 (March 23, 2021)
**IMPORTANT INSTALL AND UPGRADE NOTES**
Starting in version 18.0, the [AWX Operator](https://github.com/ansible/awx-operator) is the preferred way to install AWX: https://github.com/ansible/awx/blob/devel/INSTALL.md#installing-awx
If you have a pre-existing installation of AWX that utilizes the Docker-based installation method, this install method has ** notably changed** from 17.x to 18.x. For details, please see:
- https://groups.google.com/g/awx-project/c/47MjWSUQaOc/m/bCjSDn0eBQAJ
- https://github.com/ansible/awx/blob/devel/tools/docker-compose
- https://github.com/ansible/awx/blob/devel/tools/docker-compose/docs/data_migration.md
### Introducing Execution Environments
After a herculean effort from a number of contributors, we're excited to announce that AWX 18.0.0 introduces a new concept called Execution Environments.
Execution Environments are container images which consist of everything necessary to run a playbook within AWX, and which drive the entire management and lifecycle of playbook execution runtime in AWX: https://github.com/ansible/awx/issues/5157. This means that going forward, AWX no longer utilizes the [bubblewrap](https://github.com/containers/bubblewrap) project for playbook isolation, but instead utilizes a container per playbook run.
Much like custom virtualenvs, custom Execution Environments can be crafted to specify additional Python or system-level dependencies. Ansible Builder outputs images you can upload to your registry which can *then* be defined in AWX and utilized for playbook runs.
To learn more about Ansible Builder and Execution Environments, see: https://www.ansible.com/blog/introduction-to-ansible-builder
### Other Notable Changes
- Removed `installer` directory.
- The Kubernetes installer has been removed in favor of [AWX Operator](https://github.com/ansible/awx-operator).
- The "Local Docker" install method has been removed in favor of the development environment. Details can be found at: https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md
- Removal of custom virtual environments https://github.com/ansible/awx/pull/9498
- Custom virtual environments have been replaced by Execution Environments https://github.com/ansible/awx/pull/9570
- The default Container Group Pod definition has changed. All custom Pod specs have been reset. https://github.com/ansible/awx/commit/05ef51f710dad8f8036bc5acee4097db4adc0d71
- Added user interface for the activity stream: https://github.com/ansible/awx/pull/9083
- Converted many of the top-level list views (Jobs, Teams, Hosts, Inventories, Projects, and more) to a new, permanent table component for substantially increased responsiveness, usability, maintainability, and other 'ility's: https://github.com/ansible/awx/pull/8970, https://github.com/ansible/awx/pull/9182 and many others!
- Added click-to-expand details for job tables
- Added search filtering to job output https://github.com/ansible/awx/pull/9208
- Added the new migration, update, and "installation in progress" page https://github.com/ansible/awx/pull/9123
- Added the user interface for job settings https://github.com/ansible/awx/pull/8661
- Runtime errors from jobs are now displayed, along with an explanation for what went wrong, on the output page https://github.com/ansible/awx/pull/8726
- You can now cancel a running job from its output and details panel https://github.com/ansible/awx/pull/9199
- Fixed a bug where launch prompt inputs were unexpectedly deposited in the url: https://github.com/ansible/awx/pull/9231
- Playbook, credential type, and inventory file inputs now support type-ahead and manual type-in! https://github.com/ansible/awx/pull/9120
- Added ability to relaunch against failed hosts: https://github.com/ansible/awx/pull/9225
- Added pending workflow approval count to the application header https://github.com/ansible/awx/pull/9334
- Added user interface for management jobs: https://github.com/ansible/awx/pull/9224
- Added toast message to show notification template test result to notification templates list https://github.com/ansible/awx/pull/9318
- Replaced CodeMirror with AceEditor for editing template variables and notification templates https://github.com/ansible/awx/pull/9281
- Added support for filtering and pagination on job output https://github.com/ansible/awx/pull/9208
- Added support for html in custom login text https://github.com/ansible/awx/pull/9519
# 17.1.0 (March 9, 2021)
- Addressed a security issue in AWX (CVE-2021-20253)
- Fixed a bug permissions error related to redis in K8S-based deployments: https://github.com/ansible/awx/issues/9401
# 17.0.1 (January 26, 2021)
- Fixed pgdocker directory permissions issue with Local Docker installer: https://github.com/ansible/awx/pull/9152
- Fixed a bug in the UI which caused toggle settings to not be changed when clicked: https://github.com/ansible/awx/pull/9093
# 17.0.0 (January 22, 2021)
- AWX now requires PostgreSQL 12 by default: https://github.com/ansible/awx/pull/8943
**Note:** users who encounter permissions errors at upgrade time should `chown -R ~/.awx/pgdocker` to ensure it's owned by the user running the install playbook
- Added support for region name for OpenStack inventory: https://github.com/ansible/awx/issues/5080
- Added the ability to chain undefined attributes in custom notification templates: https://github.com/ansible/awx/issues/8677
- Dramatically simplified the `image_build` role: https://github.com/ansible/awx/pull/8980
- Fixed a bug which can cause schema migrations to fail at install time: https://github.com/ansible/awx/issues/9077
- Fixed a bug which caused the `is_superuser` user property to be out of date in certain circumstances: https://github.com/ansible/awx/pull/8833
- Fixed a bug which sometimes results in race conditions on setting access: https://github.com/ansible/awx/pull/8580
- Fixed a bug which sometimes causes an unexpected delay in stdout for some playbooks: https://github.com/ansible/awx/issues/9085
- (UI) Added support for credential password prompting on job launch: https://github.com/ansible/awx/pull/9028
- (UI) Added the ability to configure LDAP settings in the UI: https://github.com/ansible/awx/issues/8291
- (UI) Added a sync button to the Project detail view: https://github.com/ansible/awx/issues/8847
- (UI) Added a form for configuring Google Outh 2.0 settings: https://github.com/ansible/awx/pull/8762
- (UI) Added searchable keys and related keys to the Credentials list: https://github.com/ansible/awx/issues/8603
- (UI) Added support for advanced search and copying to Notification Templates: https://github.com/ansible/awx/issues/7879
- (UI) Added support for prompting on workflow nodes: https://github.com/ansible/awx/issues/5913
- (UI) Added support for session timeouts: https://github.com/ansible/awx/pull/8250
- (UI) Fixed a bug that broke websocket streaming for the insecure ws:// protocol: https://github.com/ansible/awx/pull/8877
- (UI) Fixed a bug in the user interface when a translation for the browser's preferred locale isn't available: https://github.com/ansible/awx/issues/8884
- (UI) Fixed bug where navigating from one survey question form directly to another wasn't reloading the form: https://github.com/ansible/awx/issues/7522
- (UI) Fixed a bug which can cause an uncaught error while launching a Job Template: https://github.com/ansible/awx/issues/8936
- Updated autobahn to address CVE-2020-35678
## 16.0.0 (December 10, 2020)
- AWX now ships with a reimagined user interface. **Please read this before upgrading:** https://groups.google.com/g/awx-project/c/KuT5Ao92HWo
- Removed support for syncing inventory from Red Hat CloudForms - https://github.com/ansible/awx/commit/0b701b3b2
- Removed support for Mercurial-based project updates - https://github.com/ansible/awx/issues/7932
- Upgraded NodeJS to actively maintained LTS 14.15.1 - https://github.com/ansible/awx/pull/8766
- Added Git-LFS to the default image build - https://github.com/ansible/awx/pull/8700
- Added the ability to specify `metadata.labels` in the podspec for container groups - https://github.com/ansible/awx/issues/8486
- Added support for Kubernetes pod annotations - https://github.com/ansible/awx/pull/8434
- Added the ability to label the web container in local Docker installs - https://github.com/ansible/awx/pull/8449
- Added additional metadata (as an extra var) to playbook runs to report the SCM branch name - https://github.com/ansible/awx/pull/8433
- Fixed a bug that caused k8s installations to fail due to an incorrect Helm repo - https://github.com/ansible/awx/issues/8715
- Fixed a bug that prevented certain Workflow Approval resources from being deleted - https://github.com/ansible/awx/pull/8612
- Fixed a bug that prevented the deletion of inventories stuck in "pending deletion" state - https://github.com/ansible/awx/issues/8525
- Fixed a display bug in webhook notifications with certain unicode characters - https://github.com/ansible/awx/issues/7400
- Improved support for exporting dependent objects (Inventory Hosts and Groups) in the `awx export` CLI tool - https://github.com/ansible/awx/commit/607bc0788
## 15.0.1 (October 20, 2020)
- Added several optimizations to improve performance for a variety of high-load simultaneous job launch use cases https://github.com/ansible/awx/pull/8403
- Added the ability to source roles and collections from requirements.yaml files (not just requirements.yml) - https://github.com/ansible/awx/issues/4540
@@ -88,7 +184,7 @@ This is a list of high-level changes for each release of AWX. A full list of com
- Fixed a bug that caused rsyslogd's configuration file to have world-readable file permissions, potentially leaking secrets (CVE-2020-10782)
## 12.0.0 (Jun 9, 2020)
- Removed memcached as a dependency of AWX (https://github.com/ansible/awx/pull/7240)
- Removed memcached as a dependency of AWX (https://github.com/ansible/awx/pull/7240)
- Moved to a single container image build instead of separate awx_web and awx_task images. The container image is just `awx` (https://github.com/ansible/awx/pull/7228)
- Official AWX container image builds now use a two-stage container build process that notably reduces the size of our published images (https://github.com/ansible/awx/pull/7017)
- Removed support for HipChat notifications ([EoL announcement](https://www.atlassian.com/partnerships/slack/faq#faq-98b17ca3-247f-423b-9a78-70a91681eff0)); all previously-created HipChat notification templates will be deleted due to this removal.

View File

@@ -11,24 +11,15 @@ Have questions about this document or anything not covered here? Come chat with
* [Prerequisites](#prerequisites)
* [Docker](#docker)
* [Docker compose](#docker-compose)
* [Node and npm](#node-and-npm)
* [Build the environment](#build-the-environment)
* [Frontend Development](#frontend-development)
* [Build and Run the Development Environment](#build-and-run-the-development-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)
* [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-a-shell)
* [Create a superuser](#create-a-superuser)
* [Load the data](#load-the-data)
* [Building API Documentation](#build-api-documentation)
* [Building API Documentation](#building-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)
* [Submitting Pull Requests](#submitting-pull-requests)
* [PR Checks run by Zuul](#pr-checks-run-by-zuul)
* [Reporting Issues](#reporting-issues)
## Things to know prior to submitting code
@@ -42,7 +33,7 @@ Have questions about this document or anything not covered here? Come chat with
## Setting up your development environment
The AWX development environment workflow and toolchain is based on Docker, and the docker-compose tool, to provide dependencies, services, and databases necessary to run all of the components. It also binds the local source tree into the development container, making it possible to observe and test changes in real time.
The AWX development environment workflow and toolchain uses Docker and the docker-compose tool, to provide dependencies, services, and databases necessary to run all of the components. It also bind-mounts the local source tree into the development container, making it possible to observe and test changes in real time.
### Prerequisites
@@ -55,29 +46,19 @@ respectively.
For Linux platforms, refer to the following from Docker:
**Fedora**
* **Fedora** - https://docs.docker.com/engine/installation/linux/docker-ce/fedora/
> https://docs.docker.com/engine/installation/linux/docker-ce/fedora/
* **CentOS** - https://docs.docker.com/engine/installation/linux/docker-ce/centos/
**CentOS**
* **Ubuntu** - https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
> https://docs.docker.com/engine/installation/linux/docker-ce/centos/
* **Debian** - https://docs.docker.com/engine/installation/linux/docker-ce/debian/
**Ubuntu**
* **Arch** - https://wiki.archlinux.org/index.php/Docker
> https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
#### Docker Compose
**Debian**
> https://docs.docker.com/engine/installation/linux/docker-ce/debian/
**Arch**
> https://wiki.archlinux.org/index.php/Docker
#### Docker compose
If you're not using Docker for Mac, or Docker for Windows, you may need, or choose to, install the Docker compose Python module separately, in which case you'll need to run the following:
If you're not using Docker for Mac, or Docker for Windows, you may need, or choose to, install the `docker-compose` Python module separately.
```bash
(host)$ pip3 install docker-compose
@@ -85,188 +66,17 @@ If you're not using Docker for Mac, or Docker for Windows, you may need, or choo
#### Frontend Development
See [the ui development documentation](awx/ui/README.md).
### Build the environment
See [the ui development documentation](awx/ui_next/CONTRIBUTING.md).
#### Fork and clone the AWX repo
If you have not done so already, you'll need to fork the AWX repo on GitHub. For more on how to do this, see [Fork a Repo](https://help.github.com/articles/fork-a-repo/).
#### Create local settings
### Build and Run the Development Environment
AWX will import the file `awx/settings/local_settings.py` and combine it with defaults in `awx/settings/defaults.py`. This file is required for starting the development environment and startup will fail if it's not provided.
See the [README.md](./tools/docker-compose/README.md) for docs on how to build the awx_devel image and run the development environment.
An example is provided. Make a copy of it, and edit as needed (the defaults are usually fine):
```bash
(host)$ cp awx/settings/local_settings.py.docker_compose awx/settings/local_settings.py
```
#### Build the base image
The AWX base container image (defined in `tools/docker-compose/Dockerfile`) contains basic OS dependencies and symbolic links into the development environment that make running the services easy.
Run the following to build the image:
```bash
(host)$ make docker-compose-build
```
**NOTE**
> The image will need to be rebuilt, if the Python requirements or OS dependencies change.
Once the build completes, you will have a `ansible/awx_devel` image in your local image cache. Use the `docker images` command to view it, as follows:
```bash
(host)$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ansible/awx_devel latest ba9ec3e8df74 26 minutes ago 1.42GB
```
#### Build the user interface
Run the following to build the AWX UI:
```bash
(host) $ make ui-devel
```
See [the ui development documentation](awx/ui/README.md) for more information on using the frontend development, build, and test tooling.
### Running the environment
#### 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 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
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44251b476f98 gcr.io/ansible-tower-engineering/awx_devel:devel "/entrypoint.sh /bin…" 27 seconds ago Up 23 seconds 0.0.0.0:6899->6899/tcp, 0.0.0.0:7899-7999->7899-7999/tcp, 0.0.0.0:8013->8013/tcp, 0.0.0.0:8043->8043/tcp, 0.0.0.0:8080->8080/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp tools_awx_run_9e820694d57e
40de380e3c2e redis:latest "docker-entrypoint.s…" 28 seconds ago Up 26 seconds
b66a506d3007 postgres:10 "docker-entrypoint.s…" 28 seconds ago Up 26 seconds 0.0.0.0:5432->5432/tcp tools_postgres_1
```
**NOTE**
> The Makefile assumes that the image you built is tagged with your current branch. This allows you to build images for different contexts or branches. When starting the containers, you can choose a specific branch by setting `COMPOSE_TAG=<branch name>` in your environment.
> For example, you might be working in a feature branch, but you want to run the containers using the `devel` image you built previously. To do that, start the containers using the following command: `$ COMPOSE_TAG=devel make docker-compose`
##### Wait for migrations to complete
The first time you start the environment, database migrations need to run in order to build the PostgreSQL database. It will take few moments, but eventually you will see output in your terminal session that looks like the following:
```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, 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...
awx_1 | Installing custom SQL...
awx_1 | Running migrations:
awx_1 | Rendering model states... DONE
awx_1 | Applying contenttypes.0001_initial... OK
awx_1 | Applying contenttypes.0002_remove_content_type_name... OK
awx_1 | Applying auth.0001_initial... OK
awx_1 | Applying auth.0002_alter_permission_name_max_length... OK
awx_1 | Applying auth.0003_alter_user_email_max_length... OK
awx_1 | Applying auth.0004_alter_user_username_opts... OK
awx_1 | Applying auth.0005_alter_user_last_login_null... OK
awx_1 | Applying auth.0006_require_contenttypes_0002... OK
awx_1 | Applying taggit.0001_initial... OK
awx_1 | Applying taggit.0002_auto_20150616_2121... OK
awx_1 | Applying main.0001_initial... OK
awx_1 | Applying main.0002_squashed_v300_release... OK
awx_1 | Applying main.0003_squashed_v300_v303_updates... OK
awx_1 | Applying main.0004_squashed_v310_release... OK
awx_1 | Applying conf.0001_initial... OK
awx_1 | Applying conf.0002_v310_copy_tower_settings... OK
...
```
Once migrations are completed, you can begin using AWX.
#### Start from the container shell
Often times you'll want to start the development environment without immediately starting all of the services in the *awx* container, and instead be taken directly to a shell. You can do this with the following:
```bash
(host)$ make docker-compose-test
```
Using `docker exec`, this will create a session in the running *awx* container, and place you at a command prompt, where you can run shell commands inside the container.
If you want to start and use the development environment, you'll first need to bootstrap it by running the following command:
```bash
(container)# /usr/bin/bootstrap_development.sh
```
The above will do all the setup tasks, including running database migrations, so it may take a couple minutes. Once it's done it
will drop you back to the shell.
In order to launch all developer services:
```bash
(container)# /usr/bin/launch_awx.sh
```
`launch_awx.sh` also calls `bootstrap_development.sh` so if all you are doing is launching the supervisor to start all services, you don't
need to call `bootstrap_development.sh` first.
### Post Build Steps
Before you can log in and use the system, you will need to create an admin user. Optionally, you may also want to load some demo data.
##### Start a shell
To create the admin user, and load demo data, you first need to start a shell session on the *awx* container. In a new terminal session, use the `docker exec` command as follows to start the shell session:
```bash
(host)$ docker exec -it tools_awx_1 bash
```
This creates a session in the *awx* containers, just as if you were using `ssh`, and allows you execute commands within the running container.
##### Create an admin user
Before you can log into AWX, you need to create an admin user. With this user you will be able to create more users, and begin configuring the server. From within the container shell, run the following command:
```bash
(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
(container)# awx-manage create_preload_data
```
**NOTE**
> This information will persist in the database running in the `tools_postgres_1` container, until the container is removed. You may periodically need to recreate
this container, and thus the database, if the database schema changes in an upstream commit.
##### Building API Documentation
### Building API Documentation
AWX includes support for building [Swagger/OpenAPI
documentation](https://swagger.io). To build the documentation locally, run:
@@ -284,7 +94,7 @@ is an example of one such service.
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/).
To log in use the admin user and password you created above in [Create an admin user](#create-an-admin-user).
[Create an admin user](./tools/docker-compose/README.md#create-an-admin-user) if needed.
### Purging containers and images
@@ -335,7 +145,7 @@ Sometimes it might take us a while to fully review your PR. We try to keep the `
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
## PR Checks run 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:

View File

@@ -1,643 +1,122 @@
Table of Contents
=================
* [Installing AWX](#installing-awx)
* [The AWX Operator](#the-awx-operator)
* [Quickstart with minikube](#quickstart-with-minikube)
* [Starting minikube](#starting-minikube)
* [Deploying the AWX Operator](#deploying-the-awx-operator)
* [Verifying the Operator Deployment](#verifying-the-operator-deployment)
* [Deploy AWX](#deploy-awx)
* [Accessing AWX](#accessing-awx)
* [Installing the AWX CLI](#installing-the-awx-cli)
* [Building the CLI Documentation](#building-the-cli-documentation)
# Installing AWX
This document provides a guide for installing AWX.
:warning: NOTE |
--- |
If you're installing an older release of AWX (prior to 18.0), these instructions have changed. Take a look at your version specific instructions, e.g., for AWX 17.0.1, see: [https://github.com/ansible/awx/blob/17.0.1/INSTALL.md](https://github.com/ansible/awx/blob/17.0.1/INSTALL.md)
If you're attempting to migrate an older Docker-based AWX installation, see: [Migrating Data from Local Docker](https://github.com/ansible/awx/blob/devel/tools/docker-compose/docs/data_migration.md) |
## Table of contents
## The AWX Operator
- [Installing AWX](#installing-awx)
* [Getting started](#getting-started)
+ [Clone the repo](#clone-the-repo)
+ [AWX branding](#awx-branding)
+ [Prerequisites](#prerequisites)
+ [System Requirements](#system-requirements)
+ [Choose a deployment platform](#choose-a-deployment-platform)
+ [Official vs Building Images](#official-vs-building-images)
* [Upgrading from previous versions](#upgrading-from-previous-versions)
* [OpenShift](#openshift)
+ [Prerequisites](#prerequisites-1)
+ [Pre-install steps](#pre-install-steps)
- [Deploying to Minishift](#deploying-to-minishift)
- [PostgreSQL](#postgresql)
+ [Run the installer](#run-the-installer)
+ [Post-install](#post-install)
+ [Accessing AWX](#accessing-awx)
* [Kubernetes](#kubernetes)
+ [Prerequisites](#prerequisites-2)
+ [Pre-install steps](#pre-install-steps-1)
+ [Configuring Helm](#configuring-helm)
+ [Run the installer](#run-the-installer-1)
+ [Post-install](#post-install-1)
+ [Accessing AWX](#accessing-awx-1)
+ [SSL Termination](#ssl-termination)
* [Docker-Compose](#docker-compose)
+ [Prerequisites](#prerequisites-3)
+ [Pre-install steps](#pre-install-steps-2)
- [Deploying to a remote host](#deploying-to-a-remote-host)
- [Inventory variables](#inventory-variables)
- [Docker registry](#docker-registry)
- [Proxy settings](#proxy-settings)
- [PostgreSQL](#postgresql-1)
+ [Run the installer](#run-the-installer-2)
+ [Post-install](#post-install-2)
+ [Accessing AWX](#accessing-awx-2)
- [Installing the AWX CLI](#installing-the-awx-cli)
* [Building the CLI Documentation](#building-the-cli-documentation)
Starting in version 18.0, the [AWX Operator](https://github.com/ansible/awx-operator) is the preferred way to install AWX.
AWX can also alternatively be installed and [run in Docker](./tools/docker-compose/README.md), but this install path is only recommended for development/test-oriented deployments, and has no official published release.
## Getting started
### Quickstart with minikube
### Clone the repo
If you don't have an existing OpenShift or Kubernetes cluster, minikube is a fast and easy way to get up and running.
If you have not already done so, you will need to clone, or create a local copy, of the [AWX repo](https://github.com/ansible/awx). We generally recommend that you view the releases page:
To install minikube, follow the steps in their [documentation](https://minikube.sigs.k8s.io/docs/start/).
https://github.com/ansible/awx/releases
#### Starting minikube
...and clone the latest stable release, e.g.,
`git clone -b x.y.z https://github.com/ansible/awx.git`
Please note that deploying from `HEAD` (or the latest commit) is **not** stable, and that if you want to do this, you should proceed at your own risk (also, see the section #official-vs-building-images for building your own image).
For more on how to clone the repo, view [git clone help](https://git-scm.com/docs/git-clone).
Once you have a local copy, run commands within the root of the project tree.
### AWX branding
You can optionally install the AWX branding assets from the [awx-logos repo](https://github.com/ansible/awx-logos). Prior to installing, please review and agree to the [trademark guidelines](https://github.com/ansible/awx-logos/blob/master/TRADEMARKS.md).
To install the assets, clone the `awx-logos` repo so that it is next to your `awx` clone. As you progress through the installation steps, you'll be setting variables in the [inventory](./installer/inventory) file. To include the assets in the build, set `awx_official=true`.
### Prerequisites
Before you can run a deployment, you'll need the following installed in your local environment:
- [Ansible](http://docs.ansible.com/ansible/latest/intro_installation.html) Requires Version 2.8+
- [Docker](https://docs.docker.com/engine/installation/)
+ A recent version
- [docker](https://pypi.org/project/docker/) Python module
+ This is incompatible with `docker-py`. If you have previously installed `docker-py`, please uninstall it.
+ We use this module instead of `docker-py` because it is what the `docker-compose` Python module requires.
- [community.general.docker_image collection](https://docs.ansible.com/ansible/latest/collections/community/general/docker_image_module.html)
+ This is only required if you are using Ansible >= 2.10
- [GNU Make](https://www.gnu.org/software/make/)
- [Git](https://git-scm.com/) Requires Version 1.8.4+
- Python 3.6+
- [Node 10.x LTS version](https://nodejs.org/en/download/)
+ This is only required if you're [building your own container images](#official-vs-building-images) with `use_container_for_build=false`
- [NPM 6.x LTS](https://docs.npmjs.com/)
+ This is only required if you're [building your own container images](#official-vs-building-images) with `use_container_for_build=false`
### System Requirements
The system that runs the AWX service will need to satisfy the following requirements
- At least 4GB of memory
- At least 2 cpu cores
- At least 20GB of space
- Running Docker, Openshift, or Kubernetes
- If you choose to use an external PostgreSQL database, please note that the minimum version is 10+.
### Choose a deployment platform
We currently support running AWX as a containerized application using Docker images deployed to either an OpenShift cluster, a Kubernetes cluster, or docker-compose. The remainder of this document will walk you through the process of building the images, and deploying them to either platform.
The [installer](./installer) directory contains an [inventory](./installer/inventory) file, and a playbook, [install.yml](./installer/install.yml). You'll begin by setting variables in the inventory file according to the platform you wish to use, and then you'll start the image build and deployment process by running the playbook.
In the sections below, you'll find deployment details and instructions for each platform:
- [OpenShift](#openshift)
- [Kubernetes](#kubernetes)
- [Docker Compose](#docker-compose).
### Official vs Building Images
When installing AWX you have the option of building your own image or using the image provided on DockerHub (see [awx](https://hub.docker.com/r/ansible/awx/))
This is controlled by the following variables in the `inventory` file
Once you have installed minikube, run the following command to start it. You may wish to customize these options.
```
dockerhub_base=ansible
dockerhub_version=latest
$ minikube start --cpus=4 --memory=8g --addons=ingress
```
If these variables are present then all deployments will use these hosted images. If the variables are not present then the images will be built during the install.
#### Deploying the AWX Operator
*dockerhub_base*
> The base location on DockerHub where the images are hosted (by default this pulls a container image named `ansible/awx:tag`)
*dockerhub_version*
> Multiple versions are provided. `latest` always pulls the most recent. You may also select version numbers at different granularities: 1, 1.0, 1.0.1, 1.0.0.123
*use_container_for_build*
> Use a local distribution build container image for building the AWX package. This is helpful if you don't want to bother installing the build-time dependencies as it is taken care of already.
## Upgrading from previous versions
Upgrading AWX involves rerunning the install playbook. Download a newer release from [https://github.com/ansible/awx/releases](https://github.com/ansible/awx/releases) and re-populate the inventory file with your customized variables.
For convenience, you can create a file called `vars.yml`:
For a comprehensive overview of features, see [README.md](https://github.com/ansible/awx-operator/blob/devel/README.md) in the awx-operator repo. The following steps are the bare minimum to get AWX up and running.
```
admin_password: 'adminpass'
pg_password: 'pgpass'
secret_key: 'mysupersecret'
$ minikube kubectl -- apply -f https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml
```
And pass it to the installer:
##### Verifying the Operator Deployment
After a few seconds, the operator should be up and running. Verify it by running the following command:
```
$ ansible-playbook -i inventory install.yml -e @vars.yml
$ minikube kubectl get pods
NAME READY STATUS RESTARTS AGE
awx-operator-7c78bfbfd-xb6th 1/1 Running 0 11s
```
## OpenShift
#### Deploy AWX
### Prerequisites
To complete a deployment to OpenShift, you will need access to an OpenShift cluster. For demo and testing purposes, you can use [Minishift](https://github.com/minishift/minishift) to create a single node cluster running inside a virtual machine.
When using OpenShift for deploying AWX make sure you have correct privileges to add the security context 'privileged', otherwise the installation will fail. The privileged context is needed because of the use of [the bubblewrap tool](https://github.com/containers/bubblewrap) to add an additional layer of security when using containers.
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-deployment requires:
> Memory: 6GB
> CPU: 3 cores
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)
### Pre-install steps
Before starting the install, review the [inventory](./installer/inventory) file, and uncomment and provide values for the following variables found in the `[all:vars]` section:
*openshift_host*
> IP address or hostname of the OpenShift cluster. If you're using Minishift, this will be the value returned by `minishift ip`.
*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*.
*openshift_user*
> 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.
*docker_registry_repository*
> Namespace to use when pushing and pulling images to and from the registry. Generally this will match the project name. It defaults to *awx*. This is not needed if you are using official hosted images.
*docker_registry_username*
> 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
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_admin_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.
### Run the installer
To start the install, you will pass two *extra* variables on the command line. The first is *openshift_password*, which is the password for the *openshift_user*, and the second is *docker_registry_password*, which is the password associated with *docker_registry_username*.
If you're using the OpenShift internal registry, then you'll pass an access token for the *docker_registry_password* value, rather than a password. The `oc whoami -t` command will generate the required token, as long as you're logged into the cluster via `oc cluster login`.
Run the following command (docker_registry_password is optional if using official images):
```bash
# Start the install
$ ansible-playbook -i inventory install.yml -e openshift_password=developer -e docker_registry_password=$(oc whoami -t)
```
### Post-install
After the playbook run completes, check the status of the deployment by running `oc get pods`:
```bash
# View the running pods
$ oc get pods
NAME READY STATUS RESTARTS AGE
awx-3886581826-5mv0l 4/4 Running 0 8s
postgresql-1-l85fh 1/1 Running 0 20m
Once the Operator is running, you can now deploy AWX by creating a simple YAML file:
```
In the above example, the name of the AWX pod is `awx-3886581826-5mv0l`. Before accessing the AWX web interface, setup tasks and database migrations need to complete. These tasks are running in the `awx_task` container inside the AWX pod. To monitor their status, tail the container's STDOUT by running the following command, replacing the AWX pod name with the pod name from your environment:
```bash
# Follow the awx_task log output
$ oc logs -f awx-3886581826-5mv0l -c awx-celery
$ cat myawx.yml
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: awx
spec:
tower_ingress_type: Ingress
```
You will see the following indicating that database migrations are running:
And then creating the AWX object in the Kubernetes API:
```bash
Using /etc/ansible/ansible.cfg as config file
127.0.0.1 | SUCCESS => {
"changed": false,
"db": "awx"
}
Operations to perform:
Synchronize unmigrated apps: solo, api, staticfiles, messages, channels, django_extensions, ui, rest_framework, polymorphic
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...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying taggit.0001_initial... OK
Applying taggit.0002_auto_20150616_2121... OK
...
```
$ minikube kubectl apply -- -f myawx.yml
awx.awx.ansible.com/awx created
```
When you see output similar to the following, you'll know that database migrations have completed, and you can access the web interface:
After creating the AWX object in the Kubernetes API, the operator will begin running its reconciliation loop.
```bash
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
To see what's going on, you can tail the logs of the operator pod (note that your pod name will be different):
>>> <User: admin>
>>> Default organization added.
Demo Credential, Inventory, and Job Template added.
Successfully registered instance awx-3886581826-5mv0l
(changed: True)
Creating instance group tower
Added instance awx-3886581826-5mv0l to tower
```
$ minikube kubectl logs -- -f awx-operator-7c78bfbfd-xb6th
```
Once database migrations complete, the web interface will be accessible.
After a few seconds, you will see the database and application pods show up. On a fresh system, it may take a few minutes for the container images to download.
### Accessing AWX
The AWX web interface is running in the AWX pod, behind the `awx-web-svc` service. To view the service, and its port value, run the following command:
```bash
# View available services
$ oc get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
awx-web-svc 172.30.111.74 <nodes> 8052:30083/TCP 37m
postgresql 172.30.102.9 <none> 5432/TCP 38m
```
$ minikube kubectl get pods
NAME READY STATUS RESTARTS AGE
awx-5ffbfd489c-bvtvf 3/3 Running 0 2m54s
awx-operator-7c78bfbfd-xb6th 1/1 Running 0 6m42s
awx-postgres-0 1/1 Running 0 2m58s
```
The deployment process creates a route, `awx-web-svc`, to expose the service. How the ingres is actually created will vary depending on your environment, and how the cluster is configured. You can view the route, and the external IP address and hostname assigned to it, by running the following command:
##### Accessing AWX
```bash
# View available routes
$ oc get routes
To access the AWX UI, you'll need to grab the service url from minikube:
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
awx-web-svc awx-web-svc-awx.192.168.64.2.nip.io awx-web-svc http edge/Allow None
```
$ minikube service awx-service --url
http://192.168.59.2:31868
```
The above example is taken from a Minishift instance. From a web browser, use `https` to access the `HOST/PORT` value from your environment. Using the above example, the URL to access the server would be [https://awx-web-svc-awx.192.168.64.2.nip.io](https://awx-web-svc-awx.192.168.64.2.nip.io).
On fresh installs, you will see the "AWX is currently upgrading." page until database migrations finish.
Once you access the AWX server, you will be prompted with a login dialog. The default administrator username is `admin`, and the password is `password`.
Once you are redirected to the login screen, you can now log in by obtaining the generated admin password (note: do not copy the trailing `%`):
## Kubernetes
### Prerequisites
A Kubernetes deployment will require you to have access to a Kubernetes cluster as well as the following tools:
- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
- [helm](https://helm.sh/docs/intro/quickstart/)
The installation program will reference `kubectl` directly. `helm` is only necessary if you are letting the installer configure PostgreSQL for you.
The default resource requests per-pod requires:
> Memory: 6GB
> CPU: 3 cores
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/)
### Pre-install steps
Before starting the install process, review the [inventory](./installer/inventory) file, and uncomment and provide values for the following variables found in the `[all:vars]` section uncommenting when necessary. Make sure the openshift and standalone docker sections are commented out:
*kubernetes_context*
> 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
*kubernetes_namespace*
> Name of the Kubernetes namespace where the AWX resources will be installed. This will be created if it doesn't exist
*docker_registry_*
> These settings should be used if building your own base images. You'll need access to an external registry and are responsible for making sure your kube cluster can talk to it and use it. If these are undefined and the dockerhub_ configuration settings are uncommented then the images will be pulled from dockerhub instead
### Configuring Helm
If you want the AWX installer to manage creating the database pod (rather than installing and configuring postgres on your own). Then you will need to have a working `helm` installation, you can find details here: [https://helm.sh/docs/intro/quickstart/](https://helm.sh/docs/intro/quickstart/).
You do not need to create a [Persistent Volume Claim](https://docs.openshift.org/latest/dev_guide/persistent_volumes.html) as Helm does it for you. However, an existing one may be used by setting the `pg_persistence_existingclaim` variable.
Newer Kubernetes clusters with RBAC enabled will need to make sure a service account is created, make sure to follow the instructions here [https://helm.sh/docs/topics/rbac/](https://helm.sh/docs/topics/rbac/)
### Run the installer
After making changes to the `inventory` file use `ansible-playbook` to begin the install
```bash
$ ansible-playbook -i inventory install.yml
```
$ minikube kubectl -- get secret awx-admin-password -o jsonpath='{.data.password}' | base64 --decode
b6ChwVmqEiAsil2KSpH4xGaZPeZvWnWj%
```
### Post-install
After the playbook run completes, check the status of the deployment by running `kubectl get pods --namespace awx` (replace awx with the namespace you used):
```bash
# View the running pods, it may take a few minutes for everything to be marked in the Running state
$ kubectl get pods --namespace awx
NAME READY STATUS RESTARTS AGE
awx-2558692395-2r8ss 4/4 Running 0 29s
awx-postgresql-355348841-kltkn 1/1 Running 0 1m
```
### Accessing AWX
The AWX web interface is running in the AWX pod behind the `awx-web-svc` service:
```bash
# View available services
$ kubectl get svc --namespace awx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
awx-postgresql ClusterIP 10.7.250.208 <none> 5432/TCP 2m
awx-web-svc NodePort 10.7.241.35 <none> 80:30177/TCP 1m
```
The deployment process creates an `Ingress` named `awx-web-svc` also. Some kubernetes cloud providers will automatically handle routing configuration when an Ingress is created others may require that you more explicitly configure it. You can see what kubernetes knows about things with:
```bash
kubectl get ing --namespace awx
NAME HOSTS ADDRESS PORTS AGE
awx-web-svc * 35.227.x.y 80 3m
```
If your provider is able to allocate an IP Address from the Ingress controller then you can navigate to the address and access the AWX interface. For some providers it can take a few minutes to allocate and make this accessible. For other providers it may require you to manually intervene.
### SSL Termination
Unlike Openshift's `Route` the Kubernetes `Ingress` doesn't yet handle SSL termination. As such the default configuration will only expose AWX through HTTP on port 80. You are responsible for configuring SSL support until support is added (either to Kubernetes or AWX itself).
## Docker-Compose
### Prerequisites
- [Docker](https://docs.docker.com/engine/installation/) on the host where AWX will be deployed. After installing Docker, the Docker service must be started (depending on your OS, you may have to add the local user that uses Docker to the ``docker`` group, refer to the documentation for details)
- [docker-compose](https://pypi.org/project/docker-compose/) Python module.
+ This also installs the `docker` Python module, which is incompatible with `docker-py`. If you have previously installed `docker-py`, please uninstall it.
- [Docker Compose](https://docs.docker.com/compose/install/).
### Pre-install steps
#### 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.
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:
```yaml
# localhost ansible_connection=local
awx-server
[all:vars]
...
```
In the above example, image build tasks will be delegated to `localhost`, which is typically where the clone of the AWX project exists. Built images will be archived, copied to remote host, and imported into the remote Docker image cache. Tasks to start the AWX containers will then execute on the remote host.
If you choose to use the official images then the remote host will be the one to pull those images.
**Note**
> You may also want to set additional variables to control how Ansible connects to the host. For more information about this, view [Behavioral Inventory Parameters](http://docs.ansible.com/ansible/latest/intro_inventory.html#id12).
> As mentioned above, in [Prerequisites](#prerequisites-1), the prerequisites are required on the remote host.
> 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
Before starting the install process, review the [inventory](./installer/inventory) file, and uncomment and provide values for the following variables found in the `[all:vars]` section:
*postgres_data_dir*
> If you're using the default PostgreSQL container (see [PostgreSQL](#postgresql-1) below), provide a path that can be mounted to the container, and where the database can be persisted.
*host_port*
> Provide a port number that can be mapped from the Docker daemon host to the web server running inside the AWX container. If undefined no port will be exposed. Defaults to *80*.
*host_port_ssl*
> Provide a port number that can be mapped from the Docker daemon host to the web server running inside the AWX container for SSL support. If undefined no port will be exposed. Defaults to *443*, only works if you also set `ssl_certificate` (see below).
*ssl_certificate*
> Optionally, provide the path to a file that contains a certificate and its private key. This needs to be a .pem-file
*docker_compose_dir*
> When using docker-compose, the `docker-compose.yml` file will be created there (default `/tmp/awxcompose`).
*custom_venv_dir*
> Adds the custom venv environments from the local host to be passed into the containers at install.
*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:
*docker_registry*
> IP address and port, or URL, for accessing a registry.
*docker_registry_repository*
> Namespace to use when pushing and pulling images to and from the registry. Defaults to *awx*.
*docker_registry_username*
> Username of the user that will push images to the registry. Defaults to *developer*.
**Note**
> These settings are ignored if using official images
#### Proxy settings
*http_proxy*
> IP address and port, or URL, for using an http_proxy.
*https_proxy*
> IP address and port, or URL, for using an https_proxy.
*no_proxy*
> Exclude IP address or URL from the proxy.
#### PostgreSQL
AWX requires access to a PostgreSQL database, and by default, one will be created and deployed in a container, and data will be persisted to a host volume. In this scenario, you must set the value of `postgres_data_dir` to a path that can be mounted to the container. When the container is stopped, the database files will still exist in the specified path.
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_admin_password`, `pg_database`, and `pg_port` with the connection information.
### Run the installer
If you are not pushing images to a Docker registry, start the install by running the following:
```bash
# Set the working directory to installer
$ cd installer
# Run the Ansible playbook
$ ansible-playbook -i inventory install.yml
```
If you're pushing built images to a repository, then use the `-e` option to pass the registry password as follows, replacing *password* with the password of the username assigned to `docker_registry_username` (note that you will also need to remove `dockerhub_base` and `dockerhub_version` from the inventory file):
```bash
# Set the working directory to installer
$ cd installer
# Run the Ansible playbook
$ ansible-playbook -i inventory -e docker_registry_password=password install.yml
```
### Post-install
After the playbook run completes, Docker starts a series of containers that provide the services that make up AWX. You can view the running containers using the `docker ps` command.
If you're deploying using Docker Compose, container names will be prefixed by the name of the folder where the docker-compose.yml file is created (by default, `awx`).
Immediately after the containers start, the *awx_task* container will perform required setup tasks, including database migrations. These tasks need to complete before the web interface can be accessed. To monitor the progress, you can follow the container's STDOUT by running the following:
```bash
# Tail the awx_task log
$ docker logs -f awx_task
```
You will see output similar to the following:
```bash
Using /etc/ansible/ansible.cfg as config file
127.0.0.1 | SUCCESS => {
"changed": false,
"db": "awx"
}
Operations to perform:
Synchronize unmigrated apps: solo, api, staticfiles, messages, channels, django_extensions, ui, rest_framework, polymorphic
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...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying taggit.0001_initial... OK
Applying taggit.0002_auto_20150616_2121... OK
Applying main.0001_initial... OK
...
```
Once migrations complete, you will see the following log output, indicating that migrations have completed:
```bash
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> <User: admin>
>>> Default organization added.
Demo Credential, Inventory, and Job Template added.
Successfully registered instance awx
(changed: True)
Creating instance group tower
Added instance awx to tower
(changed: True)
...
```
### Accessing AWX
The AWX web server is accessible on the deployment host, using the *host_port* value set in the *inventory* file. The default URL is [http://localhost](http://localhost).
You will prompted with a login dialog. The default administrator username is `admin`, and the password is `password`.
Now you can log in at the URL above with the username "admin" and the password above. Happy Automating!
# Installing the AWX CLI

View File

@@ -4,8 +4,6 @@ recursive-include awx *.mo
recursive-include awx/static *
recursive-include awx/templates *.html
recursive-include awx/api/templates *.md *.html
recursive-include awx/ui/templates *.html
recursive-include awx/ui/static *
recursive-include awx/ui_next/build *.html
recursive-include awx/ui_next/build *
recursive-include awx/playbooks *.yml

376
Makefile
View File

@@ -19,11 +19,13 @@ PYCURL_SSL_LIBRARY ?= openssl
COMPOSE_TAG ?= $(GIT_BRANCH)
COMPOSE_HOST ?= $(shell hostname)
VENV_BASE ?= /venv
VENV_BASE ?= /var/lib/awx/venv/
SCL_PREFIX ?=
CELERY_SCHEDULE_FILE ?= /var/lib/awx/beat.db
DEV_DOCKER_TAG_BASE ?= gcr.io/ansible-tower-engineering
DEVEL_IMAGE_NAME ?= $(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG)
# Python packages to install only from source (not from binary wheels)
# Comma separated list
SRC_ONLY_PKGS ?= cffi,pycparser,psycopg2,twilio,pycurl
@@ -56,35 +58,14 @@ WHEEL_COMMAND ?= bdist_wheel
SDIST_TAR_FILE ?= $(SDIST_TAR_NAME).tar.gz
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 runserver \
develop refresh adduser migrate dbchange \
receiver test test_unit test_coverage coverage_html \
dev_build release_build release_clean sdist \
ui-docker-machine ui-docker ui-release ui-devel \
ui-test ui-deps ui-test-ci VERSION
# remove ui build artifacts
clean-ui: clean-languages
rm -rf awx/ui/static/
rm -rf awx/ui/node_modules/
rm -rf awx/ui/test/unit/reports/
rm -rf awx/ui/test/spec/reports/
rm -rf awx/ui/test/e2e/reports/
rm -rf awx/ui/client/languages/
rm -rf awx/ui_next/node_modules/
rm -rf node_modules
rm -rf awx/ui_next/coverage/
rm -rf awx/ui_next/build/locales/_build/
rm -f $(UI_DEPS_FLAG_FILE)
rm -f $(UI_RELEASE_DEPS_FLAG_FILE)
rm -f $(UI_RELEASE_FLAG_FILE)
dev_build release_build sdist \
ui-release ui-devel \
VERSION docker-compose-sources
clean-tmp:
rm -rf tmp/
@@ -133,31 +114,7 @@ guard-%:
exit 1; \
fi
virtualenv: virtualenv_ansible virtualenv_awx
# virtualenv_* targets do not use --system-site-packages to prevent bugs installing packages
# but Ansible venvs are expected to have this, so that must be done after venv creation
virtualenv_ansible:
if [ "$(VENV_BASE)" ]; then \
if [ ! -d "$(VENV_BASE)" ]; then \
mkdir $(VENV_BASE); \
fi; \
if [ ! -d "$(VENV_BASE)/ansible" ]; then \
virtualenv -p python $(VENV_BASE)/ansible && \
$(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) $(VENV_BOOTSTRAP); \
fi; \
fi
virtualenv_ansible_py3:
if [ "$(VENV_BASE)" ]; then \
if [ ! -d "$(VENV_BASE)" ]; then \
mkdir $(VENV_BASE); \
fi; \
if [ ! -d "$(VENV_BASE)/ansible" ]; then \
virtualenv -p $(PYTHON) $(VENV_BASE)/ansible; \
$(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) $(VENV_BOOTSTRAP); \
fi; \
fi
virtualenv: virtualenv_awx
# flit is needed for offline install of certain packages, specifically ptyprocess
# it is needed for setup, but not always recognized as a setup dependency
@@ -173,32 +130,6 @@ virtualenv_awx:
fi; \
fi
# --ignore-install flag is not used because *.txt files should specify exact versions
requirements_ansible: virtualenv_ansible
if [[ "$(PIP_OPTIONS)" == *"--no-index"* ]]; then \
cat requirements/requirements_ansible.txt requirements/requirements_ansible_local.txt | PYCURL_SSL_LIBRARY=$(PYCURL_SSL_LIBRARY) $(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) -r /dev/stdin ; \
else \
cat requirements/requirements_ansible.txt requirements/requirements_ansible_git.txt | PYCURL_SSL_LIBRARY=$(PYCURL_SSL_LIBRARY) $(VENV_BASE)/ansible/bin/pip install $(PIP_OPTIONS) --no-binary $(SRC_ONLY_PKGS) -r /dev/stdin ; \
fi
$(VENV_BASE)/ansible/bin/pip uninstall --yes -r requirements/requirements_ansible_uninstall.txt
# Same effect as using --system-site-packages flag on venv creation
rm $(shell ls -d $(VENV_BASE)/ansible/lib/python* | head -n 1)/no-global-site-packages.txt
requirements_ansible_py3: virtualenv_ansible_py3
if [[ "$(PIP_OPTIONS)" == *"--no-index"* ]]; then \
cat requirements/requirements_ansible.txt requirements/requirements_ansible_local.txt | PYCURL_SSL_LIBRARY=$(PYCURL_SSL_LIBRARY) $(VENV_BASE)/ansible/bin/pip3 install $(PIP_OPTIONS) -r /dev/stdin ; \
else \
cat requirements/requirements_ansible.txt requirements/requirements_ansible_git.txt | PYCURL_SSL_LIBRARY=$(PYCURL_SSL_LIBRARY) $(VENV_BASE)/ansible/bin/pip3 install $(PIP_OPTIONS) --no-binary $(SRC_ONLY_PKGS) -r /dev/stdin ; \
fi
$(VENV_BASE)/ansible/bin/pip3 uninstall --yes -r requirements/requirements_ansible_uninstall.txt
# Same effect as using --system-site-packages flag on venv creation
rm $(shell ls -d $(VENV_BASE)/ansible/lib/python* | head -n 1)/no-global-site-packages.txt
requirements_ansible_dev:
if [ "$(VENV_BASE)" ]; then \
$(VENV_BASE)/ansible/bin/pip install pytest mock; \
fi
# Install third-party requirements needed for AWX's environment.
# this does not use system site packages intentionally
requirements_awx: virtualenv_awx
@@ -212,17 +143,9 @@ requirements_awx: virtualenv_awx
requirements_awx_dev:
$(VENV_BASE)/awx/bin/pip install -r requirements/requirements_dev.txt
requirements_collections:
mkdir -p $(COLLECTION_BASE)
n=0; \
until [ "$$n" -ge 5 ]; do \
ansible-galaxy collection install -r requirements/collections_requirements.yml -p $(COLLECTION_BASE) && break; \
n=$$((n+1)); \
done
requirements: requirements_awx
requirements: requirements_ansible requirements_awx requirements_collections
requirements_dev: requirements_awx requirements_ansible_py3 requirements_awx_dev requirements_ansible_dev
requirements_dev: requirements_awx requirements_awx_dev
requirements_test: requirements
@@ -287,11 +210,27 @@ collectstatic:
fi; \
mkdir -p awx/public/static && $(PYTHON) manage.py collectstatic --clear --noinput > /dev/null 2>&1
UWSGI_DEV_RELOAD_COMMAND ?= supervisorctl restart tower-processes:awx-dispatcher tower-processes:awx-receiver
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 --lazy-apps --logformat "%(addr) %(method) %(uri) - %(proto) %(status)" --hook-accepting1="exec:supervisorctl restart tower-processes:awx-dispatcher tower-processes:awx-receiver"
uwsgi -b 32768 \
--socket 127.0.0.1:8050 \
--module=awx.wsgi:application \
--home=/var/lib/awx/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="exec: $(UWSGI_DEV_RELOAD_COMMAND)"
daphne:
@if [ "$(VENV_BASE)" ]; then \
@@ -361,7 +300,7 @@ check: flake8 pep8 # pyflakes pylint
awx-link:
[ -d "/awx_devel/awx.egg-info" ] || python3 /awx_devel/setup.py egg_info_dev
cp -f /tmp/awx.egg-link /venv/awx/lib/python$(PYTHON_VERSION)/site-packages/awx.egg-link
cp -f /tmp/awx.egg-link /var/lib/awx/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
@@ -385,7 +324,8 @@ test_collection:
rm -f $(shell ls -d $(VENV_BASE)/awx/lib/python* | head -n 1)/no-global-site-packages.txt
if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
fi && \
pip install ansible && \
py.test $(COLLECTION_TEST_DIRS) -v
# The python path needs to be modified so that the tests can find Ansible within the container
# First we will use anything expility set as PYTHONPATH
@@ -447,163 +387,50 @@ bulk_data:
fi; \
$(PYTHON) tools/data_generators/rbac_dummy_data_generator.py --preset=$(DATA_GEN_PRESET)
# l10n TASKS
# --------------------------------------
# check for UI po files
HAVE_PO := $(shell ls awx/ui/po/*.po 2>/dev/null)
check-po:
ifdef HAVE_PO
# Should be 'Language: zh-CN' but not 'Language: zh_CN' in zh_CN.po
for po in awx/ui/po/*.po ; do \
echo $$po; \
mo="awx/ui/po/`basename $$po .po`.mo"; \
msgfmt --check --verbose $$po -o $$mo; \
if test "$$?" -ne 0 ; then \
exit -1; \
fi; \
rm $$mo; \
name=`echo "$$po" | grep '-'`; \
if test "x$$name" != x ; then \
right_name=`echo $$language | sed -e 's/-/_/'`; \
echo "ERROR: WRONG $$name CORRECTION: $$right_name"; \
exit -1; \
fi; \
language=`grep '^"Language:' "$$po" | grep '_'`; \
if test "x$$language" != x ; then \
right_language=`echo $$language | sed -e 's/_/-/'`; \
echo "ERROR: WRONG $$language CORRECTION: $$right_language in $$po"; \
exit -1; \
fi; \
done;
else
@echo No PO files
endif
# generate UI .pot
pot: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run pot
# generate django .pot .po
LANG = "en-us"
messages:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
$(PYTHON) manage.py makemessages -l $(LANG) --keep-pot
# generate l10n .json .mo
languages: $(I18N_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)
# End l10n 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):
@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_BUILD_FLAG_FILE = awx/ui_next/.ui-built
ui-docker-machine: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run ui-docker-machine -- $(MAKEFLAGS)
# Native docker. Builds UI and raises BrowserSync & filesystem polling.
ui-docker: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run ui-docker -- $(MAKEFLAGS)
# Builds UI with development UI without raising browser-sync or filesystem polling.
ui-devel: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run build-devel -- $(MAKEFLAGS)
ui-test: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run test
ui-lint: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) run --prefix awx/ui jshint
$(NPM_BIN) run --prefix awx/ui lint
# A standard go-to target for API developers to use building the frontend
ui: clean-ui ui-devel
ui-test-ci: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui run test:ci
$(NPM_BIN) --prefix awx/ui run unit
jshint: $(UI_DEPS_FLAG_FILE)
$(NPM_BIN) run --prefix awx/ui jshint
$(NPM_BIN) run --prefix awx/ui lint
ui-zuul-lint-and-test:
CHROMIUM_BIN=$(CHROMIUM_BIN) ./awx/ui/build/zuul_download_chromium.sh
CHROMIUM_BIN=$(CHROMIUM_BIN) PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 $(NPM_BIN) --unsafe-perm --prefix awx/ui ci --no-save awx/ui
CHROMIUM_BIN=$(CHROMIUM_BIN) $(NPM_BIN) run --prefix awx/ui jshint
CHROMIUM_BIN=$(CHROMIUM_BIN) $(NPM_BIN) run --prefix awx/ui lint
CHROME_BIN=$(CHROMIUM_BIN) $(NPM_BIN) --prefix awx/ui run test:ci
CHROME_BIN=$(CHROMIUM_BIN) $(NPM_BIN) --prefix awx/ui run unit
# END UI TASKS
# --------------------------------------
# UI NEXT TASKS
# --------------------------------------
clean-ui:
rm -rf node_modules
rm -rf awx/ui_next/node_modules
rm -rf awx/ui_next/build
rm -rf awx/ui_next/src/locales/_build
rm -rf $(UI_BUILD_FLAG_FILE)
awx/ui_next/node_modules:
$(NPM_BIN) --prefix awx/ui_next install
$(NPM_BIN) --prefix awx/ui_next --loglevel warn --ignore-scripts install
ui-release-next:
mkdir -p awx/ui_next/build/static
touch awx/ui_next/build/static/.placeholder
ui-devel-next: awx/ui_next/node_modules
$(NPM_BIN) --prefix awx/ui_next run extract-strings
$(NPM_BIN) --prefix awx/ui_next run compile-strings
$(NPM_BIN) --prefix awx/ui_next run build
$(UI_BUILD_FLAG_FILE):
$(NPM_BIN) --prefix awx/ui_next --loglevel warn run compile-strings
$(NPM_BIN) --prefix awx/ui_next --loglevel warn run build
mkdir -p awx/public/static/css
mkdir -p awx/public/static/js
mkdir -p awx/public/static/media
cp -r awx/ui_next/build/static/css/* awx/public/static/css
cp -r awx/ui_next/build/static/js/* awx/public/static/js
cp -r awx/ui_next/build/static/media/* awx/public/static/media
touch $@
clean-ui-next:
rm -rf node_modules
rm -rf awx/ui_next/node_modules
rm -rf awx/ui_next/build
ui-release: awx/ui_next/node_modules $(UI_BUILD_FLAG_FILE)
ui-next-zuul-lint-and-test:
ui-devel: awx/ui_next/node_modules
@$(MAKE) -B $(UI_BUILD_FLAG_FILE)
ui-devel-instrumented: awx/ui_next/node_modules
$(NPM_BIN) --prefix awx/ui_next --loglevel warn run start-instrumented
ui-devel-test: awx/ui_next/node_modules
$(NPM_BIN) --prefix awx/ui_next --loglevel warn run start
ui-zuul-lint-and-test:
$(NPM_BIN) --prefix awx/ui_next install
$(NPM_BIN) run --prefix awx/ui_next lint
$(NPM_BIN) run --prefix awx/ui_next prettier-check
$(NPM_BIN) run --prefix awx/ui_next test
$(NPM_BIN) run --prefix awx/ui_next test -- --coverage --watchAll=false
# END UI NEXT TASKS
# --------------------------------------
# Build a pip-installable package into dist/ with a timestamped version number.
dev_build:
@@ -613,10 +440,10 @@ dev_build:
release_build:
$(PYTHON) setup.py release_build
dist/$(SDIST_TAR_FILE): ui-release ui-release-next VERSION
dist/$(SDIST_TAR_FILE): ui-release VERSION
$(PYTHON) setup.py $(SDIST_COMMAND)
dist/$(WHEEL_FILE): ui-release ui-release-next
dist/$(WHEEL_FILE): ui-release
$(PYTHON) setup.py $(WHEEL_COMMAND)
sdist: dist/$(SDIST_TAR_FILE)
@@ -646,29 +473,30 @@ docker-auth:
awx/projects:
@mkdir -p $@
# Docker isolated rampart
docker-compose-isolated: awx/projects
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
COMPOSE_UP_OPTS ?=
CLUSTER_NODE_COUNT ?= 1
# Docker Compose Development environment
docker-compose: docker-auth awx/projects
CURRENT_UID=$(shell id -u) OS="$(shell docker info | grep 'Operating System')" TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose -f tools/docker-compose.yml up --no-recreate awx
docker-compose-sources:
ansible-playbook -i tools/docker-compose/inventory tools/docker-compose/ansible/sources.yml \
-e awx_image=$(DEV_DOCKER_TAG_BASE)/awx_devel \
-e awx_image_tag=$(COMPOSE_TAG) \
-e cluster_node_count=$(CLUSTER_NODE_COUNT)
docker-compose-cluster: docker-auth awx/projects
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: docker-auth awx/projects docker-compose-sources
docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_UP_OPTS) up
docker-compose-credential-plugins: docker-auth awx/projects
docker-compose-credential-plugins: docker-auth awx/projects docker-compose-sources
echo -e "\033[0;31mTo generate a CyberArk Conjur API key: docker exec -it tools_conjur_1 conjurctl account create quick-start\033[0m"
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-credential-plugins-override.yml up --no-recreate awx
docker-compose -f tools/docker-compose/_sources/docker-compose.yml -f tools/docker-credential-plugins-override.yml up --no-recreate awx
docker-compose-test: docker-auth awx/projects
cd tools && CURRENT_UID=$(shell id -u) OS="$(shell docker info | grep 'Operating System')" TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports awx /bin/bash
docker-compose-test: docker-auth awx/projects docker-compose-sources
docker-compose -f tools/docker-compose/_sources/docker-compose.yml run --rm --service-ports awx_1 /bin/bash
docker-compose-runtest: awx/projects
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-runtest: awx/projects docker-compose-sources
docker-compose -f tools/docker-compose/_sources/docker-compose.yml run --rm --service-ports awx_1 /start_tests.sh
docker-compose-build-swagger: awx/projects
cd tools && CURRENT_UID=$(shell id -u) TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose run --rm --service-ports --no-deps awx /start_tests.sh swagger
docker-compose-build-swagger: awx/projects docker-compose-sources
docker-compose -f tools/docker-compose/_sources/docker-compose.yml run --rm --service-ports --no-deps awx_1 /start_tests.sh swagger
detect-schema-change: genschema
curl https://s3.amazonaws.com/awx-public-ci-files/schema.json -o reference-schema.json
@@ -676,21 +504,14 @@ detect-schema-change: genschema
diff -u -b reference-schema.json schema.json
docker-compose-clean: awx/projects
cd tools && TAG=$(COMPOSE_TAG) DEV_DOCKER_TAG_BASE=$(DEV_DOCKER_TAG_BASE) docker-compose rm -sf
docker-compose -f tools/docker-compose/_sources/docker-compose.yml rm -sf
# Base development image build
docker-compose-build:
ansible localhost -m template -a "src=installer/roles/image_build/templates/Dockerfile.j2 dest=tools/docker-compose/Dockerfile" -e build_dev=True
docker build -t ansible/awx_devel -f tools/docker-compose/Dockerfile \
--cache-from=$(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG) .
docker tag ansible/awx_devel $(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG)
#docker push $(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG)
# For use when developing on "isolated" AWX deployments
docker-compose-isolated-build: docker-compose-build
docker build -t ansible/awx_isolated -f tools/docker-isolated/Dockerfile .
docker tag ansible/awx_isolated $(DEV_DOCKER_TAG_BASE)/awx_isolated:$(COMPOSE_TAG)
#docker push $(DEV_DOCKER_TAG_BASE)/awx_isolated:$(COMPOSE_TAG)
ansible-playbook tools/ansible/dockerfile.yml -e build_dev=True
DOCKER_BUILDKIT=1 docker build -t $(DEVEL_IMAGE_NAME) \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--cache-from=$(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG) .
docker-clean:
$(foreach container_id,$(shell docker ps -f name=tools_awx -aq),docker stop $(container_id); docker rm -f $(container_id);)
@@ -702,11 +523,11 @@ docker-clean-volumes: docker-compose-clean
docker-refresh: docker-clean docker-compose
# Docker Development Environment with Elastic Stack Connected
docker-compose-elk: docker-auth awx/projects
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-elk: docker-auth awx/projects docker-compose-sources
docker-compose -f tools/docker-compose/_sources/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 awx/projects
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
docker-compose-cluster-elk: docker-auth awx/projects docker-compose-sources
docker-compose -f tools/docker-compose/_sources/docker-compose.yml -f tools/elastic/docker-compose.logstash-link-cluster.yml -f tools/elastic/docker-compose.elastic-override.yml up --no-recreate
prometheus:
docker run -u0 --net=tools_default --link=`docker ps | egrep -o "tools_awx(_run)?_([^ ]+)?"`:awxweb --volume `pwd`/tools/prometheus:/prometheus --name prometheus -d -p 0.0.0.0:9090:9090 prom/prometheus --web.enable-lifecycle --config.file=/prometheus/prometheus.yml
@@ -720,7 +541,38 @@ clean-elk:
docker rm tools_kibana_1
psql-container:
docker run -it --net tools_default --rm postgres:10 sh -c 'exec psql -h "postgres" -p "5432" -U postgres'
docker run -it --net tools_default --rm postgres:12 sh -c 'exec psql -h "postgres" -p "5432" -U postgres'
VERSION:
@echo "awx: $(VERSION)"
Dockerfile: tools/ansible/roles/dockerfile/templates/Dockerfile.j2
ansible-playbook tools/ansible/dockerfile.yml
Dockerfile.kube-dev: tools/ansible/roles/dockerfile/templates/Dockerfile.j2
ansible-playbook tools/ansible/dockerfile.yml \
-e dockerfile_name=Dockerfile.kube-dev \
-e kube_dev=True \
-e template_dest=_build_kube_dev
awx-kube-dev-build: Dockerfile.kube-dev
docker build -f Dockerfile.kube-dev \
--build-arg BUILDKIT_INLINE_CACHE=1 \
-t $(DEV_DOCKER_TAG_BASE)/awx_kube_devel:$(COMPOSE_TAG) .
# Translation TASKS
# --------------------------------------
# generate UI .pot
pot: $(UI_BUILD_FLAG_FILE)
$(NPM_BIN) --prefix awx/ui_next --loglevel warn run extract-strings
$(NPM_BIN) --prefix awx/ui_next --loglevel warn run extract-template
# generate API django .pot .po
LANG = "en-us"
messages:
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
$(PYTHON) manage.py makemessages -l $(LANG) --keep-pot

View File

@@ -1,4 +1,5 @@
[![Gated by Zuul](https://zuul-ci.org/gated.svg)](https://ansible.softwarefactory-project.io/zuul/status)
[![Gated by Zuul](https://zuul-ci.org/gated.svg)](https://ansible.softwarefactory-project.io/zuul/status) [![Code of Conduct](https://img.shields.io/badge/code%20of%20conduct-Ansible-yellow.svg)](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html) [![Apache v2 License](https://img.shields.io/badge/license-Apache%202.0-brightgreen.svg)](https://github.com/ansible/awx/blob/devel/LICENSE.md) [![AWX Mailing List](https://img.shields.io/badge/mailing%20list-AWX-orange.svg)](https://groups.google.com/g/awx-project)
[![IRC Chat](https://img.shields.io/badge/IRC-%23ansible--awx-blueviolet.svg)](https://webchat.freenode.net/#ansible-awx)
<img src="https://raw.githubusercontent.com/ansible/awx-logos/master/awx/ui/client/assets/logo-login.svg?sanitize=true" width=200 alt="AWX" />
@@ -16,20 +17,20 @@ Contributing
------------
- Refer to the [Contributing guide](./CONTRIBUTING.md) to get started developing, testing, and building AWX.
- All code submissions are done through pull requests against the `devel` branch.
- All contributors 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 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.
- All code submissions are made through pull requests against the `devel` branch.
- All contributors 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 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, but it also helps save time and effort if the community decides some changes are needed.
Reporting Issues
----------------
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).
If you're experiencing a problem that you feel is a bug in AWX or have ideas for improving 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
---------------
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)
Get Involved
------------
@@ -38,9 +39,3 @@ We welcome your feedback and ideas. Here's how to reach us with feedback and que
- Join the `#ansible-awx` channel on irc.freenode.net
- Join the [mailing list](https://groups.google.com/forum/#!forum/awx-project)
License
-------
[Apache v2](./LICENSE.md)

View File

@@ -1 +1 @@
15.0.1
18.0.0

View File

@@ -47,8 +47,6 @@ from awx.main.utils import (
get_object_or_400,
decrypt_field,
get_awx_version,
get_licenser,
StubLicense
)
from awx.main.utils.db import get_all_field_names
from awx.main.views import ApiErrorView
@@ -189,7 +187,8 @@ class APIView(views.APIView):
'''
Log warning for 400 requests. Add header with elapsed time.
'''
from awx.main.utils import get_licenser
from awx.main.utils.licensing import OpenLicense
#
# If the URL was rewritten, and we get a 404, we should entirely
# replace the view in the request context with an ApiErrorView()
@@ -225,7 +224,8 @@ class APIView(views.APIView):
response = super(APIView, self).finalize_response(request, response, *args, **kwargs)
time_started = getattr(self, 'time_started', None)
response['X-API-Product-Version'] = get_awx_version()
response['X-API-Product-Name'] = 'AWX' if isinstance(get_licenser(), StubLicense) else 'Red Hat Ansible Tower'
response['X-API-Product-Name'] = 'AWX' if isinstance(get_licenser(), OpenLicense) else 'Red Hat Ansible Tower'
response['X-API-Node'] = settings.CLUSTER_HOST_ID
if time_started:
time_elapsed = time.time() - self.time_started

View File

@@ -24,7 +24,7 @@ from rest_framework.request import clone_request
from awx.api.fields import ChoiceNullField
from awx.main.fields import JSONField, ImplicitRoleField
from awx.main.models import NotificationTemplate
from awx.main.scheduler.kubernetes import PodManager
from awx.main.tasks import AWXReceptorJob
class Metadata(metadata.SimpleMetadata):
@@ -209,7 +209,7 @@ class Metadata(metadata.SimpleMetadata):
continue
if field == "pod_spec_override":
meta['default'] = PodManager().pod_definition
meta['default'] = AWXReceptorJob().pod_definition
# Add type choices if available from the serializer.
if field == 'type' and hasattr(serializer, 'get_type_choices'):

View File

@@ -50,7 +50,7 @@ from awx.main.constants import (
)
from awx.main.models import (
ActivityStream, AdHocCommand, AdHocCommandEvent, Credential, CredentialInputSource,
CredentialType, CustomInventoryScript, Group, Host, Instance,
CredentialType, CustomInventoryScript, ExecutionEnvironment, Group, Host, Instance,
InstanceGroup, Inventory, InventorySource, InventoryUpdate,
InventoryUpdateEvent, Job, JobEvent, JobHostSummary, JobLaunchConfig,
JobNotificationMixin, JobTemplate, Label, Notification, NotificationTemplate,
@@ -107,6 +107,8 @@ SUMMARIZABLE_FK_FIELDS = {
'insights_credential_id',),
'host': DEFAULT_SUMMARY_FIELDS,
'group': DEFAULT_SUMMARY_FIELDS,
'default_environment': DEFAULT_SUMMARY_FIELDS + ('image',),
'execution_environment': DEFAULT_SUMMARY_FIELDS + ('image',),
'project': DEFAULT_SUMMARY_FIELDS + ('status', 'scm_type'),
'source_project': DEFAULT_SUMMARY_FIELDS + ('status', 'scm_type'),
'project_update': DEFAULT_SUMMARY_FIELDS + ('status', 'failed',),
@@ -124,12 +126,12 @@ SUMMARIZABLE_FK_FIELDS = {
'last_update': DEFAULT_SUMMARY_FIELDS + ('status', 'failed', 'license_error'),
'current_update': DEFAULT_SUMMARY_FIELDS + ('status', 'failed', 'license_error'),
'current_job': DEFAULT_SUMMARY_FIELDS + ('status', 'failed', 'license_error'),
'inventory_source': ('source', 'last_updated', 'status'),
'inventory_source': ('id', 'name', 'source', 'last_updated', 'status'),
'custom_inventory_script': DEFAULT_SUMMARY_FIELDS,
'source_script': DEFAULT_SUMMARY_FIELDS,
'role': ('id', 'role_field'),
'notification_template': DEFAULT_SUMMARY_FIELDS,
'instance_group': ('id', 'name', 'controller_id', 'is_containerized'),
'instance_group': ('id', 'name', 'controller_id', 'is_container_group'),
'insights_credential': DEFAULT_SUMMARY_FIELDS,
'source_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'),
'target_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'),
@@ -453,7 +455,7 @@ class BaseSerializer(serializers.ModelSerializer, metaclass=BaseSerializerMetacl
if 'capability_map' not in self.context:
if hasattr(self, 'polymorphic_base'):
model = self.polymorphic_base.Meta.model
prefetch_list = self.polymorphic_base._capabilities_prefetch
prefetch_list = self.polymorphic_base.capabilities_prefetch
else:
model = self.Meta.model
prefetch_list = self.capabilities_prefetch
@@ -640,17 +642,14 @@ class EmptySerializer(serializers.Serializer):
class UnifiedJobTemplateSerializer(BaseSerializer):
# As a base serializer, the capabilities prefetch is not used directly
_capabilities_prefetch = [
'admin', 'execute',
{'copy': ['jobtemplate.project.use', 'jobtemplate.inventory.use',
'organization.workflow_admin']}
]
# As a base serializer, the capabilities prefetch is not used directly,
# instead they are derived from the Workflow Job Template Serializer and the Job Template Serializer, respectively.
capabilities_prefetch = []
class Meta:
model = UnifiedJobTemplate
fields = ('*', 'last_job_run', 'last_job_failed',
'next_job_run', 'status')
'next_job_run', 'status', 'execution_environment')
def get_related(self, obj):
res = super(UnifiedJobTemplateSerializer, self).get_related(obj)
@@ -660,6 +659,9 @@ class UnifiedJobTemplateSerializer(BaseSerializer):
res['last_job'] = obj.last_job.get_absolute_url(request=self.context.get('request'))
if obj.next_schedule:
res['next_schedule'] = obj.next_schedule.get_absolute_url(request=self.context.get('request'))
if obj.execution_environment_id:
res['execution_environment'] = self.reverse('api:execution_environment_detail',
kwargs={'pk': obj.execution_environment_id})
return res
def get_types(self):
@@ -695,7 +697,7 @@ class UnifiedJobTemplateSerializer(BaseSerializer):
serializer.polymorphic_base = self
# capabilities prefetch is only valid for these models
if isinstance(obj, (JobTemplate, WorkflowJobTemplate)):
serializer.capabilities_prefetch = self._capabilities_prefetch
serializer.capabilities_prefetch = serializer_class.capabilities_prefetch
else:
serializer.capabilities_prefetch = None
return serializer.to_representation(obj)
@@ -714,6 +716,7 @@ class UnifiedJobSerializer(BaseSerializer):
class Meta:
model = UnifiedJob
fields = ('*', 'unified_job_template', 'launch_type', 'status',
'execution_environment',
'failed', 'started', 'finished', 'canceled_on', 'elapsed', 'job_args',
'job_cwd', 'job_env', 'job_explanation',
'execution_node', 'controller_node',
@@ -751,6 +754,9 @@ class UnifiedJobSerializer(BaseSerializer):
res['stdout'] = self.reverse('api:ad_hoc_command_stdout', kwargs={'pk': obj.pk})
if obj.workflow_job_id:
res['source_workflow_job'] = self.reverse('api:workflow_job_detail', kwargs={'pk': obj.workflow_job_id})
if obj.execution_environment_id:
res['execution_environment'] = self.reverse('api:execution_environment_detail',
kwargs={'pk': obj.execution_environment_id})
return res
def get_summary_fields(self, obj):
@@ -1246,11 +1252,13 @@ class OrganizationSerializer(BaseSerializer):
class Meta:
model = Organization
fields = ('*', 'max_hosts', 'custom_virtualenv',)
fields = ('*', 'max_hosts', 'custom_virtualenv', 'default_environment',)
read_only_fields = ('*', 'custom_virtualenv',)
def get_related(self, obj):
res = super(OrganizationSerializer, self).get_related(obj)
res.update(dict(
res.update(
execution_environments = self.reverse('api:organization_execution_environments_list', kwargs={'pk': obj.pk}),
projects = self.reverse('api:organization_projects_list', kwargs={'pk': obj.pk}),
inventories = self.reverse('api:organization_inventories_list', kwargs={'pk': obj.pk}),
job_templates = self.reverse('api:organization_job_templates_list', kwargs={'pk': obj.pk}),
@@ -1270,7 +1278,10 @@ class OrganizationSerializer(BaseSerializer):
access_list = self.reverse('api:organization_access_list', kwargs={'pk': obj.pk}),
instance_groups = self.reverse('api:organization_instance_groups_list', kwargs={'pk': obj.pk}),
galaxy_credentials = self.reverse('api:organization_galaxy_credentials_list', kwargs={'pk': obj.pk}),
))
)
if obj.default_environment:
res['default_environment'] = self.reverse('api:execution_environment_detail',
kwargs={'pk': obj.default_environment_id})
return res
def get_summary_fields(self, obj):
@@ -1333,6 +1344,8 @@ class ProjectOptionsSerializer(BaseSerializer):
scm_type = attrs.get('scm_type', u'') or u''
if self.instance and not scm_type:
valid_local_paths.append(self.instance.local_path)
if self.instance and scm_type and "local_path" in attrs and self.instance.local_path != attrs['local_path']:
errors['local_path'] = _(f'Cannot change local_path for {scm_type}-based projects')
if scm_type:
attrs.pop('local_path', None)
if 'local_path' in attrs and attrs['local_path'] not in valid_local_paths:
@@ -1348,6 +1361,29 @@ class ProjectOptionsSerializer(BaseSerializer):
return super(ProjectOptionsSerializer, self).validate(attrs)
class ExecutionEnvironmentSerializer(BaseSerializer):
show_capabilities = ['edit', 'delete', 'copy']
managed_by_tower = serializers.ReadOnlyField()
class Meta:
model = ExecutionEnvironment
fields = ('*', 'organization', 'image', 'managed_by_tower', 'credential', 'pull')
def get_related(self, obj):
res = super(ExecutionEnvironmentSerializer, self).get_related(obj)
res.update(
activity_stream=self.reverse('api:execution_environment_activity_stream_list', kwargs={'pk': obj.pk}),
unified_job_templates=self.reverse('api:execution_environment_job_template_list', kwargs={'pk': obj.pk}),
copy=self.reverse('api:execution_environment_copy', kwargs={'pk': obj.pk}),
)
if obj.organization:
res['organization'] = self.reverse('api:organization_detail', kwargs={'pk': obj.organization.pk})
if obj.credential:
res['credential'] = self.reverse('api:credential_detail',
kwargs={'pk': obj.credential.pk})
return res
class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer):
status = serializers.ChoiceField(choices=Project.PROJECT_STATUS_CHOICES, read_only=True)
@@ -1361,9 +1397,10 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer):
class Meta:
model = Project
fields = ('*', 'organization', 'scm_update_on_launch',
'scm_update_cache_timeout', 'allow_override', 'custom_virtualenv',) + \
fields = ('*', '-execution_environment', 'organization', 'scm_update_on_launch',
'scm_update_cache_timeout', 'allow_override', 'custom_virtualenv', 'default_environment') + \
('last_update_failed', 'last_updated') # Backwards compatibility
read_only_fields = ('*', 'custom_virtualenv',)
def get_related(self, obj):
res = super(ProjectSerializer, self).get_related(obj)
@@ -1387,6 +1424,9 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer):
if obj.organization:
res['organization'] = self.reverse('api:organization_detail',
kwargs={'pk': obj.organization.pk})
if obj.default_environment:
res['default_environment'] = self.reverse('api:execution_environment_detail',
kwargs={'pk': obj.default_environment_id})
# Backwards compatibility.
if obj.current_update:
res['current_update'] = self.reverse('api:project_update_detail',
@@ -1749,7 +1789,7 @@ class HostSerializer(BaseSerializerWithVariables):
attrs['variables'] = json.dumps(vars_dict)
if Group.objects.filter(name=name, inventory=inventory).exists():
raise serializers.ValidationError(_('A Group with that name already exists.'))
return super(HostSerializer, self).validate(attrs)
def to_representation(self, obj):
@@ -1940,6 +1980,7 @@ class InventorySourceOptionsSerializer(BaseSerializer):
fields = ('*', 'source', 'source_path', 'source_script', 'source_vars', 'credential',
'enabled_var', 'enabled_value', 'host_filter', 'overwrite', 'overwrite_vars',
'custom_virtualenv', 'timeout', 'verbosity')
read_only_fields = ('*', 'custom_virtualenv',)
def get_related(self, obj):
res = super(InventorySourceOptionsSerializer, self).get_related(obj)
@@ -2925,6 +2966,7 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO
'become_enabled', 'diff_mode', 'allow_simultaneous', 'custom_virtualenv',
'job_slice_count', 'webhook_service', 'webhook_credential',
)
read_only_fields = ('*', 'custom_virtualenv',)
def get_related(self, obj):
res = super(JobTemplateSerializer, self).get_related(obj)
@@ -3946,12 +3988,12 @@ class ProjectUpdateEventSerializer(JobEventSerializer):
return UriCleaner.remove_sensitive(obj.stdout)
def get_event_data(self, obj):
# the project update playbook uses the git, hg, or svn modules
# the project update playbook uses the git or svn modules
# to clone repositories, and those modules are prone to printing
# raw SCM URLs in their stdout (which *could* contain passwords)
# attempt to detect and filter HTTP basic auth passwords in the stdout
# of these types of events
if obj.event_data.get('task_action') in ('git', 'hg', 'svn'):
if obj.event_data.get('task_action') in ('git', 'svn'):
try:
return json.loads(
UriCleaner.remove_sensitive(
@@ -4732,10 +4774,10 @@ class InstanceGroupSerializer(BaseSerializer):
'Isolated groups have a designated controller group.'),
read_only=True
)
is_containerized = serializers.BooleanField(
is_container_group = serializers.BooleanField(
required=False,
help_text=_('Indicates whether instances in this group are containerized.'
'Containerized groups have a designated Openshift or Kubernetes cluster.'),
read_only=True
'Containerized groups have a designated Openshift or Kubernetes cluster.')
)
# NOTE: help_text is duplicated from field definitions, no obvious way of
# both defining field details here and also getting the field's help_text
@@ -4762,7 +4804,7 @@ class InstanceGroupSerializer(BaseSerializer):
fields = ("id", "type", "url", "related", "name", "created", "modified",
"capacity", "committed_capacity", "consumed_capacity",
"percent_capacity_remaining", "jobs_running", "jobs_total",
"instances", "controller", "is_controller", "is_isolated", "is_containerized", "credential",
"instances", "controller", "is_controller", "is_isolated", "is_container_group", "credential",
"policy_instance_percentage", "policy_instance_minimum", "policy_instance_list",
"pod_spec_override", "summary_fields")
@@ -4787,17 +4829,17 @@ class InstanceGroupSerializer(BaseSerializer):
raise serializers.ValidationError(_('Isolated instances may not be added or removed from instances groups via the API.'))
if self.instance and self.instance.controller_id is not None:
raise serializers.ValidationError(_('Isolated instance group membership may not be managed via the API.'))
if value and self.instance and self.instance.is_containerized:
if value and self.instance and self.instance.is_container_group:
raise serializers.ValidationError(_('Containerized instances may not be managed via the API'))
return value
def validate_policy_instance_percentage(self, value):
if value and self.instance and self.instance.is_containerized:
if value and self.instance and self.instance.is_container_group:
raise serializers.ValidationError(_('Containerized instances may not be managed via the API'))
return value
def validate_policy_instance_minimum(self, value):
if value and self.instance and self.instance.is_containerized:
if value and self.instance and self.instance.is_container_group:
raise serializers.ValidationError(_('Containerized instances may not be managed via the API'))
return value
@@ -4811,6 +4853,15 @@ class InstanceGroupSerializer(BaseSerializer):
raise serializers.ValidationError(_('Only Kubernetes credentials can be associated with an Instance Group'))
return value
def validate(self, attrs):
attrs = super(InstanceGroupSerializer, self).validate(attrs)
if attrs.get('credential') and not attrs.get('is_container_group'):
raise serializers.ValidationError({'is_container_group': _(
'is_container_group must be True when associating a credential to an Instance Group')})
return attrs
def get_capacity_dict(self):
# Store capacity values (globally computed) in the context
if 'capacity_map' not in self.context:

View File

@@ -4,7 +4,6 @@ The following lists the expected format and details of our rrules:
* DTSTART is expected to be in UTC
* INTERVAL is required
* SECONDLY is not supported
* TZID is not supported
* RRULE must precede the rule statements
* BYDAY is supported but not BYDAY with a numerical prefix
* BYYEARDAY and BYWEEKNO are not supported

View File

@@ -8,7 +8,7 @@ The `period` of the data can be adjusted with:
?period=month
Where `month` can be replaced with `week`, or `day`. `month` is the default.
Where `month` can be replaced with `week`, `two_weeks`, or `day`. `month` is the default.
The type of job can be filtered with:

View File

@@ -0,0 +1,20 @@
from django.conf.urls import url
from awx.api.views import (
ExecutionEnvironmentList,
ExecutionEnvironmentDetail,
ExecutionEnvironmentJobTemplateList,
ExecutionEnvironmentCopy,
ExecutionEnvironmentActivityStreamList,
)
urls = [
url(r'^$', ExecutionEnvironmentList.as_view(), name='execution_environment_list'),
url(r'^(?P<pk>[0-9]+)/$', ExecutionEnvironmentDetail.as_view(), name='execution_environment_detail'),
url(r'^(?P<pk>[0-9]+)/unified_job_templates/$', ExecutionEnvironmentJobTemplateList.as_view(), name='execution_environment_job_template_list'),
url(r'^(?P<pk>[0-9]+)/copy/$', ExecutionEnvironmentCopy.as_view(), name='execution_environment_copy'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', ExecutionEnvironmentActivityStreamList.as_view(), name='execution_environment_activity_stream_list'),
]
__all__ = ['urls']

View File

@@ -9,6 +9,7 @@ from awx.api.views import (
OrganizationUsersList,
OrganizationAdminsList,
OrganizationInventoriesList,
OrganizationExecutionEnvironmentsList,
OrganizationProjectsList,
OrganizationJobTemplatesList,
OrganizationWorkflowJobTemplatesList,
@@ -34,6 +35,7 @@ urls = [
url(r'^(?P<pk>[0-9]+)/users/$', OrganizationUsersList.as_view(), name='organization_users_list'),
url(r'^(?P<pk>[0-9]+)/admins/$', OrganizationAdminsList.as_view(), name='organization_admins_list'),
url(r'^(?P<pk>[0-9]+)/inventories/$', OrganizationInventoriesList.as_view(), name='organization_inventories_list'),
url(r'^(?P<pk>[0-9]+)/execution_environments/$', OrganizationExecutionEnvironmentsList.as_view(), name='organization_execution_environments_list'),
url(r'^(?P<pk>[0-9]+)/projects/$', OrganizationProjectsList.as_view(), name='organization_projects_list'),
url(r'^(?P<pk>[0-9]+)/job_templates/$', OrganizationJobTemplatesList.as_view(), name='organization_job_templates_list'),
url(r'^(?P<pk>[0-9]+)/workflow_job_templates/$', OrganizationWorkflowJobTemplatesList.as_view(), name='organization_workflow_job_templates_list'),

View File

@@ -15,6 +15,7 @@ from awx.api.views import (
ApiV2PingView,
ApiV2ConfigView,
ApiV2SubscriptionView,
ApiV2AttachView,
AuthView,
UserMeList,
DashboardView,
@@ -41,6 +42,7 @@ from .user import urls as user_urls
from .project import urls as project_urls
from .project_update import urls as project_update_urls
from .inventory import urls as inventory_urls
from .execution_environments import urls as execution_environment_urls
from .team import urls as team_urls
from .host import urls as host_urls
from .group import urls as group_urls
@@ -94,6 +96,7 @@ v2_urls = [
url(r'^ping/$', ApiV2PingView.as_view(), name='api_v2_ping_view'),
url(r'^config/$', ApiV2ConfigView.as_view(), name='api_v2_config_view'),
url(r'^config/subscriptions/$', ApiV2SubscriptionView.as_view(), name='api_v2_subscription_view'),
url(r'^config/attach/$', ApiV2AttachView.as_view(), name='api_v2_attach_view'),
url(r'^auth/$', AuthView.as_view()),
url(r'^me/$', UserMeList.as_view(), name='user_me_list'),
url(r'^dashboard/$', DashboardView.as_view(), name='dashboard_view'),
@@ -104,6 +107,7 @@ v2_urls = [
url(r'^schedules/', include(schedule_urls)),
url(r'^organizations/', include(organization_urls)),
url(r'^users/', include(user_urls)),
url(r'^execution_environments/', include(execution_environment_urls)),
url(r'^projects/', include(project_urls)),
url(r'^project_updates/', include(project_update_urls)),
url(r'^teams/', include(team_urls)),

View File

@@ -112,6 +112,7 @@ from awx.api.views.organization import ( # noqa
OrganizationInventoriesList,
OrganizationUsersList,
OrganizationAdminsList,
OrganizationExecutionEnvironmentsList,
OrganizationProjectsList,
OrganizationJobTemplatesList,
OrganizationWorkflowJobTemplatesList,
@@ -153,6 +154,7 @@ from awx.api.views.root import ( # noqa
ApiV2PingView,
ApiV2ConfigView,
ApiV2SubscriptionView,
ApiV2AttachView,
)
from awx.api.views.webhooks import ( # noqa
WebhookKeyView,
@@ -241,8 +243,6 @@ class DashboardView(APIView):
git_failed_projects = git_projects.filter(last_job_failed=True)
svn_projects = user_projects.filter(scm_type='svn')
svn_failed_projects = svn_projects.filter(last_job_failed=True)
hg_projects = user_projects.filter(scm_type='hg')
hg_failed_projects = hg_projects.filter(last_job_failed=True)
archive_projects = user_projects.filter(scm_type='archive')
archive_failed_projects = archive_projects.filter(last_job_failed=True)
data['scm_types'] = {}
@@ -256,11 +256,6 @@ class DashboardView(APIView):
'failures_url': reverse('api:project_list', request=request) + "?scm_type=svn&last_job_failed=True",
'total': svn_projects.count(),
'failed': svn_failed_projects.count()}
data['scm_types']['hg'] = {'url': reverse('api:project_list', request=request) + "?scm_type=hg",
'label': 'Mercurial',
'failures_url': reverse('api:project_list', request=request) + "?scm_type=hg&last_job_failed=True",
'total': hg_projects.count(),
'failed': hg_failed_projects.count()}
data['scm_types']['archive'] = {'url': reverse('api:project_list', request=request) + "?scm_type=archive",
'label': 'Remote Archive',
'failures_url': reverse('api:project_list', request=request) + "?scm_type=archive&last_job_failed=True",
@@ -316,6 +311,9 @@ class DashboardJobsGraphView(APIView):
if period == 'month':
end_date = start_date - dateutil.relativedelta.relativedelta(months=1)
interval = 'days'
elif period == 'two_weeks':
end_date = start_date - dateutil.relativedelta.relativedelta(weeks=2)
interval = 'days'
elif period == 'week':
end_date = start_date - dateutil.relativedelta.relativedelta(weeks=1)
interval = 'days'
@@ -399,7 +397,7 @@ class InstanceGroupDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAP
permission_classes = (InstanceGroupTowerPermission,)
def update_raw_data(self, data):
if self.get_object().is_containerized:
if self.get_object().is_container_group:
data.pop('policy_instance_percentage', None)
data.pop('policy_instance_minimum', None)
data.pop('policy_instance_list', None)
@@ -688,6 +686,52 @@ class TeamAccessList(ResourceAccessList):
parent_model = models.Team
class ExecutionEnvironmentList(ListCreateAPIView):
always_allow_superuser = False
model = models.ExecutionEnvironment
serializer_class = serializers.ExecutionEnvironmentSerializer
swagger_topic = "Execution Environments"
class ExecutionEnvironmentDetail(RetrieveUpdateDestroyAPIView):
always_allow_superuser = False
model = models.ExecutionEnvironment
serializer_class = serializers.ExecutionEnvironmentSerializer
swagger_topic = "Execution Environments"
class ExecutionEnvironmentJobTemplateList(SubListAPIView):
model = models.UnifiedJobTemplate
serializer_class = serializers.UnifiedJobTemplateSerializer
parent_model = models.ExecutionEnvironment
relationship = 'unifiedjobtemplates'
class ExecutionEnvironmentCopy(CopyAPIView):
model = models.ExecutionEnvironment
copy_return_serializer_class = serializers.ExecutionEnvironmentSerializer
class ExecutionEnvironmentActivityStreamList(SubListAPIView):
model = models.ActivityStream
serializer_class = serializers.ActivityStreamSerializer
parent_model = models.ExecutionEnvironment
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(execution_environment=parent)
class ProjectList(ListCreateAPIView):
model = models.Project
@@ -4253,7 +4297,9 @@ class NotificationTemplateDetail(RetrieveUpdateDestroyAPIView):
obj = self.get_object()
if not request.user.can_access(self.model, 'delete', obj):
return Response(status=status.HTTP_404_NOT_FOUND)
if obj.notifications.filter(status='pending').exists():
hours_old = now() - dateutil.relativedelta.relativedelta(hours=8)
if obj.notifications.filter(status='pending', created__gt=hours_old).exists():
return Response({"error": _("Delete not allowed while there are pending notifications")},
status=status.HTTP_405_METHOD_NOT_ALLOWED)
return super(NotificationTemplateDetail, self).delete(request, *args, **kwargs)

View File

@@ -13,7 +13,9 @@ from django.utils.translation import ugettext_lazy as _
from awx.main.models import (
ActivityStream,
Inventory,
Host,
Project,
ExecutionEnvironment,
JobTemplate,
WorkflowJobTemplate,
Organization,
@@ -44,6 +46,7 @@ from awx.api.serializers import (
RoleSerializer,
NotificationTemplateSerializer,
InstanceGroupSerializer,
ExecutionEnvironmentSerializer,
ProjectSerializer, JobTemplateSerializer, WorkflowJobTemplateSerializer,
CredentialSerializer
)
@@ -98,6 +101,7 @@ class OrganizationDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAPI
organization__id=org_id).count()
org_counts['job_templates'] = JobTemplate.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['hosts'] = Host.objects.org_active_count(org_id)
full_context['related_field_counts'] = {}
full_context['related_field_counts'][org_id] = org_counts
@@ -139,6 +143,16 @@ class OrganizationProjectsList(SubListCreateAPIView):
parent_key = 'organization'
class OrganizationExecutionEnvironmentsList(SubListCreateAttachDetachAPIView):
model = ExecutionEnvironment
serializer_class = ExecutionEnvironmentSerializer
parent_model = Organization
relationship = 'executionenvironments'
parent_key = 'organization'
swagger_topic = "Execution Environments"
class OrganizationJobTemplatesList(SubListCreateAPIView):
model = JobTemplate

View File

@@ -1,9 +1,10 @@
# Copyright (c) 2018 Ansible, Inc.
# All Rights Reserved.
import base64
import json
import logging
import operator
import json
from collections import OrderedDict
from django.conf import settings
@@ -29,8 +30,8 @@ from awx.main.utils import (
get_custom_venv_choices,
to_python_boolean,
)
from awx.main.utils.licensing import validate_entitlement_manifest
from awx.api.versioning import reverse, drf_reverse
from awx.conf.license import get_license
from awx.main.constants import PRIVILEGE_ESCALATION_METHODS
from awx.main.models import (
Project,
@@ -99,6 +100,7 @@ class ApiVersionRootView(APIView):
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['execution_environments'] = reverse('api:execution_environment_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)
@@ -178,7 +180,7 @@ class ApiV2PingView(APIView):
class ApiV2SubscriptionView(APIView):
permission_classes = (IsAuthenticated,)
name = _('Configuration')
name = _('Subscriptions')
swagger_topic = 'System Configuration'
def check_permissions(self, request):
@@ -189,18 +191,18 @@ class ApiV2SubscriptionView(APIView):
def post(self, request):
from awx.main.utils.common import get_licenser
data = request.data.copy()
if data.get('rh_password') == '$encrypted$':
data['rh_password'] = settings.REDHAT_PASSWORD
if data.get('subscriptions_password') == '$encrypted$':
data['subscriptions_password'] = settings.SUBSCRIPTIONS_PASSWORD
try:
user, pw = data.get('rh_username'), data.get('rh_password')
user, pw = data.get('subscriptions_username'), data.get('subscriptions_password')
with set_environ(**settings.AWX_TASK_ENV):
validated = get_licenser().validate_rh(user, pw)
if user:
settings.REDHAT_USERNAME = data['rh_username']
settings.SUBSCRIPTIONS_USERNAME = data['subscriptions_username']
if pw:
settings.REDHAT_PASSWORD = data['rh_password']
settings.SUBSCRIPTIONS_PASSWORD = data['subscriptions_password']
except Exception as exc:
msg = _("Invalid License")
msg = _("Invalid Subscription")
if (
isinstance(exc, requests.exceptions.HTTPError) and
getattr(getattr(exc, 'response', None), 'status_code', None) == 401
@@ -213,13 +215,63 @@ class ApiV2SubscriptionView(APIView):
elif isinstance(exc, (ValueError, OSError)) and exc.args:
msg = exc.args[0]
else:
logger.exception(smart_text(u"Invalid license submitted."),
logger.exception(smart_text(u"Invalid subscription submitted."),
extra=dict(actor=request.user.username))
return Response({"error": msg}, status=status.HTTP_400_BAD_REQUEST)
return Response(validated)
class ApiV2AttachView(APIView):
permission_classes = (IsAuthenticated,)
name = _('Attach Subscription')
swagger_topic = 'System Configuration'
def check_permissions(self, request):
super(ApiV2AttachView, self).check_permissions(request)
if not request.user.is_superuser and request.method.lower() not in {'options', 'head'}:
self.permission_denied(request) # Raises PermissionDenied exception.
def post(self, request):
data = request.data.copy()
pool_id = data.get('pool_id', None)
if not pool_id:
return Response({"error": _("No subscription pool ID provided.")}, status=status.HTTP_400_BAD_REQUEST)
user = getattr(settings, 'SUBSCRIPTIONS_USERNAME', None)
pw = getattr(settings, 'SUBSCRIPTIONS_PASSWORD', None)
if pool_id and user and pw:
from awx.main.utils.common import get_licenser
data = request.data.copy()
try:
with set_environ(**settings.AWX_TASK_ENV):
validated = get_licenser().validate_rh(user, pw)
except Exception as exc:
msg = _("Invalid Subscription")
if (
isinstance(exc, requests.exceptions.HTTPError) and
getattr(getattr(exc, 'response', None), 'status_code', None) == 401
):
msg = _("The provided credentials are invalid (HTTP 401).")
elif isinstance(exc, requests.exceptions.ProxyError):
msg = _("Unable to connect to proxy server.")
elif isinstance(exc, requests.exceptions.ConnectionError):
msg = _("Could not connect to subscription service.")
elif isinstance(exc, (ValueError, OSError)) and exc.args:
msg = exc.args[0]
else:
logger.exception(smart_text(u"Invalid subscription submitted."),
extra=dict(actor=request.user.username))
return Response({"error": msg}, status=status.HTTP_400_BAD_REQUEST)
for sub in validated:
if sub['pool_id'] == pool_id:
sub['valid_key'] = True
settings.LICENSE = sub
return Response(sub)
return Response({"error": _("Error processing subscription metadata.")}, status=status.HTTP_400_BAD_REQUEST)
class ApiV2ConfigView(APIView):
permission_classes = (IsAuthenticated,)
@@ -234,15 +286,11 @@ class ApiV2ConfigView(APIView):
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)
from awx.main.utils.common import get_licenser
license_data = get_licenser().validate()
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'
@@ -281,9 +329,10 @@ class ApiV2ConfigView(APIView):
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)
return Response({"error": _("Invalid subscription 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:
@@ -300,25 +349,47 @@ class ApiV2ConfigView(APIView):
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)
from awx.main.utils.common import get_licenser
license_data = json.loads(data_actual)
if 'license_key' in license_data:
return Response({"error": _('Legacy license submitted. A subscription manifest is now required.')}, status=status.HTTP_400_BAD_REQUEST)
if 'manifest' in license_data:
try:
json_actual = json.loads(base64.b64decode(license_data['manifest']))
if 'license_key' in json_actual:
return Response(
{"error": _('Legacy license submitted. A subscription manifest is now required.')},
status=status.HTTP_400_BAD_REQUEST
)
except Exception:
pass
try:
license_data = validate_entitlement_manifest(license_data['manifest'])
except ValueError as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
except Exception:
logger.exception('Invalid manifest submitted. {}')
return Response({"error": _('Invalid manifest submitted.')}, status=status.HTTP_400_BAD_REQUEST)
try:
license_data_validated = get_licenser().license_from_manifest(license_data)
except Exception:
logger.warning(smart_text(u"Invalid subscription submitted."),
extra=dict(actor=request.user.username))
return Response({"error": _("Invalid License")}, status=status.HTTP_400_BAD_REQUEST)
else:
license_data_validated = get_licenser().validate()
# If the license is valid, write it to the database.
if license_data_validated['valid_key']:
settings.LICENSE = license_data
if not settings_registry.is_setting_read_only('TOWER_URL_BASE'):
settings.TOWER_URL_BASE = "{}://{}".format(request.scheme, request.get_host())
return Response(license_data_validated)
logger.warning(smart_text(u"Invalid license submitted."),
logger.warning(smart_text(u"Invalid subscription submitted."),
extra=dict(actor=request.user.username))
return Response({"error": _("Invalid license")}, status=status.HTTP_400_BAD_REQUEST)
return Response({"error": _("Invalid subscription")}, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request):
try:

View File

@@ -25,10 +25,12 @@ if MODE == 'production':
try:
fd = open("/var/lib/awx/.tower_version", "r")
if fd.read().strip() != tower_version:
raise Exception()
except Exception:
raise ValueError()
except FileNotFoundError:
pass
except ValueError as e:
logger.error("Missing or incorrect metadata for Tower version. Ensure Tower was installed using the setup playbook.")
raise Exception("Missing or incorrect metadata for Tower version. Ensure Tower was installed using the setup playbook.")
raise Exception("Missing or incorrect metadata for Tower version. Ensure Tower was installed using the setup playbook.") from e
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "awx.settings")

View File

@@ -14,6 +14,7 @@ from rest_framework.fields import ( # noqa
BooleanField, CharField, ChoiceField, DictField, DateTimeField, EmailField,
IntegerField, ListField, NullBooleanField
)
from rest_framework.serializers import PrimaryKeyRelatedField # noqa
logger = logging.getLogger('awx.conf.fields')

View File

@@ -1,18 +1,14 @@
# Copyright (c) 2016 Ansible, Inc.
# All Rights Reserved.
__all__ = ['get_license']
def _get_validated_license_data():
from awx.main.utils.common import get_licenser
from awx.main.utils import get_licenser
return get_licenser().validate()
def get_license(show_key=False):
def get_license():
"""Return a dictionary representing the active license on this Tower instance."""
license_data = _get_validated_license_data()
if not show_key:
license_data.pop('license_key', None)
return license_data
return _get_validated_license_data()

View File

@@ -23,4 +23,4 @@ class Migration(migrations.Migration):
operations = [
migrations.RunPython(copy_session_settings, reverse_copy_session_settings),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 2.2.11 on 2020-08-04 15:19
import logging
from django.db import migrations
from awx.conf.migrations._subscriptions import clear_old_license, prefill_rh_credentials
logger = logging.getLogger('awx.conf.migrations')
def _noop(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('conf', '0007_v380_rename_more_settings'),
]
operations = [
migrations.RunPython(clear_old_license, _noop),
migrations.RunPython(prefill_rh_credentials, _noop)
]

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
import logging
from django.utils.timezone import now
from awx.main.utils.encryption import decrypt_field, encrypt_field
logger = logging.getLogger('awx.conf.settings')
__all__ = ['clear_old_license', 'prefill_rh_credentials']
def clear_old_license(apps, schema_editor):
Setting = apps.get_model('conf', 'Setting')
Setting.objects.filter(key='LICENSE').delete()
def _migrate_setting(apps, old_key, new_key, encrypted=False):
Setting = apps.get_model('conf', 'Setting')
if not Setting.objects.filter(key=old_key).exists():
return
new_setting = Setting.objects.create(key=new_key,
created=now(),
modified=now()
)
if encrypted:
new_setting.value = decrypt_field(Setting.objects.filter(key=old_key).first(), 'value')
new_setting.value = encrypt_field(new_setting, 'value')
else:
new_setting.value = getattr(Setting.objects.filter(key=old_key).first(), 'value')
new_setting.save()
def prefill_rh_credentials(apps, schema_editor):
_migrate_setting(apps, 'REDHAT_USERNAME', 'SUBSCRIPTIONS_USERNAME', encrypted=False)
_migrate_setting(apps, 'REDHAT_PASSWORD', 'SUBSCRIPTIONS_PASSWORD', encrypted=True)

View File

@@ -78,14 +78,6 @@ 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

@@ -4,6 +4,7 @@ import logging
import sys
import threading
import time
import os
# Django
from django.conf import LazySettings
@@ -247,6 +248,7 @@ class SettingsWrapper(UserSettingsHolder):
# These values have to be stored via self.__dict__ in this way to get
# around the magic __setattr__ method on this class (which is used to
# store API-assigned settings in the database).
self.__dict__['__forks__'] = {}
self.__dict__['default_settings'] = default_settings
self.__dict__['_awx_conf_settings'] = self
self.__dict__['_awx_conf_preload_expires'] = None
@@ -255,6 +257,26 @@ class SettingsWrapper(UserSettingsHolder):
self.__dict__['cache'] = EncryptedCacheProxy(cache, registry)
self.__dict__['registry'] = registry
# record the current pid so we compare it post-fork for
# processes like the dispatcher and callback receiver
self.__dict__['pid'] = os.getpid()
def __clean_on_fork__(self):
pid = os.getpid()
# if the current pid does *not* match the value on self, it means
# that value was copied on fork, and we're now in a *forked* process;
# the *first* time we enter this code path (on setting access),
# forcibly close DB/cache sockets and set a marker so we don't run
# this code again _in this process_
#
if pid != self.__dict__['pid'] and pid not in self.__dict__['__forks__']:
self.__dict__['__forks__'][pid] = True
# It's important to close these post-fork, because we
# don't want the forked processes to inherit the open sockets
# for the DB and cache connections (that way lies race conditions)
connection.close()
django_cache.close()
@cached_property
def all_supported_settings(self):
return self.registry.get_registered_settings()

View File

@@ -3354,6 +3354,15 @@ msgid ""
"common scenarios."
msgstr ""
#: awx/main/models/credential/__init__.py:824
msgid "Region Name"
msgstr ""
#: awx/main/models/credential/__init__.py:826
msgid ""
"For some cloud providers, like OVH, region must be specified."
msgstr ""
#: awx/main/models/credential/__init__.py:824
#: awx/main/models/credential/__init__.py:1131
#: awx/main/models/credential/__init__.py:1166

View File

@@ -3354,6 +3354,15 @@ msgid ""
"common scenarios."
msgstr ""
#: awx/main/models/credential/__init__.py:824
msgid "Region Name"
msgstr ""
#: awx/main/models/credential/__init__.py:826
msgid ""
"For some cloud providers, like OVH, region must be specified."
msgstr ""
#: awx/main/models/credential/__init__.py:824
#: awx/main/models/credential/__init__.py:1131
#: awx/main/models/credential/__init__.py:1166

View File

@@ -3294,6 +3294,16 @@ msgid ""
"common scenarios."
msgstr "Les domaines OpenStack définissent les limites administratives. Ils sont nécessaires uniquement pour les URL dauthentification Keystone v3. Voir la documentation Ansible Tower pour les scénarios courants."
#: awx/main/models/credential/__init__.py:824
msgid "Region Name"
msgstr "Nom de la region"
#: awx/main/models/credential/__init__.py:826
msgid ""
"For some cloud providers, like OVH, region must be specified."
msgstr ""
"Chez certains fournisseurs, comme OVH, vous devez spécifier le nom de la région"
#: awx/main/models/credential/__init__.py:812
#: awx/main/models/credential/__init__.py:1110
#: awx/main/models/credential/__init__.py:1144

View File

@@ -29,9 +29,9 @@ from awx.main.utils import (
)
from awx.main.models import (
ActivityStream, AdHocCommand, AdHocCommandEvent, Credential, CredentialType,
CredentialInputSource, CustomInventoryScript, Group, Host, Instance, InstanceGroup,
Inventory, InventorySource, InventoryUpdate, InventoryUpdateEvent, Job, JobEvent,
JobHostSummary, JobLaunchConfig, JobTemplate, Label, Notification,
CredentialInputSource, CustomInventoryScript, ExecutionEnvironment, Group, Host, Instance,
InstanceGroup, Inventory, InventorySource, InventoryUpdate, InventoryUpdateEvent, Job,
JobEvent, JobHostSummary, JobLaunchConfig, JobTemplate, Label, Notification,
NotificationTemplate, Organization, Project, ProjectUpdate,
ProjectUpdateEvent, Role, Schedule, SystemJob, SystemJobEvent,
SystemJobTemplate, Team, UnifiedJob, UnifiedJobTemplate, WorkflowJob,
@@ -333,14 +333,14 @@ class BaseAccess(object):
report_violation(_("License has expired."))
free_instances = validation_info.get('free_instances', 0)
available_instances = validation_info.get('available_instances', 0)
instance_count = validation_info.get('instance_count', 0)
if add_host_name:
host_exists = Host.objects.filter(name=add_host_name).exists()
if not host_exists and free_instances == 0:
report_violation(_("License count of %s instances has been reached.") % available_instances)
report_violation(_("License count of %s instances has been reached.") % instance_count)
elif not host_exists and free_instances < 0:
report_violation(_("License count of %s instances has been exceeded.") % available_instances)
report_violation(_("License count of %s instances has been exceeded.") % instance_count)
elif not add_host_name and free_instances < 0:
report_violation(_("Host count exceeds available instances."))
@@ -777,6 +777,11 @@ class OrganizationAccess(NotificationAttachMixin, BaseAccess):
@check_superuser
def can_change(self, obj, data):
if data and data.get('default_environment'):
ee = get_object_from_data('default_environment', ExecutionEnvironment, data)
if not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
return self.user in obj.admin_role
def can_delete(self, obj):
@@ -1308,6 +1313,54 @@ class TeamAccess(BaseAccess):
*args, **kwargs)
class ExecutionEnvironmentAccess(BaseAccess):
"""
I can see an execution environment when:
- I'm a superuser
- I'm a member of the same organization
- it is a global ExecutionEnvironment
I can create/change an execution environment when:
- I'm a superuser
- I'm an admin for the organization(s)
"""
model = ExecutionEnvironment
select_related = ('organization',)
prefetch_related = ('organization__admin_role', 'organization__execution_environment_admin_role')
def filtered_queryset(self):
return ExecutionEnvironment.objects.filter(
Q(organization__in=Organization.accessible_pk_qs(self.user, 'read_role')) |
Q(organization__isnull=True)
).distinct()
@check_superuser
def can_add(self, data):
if not data: # So the browseable API will work
return Organization.accessible_objects(self.user, 'execution_environment_admin_role').exists()
return self.check_related('organization', Organization, data, mandatory=True,
role_field='execution_environment_admin_role')
def can_change(self, obj, data):
if obj.managed_by_tower:
raise PermissionDenied
if self.user.is_superuser:
return True
if obj and obj.organization_id is None:
raise PermissionDenied
if self.user not in obj.organization.execution_environment_admin_role:
raise PermissionDenied
if data and 'organization' in data:
new_org = get_object_from_data('organization', Organization, data, obj=obj)
if not new_org or self.user not in new_org.execution_environment_admin_role:
return False
return self.check_related('organization', Organization, data, obj=obj, mandatory=True,
role_field='execution_environment_admin_role')
def can_delete(self, obj):
return self.can_change(obj, None)
class ProjectAccess(NotificationAttachMixin, BaseAccess):
'''
I can see projects when:
@@ -1337,14 +1390,29 @@ class ProjectAccess(NotificationAttachMixin, 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) and
self.check_related('credential', Credential, data, role_field='use_role'))
if data.get('default_environment'):
ee = get_object_from_data('default_environment', ExecutionEnvironment, data)
if not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
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):
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'))
if data and data.get('default_environment'):
ee = get_object_from_data('default_environment', ExecutionEnvironment, data, obj=obj)
if not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
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):
@@ -1449,6 +1517,10 @@ class JobTemplateAccess(NotificationAttachMixin, BaseAccess):
if self.user not in inventory.use_role:
return False
ee = get_value(ExecutionEnvironment, 'execution_environment')
if ee and not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
project = get_value(Project, 'project')
# If the user has admin access to the project (as an org admin), should
# be able to proceed without additional checks.
@@ -1496,6 +1568,11 @@ class JobTemplateAccess(NotificationAttachMixin, BaseAccess):
if self.changes_are_non_sensitive(obj, data):
return True
if data.get('execution_environment'):
ee = get_object_from_data('execution_environment', ExecutionEnvironment, data)
if not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
for required_field, cls in (('inventory', Inventory), ('project', Project)):
is_mandatory = True
if not getattr(obj, '{}_id'.format(required_field)):
@@ -1926,6 +2003,11 @@ class WorkflowJobTemplateAccess(NotificationAttachMixin, BaseAccess):
if not data: # So the browseable API will work
return Organization.accessible_objects(self.user, 'workflow_admin_role').exists()
if data.get('execution_environment'):
ee = get_object_from_data('execution_environment', ExecutionEnvironment, data)
if not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
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')
@@ -1975,6 +2057,11 @@ class WorkflowJobTemplateAccess(NotificationAttachMixin, BaseAccess):
if self.user.is_superuser:
return True
if data and data.get('execution_environment'):
ee = get_object_from_data('execution_environment', ExecutionEnvironment, data)
if not self.user.can_access(ExecutionEnvironment, 'read', ee):
return False
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

View File

@@ -33,9 +33,9 @@ data _since_ the last report date - i.e., new data in the last 24 hours)
'''
@register('config', '1.1', description=_('General platform configuration.'))
@register('config', '1.2', description=_('General platform configuration.'))
def config(since, **kwargs):
license_info = get_license(show_key=False)
license_info = get_license()
install_type = 'traditional'
if os.environ.get('container') == 'oci':
install_type = 'openshift'
@@ -194,7 +194,6 @@ def instance_info(since, include_hostnames=False, **kwargs):
return info
@register('job_counts', '1.0', description=_('Counts of jobs by status'))
def job_counts(since, **kwargs):
counts = {}
counts['total_jobs'] = models.UnifiedJob.objects.exclude(launch_type='sync').count()
@@ -204,7 +203,6 @@ def job_counts(since, **kwargs):
return counts
@register('job_instance_counts', '1.0', description=_('Counts of jobs by execution node'))
def job_instance_counts(since, **kwargs):
counts = {}
job_types = models.UnifiedJob.objects.exclude(launch_type='sync').values_list(
@@ -282,14 +280,16 @@ def _copy_table(table, query, path):
return file.file_list()
@register('events_table', '1.1', format='csv', description=_('Automation task records'), expensive=True)
@register('events_table', '1.2', format='csv', description=_('Automation task records'), expensive=True)
def events_table(since, full_path, until, **kwargs):
events_query = '''COPY (SELECT main_jobevent.id,
main_jobevent.created,
main_jobevent.modified,
main_jobevent.uuid,
main_jobevent.parent_uuid,
main_jobevent.event,
main_jobevent.event_data::json->'task_action' AS task_action,
(CASE WHEN event = 'playbook_on_stats' THEN event_data END) as playbook_on_stats,
main_jobevent.failed,
main_jobevent.changed,
main_jobevent.playbook,
@@ -311,7 +311,7 @@ def events_table(since, full_path, until, **kwargs):
return _copy_table(table='events', query=events_query, path=full_path)
@register('unified_jobs_table', '1.1', format='csv', description=_('Data on jobs run'), expensive=True)
@register('unified_jobs_table', '1.2', format='csv', description=_('Data on jobs run'), expensive=True)
def unified_jobs_table(since, full_path, until, **kwargs):
unified_job_query = '''COPY (SELECT main_unifiedjob.id,
main_unifiedjob.polymorphic_ctype_id,
@@ -334,7 +334,9 @@ def unified_jobs_table(since, full_path, until, **kwargs):
main_unifiedjob.finished,
main_unifiedjob.elapsed,
main_unifiedjob.job_explanation,
main_unifiedjob.instance_group_id
main_unifiedjob.instance_group_id,
main_unifiedjob.installed_collections,
main_unifiedjob.ansible_version
FROM main_unifiedjob
JOIN django_content_type ON main_unifiedjob.polymorphic_ctype_id = django_content_type.id
LEFT JOIN main_job ON main_unifiedjob.id = main_job.unifiedjob_ptr_id

View File

@@ -24,7 +24,7 @@ logger = logging.getLogger('awx.main.analytics')
def _valid_license():
try:
if get_license(show_key=False).get('license_type', 'UNLICENSED') == 'open':
if get_license().get('license_type', 'UNLICENSED') == 'open':
return False
access_registry[Job](None).check_license()
except PermissionDenied:
@@ -68,7 +68,7 @@ def register(key, version, description=None, format='json', expensive=False):
@register('projects_by_scm_type', 1)
def projects_by_scm_type():
return {'git': 5, 'svn': 1, 'hg': 0}
return {'git': 5, 'svn': 1}
"""
def decorate(f):
@@ -102,7 +102,7 @@ def gather(dest=None, module=None, subset = None, since = None, until = now(), c
last_run = since or settings.AUTOMATION_ANALYTICS_LAST_GATHER or (now() - timedelta(weeks=4))
logger.debug("Last analytics run was: {}".format(settings.AUTOMATION_ANALYTICS_LAST_GATHER))
if _valid_license() is False:
logger.exception("Invalid License provided, or No License Provided")
return None

View File

@@ -12,7 +12,7 @@ from prometheus_client import (
from awx.conf.license import get_license
from awx.main.utils import (get_awx_version, get_ansible_version)
from awx.main.analytics.collectors import (
counts,
counts,
instance_info,
job_instance_counts,
job_counts,
@@ -54,7 +54,7 @@ LICENSE_INSTANCE_FREE = Gauge('awx_license_instance_free', 'Number of remaining
def metrics():
license_info = get_license(show_key=False)
license_info = get_license()
SYSTEM_INFO.info({
'install_uuid': settings.INSTALL_UUID,
'insights_analytics': str(settings.INSIGHTS_TRACKING_STATE),
@@ -68,7 +68,7 @@ def metrics():
'external_logger_type': getattr(settings, 'LOG_AGGREGATOR_TYPE', 'None')
})
LICENSE_INSTANCE_TOTAL.set(str(license_info.get('available_instances', 0)))
LICENSE_INSTANCE_TOTAL.set(str(license_info.get('instance_count', 0)))
LICENSE_INSTANCE_FREE.set(str(license_info.get('free_instances', 0)))
current_counts = counts(None)

View File

@@ -1,7 +1,5 @@
# Python
import json
import logging
import os
# Django
from django.utils.translation import ugettext_lazy as _
@@ -12,6 +10,8 @@ from rest_framework.fields import FloatField
# Tower
from awx.conf import fields, register, register_validate
from awx.main.models import ExecutionEnvironment
logger = logging.getLogger('awx.main.conf')
@@ -92,22 +92,10 @@ register(
)
def _load_default_license_from_file():
try:
license_file = os.environ.get('AWX_LICENSE_FILE', '/etc/tower/license')
if os.path.exists(license_file):
license_data = json.load(open(license_file))
logger.debug('Read license data from "%s".', license_file)
return license_data
except Exception:
logger.warning('Could not read license from "%s".', license_file, exc_info=True)
return {}
register(
'LICENSE',
field_class=fields.DictField,
default=_load_default_license_from_file,
default=lambda: {},
label=_('License'),
help_text=_('The license controls which features and functionality are '
'enabled. Use /api/v2/config/ to update or change '
@@ -124,7 +112,7 @@ register(
encrypted=False,
read_only=False,
label=_('Red Hat customer username'),
help_text=_('This username is used to retrieve license information and to send Automation Analytics'), # noqa
help_text=_('This username is used to send data to Automation Analytics'),
category=_('System'),
category_slug='system',
)
@@ -137,7 +125,33 @@ register(
encrypted=True,
read_only=False,
label=_('Red Hat customer password'),
help_text=_('This password is used to retrieve license information and to send Automation Analytics'), # noqa
help_text=_('This password is used to send data to Automation Analytics'),
category=_('System'),
category_slug='system',
)
register(
'SUBSCRIPTIONS_USERNAME',
field_class=fields.CharField,
default='',
allow_blank=True,
encrypted=False,
read_only=False,
label=_('Red Hat or Satellite username'),
help_text=_('This username is used to retrieve subscription and content information'), # noqa
category=_('System'),
category_slug='system',
)
register(
'SUBSCRIPTIONS_PASSWORD',
field_class=fields.CharField,
default='',
allow_blank=True,
encrypted=True,
read_only=False,
label=_('Red Hat or Satellite password'),
help_text=_('This password is used to retrieve subscription and content information'), # noqa
category=_('System'),
category_slug='system',
)
@@ -163,6 +177,18 @@ register(
read_only=True,
)
register(
'DEFAULT_EXECUTION_ENVIRONMENT',
field_class=fields.PrimaryKeyRelatedField,
allow_null=True,
default=None,
queryset=ExecutionEnvironment.objects.all(),
label=_('Global default execution environment'),
help_text=_('.'),
category=_('System'),
category_slug='system',
)
register(
'CUSTOM_VENV_PATHS',
field_class=fields.StringListPathField,

View File

@@ -75,7 +75,7 @@ class WebsocketSecretAuthHelper:
nonce_diff = now - nonce_parsed
if abs(nonce_diff) > nonce_tolerance:
logger.warn(f"Potential replay attack or machine(s) time out of sync by {nonce_diff} seconds.")
raise ValueError("Potential replay attack or machine(s) time out of sync by {nonce_diff} seconds.")
raise ValueError(f"Potential replay attack or machine(s) time out of sync by {nonce_diff} seconds.")
return True

View File

@@ -0,0 +1,142 @@
from .plugin import CredentialPlugin, raise_for_status
from django.utils.translation import ugettext_lazy as _
from urllib.parse import urljoin
import requests
pas_inputs = {
'fields': [{
'id': 'url',
'label': _('Centrify Tenant URL'),
'type': 'string',
'help_text': _('Centrify Tenant URL'),
'format': 'url',
}, {
'id':'client_id',
'label':_('Centrify API User'),
'type':'string',
'help_text': _('Centrify API User, having necessary permissions as mentioned in support doc'),
}, {
'id':'client_password',
'label':_('Centrify API Password'),
'type':'string',
'help_text': _('Password of Centrify API User with necessary permissions'),
'secret':True,
},{
'id':'oauth_application_id',
'label':_('OAuth2 Application ID'),
'type':'string',
'help_text': _('Application ID of the configured OAuth2 Client (defaults to \'awx\')'),
'default': 'awx',
},{
'id':'oauth_scope',
'label':_('OAuth2 Scope'),
'type':'string',
'help_text': _('Scope of the configured OAuth2 Client (defaults to \'awx\')'),
'default': 'awx',
}],
'metadata': [{
'id': 'account-name',
'label': _('Account Name'),
'type': 'string',
'help_text': _('Local system account or Domain account name enrolled in Centrify Vault. eg. (root or DOMAIN/Administrator)'),
},{
'id': 'system-name',
'label': _('System Name'),
'type': 'string',
'help_text': _('Machine Name enrolled with in Centrify Portal'),
}],
'required': ['url', 'account-name', 'system-name','client_id','client_password'],
}
# generate bearer token to authenticate with PAS portal, Input : Client ID, Client Secret
def handle_auth(**kwargs):
post_data = {
"grant_type": "client_credentials",
"scope": kwargs['oauth_scope']
}
response = requests.post(
kwargs['endpoint'],
data = post_data,
auth = (kwargs['client_id'],kwargs['client_password']),
verify = True,
timeout = (5, 30)
)
raise_for_status(response)
try:
return response.json()['access_token']
except KeyError:
raise RuntimeError('OAuth request to tenant was unsuccessful')
# fetch the ID of system with RedRock query, Input : System Name, Account Name
def get_ID(**kwargs):
endpoint = urljoin(kwargs['url'],'/Redrock/query')
name=" Name='{0}' and User='{1}'".format(kwargs['system_name'],kwargs['acc_name'])
query = 'Select ID from VaultAccount where {0}'.format(name)
post_headers = {
"Authorization": "Bearer " + kwargs['access_token'],
"X-CENTRIFY-NATIVE-CLIENT":"true"
}
response = requests.post(
endpoint,
json = {'Script': query},
headers = post_headers,
verify = True,
timeout = (5, 30)
)
raise_for_status(response)
try:
result_str = response.json()["Result"]["Results"]
return result_str[0]["Row"]["ID"]
except (IndexError, KeyError):
raise RuntimeError("Error Detected!! Check the Inputs")
# CheckOut Password from Centrify Vault, Input : ID
def get_passwd(**kwargs):
endpoint = urljoin(kwargs['url'],'/ServerManage/CheckoutPassword')
post_headers = {
"Authorization": "Bearer " + kwargs['access_token'],
"X-CENTRIFY-NATIVE-CLIENT":"true"
}
response = requests.post(
endpoint,
json = {'ID': kwargs['acc_id']},
headers = post_headers,
verify = True,
timeout = (5, 30)
)
raise_for_status(response)
try:
return response.json()["Result"]["Password"]
except KeyError:
raise RuntimeError("Password Not Found")
def centrify_backend(**kwargs):
url = kwargs.get('url')
acc_name = kwargs.get('account-name')
system_name = kwargs.get('system-name')
client_id = kwargs.get('client_id')
client_password = kwargs.get('client_password')
app_id = kwargs.get('oauth_application_id', 'awx')
endpoint = urljoin(url, f'/oauth2/token/{app_id}')
endpoint = {
'endpoint': endpoint,
'client_id': client_id,
'client_password': client_password,
'oauth_scope': kwargs.get('oauth_scope', 'awx')
}
token = handle_auth(**endpoint)
get_id_args = {'system_name':system_name,'acc_name':acc_name,'url':url,'access_token':token}
acc_id = get_ID(**get_id_args)
get_pwd_args = {'url':url,'acc_id':acc_id,'access_token':token}
return get_passwd(**get_pwd_args)
centrify_plugin = CredentialPlugin(
'Centrify Vault Credential Provider Lookup',
inputs=pas_inputs,
backend=centrify_backend
)

View File

@@ -40,6 +40,12 @@ base_inputs = {
'multiline': False,
'secret': True,
'help_text': _('The Secret ID for AppRole Authentication')
}, {
'id': 'namespace',
'label': _('Namespace name (Vault Enterprise only)'),
'type': 'string',
'multiline': False,
'help_text': _('Name of the namespace to use when authenticate and retrieve secrets')
}, {
'id': 'default_auth_path',
'label': _('Path to Approle Auth'),
@@ -137,6 +143,9 @@ def approle_auth(**kwargs):
# AppRole Login
request_kwargs['json'] = {'role_id': role_id, 'secret_id': secret_id}
sess = requests.Session()
# Namespace support
if kwargs.get('namespace'):
sess.headers['X-Vault-Namespace'] = kwargs['namespace']
request_url = '/'.join([url, 'auth', auth_path, 'login']).rstrip('/')
with CertFiles(cacert) as cert:
request_kwargs['verify'] = cert
@@ -164,6 +173,8 @@ def kv_backend(**kwargs):
sess.headers['Authorization'] = 'Bearer {}'.format(token)
# Compatibility header for older installs of Hashicorp Vault
sess.headers['X-Vault-Token'] = token
if kwargs.get('namespace'):
sess.headers['X-Vault-Namespace'] = kwargs['namespace']
if api_version == 'v2':
if kwargs.get('secret_version'):
@@ -222,6 +233,8 @@ def ssh_backend(**kwargs):
sess = requests.Session()
sess.headers['Authorization'] = 'Bearer {}'.format(token)
if kwargs.get('namespace'):
sess.headers['X-Vault-Namespace'] = kwargs['namespace']
# Compatability header for older installs of Hashicorp Vault
sess.headers['X-Vault-Token'] = token
# https://www.vaultproject.io/api/secret/ssh/index.html#sign-ssh-key

View File

@@ -6,6 +6,7 @@ from multiprocessing import Process
from django.conf import settings
from django.db import connections
from schedule import Scheduler
from django_guid.middleware import GuidMiddleware
from awx.main.dispatch.worker import TaskWorker
@@ -35,6 +36,7 @@ class Scheduler(Scheduler):
# If the database connection has a hiccup, re-establish a new
# connection
conn.close_if_unusable_or_obsolete()
GuidMiddleware.set_guid(GuidMiddleware._generate_guid())
self.run_pending()
except Exception:
logger.exception(

View File

@@ -16,6 +16,7 @@ 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 django_guid.middleware import GuidMiddleware
from jinja2 import Template
import psutil
@@ -445,6 +446,8 @@ class AutoscalePool(WorkerPool):
return super(AutoscalePool, self).up()
def write(self, preferred_queue, body):
if 'guid' in body:
GuidMiddleware.set_guid(body['guid'])
try:
# when the cluster heartbeat occurs, clean up internally
if isinstance(body, dict) and 'cluster_node_heartbeat' in body['task']:

View File

@@ -5,6 +5,7 @@ import json
from uuid import uuid4
from django.conf import settings
from django_guid.middleware import GuidMiddleware
from . import pg_bus_conn
@@ -83,6 +84,9 @@ class task:
'kwargs': kwargs,
'task': cls.name
}
guid = GuidMiddleware.get_guid()
if guid:
obj['guid'] = guid
obj.update(**kw)
if callable(queue):
queue = queue()

View File

@@ -1,10 +1,7 @@
import cProfile
import json
import logging
import os
import pstats
import signal
import tempfile
import time
import traceback
@@ -12,6 +9,7 @@ from django.conf import settings
from django.utils.timezone import now as tz_now
from django.db import DatabaseError, OperationalError, connection as django_connection
from django.db.utils import InterfaceError, InternalError
from django_guid.middleware import GuidMiddleware
import psutil
@@ -23,6 +21,7 @@ from awx.main.models import (JobEvent, AdHocCommandEvent, ProjectUpdateEvent,
Job)
from awx.main.tasks import handle_success_and_failure_notifications
from awx.main.models.events import emit_event_detail
from awx.main.utils.profiling import AWXProfiler
from .base import BaseWorker
@@ -40,6 +39,7 @@ class CallbackBrokerWorker(BaseWorker):
MAX_RETRIES = 2
last_stats = time.time()
last_flush = time.time()
total = 0
last_event = ''
prof = None
@@ -48,12 +48,13 @@ class CallbackBrokerWorker(BaseWorker):
self.buff = {}
self.pid = os.getpid()
self.redis = redis.Redis.from_url(settings.BROKER_URL)
self.prof = AWXProfiler("CallbackBrokerWorker")
for key in self.redis.keys('awx_callback_receiver_statistics_*'):
self.redis.delete(key)
def read(self, queue):
try:
res = self.redis.blpop(settings.CALLBACK_QUEUE, timeout=settings.JOB_EVENT_BUFFER_SECONDS)
res = self.redis.blpop(settings.CALLBACK_QUEUE, timeout=1)
if res is None:
return {'event': 'FLUSH'}
self.total += 1
@@ -87,19 +88,12 @@ class CallbackBrokerWorker(BaseWorker):
)
def toggle_profiling(self, *args):
if self.prof:
self.prof.disable()
filename = f'callback-{self.pid}.pstats'
filepath = os.path.join(tempfile.gettempdir(), filename)
with open(filepath, 'w') as f:
pstats.Stats(self.prof, stream=f).sort_stats('cumulative').print_stats()
pstats.Stats(self.prof).dump_stats(filepath + '.raw')
self.prof = False
logger.error(f'profiling is disabled, wrote {filepath}')
else:
self.prof = cProfile.Profile()
self.prof.enable()
if not self.prof.is_started():
self.prof.start()
logger.error('profiling is enabled')
else:
filepath = self.prof.stop()
logger.error(f'profiling is disabled, wrote {filepath}')
def work_loop(self, *args, **kw):
if settings.AWX_CALLBACK_PROFILE:
@@ -110,6 +104,7 @@ class CallbackBrokerWorker(BaseWorker):
now = tz_now()
if (
force or
(time.time() - self.last_flush) > settings.JOB_EVENT_BUFFER_SECONDS or
any([len(events) >= 1000 for events in self.buff.values()])
):
for cls, events in self.buff.items():
@@ -132,6 +127,7 @@ class CallbackBrokerWorker(BaseWorker):
for e in events:
emit_event_detail(e)
self.buff = {}
self.last_flush = time.time()
def perform_work(self, body):
try:
@@ -157,6 +153,8 @@ class CallbackBrokerWorker(BaseWorker):
if body.get('event') == 'EOF':
try:
if 'guid' in body:
GuidMiddleware.set_guid(body['guid'])
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
@@ -181,6 +179,8 @@ class CallbackBrokerWorker(BaseWorker):
handle_success_and_failure_notifications.apply_async([uj.id])
except Exception:
logger.exception('Worker failed to emit notifications: Job {}'.format(job_identifier))
finally:
GuidMiddleware.set_guid('')
return
event = cls.create_from_data(**body)

View File

@@ -6,6 +6,9 @@ import traceback
from kubernetes.config import kube_config
from django.conf import settings
from django_guid.middleware import GuidMiddleware
from awx.main.tasks import dispatch_startup, inform_cluster_of_shutdown
from .base import BaseWorker
@@ -52,6 +55,8 @@ class TaskWorker(BaseWorker):
uuid = body.get('uuid', '<unknown>')
args = body.get('args', [])
kwargs = body.get('kwargs', {})
if 'guid' in body:
GuidMiddleware.set_guid(body.pop('guid'))
_call = TaskWorker.resolve_callable(task)
if inspect.isclass(_call):
# the callable is a class, e.g., RunJob; instantiate and
@@ -81,6 +86,7 @@ class TaskWorker(BaseWorker):
'task': u'awx.main.tasks.RunProjectUpdate'
}
'''
settings.__clean_on_fork__()
result = None
try:
result = self.run_callable(body)

View File

@@ -30,3 +30,10 @@ class _AwxTaskError():
AwxTaskError = _AwxTaskError()
class PostRunError(Exception):
def __init__(self, msg, status='failed', tb=''):
self.status = status
self.tb = tb
super(PostRunError, self).__init__(msg)

View File

@@ -6,7 +6,7 @@ import stat
import tempfile
import time
import logging
import yaml
import datetime
from django.conf import settings
import ansible_runner
@@ -31,7 +31,7 @@ def set_pythonpath(venv_libdir, env):
class IsolatedManager(object):
def __init__(self, event_handler, canceled_callback=None, check_callback=None, pod_manager=None):
def __init__(self, event_handler, canceled_callback=None, check_callback=None):
"""
:param event_handler: a callable used to persist event data from isolated nodes
:param canceled_callback: a callable - which returns `True` or `False`
@@ -44,28 +44,12 @@ class IsolatedManager(object):
self.started_at = None
self.captured_command_artifact = False
self.instance = None
self.pod_manager = pod_manager
def build_inventory(self, hosts):
if self.instance and self.instance.is_containerized:
inventory = {'all': {'hosts': {}}}
fd, path = tempfile.mkstemp(
prefix='.kubeconfig', dir=self.private_data_dir
)
with open(path, 'wb') as temp:
temp.write(yaml.dump(self.pod_manager.kube_config).encode())
temp.flush()
os.chmod(temp.name, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
for host in hosts:
inventory['all']['hosts'][host] = {
"ansible_connection": "kubectl",
"ansible_kubectl_config": path,
}
else:
inventory = '\n'.join([
'{} ansible_ssh_user={}'.format(host, settings.AWX_ISOLATED_USERNAME)
for host in hosts
])
inventory = '\n'.join([
'{} ansible_ssh_user={}'.format(host, settings.AWX_ISOLATED_USERNAME)
for host in hosts
])
return inventory
@@ -123,6 +107,7 @@ class IsolatedManager(object):
dir=private_data_dir
)
params = self.runner_params.copy()
params.get('envvars', dict())['ANSIBLE_CALLBACK_WHITELIST'] = 'profile_tasks'
params['playbook'] = playbook
params['private_data_dir'] = iso_dir
if idle_timeout:
@@ -149,7 +134,6 @@ class IsolatedManager(object):
# don't rsync source control metadata (it can be huge!)
'- /project/.git',
'- /project/.svn',
'- /project/.hg',
# don't rsync job events that are in the process of being written
'- /artifacts/job_events/*-partial.json.tmp',
# don't rsync the ssh_key FIFO
@@ -169,7 +153,8 @@ class IsolatedManager(object):
extravars = {
'src': self.private_data_dir,
'dest': settings.AWX_PROOT_BASE_PATH,
'ident': self.ident
'ident': self.ident,
'job_id': self.instance.id,
}
if playbook:
extravars['playbook'] = playbook
@@ -205,7 +190,10 @@ class IsolatedManager(object):
:param interval: an interval (in seconds) to wait between status polls
"""
interval = interval if interval is not None else settings.AWX_ISOLATED_CHECK_INTERVAL
extravars = {'src': self.private_data_dir}
extravars = {
'src': self.private_data_dir,
'job_id': self.instance.id
}
status = 'failed'
rc = None
last_check = time.time()
@@ -221,9 +209,13 @@ class IsolatedManager(object):
logger.warning('Isolated job {} was manually canceled.'.format(self.instance.id))
logger.debug('Checking on isolated job {} with `check_isolated.yml`.'.format(self.instance.id))
time_start = datetime.datetime.now()
runner_obj = self.run_management_playbook('check_isolated.yml',
self.private_data_dir,
extravars=extravars)
time_end = datetime.datetime.now()
time_diff = time_end - time_start
logger.debug('Finished checking on isolated job {} with `check_isolated.yml` took {} seconds.'.format(self.instance.id, time_diff.total_seconds()))
status, rc = runner_obj.status, runner_obj.rc
if self.check_callback is not None and not self.captured_command_artifact:

View File

@@ -18,7 +18,5 @@ class Command(BaseCommand):
super(Command, self).__init__()
license = get_licenser().validate()
if options.get('data'):
if license.get('license_key', '') != 'UNLICENSED':
license['license_key'] = '********'
return json.dumps(license)
return license.get('license_type', 'none')

View File

@@ -8,5 +8,7 @@ class Command(MakeMigrations):
def execute(self, *args, **options):
settings = connections['default'].settings_dict.copy()
settings['ENGINE'] = 'sqlite3'
if 'application_name' in settings['OPTIONS']:
del settings['OPTIONS']['application_name']
connections['default'] = DatabaseWrapper(settings)
return MakeMigrations().execute(*args, **options)

View File

@@ -21,7 +21,7 @@ from awx.main.signals import (
disable_computed_fields
)
from awx.main.management.commands.deletion import AWXCollector, pre_delete
from awx.main.utils.deletion import AWXCollector, pre_delete
class Command(BaseCommand):

View File

@@ -2,22 +2,22 @@
# All Rights Reserved
from django.core.management.base import BaseCommand
from django.conf import settings
from crum import impersonate
from awx.main.models import User, Organization, Project, Inventory, CredentialType, Credential, Host, JobTemplate
from awx.main.models import (
User, Organization, Project, Inventory, CredentialType,
Credential, Host, JobTemplate, ExecutionEnvironment
)
from awx.main.signals import disable_computed_fields
class Command(BaseCommand):
"""Create preloaded data, intended for new installs
"""
help = 'Creates a preload tower data iff there is none.'
help = 'Creates a preload tower data if there is none.'
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
changed = False
# Create a default organization as the first superuser found.
try:
@@ -26,44 +26,62 @@ class Command(BaseCommand):
superuser = None
with impersonate(superuser):
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.objects.filter(namespace='ssh').first()
c = Credential.objects.create(credential_type=ssh_type,
name='Demo Credential',
inputs={
'username': superuser.username
},
created_by=superuser)
c.admin_role.members.add(superuser)
public_galaxy_credential = Credential(
name='Ansible Galaxy',
managed_by_tower=True,
credential_type=CredentialType.objects.get(kind='galaxy'),
inputs = {
'url': 'https://galaxy.ansible.com/'
}
)
public_galaxy_credential.save()
o.galaxy_credentials.add(public_galaxy_credential)
i = Inventory.objects.create(name='Demo Inventory',
organization=o,
created_by=superuser)
Host.objects.create(name='localhost',
inventory=i,
variables="ansible_connection: local\nansible_python_interpreter: '{{ ansible_playbook_python }}'",
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)')
if not Organization.objects.exists():
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.objects.filter(namespace='ssh').first()
c = Credential.objects.create(credential_type=ssh_type,
name='Demo Credential',
inputs={
'username': superuser.username
},
created_by=superuser)
c.admin_role.members.add(superuser)
public_galaxy_credential = Credential(name='Ansible Galaxy',
managed_by_tower=True,
credential_type=CredentialType.objects.get(kind='galaxy'),
inputs={'url': 'https://galaxy.ansible.com/'})
public_galaxy_credential.save()
o.galaxy_credentials.add(public_galaxy_credential)
i = Inventory.objects.create(name='Demo Inventory',
organization=o,
created_by=superuser)
Host.objects.create(name='localhost',
inventory=i,
variables="ansible_connection: local\nansible_python_interpreter: '{{ ansible_playbook_python }}'",
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.')
changed = True
default_ee = settings.AWX_EXECUTION_ENVIRONMENT_DEFAULT_IMAGE
ee, created = ExecutionEnvironment.objects.get_or_create(name='Default EE', defaults={'image': default_ee,
'managed_by_tower': True})
if created:
changed = True
print('Default Execution Environment registered.')
if changed:
print('(changed: True)')
else:
print('(changed: False)')

View File

@@ -0,0 +1,117 @@
# Python
import asciichartpy as chart
import collections
import time
import sys
# Django
from django.db.models import Count
from django.core.management.base import BaseCommand
# AWX
from awx.main.models import (
Job,
Instance
)
DEFAULT_WIDTH = 100
DEFAULT_HEIGHT = 30
def chart_color_lookup(color_str):
return getattr(chart, color_str)
def clear_screen():
print(chr(27) + "[2J")
class JobStatus():
def __init__(self, status, color, width):
self.status = status
self.color = color
self.color_code = chart_color_lookup(color)
self.x = collections.deque(maxlen=width)
self.y = collections.deque(maxlen=width)
def tick(self, x, y):
self.x.append(x)
self.y.append(y)
class JobStatusController:
RESET = chart_color_lookup('reset')
def __init__(self, width):
self.plots = [
JobStatus('pending', 'red', width),
JobStatus('waiting', 'blue', width),
JobStatus('running', 'green', width)
]
self.ts_start = int(time.time())
def tick(self):
ts = int(time.time()) - self.ts_start
q = Job.objects.filter(status__in=['pending','waiting','running']).values_list('status').order_by().annotate(Count('status'))
status_count = dict(pending=0, waiting=0, running=0)
for status, count in q:
status_count[status] = count
for p in self.plots:
p.tick(ts, status_count[p.status])
def series(self):
return [list(p.y) for p in self.plots]
def generate_status(self):
line = ""
lines = []
for p in self.plots:
lines.append(f'{p.color_code}{p.status} {p.y[-1]}{self.RESET}')
line += ", ".join(lines) + '\n'
width = 5
time_running = int(time.time()) - self.ts_start
instances = Instance.objects.all().order_by('hostname')
line += "Capacity: " + ", ".join([f"{instance.capacity:{width}}" for instance in instances]) + '\n'
line += "Remaining: " + ", ".join([f"{instance.remaining_capacity:{width}}" for instance in instances]) + '\n'
line += f"Seconds running: {time_running}" + '\n'
return line
class Command(BaseCommand):
help = "Plot pending, waiting, running jobs over time on the terminal"
def add_arguments(self, parser):
parser.add_argument('--refresh', dest='refresh', type=float, default=1.0,
help='Time between refreshes of the graph and data in seconds (defaults to 1.0)')
parser.add_argument('--width', dest='width', type=int, default=DEFAULT_WIDTH,
help=f'Width of the graph (defaults to {DEFAULT_WIDTH})')
parser.add_argument('--height', dest='height', type=int, default=DEFAULT_HEIGHT,
help=f'Height of the graph (defaults to {DEFAULT_HEIGHT})')
def handle(self, *args, **options):
refresh_seconds = options['refresh']
width = options['width']
height = options['height']
jctl = JobStatusController(width)
conf = {
'colors': [chart_color_lookup(p.color) for p in jctl.plots],
'height': height,
}
while True:
jctl.tick()
draw = chart.plot(jctl.series(), conf)
status_line = jctl.generate_status()
clear_screen()
print(draw)
sys.stdout.write(status_line)
time.sleep(refresh_seconds)

View File

@@ -4,7 +4,6 @@
# Python
import json
import logging
import fnmatch
import os
import re
import subprocess
@@ -19,6 +18,9 @@ from django.core.management.base import BaseCommand, CommandError
from django.db import connection, transaction
from django.utils.encoding import smart_text
# DRF error class to distinguish license exceptions
from rest_framework.exceptions import PermissionDenied
# AWX inventory imports
from awx.main.models.inventory import (
Inventory,
@@ -33,9 +35,6 @@ from awx.main.utils.safe_yaml import sanitize_jinja
from awx.main.models.rbac import batch_role_ancestor_rebuilding
from awx.main.utils import (
ignore_inventory_computed_fields,
check_proot_installed,
wrap_args_with_proot,
build_proot_temp_dir,
get_licenser
)
from awx.main.signals import disable_activity_stream
@@ -53,11 +52,11 @@ No license.
See http://www.ansible.com/renew for license information.'''
LICENSE_MESSAGE = '''\
Number of licensed instances exceeded, would bring available instances to %(new_count)d, system is licensed for %(available_instances)d.
Number of licensed instances exceeded, would bring available instances to %(new_count)d, system is licensed for %(instance_count)d.
See http://www.ansible.com/renew for license extension information.'''
DEMO_LICENSE_MESSAGE = '''\
Demo mode free license count exceeded, would bring available instances to %(new_count)d, demo mode allows %(available_instances)d.
Demo mode free license count exceeded, would bring available instances to %(new_count)d, demo mode allows %(instance_count)d.
See http://www.ansible.com/renew for licensing information.'''
@@ -75,39 +74,16 @@ class AnsibleInventoryLoader(object):
/usr/bin/ansible/ansible-inventory -i hosts --list
'''
def __init__(self, source, is_custom=False, venv_path=None, verbosity=0):
def __init__(self, source, venv_path=None, verbosity=0):
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.verbosity = verbosity
# TODO: remove once proot has been removed
self.tmp_private_dir = None
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'] = 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
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):
@@ -126,69 +102,32 @@ class AnsibleInventoryLoader(object):
return shutil.which('ansible-inventory')
def get_base_args(self):
# get ansible-inventory absolute path for running in bubblewrap/proot, in Popen
ansible_inventory_path = self.get_path_to_ansible_inventory()
# NOTE: why do we add "python" to the start of these args?
# the script that runs ansible-inventory specifies a python interpreter
# that makes no sense in light of the fact that we put all the dependencies
# inside of /venv/ansible, so we override the specified interpreter
# https://github.com/ansible/ansible/issues/50714
bargs = ['python', ansible_inventory_path, '-i', self.source]
bargs.extend(['--playbook-dir', self.source_dir])
bargs = ['podman', 'run', '--user=root', '--quiet']
bargs.extend(['-v', '{0}:{0}:Z'.format(self.source)])
for key, value in STANDARD_INVENTORY_UPDATE_ENV.items():
bargs.extend(['-e', '{0}={1}'.format(key, value)])
bargs.extend([settings.AWX_EXECUTION_ENVIRONMENT_DEFAULT_IMAGE])
bargs.extend(['ansible-inventory', '-i', self.source])
bargs.extend(['--playbook-dir', functioning_dir(self.source)])
if self.verbosity:
# INFO: -vvv, DEBUG: -vvvvv, for inventory, any more than 3 makes little difference
bargs.append('-{}'.format('v' * min(5, self.verbosity * 2 + 1)))
bargs.append('--list')
logger.debug('Using base command: {}'.format(' '.join(bargs)))
return bargs
def get_proot_args(self, cmd, env):
cwd = os.getcwd()
if not check_proot_installed():
raise RuntimeError("proot is not installed but is configured for use")
kwargs = {}
if self.is_custom:
# use source's tmp dir for proot, task manager will delete folder
logger.debug("Using provided directory '{}' for isolation.".format(self.source_dir))
kwargs['proot_temp_dir'] = self.source_dir
cwd = self.source_dir
else:
# we cannot safely store tmp data in source dir or trust script contents
if env['AWX_PRIVATE_DATA_DIR']:
# If this is non-blank, file credentials are being used and we need access
private_data_dir = functioning_dir(env['AWX_PRIVATE_DATA_DIR'])
logger.debug("Using private credential data in '{}'.".format(private_data_dir))
kwargs['private_data_dir'] = private_data_dir
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
kwargs['proot_show_paths'] = [functioning_dir(self.source), settings.AWX_ANSIBLE_COLLECTIONS_PATHS]
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):
data = {}
stdout, stderr = '', ''
env = self.build_env()
if ((self.is_custom or 'AWX_PRIVATE_DATA_DIR' in env) and
getattr(settings, 'AWX_PROOT_ENABLED', False)):
cmd = self.get_proot_args(cmd, env)
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
stdout = smart_text(stdout)
stderr = smart_text(stderr)
if self.tmp_private_dir:
shutil.rmtree(self.tmp_private_dir, True)
if proc.returncode != 0:
raise RuntimeError('%s failed (rc=%d) with stdout:\n%s\nstderr:\n%s' % (
self.method, proc.returncode, stdout, stderr))
'ansible-inventory', proc.returncode, stdout, stderr))
for line in stderr.splitlines():
logger.error(line)
@@ -203,9 +142,10 @@ class AnsibleInventoryLoader(object):
def load(self):
base_args = self.get_base_args()
logger.info('Reading Ansible inventory source: %s', self.source)
return self.command_to_json(base_args + ['--list'])
return self.command_to_json(base_args)
class Command(BaseCommand):
@@ -231,9 +171,9 @@ class Command(BaseCommand):
action='store_true', default=False,
help='overwrite (rather than merge) variables')
parser.add_argument('--keep-vars', dest='keep_vars', action='store_true', default=False,
help='use database variables if set')
help='DEPRECATED legacy option, has no effect')
parser.add_argument('--custom', dest='custom', action='store_true', default=False,
help='this is a custom inventory script')
help='DEPRECATED indicates a custom inventory script, no longer used')
parser.add_argument('--source', dest='source', type=str, default=None,
metavar='s', help='inventory directory, file, or script to load')
parser.add_argument('--enabled-var', dest='enabled_var', type=str,
@@ -259,10 +199,10 @@ class Command(BaseCommand):
'specifies the unique, immutable instance ID, may be '
'specified as "foo.bar" to traverse nested dicts.')
def set_logging_level(self):
def set_logging_level(self, verbosity):
log_levels = dict(enumerate([logging.WARNING, logging.INFO,
logging.DEBUG, 0]))
logger.setLevel(log_levels.get(self.verbosity, 0))
logger.setLevel(log_levels.get(verbosity, 0))
def _get_instance_id(self, variables, default=''):
'''
@@ -322,7 +262,8 @@ class Command(BaseCommand):
else:
raise NotImplementedError('Value of enabled {} not understood.'.format(enabled))
def get_source_absolute_path(self, source):
@staticmethod
def get_source_absolute_path(source):
if not os.path.exists(source):
raise IOError('Source does not exist: %s' % source)
source = os.path.join(os.getcwd(), os.path.dirname(source),
@@ -330,61 +271,6 @@ class Command(BaseCommand):
source = os.path.normpath(os.path.abspath(source))
return source
def load_inventory_from_database(self):
'''
Load inventory and related objects from the database.
'''
# Load inventory object based on name or ID.
if self.inventory_id:
q = dict(id=self.inventory_id)
else:
q = dict(name=self.inventory_name)
try:
self.inventory = Inventory.objects.get(**q)
except Inventory.DoesNotExist:
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' % list(q.items())[0])
logger.info('Updating inventory %d: %s' % (self.inventory.pk,
self.inventory.name))
# Load inventory source if specified via environment variable (when
# inventory_import is called from an InventoryUpdate task).
inventory_source_id = os.getenv('INVENTORY_SOURCE_ID', None)
inventory_update_id = os.getenv('INVENTORY_UPDATE_ID', None)
if inventory_source_id:
try:
self.inventory_source = InventorySource.objects.get(pk=inventory_source_id,
inventory=self.inventory)
except InventorySource.DoesNotExist:
raise CommandError('Inventory source with id=%s not found' %
inventory_source_id)
try:
self.inventory_update = InventoryUpdate.objects.get(pk=inventory_update_id)
except InventoryUpdate.DoesNotExist:
raise CommandError('Inventory update with id=%s not found' %
inventory_update_id)
# Otherwise, create a new inventory source to capture this invocation
# via command line.
else:
with ignore_inventory_computed_fields():
self.inventory_source, created = InventorySource.objects.get_or_create(
inventory=self.inventory,
source='file',
source_path=os.path.abspath(self.source),
overwrite=self.overwrite,
overwrite_vars=self.overwrite_vars,
)
self.inventory_update = self.inventory_source.create_inventory_update(
_eager_fields=dict(
job_args=json.dumps(sys.argv),
job_env=dict(os.environ.items()),
job_cwd=os.getcwd())
)
# FIXME: Wait or raise error if inventory is being updated by another
# source.
def _batch_add_m2m(self, related_manager, *objs, **kwargs):
key = (related_manager.instance.pk, related_manager.through._meta.db_table)
flush = bool(kwargs.get('flush', False))
@@ -894,21 +780,21 @@ class Command(BaseCommand):
source_vars = self.all_group.variables
remote_license_type = source_vars.get('tower_metadata', {}).get('license_type', None)
if remote_license_type is None:
raise CommandError('Unexpected Error: Tower inventory plugin missing needed metadata!')
raise PermissionDenied('Unexpected Error: Tower inventory plugin missing needed metadata!')
if local_license_type != remote_license_type:
raise CommandError('Tower server licenses must match: source: {} local: {}'.format(
raise PermissionDenied('Tower server licenses must match: source: {} local: {}'.format(
remote_license_type, local_license_type
))
def check_license(self):
license_info = get_licenser().validate()
local_license_type = license_info.get('license_type', 'UNLICENSED')
if license_info.get('license_key', 'UNLICENSED') == 'UNLICENSED':
if local_license_type == 'UNLICENSED':
logger.error(LICENSE_NON_EXISTANT_MESSAGE)
raise CommandError('No license found!')
raise PermissionDenied('No license found!')
elif local_license_type == 'open':
return
available_instances = license_info.get('available_instances', 0)
instance_count = license_info.get('instance_count', 0)
free_instances = license_info.get('free_instances', 0)
time_remaining = license_info.get('time_remaining', 0)
hard_error = license_info.get('trial', False) is True or license_info['instance_count'] == 10
@@ -916,24 +802,24 @@ class Command(BaseCommand):
if time_remaining <= 0:
if hard_error:
logger.error(LICENSE_EXPIRED_MESSAGE)
raise CommandError("License has expired!")
raise PermissionDenied("License has expired!")
else:
logger.warning(LICENSE_EXPIRED_MESSAGE)
# special check for tower-type inventory sources
# but only if running the plugin
TOWER_SOURCE_FILES = ['tower.yml', 'tower.yaml']
if self.inventory_source.source == 'tower' and any(f in self.source for f in TOWER_SOURCE_FILES):
if self.inventory_source.source == 'tower' and any(f in self.inventory_source.source_path for f in TOWER_SOURCE_FILES):
# only if this is the 2nd call to license check, we cannot compare before running plugin
if hasattr(self, 'all_group'):
self.remote_tower_license_compare(local_license_type)
if free_instances < 0:
d = {
'new_count': new_count,
'available_instances': available_instances,
'instance_count': instance_count,
}
if hard_error:
logger.error(LICENSE_MESSAGE % d)
raise CommandError('License count exceeded!')
raise PermissionDenied('License count exceeded!')
else:
logger.warning(LICENSE_MESSAGE % d)
@@ -948,7 +834,7 @@ class Command(BaseCommand):
active_count = Host.objects.org_active_count(org.id)
if active_count > org.max_hosts:
raise CommandError('Host limit for organization exceeded!')
raise PermissionDenied('Host limit for organization exceeded!')
def mark_license_failure(self, save=True):
self.inventory_update.license_error = True
@@ -959,16 +845,103 @@ class Command(BaseCommand):
self.inventory_update.save(update_fields=['org_host_limit_error'])
def handle(self, *args, **options):
self.verbosity = int(options.get('verbosity', 1))
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)
# Load inventory and related objects from database.
inventory_name = options.get('inventory_name', None)
inventory_id = options.get('inventory_id', None)
if inventory_name and inventory_id:
raise CommandError('--inventory-name and --inventory-id are mutually exclusive')
elif not inventory_name and not inventory_id:
raise CommandError('--inventory-name or --inventory-id is required')
with advisory_lock('inventory_{}_import'.format(inventory_id)):
# Obtain rest of the options needed to run update
raw_source = options.get('source', None)
if not raw_source:
raise CommandError('--source is required')
verbosity = int(options.get('verbosity', 1))
self.set_logging_level(verbosity)
venv_path = options.get('venv', None)
# Load inventory object based on name or ID.
if inventory_id:
q = dict(id=inventory_id)
else:
q = dict(name=inventory_name)
try:
inventory = Inventory.objects.get(**q)
except Inventory.DoesNotExist:
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' % list(q.items())[0])
logger.info('Updating inventory %d: %s' % (inventory.pk, inventory.name))
# Create ad-hoc inventory source and inventory update objects
with ignore_inventory_computed_fields():
source = Command.get_source_absolute_path(raw_source)
inventory_source, created = InventorySource.objects.get_or_create(
inventory=inventory,
source='file',
source_path=os.path.abspath(source),
overwrite=bool(options.get('overwrite', False)),
overwrite_vars=bool(options.get('overwrite_vars', False)),
)
inventory_update = inventory_source.create_inventory_update(
_eager_fields=dict(
job_args=json.dumps(sys.argv),
job_env=dict(os.environ.items()),
job_cwd=os.getcwd())
)
data = AnsibleInventoryLoader(
source=source, venv_path=venv_path, verbosity=verbosity
).load()
logger.debug('Finished loading from source: %s', source)
status, tb, exc = 'error', '', None
try:
self.perform_update(options, data, inventory_update)
status = 'successful'
except Exception as e:
exc = e
if isinstance(e, KeyboardInterrupt):
status = 'canceled'
else:
tb = traceback.format_exc()
with ignore_inventory_computed_fields():
inventory_update = InventoryUpdate.objects.get(pk=inventory_update.pk)
inventory_update.result_traceback = tb
inventory_update.status = status
inventory_update.save(update_fields=['status', 'result_traceback'])
inventory_source.status = status
inventory_source.save(update_fields=['status'])
if exc:
logger.error(str(exc))
if exc:
if isinstance(exc, CommandError):
sys.exit(1)
raise exc
def perform_update(self, options, data, inventory_update):
"""Shared method for both awx-manage CLI updates and inventory updates
from the tasks system.
This saves the inventory data to the database, calling load_into_database
but also wraps that method in a host of options processing
"""
# outside of normal options, these are needed as part of programatic interface
self.inventory = inventory_update.inventory
self.inventory_source = inventory_update.inventory_source
self.inventory_update = inventory_update
# the update options, could be parser object or dict
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))
self.is_custom = bool(options.get('custom', False))
self.source = options.get('source', None)
self.enabled_var = options.get('enabled_var', None)
self.enabled_value = options.get('enabled_value', None)
self.group_filter = options.get('group_filter', None) or r'^.+$'
@@ -976,17 +949,6 @@ 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.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:
raise CommandError('--inventory-name and --inventory-id are mutually exclusive')
elif not self.inventory_name and not self.inventory_id:
raise CommandError('--inventory-name or --inventory-id is required')
if (self.overwrite or self.overwrite_vars) and self.keep_vars:
raise CommandError('--overwrite/--overwrite-vars and --keep-vars are mutually exclusive')
if not self.source:
raise CommandError('--source is required')
try:
self.group_filter_re = re.compile(self.group_filter)
except re.error:
@@ -997,146 +959,115 @@ class Command(BaseCommand):
raise CommandError('invalid regular expression for --host-filter')
begin = time.time()
with advisory_lock('inventory_{}_update'.format(self.inventory_id)):
self.load_inventory_from_database()
# Since perform_update can be invoked either through the awx-manage CLI
# or from the task system, we need to create a new lock at this level
# (even though inventory_import.Command.handle -- which calls
# perform_update -- has its own lock, inventory_ID_import)
with advisory_lock('inventory_{}_perform_update'.format(self.inventory.id)):
try:
self.check_license()
except CommandError as e:
except PermissionDenied as e:
self.mark_license_failure(save=True)
raise e
try:
# Check the per-org host limits
self.check_org_host_limit()
except CommandError as e:
except PermissionDenied as e:
self.mark_org_limits_failure(save=True)
raise e
status, tb, exc = 'error', '', None
try:
if settings.SQL_DEBUG:
queries_before = len(connection.queries)
if settings.SQL_DEBUG:
queries_before = len(connection.queries)
# Update inventory update for this command line invocation.
with ignore_inventory_computed_fields():
iu = self.inventory_update
if iu.status != 'running':
with transaction.atomic():
self.inventory_update.status = 'running'
self.inventory_update.save()
# Update inventory update for this command line invocation.
with ignore_inventory_computed_fields():
# TODO: move this to before perform_update
iu = self.inventory_update
if iu.status != 'running':
with transaction.atomic():
self.inventory_update.status = 'running'
self.inventory_update.save()
source = self.get_source_absolute_path(self.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)
data = AnsibleInventoryLoader(source=source, is_custom=self.is_custom,
venv_path=venv_path, verbosity=self.verbosity).load()
logger.info('Loaded %d groups, %d hosts', len(inventory.all_group.all_groups),
len(inventory.all_group.all_hosts))
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)
if self.exclude_empty_groups:
inventory.delete_empty_groups()
del data # forget dict from import, could be large
self.all_group = inventory.all_group
logger.info('Loaded %d groups, %d hosts', len(inventory.all_group.all_groups),
len(inventory.all_group.all_hosts))
if settings.DEBUG:
# depending on inventory source, this output can be
# *exceedingly* verbose - crawling a deeply nested
# inventory/group data structure and printing metadata about
# each host and its memberships
#
# it's easy for this scale of data to overwhelm pexpect,
# (and it's likely only useful for purposes of debugging the
# actual inventory import code), so only print it if we have to:
# https://github.com/ansible/ansible-tower/issues/7414#issuecomment-321615104
self.all_group.debug_tree()
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
# inventory/group data structure and printing metadata about
# each host and its memberships
#
# it's easy for this scale of data to overwhelm pexpect,
# (and it's likely only useful for purposes of debugging the
# actual inventory import code), so only print it if we have to:
# https://github.com/ansible/ansible-tower/issues/7414#issuecomment-321615104
self.all_group.debug_tree()
with batch_role_ancestor_rebuilding():
# 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):
with batch_role_ancestor_rebuilding():
# 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()
else:
with disable_activity_stream():
self.load_into_database()
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.
license_fail = True
self.check_license()
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 the per-org host limits
license_fail = False
self.check_org_host_limit()
except CommandError as e:
if license_fail:
self.mark_license_failure()
else:
self.mark_org_limits_failure()
raise e
# 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.
license_fail = True
self.check_license()
if settings.SQL_DEBUG:
logger.warning('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
# Check the per-org host limits
license_fail = False
self.check_org_host_limit()
except PermissionDenied as e:
if license_fail:
self.mark_license_failure(save=True)
else:
logger.info('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
status = 'successful'
self.mark_org_limits_failure(save=True)
raise e
# If we're in debug mode, then log the queries and time
# used to do the operation.
if settings.SQL_DEBUG:
queries_this_import = connection.queries[queries_before:]
sqltime = sum(float(x['time']) for x in queries_this_import)
logger.warning('Inventory import required %d queries '
'taking %0.3fs', len(queries_this_import),
sqltime)
except Exception as e:
if isinstance(e, KeyboardInterrupt):
status = 'canceled'
exc = e
elif isinstance(e, CommandError):
exc = e
logger.warning('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
else:
tb = traceback.format_exc()
exc = e
logger.info('Inventory import completed for %s in %0.1fs',
self.inventory_source.name, time.time() - begin)
if not self.invoked_from_dispatcher:
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:
logger.error(str(exc))
if exc:
if isinstance(exc, CommandError):
sys.exit(1)
raise exc
# If we're in debug mode, then log the queries and time
# used to do the operation.
if settings.SQL_DEBUG:
queries_this_import = connection.queries[queries_before:]
sqltime = sum(float(x['time']) for x in queries_this_import)
logger.warning('Inventory import required %d queries '
'taking %0.3fs', len(queries_this_import),
sqltime)

View File

@@ -19,7 +19,9 @@ class Command(BaseCommand):
profile_sql.delay(
threshold=options['threshold'], minutes=options['minutes']
)
print(f"Logging initiated with a threshold of {options['threshold']} second(s) and a duration of"
f" {options['minutes']} minute(s), any queries that meet criteria can"
f" be found in /var/log/tower/profile/."
)
if options['threshold'] > 0:
print(f"SQL profiling initiated with a threshold of {options['threshold']} second(s) and a"
f" duration of {options['minutes']} minute(s), any queries that meet criteria can"
f" be found in /var/log/tower/profile/.")
else:
print("SQL profiling disabled.")

View File

@@ -17,13 +17,14 @@ class InstanceNotFound(Exception):
class RegisterQueue:
def __init__(self, queuename, controller, instance_percent, inst_min, hostname_list):
def __init__(self, queuename, controller, instance_percent, inst_min, hostname_list, is_container_group=None):
self.instance_not_found_err = None
self.queuename = queuename
self.controller = controller
self.instance_percent = instance_percent
self.instance_min = inst_min
self.hostname_list = hostname_list
self.is_container_group = is_container_group
def get_create_update_instance_group(self):
created = False
@@ -36,6 +37,10 @@ class RegisterQueue:
ig.policy_instance_minimum = self.instance_min
changed = True
if self.is_container_group:
ig.is_container_group = self.is_container_group
changed = True
if changed:
ig.save()

View File

@@ -144,7 +144,8 @@ class InstanceManager(models.Manager):
from awx.main.management.commands.register_queue import RegisterQueue
pod_ip = os.environ.get('MY_POD_IP')
registered = self.register(ip_address=pod_ip)
RegisterQueue('tower', None, 100, 0, []).register()
is_container_group = settings.IS_K8S
RegisterQueue('tower', None, 100, 0, [], is_container_group).register()
return registered
else:
return (False, self.me())
@@ -237,7 +238,7 @@ class InstanceGroupManager(models.Manager):
elif t.status == 'running':
# Subtract capacity from all groups that contain the instance
if t.execution_node not in instance_ig_mapping:
if not t.is_containerized:
if not t.is_container_group_task:
logger.warning('Detected %s running inside lost instance, '
'may still be waiting for reaper.', t.log_format)
if t.instance_group:

View File

@@ -1,13 +1,9 @@
# Copyright (c) 2015 Ansible, Inc.
# All Rights Reserved.
import uuid
import logging
import threading
import time
import cProfile
import pstats
import os
import urllib.parse
from django.conf import settings
@@ -22,6 +18,7 @@ from django.urls import reverse, resolve
from awx.main.utils.named_url_graph import generate_graph, GraphNode
from awx.conf import fields, register
from awx.main.utils.profiling import AWXProfiler
logger = logging.getLogger('awx.main.middleware')
@@ -32,11 +29,14 @@ class TimingMiddleware(threading.local, MiddlewareMixin):
dest = '/var/log/tower/profile'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.prof = AWXProfiler("TimingMiddleware")
def process_request(self, request):
self.start_time = time.time()
if settings.AWX_REQUEST_PROFILE:
self.prof = cProfile.Profile()
self.prof.enable()
self.prof.start()
def process_response(self, request, response):
if not hasattr(self, 'start_time'): # some tools may not invoke process_request
@@ -44,33 +44,13 @@ class TimingMiddleware(threading.local, MiddlewareMixin):
total_time = time.time() - self.start_time
response['X-API-Total-Time'] = '%0.3fs' % total_time
if settings.AWX_REQUEST_PROFILE:
self.prof.disable()
cprofile_file = self.save_profile_file(request)
response['cprofile_file'] = cprofile_file
perf_logger.info('api response times', extra=dict(python_objects=dict(request=request, response=response)))
response['X-API-Profile-File'] = self.prof.stop()
perf_logger.info(
f'request: {request}, response_time: {response["X-API-Total-Time"]}',
extra=dict(python_objects=dict(request=request, response=response, X_API_TOTAL_TIME=response["X-API-Total-Time"]))
)
return response
def save_profile_file(self, request):
if not os.path.isdir(self.dest):
os.makedirs(self.dest)
filename = '%.3fs-%s.pstats' % (pstats.Stats(self.prof).total_tt, uuid.uuid4())
filepath = os.path.join(self.dest, filename)
with open(filepath, 'w') as f:
f.write('%s %s\n' % (request.method, request.get_full_path()))
pstats.Stats(self.prof, stream=f).sort_stats('cumulative').print_stats()
if settings.AWX_REQUEST_PROFILE_WITH_DOT:
from gprof2dot import main as generate_dot
raw = os.path.join(self.dest, filename) + '.raw'
pstats.Stats(self.prof).dump_stats(raw)
generate_dot([
'-n', '2.5', '-f', 'pstats', '-o',
os.path.join( self.dest, filename).replace('.pstats', '.dot'),
raw
])
os.remove(raw)
return filepath
class SessionTimeoutMiddleware(MiddlewareMixin):
"""
@@ -204,4 +184,4 @@ class MigrationRanCheckMiddleware(MiddlewareMixin):
plan = executor.migration_plan(executor.loader.graph.leaf_nodes())
if bool(plan) and \
getattr(resolve(request.path), 'url_name', '') != 'migrations_notran':
return redirect(reverse("ui:migrations_notran"))
return redirect(reverse("ui_next:migrations_notran"))

View File

@@ -1,11 +1,7 @@
# Generated by Django 2.2.11 on 2020-05-01 13:25
from django.db import migrations, models
from awx.main.migrations._inventory_source import create_scm_script_substitute
def convert_cloudforms_to_scm(apps, schema_editor):
create_scm_script_substitute(apps, 'cloudforms')
from awx.main.migrations._inventory_source import delete_cloudforms_inv_source
class Migration(migrations.Migration):
@@ -15,7 +11,7 @@ class Migration(migrations.Migration):
]
operations = [
migrations.RunPython(convert_cloudforms_to_scm),
migrations.RunPython(delete_cloudforms_inv_source),
migrations.AlterField(
model_name='inventorysource',
name='source',

View File

@@ -0,0 +1,13 @@
from django.db import migrations
from awx.main.migrations._inventory_source import delete_cloudforms_inv_source
class Migration(migrations.Migration):
dependencies = [
('main', '0121_delete_toweranalyticsstate'),
]
operations = [
migrations.RunPython(delete_cloudforms_inv_source),
]

View File

@@ -0,0 +1,23 @@
from django.db import migrations, models
from awx.main.migrations._hg_removal import delete_hg_scm
class Migration(migrations.Migration):
dependencies = [
('main', '0122_really_remove_cloudforms_inventory'),
]
operations = [
migrations.RunPython(delete_hg_scm),
migrations.AlterField(
model_name='project',
name='scm_type',
field=models.CharField(blank=True, choices=[('', 'Manual'), ('git', 'Git'), ('svn', 'Subversion'), ('insights', 'Red Hat Insights'), ('archive', 'Remote Archive')], default='', help_text='Specifies the source control system used to store the project.', max_length=8, verbose_name='SCM Type'),
),
migrations.AlterField(
model_name='projectupdate',
name='scm_type',
field=models.CharField(blank=True, choices=[('', 'Manual'), ('git', 'Git'), ('svn', 'Subversion'), ('insights', 'Red Hat Insights'), ('archive', 'Remote Archive')], default='', help_text='Specifies the source control system used to store the project.', max_length=8, verbose_name='SCM Type'),
),
]

View File

@@ -0,0 +1,59 @@
# Generated by Django 2.2.11 on 2020-07-08 18:42
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.db.models.expressions
import taggit.managers
class Migration(migrations.Migration):
dependencies = [
('taggit', '0003_taggeditem_add_unique_index'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('main', '0123_drop_hg_support'),
]
operations = [
migrations.CreateModel(
name='ExecutionEnvironment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=None, editable=False)),
('modified', models.DateTimeField(default=None, editable=False)),
('description', models.TextField(blank=True, default='')),
('image', models.CharField(help_text='The registry location where the container is stored.', max_length=1024, verbose_name='image location')),
('managed_by_tower', models.BooleanField(default=False, editable=False)),
('created_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="{'class': 'executionenvironment', 'model_name': 'executionenvironment', 'app_label': 'main'}(class)s_created+", to=settings.AUTH_USER_MODEL)),
('credential', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='executionenvironments', to='main.Credential')),
('modified_by', models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="{'class': 'executionenvironment', 'model_name': 'executionenvironment', 'app_label': 'main'}(class)s_modified+", to=settings.AUTH_USER_MODEL)),
('organization', models.ForeignKey(blank=True, default=None, help_text='The organization used to determine access to this execution environment.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executionenvironments', to='main.Organization')),
('tags', taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')),
],
options={
'ordering': (django.db.models.expressions.OrderBy(django.db.models.expressions.F('organization_id'), nulls_first=True), 'image'),
'unique_together': {('organization', 'image')},
},
),
migrations.AddField(
model_name='activitystream',
name='execution_environment',
field=models.ManyToManyField(blank=True, to='main.ExecutionEnvironment'),
),
migrations.AddField(
model_name='organization',
name='default_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The default execution environment for jobs run by this organization.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='main.ExecutionEnvironment'),
),
migrations.AddField(
model_name='unifiedjob',
name='execution_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The container image to be used for execution.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unifiedjobs', to='main.ExecutionEnvironment'),
),
migrations.AddField(
model_name='unifiedjobtemplate',
name='execution_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The container image to be used for execution.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unifiedjobtemplates', to='main.ExecutionEnvironment'),
),
]

View File

@@ -0,0 +1,46 @@
# Generated by Django 2.2.16 on 2020-11-19 16:20
import uuid
import awx.main.fields
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0124_execution_environments'),
]
operations = [
migrations.AlterModelOptions(
name='executionenvironment',
options={'ordering': ('-created',)},
),
migrations.AddField(
model_name='executionenvironment',
name='name',
field=models.CharField(default=uuid.uuid4, max_length=512, unique=True),
preserve_default=False,
),
migrations.AddField(
model_name='organization',
name='execution_environment_admin_role',
field=awx.main.fields.ImplicitRoleField(editable=False, null='True', on_delete=django.db.models.deletion.CASCADE, parent_role='admin_role', related_name='+', to='main.Role'),
preserve_default='True',
),
migrations.AddField(
model_name='project',
name='default_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The default execution environment for jobs run using this project.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='main.ExecutionEnvironment'),
),
migrations.AlterField(
model_name='credentialtype',
name='kind',
field=models.CharField(choices=[('ssh', 'Machine'), ('vault', 'Vault'), ('net', 'Network'), ('scm', 'Source Control'), ('cloud', 'Cloud'), ('registry', 'Container Registry'), ('token', 'Personal Access Token'), ('insights', 'Insights'), ('external', 'External'), ('kubernetes', 'Kubernetes'), ('galaxy', 'Galaxy/Automation Hub')], max_length=32),
),
migrations.AlterUniqueTogether(
name='executionenvironment',
unique_together=set(),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 2.2.16 on 2021-01-27 22:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0125_more_ee_modeling_changes'),
]
operations = [
migrations.AddField(
model_name='executionenvironment',
name='pull',
field=models.CharField(choices=[('always', 'Always pull container before running.'), ('missing', 'No pull option has been selected.'), ('never', 'Never pull container before running.')], blank=True, default='', help_text='Pull image before running?', max_length=16),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 2.2.16 on 2021-02-15 22:02
from django.db import migrations
def reset_pod_specs(apps, schema_editor):
InstanceGroup = apps.get_model('main', 'InstanceGroup')
InstanceGroup.objects.update(pod_spec_override="")
class Migration(migrations.Migration):
dependencies = [
('main', '0126_executionenvironment_container_options'),
]
operations = [
migrations.RunPython(reset_pod_specs)
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 2.2.16 on 2021-02-18 22:57
import awx.main.fields
from django.db import migrations
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0127_reset_pod_spec_override'),
]
operations = [
migrations.AlterField(
model_name='organization',
name='read_role',
field=awx.main.fields.ImplicitRoleField(editable=False, null='True', on_delete=django.db.models.deletion.CASCADE, parent_role=['member_role', 'auditor_role', 'execute_role', 'project_admin_role', 'inventory_admin_role', 'workflow_admin_role', 'notification_admin_role', 'credential_admin_role', 'job_template_admin_role', 'approval_role', 'execution_environment_admin_role'], related_name='+', to='main.Role'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 2.2.16 on 2021-02-16 20:27
import awx.main.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0128_organiaztion_read_roles_ee_admin'),
]
operations = [
migrations.AddField(
model_name='unifiedjob',
name='installed_collections',
field=awx.main.fields.JSONBField(blank=True, default=dict, editable=False, help_text='The Collections names and versions installed in the execution environment.'),
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 2.2.16 on 2021-03-11 16:25
import awx.main.utils.polymorphic
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0129_unifiedjob_installed_collections'),
]
operations = [
migrations.AlterField(
model_name='organization',
name='default_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The default execution environment for jobs run by this organization.', null=True, on_delete=awx.main.utils.polymorphic.SET_NULL, related_name='+', to='main.ExecutionEnvironment'),
),
migrations.AlterField(
model_name='project',
name='default_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The default execution environment for jobs run using this project.', null=True, on_delete=awx.main.utils.polymorphic.SET_NULL, related_name='+', to='main.ExecutionEnvironment'),
),
migrations.AlterField(
model_name='unifiedjob',
name='execution_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The container image to be used for execution.', null=True, on_delete=awx.main.utils.polymorphic.SET_NULL, related_name='unifiedjobs', to='main.ExecutionEnvironment'),
),
migrations.AlterField(
model_name='unifiedjobtemplate',
name='execution_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The container image to be used for execution.', null=True, on_delete=awx.main.utils.polymorphic.SET_NULL, related_name='unifiedjobtemplates', to='main.ExecutionEnvironment'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 2.2.16 on 2021-03-11 20:50
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0130_ee_polymorphic_set_null'),
]
operations = [
migrations.AlterField(
model_name='organization',
name='default_environment',
field=models.ForeignKey(blank=True, default=None, help_text='The default execution environment for jobs run by this organization.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='main.ExecutionEnvironment'),
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 2.2.16 on 2021-03-13 14:53
from django.db import migrations, models
def migrate_existing_container_groups(apps, schema_editor):
InstanceGroup = apps.get_model('main', 'InstanceGroup')
for group in InstanceGroup.objects.filter(credential__isnull=False).iterator():
group.is_container_group = True
group.save(update_fields=['is_container_group'])
class Migration(migrations.Migration):
dependencies = [
('main', '0131_undo_org_polymorphic_ee'),
]
operations = [
migrations.AddField(
model_name='instancegroup',
name='is_container_group',
field=models.BooleanField(default=False),
),
migrations.RunPython(migrate_existing_container_groups, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,20 @@
from django.db import migrations
from awx.main.models import CredentialType
from awx.main.utils.common import set_current_apps
def setup_tower_managed_defaults(apps, schema_editor):
set_current_apps(apps)
CredentialType.setup_tower_managed_defaults()
class Migration(migrations.Migration):
dependencies = [
('main', '0132_instancegroup_is_container_group'),
]
operations = [
migrations.RunPython(setup_tower_managed_defaults),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 2.2.16 on 2021-03-16 20:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0133_centrify_vault_credtype'),
]
operations = [
migrations.AddField(
model_name='unifiedjob',
name='ansible_version',
field=models.CharField(blank=True, default='', editable=False, help_text='The version of Ansible Core installed in the execution environment.', max_length=255),
),
]

View File

@@ -0,0 +1,19 @@
import logging
from awx.main.utils.common import set_current_apps
logger = logging.getLogger('awx.main.migrations')
def delete_hg_scm(apps, schema_editor):
set_current_apps(apps)
Project = apps.get_model('main', 'Project')
ProjectUpdate = apps.get_model('main', 'ProjectUpdate')
ProjectUpdate.objects.filter(project__scm_type='hg').update(scm_type='')
update_ct = Project.objects.filter(scm_type='hg').update(scm_type='')
if update_ct:
logger.warn('Changed {} mercurial projects to manual, deprecation period ended'.format(
update_ct
))

View File

@@ -5,6 +5,7 @@ from uuid import uuid4
from django.utils.encoding import smart_text
from django.utils.timezone import now
from awx.main.utils.common import set_current_apps
from awx.main.utils.common import parse_yaml_or_json
logger = logging.getLogger('awx.main.migrations')
@@ -91,43 +92,14 @@ def back_out_new_instance_id(apps, source, new_id):
))
def create_scm_script_substitute(apps, source):
"""Only applies for cloudforms in practice, but written generally.
Given a source type, this will replace all inventory sources of that type
with SCM inventory sources that source the script from Ansible core
"""
# the revision in the Ansible 2.9 stable branch this project will start out as
# it can still be updated manually later (but staying within 2.9 branch), if desired
ansible_rev = '6f83b9aff42331e15c55a171de0a8b001208c18c'
def delete_cloudforms_inv_source(apps, schema_editor):
set_current_apps(apps)
InventorySource = apps.get_model('main', 'InventorySource')
ContentType = apps.get_model('contenttypes', 'ContentType')
Project = apps.get_model('main', 'Project')
if not InventorySource.objects.filter(source=source).exists():
logger.debug('No sources of type {} to migrate'.format(source))
return
proj_name = 'Replacement project for {} type sources - {}'.format(source, uuid4())
right_now = now()
project = Project.objects.create(
name=proj_name,
created=right_now,
modified=right_now,
description='Created by migration',
polymorphic_ctype=ContentType.objects.get(model='project'),
# project-specific fields
scm_type='git',
scm_url='https://github.com/ansible/ansible.git',
scm_branch='stable-2.9',
scm_revision=ansible_rev
)
ct = 0
for inv_src in InventorySource.objects.filter(source=source).iterator():
inv_src.source = 'scm'
inv_src.source_project = project
inv_src.source_path = 'contrib/inventory/{}.py'.format(source)
inv_src.scm_last_revision = ansible_rev
inv_src.save(update_fields=['source', 'source_project', 'source_path', 'scm_last_revision'])
logger.debug('Changed inventory source {} to scm type'.format(inv_src.pk))
ct += 1
InventoryUpdate = apps.get_model('main', 'InventoryUpdate')
CredentialType = apps.get_model('main', 'CredentialType')
InventoryUpdate.objects.filter(inventory_source__source='cloudforms').delete()
InventorySource.objects.filter(source='cloudforms').delete()
ct = CredentialType.objects.filter(namespace='cloudforms').first()
if ct:
logger.info('Changed total of {} inventory sources from {} type to scm'.format(ct, source))
ct.credentials.all().delete()
ct.delete()

View File

@@ -1,9 +1,13 @@
import json
import re
import logging
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import iri_to_uri
FrozenInjectors = dict()
logger = logging.getLogger('awx.main.migrations')
class PluginFileInjector(object):
@@ -129,6 +133,7 @@ class azure_rm(PluginFileInjector):
ret['exclude_host_filters'].append("location not in {}".format(repr(python_regions)))
return ret
class ec2(PluginFileInjector):
plugin_name = 'aws_ec2'
namespace = 'amazon'
@@ -586,6 +591,7 @@ class openstack(PluginFileInjector):
ret['inventory_hostname'] = use_host_name_for_name(source_vars['use_hostnames'])
return ret
class rhv(PluginFileInjector):
"""ovirt uses the custom credential templating, and that is all
"""

View File

@@ -35,6 +35,7 @@ from awx.main.models.events import ( # noqa
)
from awx.main.models.ad_hoc_commands import AdHocCommand # noqa
from awx.main.models.schedules import Schedule # noqa
from awx.main.models.execution_environments import ExecutionEnvironment # noqa
from awx.main.models.activity_stream import ActivityStream # noqa
from awx.main.models.ha import ( # noqa
Instance, InstanceGroup, TowerScheduleState,
@@ -45,7 +46,7 @@ from awx.main.models.rbac import ( # noqa
ROLE_SINGLETON_SYSTEM_AUDITOR,
)
from awx.main.models.mixins import ( # noqa
CustomVirtualEnvMixin, ResourceMixin, SurveyJobMixin,
CustomVirtualEnvMixin, ExecutionEnvironmentMixin, ResourceMixin, SurveyJobMixin,
SurveyJobTemplateMixin, TaskManagerInventoryUpdateMixin,
TaskManagerJobMixin, TaskManagerProjectUpdateMixin,
TaskManagerUnifiedJobMixin,
@@ -81,10 +82,17 @@ User.add_to_class('accessible_objects', user_accessible_objects)
def enforce_bigint_pk_migration():
#
# NOTE: this function is not actually in use anymore,
# but has been intentionally kept for historical purposes,
# and to serve as an illustration if we ever need to perform
# bulk modification/migration of event data in the future.
#
# see: https://github.com/ansible/awx/issues/6010
# look at all the event tables and verify that they have been fully migrated
# from the *old* int primary key table to the replacement bigint table
# if not, attempt to migrate them in the background
#
for tblname in (
'main_jobevent', 'main_inventoryupdateevent',
'main_projectupdateevent', 'main_adhoccommandevent',
@@ -214,6 +222,7 @@ activity_stream_registrar.connect(CredentialType)
activity_stream_registrar.connect(Team)
activity_stream_registrar.connect(Project)
#activity_stream_registrar.connect(ProjectUpdate)
activity_stream_registrar.connect(ExecutionEnvironment)
activity_stream_registrar.connect(JobTemplate)
activity_stream_registrar.connect(Job)
activity_stream_registrar.connect(AdHocCommand)

View File

@@ -61,6 +61,7 @@ class ActivityStream(models.Model):
team = models.ManyToManyField("Team", blank=True)
project = models.ManyToManyField("Project", blank=True)
project_update = models.ManyToManyField("ProjectUpdate", blank=True)
execution_environment = models.ManyToManyField("ExecutionEnvironment", blank=True)
job_template = models.ManyToManyField("JobTemplate", blank=True)
job = models.ManyToManyField("Job", blank=True)
workflow_job_template_node = models.ManyToManyField("WorkflowJobTemplateNode", blank=True)
@@ -74,6 +75,7 @@ class ActivityStream(models.Model):
ad_hoc_command = models.ManyToManyField("AdHocCommand", blank=True)
schedule = models.ManyToManyField("Schedule", blank=True)
custom_inventory_script = models.ManyToManyField("CustomInventoryScript", blank=True)
execution_environment = models.ManyToManyField("ExecutionEnvironment", blank=True)
notification_template = models.ManyToManyField("NotificationTemplate", blank=True)
notification = models.ManyToManyField("Notification", blank=True)
label = models.ManyToManyField("Label", blank=True)

View File

@@ -151,8 +151,8 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin):
return True
@property
def is_containerized(self):
return bool(self.instance_group and self.instance_group.is_containerized)
def is_container_group_task(self):
return bool(self.instance_group and self.instance_group.is_container_group)
@property
def can_run_containerized(self):
@@ -198,8 +198,8 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin):
def copy(self):
data = {}
for field in ('job_type', 'inventory_id', 'limit', 'credential_id',
'module_name', 'module_args', 'forks', 'verbosity',
'extra_vars', 'become_enabled', 'diff_mode'):
'execution_environment_id', 'module_name', 'module_args',
'forks', 'verbosity', 'extra_vars', 'become_enabled', 'diff_mode'):
data[field] = getattr(self, field)
return AdHocCommand.objects.create(**data)
@@ -209,6 +209,9 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin):
self.name = Truncator(u': '.join(filter(None, (self.module_name, self.module_args)))).chars(512)
if 'name' not in update_fields:
update_fields.append('name')
if not self.execution_environment_id:
self.execution_environment = self.resolve_execution_environment()
update_fields.append('execution_environment')
super(AdHocCommand, self).save(*args, **kwargs)
@property

View File

@@ -331,6 +331,7 @@ class CredentialType(CommonModelNameNotUnique):
('net', _('Network')),
('scm', _('Source Control')),
('cloud', _('Cloud')),
('registry', _('Container Registry')),
('token', _('Personal Access Token')),
('insights', _('Insights')),
('external', _('External')),
@@ -528,15 +529,20 @@ class CredentialType(CommonModelNameNotUnique):
with open(path, 'w') as f:
f.write(data)
os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
# FIXME: develop some better means of referencing paths inside containers
container_path = os.path.join(
'/runner',
os.path.basename(path)
)
# determine if filename indicates single file or many
if file_label.find('.') == -1:
tower_namespace.filename = path
tower_namespace.filename = container_path
else:
if not hasattr(tower_namespace, 'filename'):
tower_namespace.filename = TowerNamespace()
file_label = file_label.split('.')[1]
setattr(tower_namespace.filename, file_label, path)
setattr(tower_namespace.filename, file_label, container_path)
injector_field = self._meta.get_field('injectors')
for env_var, tmpl in self.injectors.get('env', {}).items():
@@ -564,7 +570,12 @@ class CredentialType(CommonModelNameNotUnique):
if extra_vars:
path = build_extra_vars_file(extra_vars, private_data_dir)
args.extend(['-e', '@%s' % path])
# FIXME: develop some better means of referencing paths inside containers
container_path = os.path.join(
'/runner',
os.path.basename(path)
)
args.extend(['-e', '@%s' % container_path])
class ManagedCredentialType(SimpleNamespace):
@@ -819,6 +830,11 @@ ManagedCredentialType(
'It is only needed for Keystone v3 authentication '
'URLs. Refer to Ansible Tower documentation for '
'common scenarios.')
}, {
'id': 'region',
'label': ugettext_noop('Region Name'),
'type': 'string',
'help_text': ugettext_noop('For some cloud providers, like OVH, region must be specified'),
}, {
'id': 'verify_ssl',
'label': ugettext_noop('Verify SSL'),
@@ -881,33 +897,6 @@ ManagedCredentialType(
}
)
ManagedCredentialType(
namespace='cloudforms',
kind='cloud',
name=ugettext_noop('Red Hat CloudForms'),
managed_by_tower=True,
inputs={
'fields': [{
'id': 'host',
'label': ugettext_noop('CloudForms URL'),
'type': 'string',
'help_text': ugettext_noop('Enter the URL for the virtual machine that '
'corresponds to your CloudForms instance. '
'For example, https://cloudforms.example.org')
}, {
'id': 'username',
'label': ugettext_noop('Username'),
'type': 'string'
}, {
'id': 'password',
'label': ugettext_noop('Password'),
'type': 'string',
'secret': True,
}],
'required': ['host', 'username', 'password'],
}
)
ManagedCredentialType(
namespace='gce',
kind='cloud',
@@ -1145,7 +1134,6 @@ ManagedCredentialType(
},
)
ManagedCredentialType(
namespace='kubernetes_bearer_token',
kind='kubernetes',
@@ -1177,6 +1165,37 @@ ManagedCredentialType(
}
)
ManagedCredentialType(
namespace='registry',
kind='registry',
name=ugettext_noop('Container Registry'),
inputs={
'fields': [{
'id': 'host',
'label': ugettext_noop('Authentication URL'),
'type': 'string',
'help_text': ugettext_noop('Authentication endpoint for the container registry.'),
}, {
'id': 'username',
'label': ugettext_noop('Username'),
'type': 'string',
}, {
'id': 'password',
'label': ugettext_noop('Password'),
'type': 'string',
'secret': True,
}, {
'id': 'token',
'label': ugettext_noop('Access Token'),
'type': 'string',
'secret': True,
'help_text': ugettext_noop('A token to use to authenticate with. '
'This should not be set if username/password are being used.'),
}],
'required': ['host'],
}
)
ManagedCredentialType(
namespace='galaxy_api_token',

View File

@@ -35,8 +35,8 @@ def gce(cred, env, private_data_dir):
json.dump(json_cred, f, indent=2)
f.close()
os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
env['GCE_CREDENTIALS_FILE_PATH'] = path
env['GCP_SERVICE_ACCOUNT_FILE'] = path
env['GCE_CREDENTIALS_FILE_PATH'] = os.path.join('/runner', os.path.basename(path))
env['GCP_SERVICE_ACCOUNT_FILE'] = os.path.join('/runner', os.path.basename(path))
# Handle env variables for new module types.
# This includes gcp_compute inventory plugin and
@@ -82,6 +82,7 @@ def _openstack_data(cred):
if cred.has_input('domain'):
openstack_auth['domain_name'] = cred.get_input('domain', default='')
verify_state = cred.get_input('verify_ssl', default=True)
openstack_data = {
'clouds': {
'devstack': {
@@ -90,6 +91,10 @@ def _openstack_data(cred):
},
},
}
if cred.has_input('region'):
openstack_data['clouds']['devstack']['region_name'] = cred.get_input('region', default='')
return openstack_data
@@ -100,7 +105,8 @@ def openstack(cred, env, private_data_dir):
yaml.safe_dump(openstack_data, f, default_flow_style=False, allow_unicode=True)
f.close()
os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
env['OS_CLIENT_CONFIG_FILE'] = path
# TODO: constant for container base path
env['OS_CLIENT_CONFIG_FILE'] = os.path.join('/runner', os.path.basename(path))
def kubernetes_bearer_token(cred, env, private_data_dir):

View File

@@ -0,0 +1,53 @@
from django.db import models
from django.utils.translation import ugettext_lazy as _
from awx.api.versioning import reverse
from awx.main.models.base import CommonModel
__all__ = ['ExecutionEnvironment']
class ExecutionEnvironment(CommonModel):
class Meta:
ordering = ('-created',)
PULL_CHOICES = [
('always', _("Always pull container before running.")),
('missing', _("No pull option has been selected.")),
('never', _("Never pull container before running."))
]
organization = models.ForeignKey(
'Organization',
null=True,
default=None,
blank=True,
on_delete=models.CASCADE,
related_name='%(class)ss',
help_text=_('The organization used to determine access to this execution environment.'),
)
image = models.CharField(
max_length=1024,
verbose_name=_('image location'),
help_text=_("The registry location where the container is stored."),
)
managed_by_tower = models.BooleanField(default=False, editable=False)
credential = models.ForeignKey(
'Credential',
related_name='%(class)ss',
blank=True,
null=True,
default=None,
on_delete=models.SET_NULL,
)
pull = models.CharField(
max_length=16,
choices=PULL_CHOICES,
blank=True,
default='',
help_text=_('Pull image before running?'),
)
def get_absolute_url(self, request=None):
return reverse('api:execution_environment_detail', kwargs={'pk': self.pk}, request=request)

View File

@@ -147,6 +147,13 @@ class Instance(HasPolicyEditsMixin, BaseModel):
return self.rampart_groups.filter(controller__isnull=False).exists()
def refresh_capacity(self):
if settings.IS_K8S:
self.capacity = self.cpu = self.memory = self.cpu_capacity = self.mem_capacity = 0 # noqa
self.version = awx_application_version
self.save(update_fields=['capacity', 'version', 'modified', 'cpu',
'memory', 'cpu_capacity', 'mem_capacity'])
return
cpu = get_cpu_capacity()
mem = get_mem_capacity()
if self.enabled:
@@ -192,6 +199,9 @@ class InstanceGroup(HasPolicyEditsMixin, BaseModel, RelatedJobsMixin):
null=True,
on_delete=models.CASCADE
)
is_container_group = models.BooleanField(
default=False
)
credential = models.ForeignKey(
'Credential',
related_name='%(class)ss',
@@ -246,10 +256,6 @@ class InstanceGroup(HasPolicyEditsMixin, BaseModel, RelatedJobsMixin):
def is_isolated(self):
return bool(self.controller)
@property
def is_containerized(self):
return bool(self.credential and self.credential.kubernetes)
'''
RelatedJobsMixin
'''
@@ -306,9 +312,9 @@ def schedule_policy_task():
@receiver(post_save, sender=InstanceGroup)
def on_instance_group_saved(sender, instance, created=False, raw=False, **kwargs):
if created or instance.has_policy_changes():
if not instance.is_containerized:
if not instance.is_container_group:
schedule_policy_task()
elif created or instance.is_containerized:
elif created or instance.is_container_group:
instance.set_default_policy_fields()
@@ -320,7 +326,7 @@ def on_instance_saved(sender, instance, created=False, raw=False, **kwargs):
@receiver(post_delete, sender=InstanceGroup)
def on_instance_group_deleted(sender, instance, using, **kwargs):
if not instance.is_containerized:
if not instance.is_container_group:
schedule_policy_task()

View File

@@ -1373,6 +1373,7 @@ class PluginFileInjector(object):
collection = None
collection_migration = '2.9' # Starting with this version, we use collections
# TODO: delete this method and update unit tests
@classmethod
def get_proper_name(cls):
if cls.plugin_name is None:
@@ -1397,13 +1398,12 @@ class PluginFileInjector(object):
def inventory_as_dict(self, inventory_update, private_data_dir):
source_vars = dict(inventory_update.source_vars_dict) # make a copy
proper_name = self.get_proper_name()
'''
None conveys that we should use the user-provided plugin.
Note that a plugin value of '' should still be overridden.
'''
if proper_name is not None:
source_vars['plugin'] = proper_name
if self.plugin_name is not None:
source_vars['plugin'] = self.plugin_name
return source_vars
def build_env(self, inventory_update, env, private_data_dir, private_data_files):
@@ -1441,7 +1441,6 @@ class PluginFileInjector(object):
def get_plugin_env(self, inventory_update, private_data_dir, private_data_files):
env = self._get_shared_env(inventory_update, private_data_dir, private_data_files)
env['ANSIBLE_COLLECTIONS_PATHS'] = settings.AWX_ANSIBLE_COLLECTIONS_PATHS
return env
def build_private_data(self, inventory_update, private_data_dir):
@@ -1544,7 +1543,7 @@ class openstack(PluginFileInjector):
env = super(openstack, self).get_plugin_env(inventory_update, private_data_dir, private_data_files)
credential = inventory_update.get_cloud_credential()
cred_data = private_data_files['credentials']
env['OS_CLIENT_CONFIG_FILE'] = cred_data[credential]
env['OS_CLIENT_CONFIG_FILE'] = os.path.join('/runner', os.path.basename(cred_data[credential]))
return env
@@ -1574,6 +1573,12 @@ class satellite6(PluginFileInjector):
ret['FOREMAN_PASSWORD'] = credential.get_input('password', default='')
return ret
def inventory_as_dict(self, inventory_update, private_data_dir):
ret = super(satellite6, self).inventory_as_dict(inventory_update, private_data_dir)
# this inventory plugin requires the fully qualified inventory plugin name
ret['plugin'] = f'{self.namespace}.{self.collection}.{self.plugin_name}'
return ret
class tower(PluginFileInjector):
plugin_name = 'tower'

View File

@@ -284,7 +284,7 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, SurveyJobTemplateMixin, Resour
def _get_unified_job_field_names(cls):
return set(f.name for f in JobOptions._meta.fields) | set(
['name', 'description', 'organization', 'survey_passwords', 'labels', 'credentials',
'job_slice_number', 'job_slice_count']
'job_slice_number', 'job_slice_count', 'execution_environment']
)
@property
@@ -768,11 +768,11 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskMana
@property
def can_run_containerized(self):
return any([ig for ig in self.preferred_instance_groups if ig.is_containerized])
return any([ig for ig in self.preferred_instance_groups if ig.is_container_group])
@property
def is_containerized(self):
return bool(self.instance_group and self.instance_group.is_containerized)
def is_container_group_task(self):
return bool(self.instance_group and self.instance_group.is_container_group)
@property
def preferred_instance_groups(self):
@@ -798,6 +798,10 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskMana
if self.project:
for name in ('awx', 'tower'):
r['{}_project_revision'.format(name)] = self.project.scm_revision
r['{}_project_scm_branch'.format(name)] = self.project.scm_branch
if self.scm_branch:
for name in ('awx', 'tower'):
r['{}_job_scm_branch'.format(name)] = self.scm_branch
if self.job_template:
for name in ('awx', 'tower'):
r['{}_job_template_id'.format(name)] = self.job_template.pk
@@ -824,6 +828,7 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskMana
return self.inventory.hosts.only(*only)
def start_job_fact_cache(self, destination, modification_times, timeout=None):
self.log_lifecycle("start_job_fact_cache")
os.makedirs(destination, mode=0o700)
hosts = self._get_inventory_hosts()
if timeout is None:
@@ -848,6 +853,7 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskMana
modification_times[filepath] = os.path.getmtime(filepath)
def finish_job_fact_cache(self, destination, modification_times):
self.log_lifecycle("finish_job_fact_cache")
for host in self._get_inventory_hosts():
filepath = os.sep.join(map(str, [destination, host.name]))
if not os.path.realpath(filepath).startswith(destination):
@@ -1280,6 +1286,8 @@ class SystemJob(UnifiedJob, SystemJobOptions, JobNotificationMixin):
@property
def task_impact(self):
if settings.IS_K8S:
return 0
return 5
@property

View File

@@ -22,7 +22,7 @@ from awx.main.models.base import prevent_search
from awx.main.models.rbac import (
Role, RoleAncestorEntry, get_roles_on_resource
)
from awx.main.utils import parse_yaml_or_json, get_custom_venv_choices, get_licenser
from awx.main.utils import parse_yaml_or_json, get_custom_venv_choices, get_licenser, polymorphic
from awx.main.utils.encryption import decrypt_value, get_encryption_key, is_encrypted
from awx.main.utils.polymorphic import build_polymorphic_ctypes_map
from awx.main.fields import JSONField, AskForField
@@ -34,7 +34,7 @@ logger = logging.getLogger('awx.main.models.mixins')
__all__ = ['ResourceMixin', 'SurveyJobTemplateMixin', 'SurveyJobMixin',
'TaskManagerUnifiedJobMixin', 'TaskManagerJobMixin', 'TaskManagerProjectUpdateMixin',
'TaskManagerInventoryUpdateMixin', 'CustomVirtualEnvMixin']
'TaskManagerInventoryUpdateMixin', 'ExecutionEnvironmentMixin', 'CustomVirtualEnvMixin']
class ResourceMixin(models.Model):
@@ -441,6 +441,44 @@ class TaskManagerInventoryUpdateMixin(TaskManagerUpdateOnLaunchMixin):
abstract = True
class ExecutionEnvironmentMixin(models.Model):
class Meta:
abstract = True
execution_environment = models.ForeignKey(
'ExecutionEnvironment',
null=True,
blank=True,
default=None,
on_delete=polymorphic.SET_NULL,
related_name='%(class)ss',
help_text=_('The container image to be used for execution.'),
)
def get_execution_environment_default(self):
from awx.main.models.execution_environments import ExecutionEnvironment
if settings.DEFAULT_EXECUTION_ENVIRONMENT is not None:
return settings.DEFAULT_EXECUTION_ENVIRONMENT
return ExecutionEnvironment.objects.filter(organization=None, managed_by_tower=True).first()
def resolve_execution_environment(self):
"""
Return the execution environment that should be used when creating a new job.
"""
if self.execution_environment is not None:
return self.execution_environment
if getattr(self, 'project_id', None) and self.project.default_environment is not None:
return self.project.default_environment
if getattr(self, 'organization', None) and self.organization.default_environment is not None:
return self.organization.default_environment
if getattr(self, 'inventory', None) and self.inventory.organization is not None:
if self.inventory.organization.default_environment is not None:
return self.inventory.organization.default_environment
return self.get_execution_environment_default()
class CustomVirtualEnvMixin(models.Model):
class Meta:
abstract = True

View File

@@ -12,7 +12,7 @@ from django.core.mail.message import EmailMessage
from django.db import connection
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_str, force_text
from jinja2 import sandbox
from jinja2 import sandbox, ChainableUndefined
from jinja2.exceptions import TemplateSyntaxError, UndefinedError, SecurityError
# AWX
@@ -280,6 +280,7 @@ class JobNotificationMixin(object):
{'unified_job_template': ['id', 'name', 'description', 'unified_job_type']},
{'instance_group': ['name', 'id']},
{'created_by': ['id', 'username', 'first_name', 'last_name']},
{'schedule': ['id', 'name', 'description', 'next_run']},
{'labels': ['count', 'results']}]}]
@classmethod
@@ -344,6 +345,10 @@ class JobNotificationMixin(object):
'name': 'Stub project',
'scm_type': 'git',
'status': 'successful'},
'schedule': {'description': 'Sample schedule',
'id': 42,
'name': 'Stub schedule',
'next_run': datetime.datetime(2038, 1, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc)},
'unified_job_template': {'description': 'Sample unified job template description',
'id': 39,
'name': 'Stub Job Template',
@@ -357,7 +362,7 @@ class JobNotificationMixin(object):
'url': 'https://towerhost/#/jobs/playbook/1010',
'approval_status': 'approved',
'approval_node_name': 'Approve Me',
'workflow_url': 'https://towerhost/#/workflows/1010',
'workflow_url': 'https://towerhost/#/jobs/workflow/1010',
'job_metadata': """{'url': 'https://towerhost/$/jobs/playbook/13',
'traceback': '',
'status': 'running',
@@ -383,12 +388,17 @@ class JobNotificationMixin(object):
and a url to the job run."""
job_context = {'host_status_counts': {}}
summary = None
if hasattr(self, 'job_host_summaries'):
summary = self.job_host_summaries.first()
if summary:
from awx.api.serializers import JobHostSummarySerializer
summary_data = JobHostSummarySerializer(summary).to_representation(summary)
job_context['host_status_counts'] = summary_data
try:
has_event_property = any([f for f in self.event_class._meta.fields if f.name == 'event'])
except NotImplementedError:
has_event_property = False
if has_event_property:
qs = self.get_event_queryset()
if qs:
event = qs.only('event_data').filter(event='playbook_on_stats').first()
if event:
summary = event.get_host_status_counts()
job_context['host_status_counts'] = summary
context = {
'job': job_context,
'job_friendly_name': self.get_notification_friendly_name(),
@@ -429,7 +439,7 @@ class JobNotificationMixin(object):
raise RuntimeError("Define me")
def build_notification_message(self, nt, status):
env = sandbox.ImmutableSandboxedEnvironment()
env = sandbox.ImmutableSandboxedEnvironment(undefined=ChainableUndefined)
from awx.api.serializers import UnifiedJobSerializer
job_serialization = UnifiedJobSerializer(self).to_representation(self)

View File

@@ -61,6 +61,15 @@ class Organization(CommonModel, NotificationFieldsModel, ResourceMixin, CustomVi
blank=True,
related_name='%(class)s_notification_templates_for_approvals'
)
default_environment = models.ForeignKey(
'ExecutionEnvironment',
null=True,
blank=True,
default=None,
on_delete=models.SET_NULL,
related_name='+',
help_text=_('The default execution environment for jobs run by this organization.'),
)
admin_role = ImplicitRoleField(
parent_role='singleton:' + ROLE_SINGLETON_SYSTEM_ADMINISTRATOR,
@@ -86,6 +95,9 @@ class Organization(CommonModel, NotificationFieldsModel, ResourceMixin, CustomVi
job_template_admin_role = ImplicitRoleField(
parent_role='admin_role',
)
execution_environment_admin_role = ImplicitRoleField(
parent_role='admin_role',
)
auditor_role = ImplicitRoleField(
parent_role='singleton:' + ROLE_SINGLETON_SYSTEM_AUDITOR,
)
@@ -97,7 +109,8 @@ class Organization(CommonModel, NotificationFieldsModel, ResourceMixin, CustomVi
'execute_role', 'project_admin_role',
'inventory_admin_role', 'workflow_admin_role',
'notification_admin_role', 'credential_admin_role',
'job_template_admin_role', 'approval_role',],
'job_template_admin_role', 'approval_role',
'execution_environment_admin_role',],
)
approval_role = ImplicitRoleField(
parent_role='admin_role',

View File

@@ -35,7 +35,7 @@ from awx.main.models.mixins import (
CustomVirtualEnvMixin,
RelatedJobsMixin
)
from awx.main.utils import update_scm_url
from awx.main.utils import update_scm_url, polymorphic
from awx.main.utils.ansible import skip_directory, could_be_inventory, could_be_playbook
from awx.main.fields import ImplicitRoleField
from awx.main.models.rbac import (
@@ -52,7 +52,6 @@ class ProjectOptions(models.Model):
SCM_TYPE_CHOICES = [
('', _('Manual')),
('git', _('Git')),
('hg', _('Mercurial')),
('svn', _('Subversion')),
('insights', _('Red Hat Insights')),
('archive', _('Remote Archive')),
@@ -188,6 +187,14 @@ class ProjectOptions(models.Model):
pass
return cred
def resolve_execution_environment(self):
"""
Project updates, themselves, will use the default execution environment.
Jobs using the project can use the default_environment, but the project updates
are not flexible enough to allow customizing the image they use.
"""
return self.get_execution_environment_default()
def get_project_path(self, check_if_exists=True):
local_path = os.path.basename(self.local_path)
if local_path and not local_path.startswith('.'):
@@ -260,6 +267,15 @@ class Project(UnifiedJobTemplate, ProjectOptions, ResourceMixin, CustomVirtualEn
app_label = 'main'
ordering = ('id',)
default_environment = models.ForeignKey(
'ExecutionEnvironment',
null=True,
blank=True,
default=None,
on_delete=polymorphic.SET_NULL,
related_name='+',
help_text=_('The default execution environment for jobs run using this project.'),
)
scm_update_on_launch = models.BooleanField(
default=False,
help_text=_('Update the project when a job is launched that uses the project.'),
@@ -555,6 +571,8 @@ class ProjectUpdate(UnifiedJob, ProjectOptions, JobNotificationMixin, TaskManage
@property
def task_impact(self):
if settings.IS_K8S:
return 0
return 0 if self.job_type == 'run' else 1
@property

View File

@@ -40,6 +40,7 @@ role_names = {
'inventory_admin_role': _('Inventory Admin'),
'credential_admin_role': _('Credential Admin'),
'job_template_admin_role': _('Job Template Admin'),
'execution_environment_admin_role': _('Execution Environment Admin'),
'workflow_admin_role': _('Workflow Admin'),
'notification_admin_role': _('Notification Admin'),
'auditor_role': _('Auditor'),
@@ -60,6 +61,7 @@ role_descriptions = {
'inventory_admin_role': _('Can manage all inventories of the %s'),
'credential_admin_role': _('Can manage all credentials of the %s'),
'job_template_admin_role': _('Can manage all job templates of the %s'),
'execution_environment_admin_role': _('Can manage all execution environments of the %s'),
'workflow_admin_role': _('Can manage all workflows of the %s'),
'notification_admin_role': _('Can manage all notifications of the %s'),
'auditor_role': _('Can view all aspects of the %s'),

View File

@@ -39,7 +39,7 @@ from awx.main.models.base import (
from awx.main.dispatch import get_local_queuename
from awx.main.dispatch.control import Control as ControlDispatcher
from awx.main.registrar import activity_stream_registrar
from awx.main.models.mixins import ResourceMixin, TaskManagerUnifiedJobMixin
from awx.main.models.mixins import ResourceMixin, TaskManagerUnifiedJobMixin, ExecutionEnvironmentMixin
from awx.main.utils import (
camelcase_to_underscore, get_model_for_type,
encrypt_dict, decrypt_field, _inventory_updates,
@@ -50,16 +50,16 @@ from awx.main.utils import (
from awx.main.constants import ACTIVE_STATES, CAN_CANCEL
from awx.main.redact import UriCleaner, REPLACE_STR
from awx.main.consumers import emit_channel_notification
from awx.main.fields import JSONField, AskForField, OrderedManyToManyField
from awx.main.fields import JSONField, JSONBField, AskForField, OrderedManyToManyField
__all__ = ['UnifiedJobTemplate', 'UnifiedJob', 'StdoutMaxBytesExceeded']
logger = logging.getLogger('awx.main.models.unified_jobs')
logger_job_lifecycle = logging.getLogger('awx.analytics.job_lifecycle')
# NOTE: ACTIVE_STATES moved to constants because it is used by parent modules
class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, NotificationFieldsModel):
class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, ExecutionEnvironmentMixin, NotificationFieldsModel):
'''
Concrete base class for unified job templates.
'''
@@ -376,6 +376,8 @@ class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, Notificatio
for fd, val in eager_fields.items():
setattr(unified_job, fd, val)
unified_job.execution_environment = self.resolve_execution_environment()
# NOTE: slice workflow jobs _get_parent_field_name method
# is not correct until this is set
if not parent_field_name:
@@ -420,7 +422,7 @@ class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, Notificatio
# have been associated to the UJ
if unified_job.__class__ in activity_stream_registrar.models:
activity_stream_create(None, unified_job, True)
unified_job.log_lifecycle("created")
return unified_job
@classmethod
@@ -527,7 +529,7 @@ class StdoutMaxBytesExceeded(Exception):
class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique,
UnifiedJobTypeStringMixin, TaskManagerUnifiedJobMixin):
UnifiedJobTypeStringMixin, TaskManagerUnifiedJobMixin, ExecutionEnvironmentMixin):
'''
Concrete base class for unified job run by the task engine.
'''
@@ -720,6 +722,19 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
'Credential',
related_name='%(class)ss',
)
installed_collections = JSONBField(
blank=True,
default=dict,
editable=False,
help_text=_("The Collections names and versions installed in the execution environment."),
)
ansible_version = models.CharField(
max_length=255,
blank=True,
default='',
editable=False,
help_text=_("The version of Ansible Core installed in the execution environment."),
)
def get_absolute_url(self, request=None):
RealClass = self.get_real_instance_class()
@@ -862,7 +877,7 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
self.unified_job_template = self._get_parent_instance()
if 'unified_job_template' not in update_fields:
update_fields.append('unified_job_template')
if self.cancel_flag and not self.canceled_on:
# Record the 'canceled' time.
self.canceled_on = now()
@@ -1010,6 +1025,7 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
event_qs = self.get_event_queryset()
except NotImplementedError:
return True # Model without events, such as WFJT
self.log_lifecycle("event_processing_finished")
return self.emitted_events == event_qs.count()
def result_stdout_raw_handle(self, enforce_max_bytes=True):
@@ -1318,6 +1334,10 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
if 'extra_vars' in kwargs:
self.handle_extra_data(kwargs['extra_vars'])
# remove any job_explanations that may have been set while job was in pending
if self.job_explanation != "":
self.job_explanation = ""
return (True, opts)
def signal_start(self, **kwargs):
@@ -1448,6 +1468,7 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
for name in ('awx', 'tower'):
r['{}_workflow_job_id'.format(name)] = wj.pk
r['{}_workflow_job_name'.format(name)] = wj.name
r['{}_workflow_job_launch_type'.format(name)] = wj.launch_type
if schedule:
r['{}_parent_job_schedule_id'.format(name)] = schedule.pk
r['{}_parent_job_schedule_name'.format(name)] = schedule.name
@@ -1482,5 +1503,19 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
return bool(self.controller_node)
@property
def is_containerized(self):
def is_container_group_task(self):
return False
def log_lifecycle(self, state, blocked_by=None):
extra={'type': self._meta.model_name,
'task_id': self.id,
'state': state}
if self.unified_job_template:
extra["template_name"] = self.unified_job_template.name
if state == "blocked" and blocked_by:
blocked_by_msg = f"{blocked_by._meta.model_name}-{blocked_by.id}"
msg = f"{self._meta.model_name}-{self.id} blocked by {blocked_by_msg}"
extra["blocked_by"] = blocked_by_msg
else:
msg = f"{self._meta.model_name}-{self.id} {state.replace('_', ' ')}"
logger_job_lifecycle.debug(msg, extra=extra)

View File

@@ -620,7 +620,7 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, SurveyJobMixin, JobNotificatio
return reverse('api:workflow_job_detail', kwargs={'pk': self.pk}, request=request)
def get_ui_url(self):
return urljoin(settings.TOWER_URL_BASE, '/#/workflows/{}'.format(self.pk))
return urljoin(settings.TOWER_URL_BASE, '/#/jobs/workflow/{}'.format(self.pk))
def notification_data(self):
result = super(WorkflowJob, self).notification_data()
@@ -674,7 +674,7 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, SurveyJobMixin, JobNotificatio
return self.status == 'running'
class WorkflowApprovalTemplate(UnifiedJobTemplate):
class WorkflowApprovalTemplate(UnifiedJobTemplate, RelatedJobsMixin):
FIELDS_TO_PRESERVE_AT_COPY = ['description', 'timeout',]
@@ -702,6 +702,12 @@ class WorkflowApprovalTemplate(UnifiedJobTemplate):
def workflow_job_template(self):
return self.workflowjobtemplatenodes.first().workflow_job_template
'''
RelatedJobsMixin
'''
def _get_related_jobs(self):
return UnifiedJob.objects.filter(unified_job_template=self)
class WorkflowApproval(UnifiedJob, JobNotificationMixin):
class Meta:
@@ -746,7 +752,7 @@ class WorkflowApproval(UnifiedJob, JobNotificationMixin):
return None
def get_ui_url(self):
return urljoin(settings.TOWER_URL_BASE, '/#/workflows/{}'.format(self.workflow_job.id))
return urljoin(settings.TOWER_URL_BASE, '/#/jobs/workflow/{}'.format(self.workflow_job.id))
def _get_parent_field_name(self):
return 'workflow_approval_template'
@@ -834,7 +840,7 @@ class WorkflowApproval(UnifiedJob, JobNotificationMixin):
return (msg, body)
def context(self, approval_status):
workflow_url = urljoin(settings.TOWER_URL_BASE, '/#/workflows/{}'.format(self.workflow_job.id))
workflow_url = urljoin(settings.TOWER_URL_BASE, '/#/jobs/workflow/{}'.format(self.workflow_job.id))
return {'approval_status': approval_status,
'approval_node_name': self.workflow_approval_template.name,
'workflow_url': workflow_url,

View File

@@ -57,6 +57,7 @@ class WebhookBackend(AWXBaseEmailBackend, CustomNotificationBase):
def send_messages(self, messages):
sent_messages = 0
self.headers['Content-Type'] = 'application/json'
if 'User-Agent' not in self.headers:
self.headers['User-Agent'] = "Tower {}".format(get_awx_version())
if self.http_method.lower() not in ['put','post']:
@@ -68,7 +69,7 @@ class WebhookBackend(AWXBaseEmailBackend, CustomNotificationBase):
auth = (self.username, self.password)
r = chosen_method("{}".format(m.recipients()[0]),
auth=auth,
json=m.body,
data=json.dumps(m.body, ensure_ascii=False).encode('utf-8'),
headers=self.headers,
verify=(not self.disable_ssl_verification))
if r.status_code >= 400:

View File

@@ -1,5 +1,3 @@
from django.utils.timezone import now as tz_now
from awx.main.models import (
Job,
ProjectUpdate,
@@ -20,119 +18,110 @@ class DependencyGraph(object):
INVENTORY_SOURCE_UPDATES = 'inventory_source_updates'
WORKFLOW_JOB_TEMPLATES_JOBS = 'workflow_job_template_jobs'
LATEST_PROJECT_UPDATES = 'latest_project_updates'
LATEST_INVENTORY_UPDATES = 'latest_inventory_updates'
INVENTORY_SOURCES = 'inventory_source_ids'
def __init__(self, queue):
self.queue = queue
def __init__(self):
self.data = {}
# project_id -> True / False
self.data[self.PROJECT_UPDATES] = {}
# inventory_id -> True / False
# The reason for tracking both inventory and inventory sources:
# Consider InvA, which has two sources, InvSource1, InvSource2.
# JobB might depend on InvA, which launches two updates, one for each source.
# To determine if JobB can run, we can just check InvA, which is marked in
# INVENTORY_UPDATES, instead of having to check for both entries in
# INVENTORY_SOURCE_UPDATES.
self.data[self.INVENTORY_UPDATES] = {}
# job_template_id -> True / False
self.data[self.JOB_TEMPLATE_JOBS] = {}
'''
Track runnable job related project and inventory to ensure updates
don't run while a job needing those resources is running.
'''
# inventory_source_id -> True / False
self.data[self.INVENTORY_SOURCE_UPDATES] = {}
# True / False
self.data[self.SYSTEM_JOB] = True
# workflow_job_template_id -> True / False
self.data[self.JOB_TEMPLATE_JOBS] = {}
self.data[self.SYSTEM_JOB] = {}
self.data[self.WORKFLOW_JOB_TEMPLATES_JOBS] = {}
# project_id -> latest ProjectUpdateLatestDict'
self.data[self.LATEST_PROJECT_UPDATES] = {}
# inventory_source_id -> latest InventoryUpdateLatestDict
self.data[self.LATEST_INVENTORY_UPDATES] = {}
def mark_if_no_key(self, job_type, id, job):
# only mark first occurrence of a task. If 10 of JobA are launched
# (concurrent disabled), the dependency graph should return that jobs
# 2 through 10 are blocked by job1
if id not in self.data[job_type]:
self.data[job_type][id] = job
# inventory_id -> [inventory_source_ids]
self.data[self.INVENTORY_SOURCES] = {}
def get_item(self, job_type, id):
return self.data[job_type].get(id, None)
def add_latest_project_update(self, job):
self.data[self.LATEST_PROJECT_UPDATES][job.project_id] = job
def get_now(self):
return tz_now()
def mark_system_job(self):
self.data[self.SYSTEM_JOB] = False
def mark_system_job(self, job):
# Don't track different types of system jobs, so that only one can run
# at a time. Therefore id in this case is just 'system_job'.
self.mark_if_no_key(self.SYSTEM_JOB, 'system_job', job)
def mark_project_update(self, job):
self.data[self.PROJECT_UPDATES][job.project_id] = False
self.mark_if_no_key(self.PROJECT_UPDATES, job.project_id, job)
def mark_inventory_update(self, inventory_id):
self.data[self.INVENTORY_UPDATES][inventory_id] = False
def mark_inventory_update(self, job):
if type(job) is AdHocCommand:
self.mark_if_no_key(self.INVENTORY_UPDATES, job.inventory_id, job)
else:
self.mark_if_no_key(self.INVENTORY_UPDATES, job.inventory_source.inventory_id, job)
def mark_inventory_source_update(self, inventory_source_id):
self.data[self.INVENTORY_SOURCE_UPDATES][inventory_source_id] = False
def mark_inventory_source_update(self, job):
self.mark_if_no_key(self.INVENTORY_SOURCE_UPDATES, job.inventory_source_id, job)
def mark_job_template_job(self, job):
self.data[self.JOB_TEMPLATE_JOBS][job.job_template_id] = False
self.mark_if_no_key(self.JOB_TEMPLATE_JOBS, job.job_template_id, job)
def mark_workflow_job(self, job):
self.data[self.WORKFLOW_JOB_TEMPLATES_JOBS][job.workflow_job_template_id] = False
self.mark_if_no_key(self.WORKFLOW_JOB_TEMPLATES_JOBS, job.workflow_job_template_id, job)
def can_project_update_run(self, job):
return self.data[self.PROJECT_UPDATES].get(job.project_id, True)
def project_update_blocked_by(self, job):
return self.get_item(self.PROJECT_UPDATES, job.project_id)
def can_inventory_update_run(self, job):
return self.data[self.INVENTORY_SOURCE_UPDATES].get(job.inventory_source_id, True)
def inventory_update_blocked_by(self, job):
return self.get_item(self.INVENTORY_SOURCE_UPDATES, job.inventory_source_id)
def can_job_run(self, job):
if self.data[self.PROJECT_UPDATES].get(job.project_id, True) is True and \
self.data[self.INVENTORY_UPDATES].get(job.inventory_id, True) is True:
if job.allow_simultaneous is False:
return self.data[self.JOB_TEMPLATE_JOBS].get(job.job_template_id, True)
else:
return True
return False
def job_blocked_by(self, job):
project_block = self.get_item(self.PROJECT_UPDATES, job.project_id)
inventory_block = self.get_item(self.INVENTORY_UPDATES, job.inventory_id)
if job.allow_simultaneous is False:
job_block = self.get_item(self.JOB_TEMPLATE_JOBS, job.job_template_id)
else:
job_block = None
return project_block or inventory_block or job_block
def can_workflow_job_run(self, job):
if job.allow_simultaneous:
return True
return self.data[self.WORKFLOW_JOB_TEMPLATES_JOBS].get(job.workflow_job_template_id, True)
def workflow_job_blocked_by(self, job):
if job.allow_simultaneous is False:
return self.get_item(self.WORKFLOW_JOB_TEMPLATES_JOBS, job.workflow_job_template_id)
return None
def can_system_job_run(self):
return self.data[self.SYSTEM_JOB]
def system_job_blocked_by(self, job):
return self.get_item(self.SYSTEM_JOB, 'system_job')
def can_ad_hoc_command_run(self, job):
return self.data[self.INVENTORY_UPDATES].get(job.inventory_id, True)
def ad_hoc_command_blocked_by(self, job):
return self.get_item(self.INVENTORY_UPDATES, job.inventory_id)
def is_job_blocked(self, job):
def task_blocked_by(self, job):
if type(job) is ProjectUpdate:
return not self.can_project_update_run(job)
return self.project_update_blocked_by(job)
elif type(job) is InventoryUpdate:
return not self.can_inventory_update_run(job)
return self.inventory_update_blocked_by(job)
elif type(job) is Job:
return not self.can_job_run(job)
return self.job_blocked_by(job)
elif type(job) is SystemJob:
return not self.can_system_job_run()
return self.system_job_blocked_by(job)
elif type(job) is AdHocCommand:
return not self.can_ad_hoc_command_run(job)
return self.ad_hoc_command_blocked_by(job)
elif type(job) is WorkflowJob:
return not self.can_workflow_job_run(job)
return self.workflow_job_blocked_by(job)
def add_job(self, job):
if type(job) is ProjectUpdate:
self.mark_project_update(job)
elif type(job) is InventoryUpdate:
self.mark_inventory_update(job.inventory_source.inventory_id)
self.mark_inventory_source_update(job.inventory_source_id)
self.mark_inventory_update(job)
self.mark_inventory_source_update(job)
elif type(job) is Job:
self.mark_job_template_job(job)
elif type(job) is WorkflowJob:
self.mark_workflow_job(job)
elif type(job) is SystemJob:
self.mark_system_job()
self.mark_system_job(job)
elif type(job) is AdHocCommand:
self.mark_inventory_update(job.inventory_id)
self.mark_inventory_update(job)
def add_jobs(self, jobs):
for j in jobs:

View File

@@ -12,6 +12,24 @@ from awx.main.utils.common import parse_yaml_or_json
logger = logging.getLogger('awx.main.scheduler')
def deepmerge(a, b):
"""
Merge dict structures and return the result.
>>> a = {'first': {'all_rows': {'pass': 'dog', 'number': '1'}}}
>>> b = {'first': {'all_rows': {'fail': 'cat', 'number': '5'}}}
>>> import pprint; pprint.pprint(deepmerge(a, b))
{'first': {'all_rows': {'fail': 'cat', 'number': '5', 'pass': 'dog'}}}
"""
if isinstance(a, dict) and isinstance(b, dict):
return dict([(k, deepmerge(a.get(k), b.get(k)))
for k in set(a.keys()).union(b.keys())])
elif b is None:
return a
else:
return b
class PodManager(object):
def __init__(self, task=None):
@@ -128,11 +146,13 @@ class PodManager(object):
pod_spec = {**default_pod_spec, **pod_spec_override}
if self.task:
pod_spec['metadata']['name'] = self.pod_name
pod_spec['metadata']['labels'] = {
'ansible-awx': settings.INSTALL_UUID,
'ansible-awx-job-id': str(self.task.id)
}
pod_spec['metadata'] = deepmerge(
pod_spec.get('metadata', {}),
dict(name=self.pod_name,
labels={
'ansible-awx': settings.INSTALL_UUID,
'ansible-awx-job-id': str(self.task.id)
}))
pod_spec['spec']['containers'][0]['name'] = self.pod_name
return pod_spec

View File

@@ -14,6 +14,7 @@ from django.db import transaction, connection
from django.utils.translation import ugettext_lazy as _, gettext_noop
from django.utils.timezone import now as tz_now
from django.conf import settings
from django.db.models import Q
# AWX
from awx.main.dispatch.reaper import reap_job
@@ -63,11 +64,13 @@ class TaskManager():
# will no longer be started and will be started on the next task manager cycle.
self.start_task_limit = settings.START_TASK_LIMIT
self.time_delta_job_explanation = timedelta(seconds=30)
def after_lock_init(self):
'''
Init AFTER we know this instance of the task manager will run because the lock is acquired.
'''
instances = Instance.objects.filter(capacity__gt=0, enabled=True)
instances = Instance.objects.filter(~Q(hostname=None), enabled=True)
self.real_instances = {i.hostname: i for i in instances}
instances_partial = [SimpleNamespace(obj=instance,
@@ -79,26 +82,29 @@ class TaskManager():
instances_by_hostname = {i.hostname: i for i in instances_partial}
for rampart_group in InstanceGroup.objects.prefetch_related('instances'):
self.graph[rampart_group.name] = dict(graph=DependencyGraph(rampart_group.name),
self.graph[rampart_group.name] = dict(graph=DependencyGraph(),
capacity_total=rampart_group.capacity,
consumed_capacity=0,
instances=[])
for instance in rampart_group.instances.filter(capacity__gt=0, enabled=True).order_by('hostname'):
for instance in rampart_group.instances.filter(enabled=True).order_by('hostname'):
if instance.hostname in instances_by_hostname:
self.graph[rampart_group.name]['instances'].append(instances_by_hostname[instance.hostname])
def is_job_blocked(self, task):
def job_blocked_by(self, task):
# TODO: I'm not happy with this, I think blocking behavior should be decided outside of the dependency graph
# in the old task manager this was handled as a method on each task object outside of the graph and
# probably has the side effect of cutting down *a lot* of the logic from this task manager class
for g in self.graph:
if self.graph[g]['graph'].is_job_blocked(task):
return True
blocked_by = self.graph[g]['graph'].task_blocked_by(task)
if blocked_by:
return blocked_by
if not task.dependent_jobs_finished():
return True
blocked_by = task.dependent_jobs.first()
if blocked_by:
return blocked_by
return False
return None
def get_tasks(self, status_list=('pending', 'waiting', 'running')):
jobs = [j for j in Job.objects.filter(status__in=status_list).prefetch_related('instance_group')]
@@ -277,14 +283,14 @@ class TaskManager():
task.controller_node = controller_node
logger.debug('Submitting isolated {} to queue {} controlled by {}.'.format(
task.log_format, task.execution_node, controller_node))
elif rampart_group.is_containerized:
elif rampart_group.is_container_group:
# find one real, non-containerized instance with capacity to
# act as the controller for k8s API interaction
match = None
for group in InstanceGroup.objects.all():
if group.is_containerized or group.controller_id:
if group.is_container_group or group.controller_id:
continue
match = group.fit_task_to_most_remaining_capacity_instance(task)
match = group.fit_task_to_most_remaining_capacity_instance(task, group.instances.all())
if match:
break
task.instance_group = rampart_group
@@ -311,6 +317,7 @@ class TaskManager():
with disable_activity_stream():
task.celery_task_id = str(uuid.uuid4())
task.save()
task.log_lifecycle("waiting")
if rampart_group is not None:
self.consume_capacity(task, rampart_group.name)
@@ -449,6 +456,7 @@ class TaskManager():
def generate_dependencies(self, undeped_tasks):
created_dependencies = []
for task in undeped_tasks:
task.log_lifecycle("acknowledged")
dependencies = []
if not type(task) is Job:
continue
@@ -488,11 +496,18 @@ class TaskManager():
def process_pending_tasks(self, pending_tasks):
running_workflow_templates = set([wf.unified_job_template_id for wf in self.get_running_workflow_jobs()])
tasks_to_update_job_explanation = []
for task in pending_tasks:
if self.start_task_limit <= 0:
break
if self.is_job_blocked(task):
logger.debug("{} is blocked from running".format(task.log_format))
blocked_by = self.job_blocked_by(task)
if blocked_by:
task.log_lifecycle("blocked", blocked_by=blocked_by)
job_explanation = gettext_noop(f"waiting for {blocked_by._meta.model_name}-{blocked_by.id} to finish")
if task.job_explanation != job_explanation:
if task.created < (tz_now() - self.time_delta_job_explanation):
task.job_explanation = job_explanation
tasks_to_update_job_explanation.append(task)
continue
preferred_instance_groups = task.preferred_instance_groups
found_acceptable_queue = False
@@ -506,14 +521,17 @@ class TaskManager():
self.start_task(task, None, task.get_jobs_fail_chain(), None)
continue
for rampart_group in preferred_instance_groups:
if task.can_run_containerized and rampart_group.is_containerized:
if task.can_run_containerized and rampart_group.is_container_group:
self.graph[rampart_group.name]['graph'].add_job(task)
self.start_task(task, rampart_group, task.get_jobs_fail_chain(), None)
found_acceptable_queue = True
break
remaining_capacity = self.get_remaining_capacity(rampart_group.name)
if not rampart_group.is_containerized and self.get_remaining_capacity(rampart_group.name) <= 0:
if (
task.task_impact > 0 and # project updates have a cost of zero
not rampart_group.is_container_group and
self.get_remaining_capacity(rampart_group.name) <= 0):
logger.debug("Skipping group {}, remaining_capacity {} <= 0".format(
rampart_group.name, remaining_capacity))
continue
@@ -521,14 +539,15 @@ class TaskManager():
execution_instance = InstanceGroup.fit_task_to_most_remaining_capacity_instance(task, self.graph[rampart_group.name]['instances']) or \
InstanceGroup.find_largest_idle_instance(self.graph[rampart_group.name]['instances'])
if execution_instance or rampart_group.is_containerized:
if not rampart_group.is_containerized:
if execution_instance or rampart_group.is_container_group:
if not rampart_group.is_container_group:
execution_instance.remaining_capacity = max(0, execution_instance.remaining_capacity - task.task_impact)
execution_instance.jobs_running += 1
logger.debug("Starting {} in group {} instance {} (remaining_capacity={})".format(
task.log_format, rampart_group.name, execution_instance.hostname, remaining_capacity))
execution_instance = self.real_instances[execution_instance.hostname]
if execution_instance:
execution_instance = self.real_instances[execution_instance.hostname]
self.graph[rampart_group.name]['graph'].add_job(task)
self.start_task(task, rampart_group, task.get_jobs_fail_chain(), execution_instance)
found_acceptable_queue = True
@@ -537,7 +556,17 @@ class TaskManager():
logger.debug("No instance available in group {} to run job {} w/ capacity requirement {}".format(
rampart_group.name, task.log_format, task.task_impact))
if not found_acceptable_queue:
task.log_lifecycle("needs_capacity")
job_explanation = gettext_noop("This job is not ready to start because there is not enough available capacity.")
if task.job_explanation != job_explanation:
if task.created < (tz_now() - self.time_delta_job_explanation):
# Many launched jobs are immediately blocked, but most blocks will resolve in a few seconds.
# Therefore we should only update the job_explanation after some time has elapsed to
# prevent excessive task saves.
task.job_explanation = job_explanation
tasks_to_update_job_explanation.append(task)
logger.debug("{} couldn't be scheduled on graph, waiting for next cycle".format(task.log_format))
UnifiedJob.objects.bulk_update(tasks_to_update_job_explanation, ['job_explanation'])
def timeout_approval_node(self):
workflow_approvals = WorkflowApproval.objects.filter(status='pending')
@@ -568,7 +597,7 @@ class TaskManager():
).exclude(
execution_node__in=Instance.objects.values_list('hostname', flat=True)
):
if j.execution_node and not j.is_containerized:
if j.execution_node and not j.is_container_group_task:
logger.error(f'{j.execution_node} is not a registered instance; reaping {j.log_format}')
reap_job(j, 'failed')

View File

@@ -121,6 +121,27 @@ def sync_superuser_status_to_rbac(instance, **kwargs):
Role.singleton(ROLE_SINGLETON_SYSTEM_ADMINISTRATOR).members.remove(instance)
def sync_rbac_to_superuser_status(instance, sender, **kwargs):
'When the is_superuser flag is false but a user has the System Admin role, update the database to reflect that'
if kwargs['action'] in ['post_add', 'post_remove', 'post_clear']:
new_status_value = bool(kwargs['action'] == 'post_add')
if hasattr(instance, 'singleton_name'): # duck typing, role.members.add() vs user.roles.add()
role = instance
if role.singleton_name == ROLE_SINGLETON_SYSTEM_ADMINISTRATOR:
if kwargs['pk_set']:
kwargs['model'].objects.filter(pk__in=kwargs['pk_set']).update(is_superuser=new_status_value)
elif kwargs['action'] == 'post_clear':
kwargs['model'].objects.all().update(is_superuser=False)
else:
user = instance
if kwargs['action'] == 'post_clear':
user.is_superuser = False
user.save(update_fields=['is_superuser'])
elif kwargs['model'].objects.filter(pk__in=kwargs['pk_set'], singleton_name=ROLE_SINGLETON_SYSTEM_ADMINISTRATOR).exists():
user.is_superuser = new_status_value
user.save(update_fields=['is_superuser'])
def rbac_activity_stream(instance, sender, **kwargs):
# Only if we are associating/disassociating
if kwargs['action'] in ['pre_add', 'pre_remove']:
@@ -197,6 +218,7 @@ m2m_changed.connect(rebuild_role_ancestor_list, Role.parents.through)
m2m_changed.connect(rbac_activity_stream, Role.members.through)
m2m_changed.connect(rbac_activity_stream, Role.parents.through)
post_save.connect(sync_superuser_status_to_rbac, sender=User)
m2m_changed.connect(sync_rbac_to_superuser_status, Role.members.through)
pre_delete.connect(cleanup_detached_labels_on_deleted_parent, sender=UnifiedJob)
pre_delete.connect(cleanup_detached_labels_on_deleted_parent, sender=UnifiedJobTemplate)
@@ -346,6 +368,7 @@ def model_serializer_mapping():
models.Credential: serializers.CredentialSerializer,
models.Team: serializers.TeamSerializer,
models.Project: serializers.ProjectSerializer,
models.ExecutionEnvironment: serializers.ExecutionEnvironmentSerializer,
models.JobTemplate: serializers.JobTemplateWithSpecSerializer,
models.Job: serializers.JobSerializer,
models.AdHocCommand: serializers.AdHocCommandSerializer,

File diff suppressed because it is too large Load Diff

View File

@@ -8,4 +8,5 @@ clouds:
project_name: fooo
username: fooo
private: true
region_name: fooo
verify: false

View File

@@ -1,34 +0,0 @@
import pytest
import random
from awx.main.models import Project
from awx.main.analytics import collectors
@pytest.mark.django_db
def test_empty():
assert collectors.projects_by_scm_type(None) == {
'manual': 0,
'git': 0,
'svn': 0,
'hg': 0,
'insights': 0,
'archive': 0,
}
@pytest.mark.django_db
@pytest.mark.parametrize('scm_type', [t[0] for t in Project.SCM_TYPE_CHOICES])
def test_multiple(scm_type):
expected = {
'manual': 0,
'git': 0,
'svn': 0,
'hg': 0,
'insights': 0,
'archive': 0,
}
for i in range(random.randint(0, 10)):
Project(scm_type=scm_type).save()
expected[scm_type or 'manual'] += 1
assert collectors.projects_by_scm_type(None) == expected

View File

@@ -1,283 +0,0 @@
{
"ansible_all_ipv4_addresses": [
"172.17.0.7"
],
"ansible_all_ipv6_addresses": [
"fe80::42:acff:fe11:7"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "12/01/2006",
"ansible_bios_version": "VirtualBox",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz64",
"base": true,
"console": "tty0",
"initrd": "/boot/initrd.img",
"loglevel": "3",
"noembed": true,
"nomodeset": true,
"norestore": true,
"user": "docker",
"waitusb": "10:LABEL=boot2docker-data"
},
"ansible_date_time": {
"date": "2016-02-02",
"day": "02",
"epoch": "1454424257",
"hour": "14",
"iso8601": "2016-02-02T14:44:17Z",
"iso8601_basic": "20160202T144417348424",
"iso8601_basic_short": "20160202T144417",
"iso8601_micro": "2016-02-02T14:44:17.348496Z",
"minute": "44",
"month": "02",
"second": "17",
"time": "14:44:17",
"tz": "UTC",
"tz_offset": "+0000",
"weekday": "Tuesday",
"weekday_number": "2",
"weeknumber": "05",
"year": "2016"
},
"ansible_default_ipv4": {
"address": "172.17.0.7",
"alias": "eth0",
"broadcast": "global",
"gateway": "172.17.0.1",
"interface": "eth0",
"macaddress": "02:42:ac:11:00:07",
"mtu": 1500,
"netmask": "255.255.0.0",
"network": "172.17.0.0",
"type": "ether"
},
"ansible_default_ipv6": {},
"ansible_devices": {
"sda": {
"holders": [],
"host": "",
"model": "VBOX HARDDISK",
"partitions": {
"sda1": {
"sectors": "510015555",
"sectorsize": 512,
"size": "243.19 GB",
"start": "1975995"
},
"sda2": {
"sectors": "1975932",
"sectorsize": 512,
"size": "964.81 MB",
"start": "63"
}
},
"removable": "0",
"rotational": "0",
"scheduler_mode": "deadline",
"sectors": "512000000",
"sectorsize": "512",
"size": "244.14 GB",
"support_discard": "0",
"vendor": "ATA"
},
"sr0": {
"holders": [],
"host": "",
"model": "CD-ROM",
"partitions": {},
"removable": "1",
"rotational": "1",
"scheduler_mode": "deadline",
"sectors": "61440",
"sectorsize": "2048",
"size": "120.00 MB",
"support_discard": "0",
"vendor": "VBOX"
}
},
"ansible_distribution": "Ubuntu",
"ansible_distribution_major_version": "14",
"ansible_distribution_release": "trusty",
"ansible_distribution_version": "14.04",
"ansible_dns": {
"nameservers": [
"8.8.8.8"
]
},
"ansible_domain": "",
"ansible_env": {
"HOME": "/root",
"HOSTNAME": "ede894599989",
"LANG": "en_US.UTF-8",
"LC_ALL": "en_US.UTF-8",
"LC_MESSAGES": "en_US.UTF-8",
"LESSCLOSE": "/usr/bin/lesspipe %s %s",
"LESSOPEN": "| /usr/bin/lesspipe %s",
"LS_COLORS": "",
"OLDPWD": "/ansible",
"PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"PWD": "/ansible/examples",
"SHLVL": "1",
"_": "/usr/local/bin/ansible",
"container": "docker"
},
"ansible_eth0": {
"active": true,
"device": "eth0",
"ipv4": {
"address": "172.17.0.7",
"broadcast": "global",
"netmask": "255.255.0.0",
"network": "172.17.0.0"
},
"ipv6": [
{
"address": "fe80::42:acff:fe11:7",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "02:42:ac:11:00:07",
"mtu": 1500,
"promisc": false,
"type": "ether"
},
"ansible_fips": false,
"ansible_form_factor": "Other",
"ansible_fqdn": "ede894599989",
"ansible_hostname": "ede894599989",
"ansible_interfaces": [
"lo",
"eth0"
],
"ansible_kernel": "4.1.12-boot2docker",
"ansible_lo": {
"active": true,
"device": "lo",
"ipv4": {
"address": "127.0.0.1",
"broadcast": "host",
"netmask": "255.0.0.0",
"network": "127.0.0.0"
},
"ipv6": [
{
"address": "::1",
"prefix": "128",
"scope": "host"
}
],
"mtu": 65536,
"promisc": false,
"type": "loopback"
},
"ansible_lsb": {
"codename": "trusty",
"description": "Ubuntu 14.04.3 LTS",
"id": "Ubuntu",
"major_release": "14",
"release": "14.04"
},
"ansible_machine": "x86_64",
"ansible_memfree_mb": 3746,
"ansible_memory_mb": {
"nocache": {
"free": 8896,
"used": 3638
},
"real": {
"free": 3746,
"total": 12534,
"used": 8788
},
"swap": {
"cached": 0,
"free": 4048,
"total": 4048,
"used": 0
}
},
"ansible_memtotal_mb": 12534,
"ansible_mounts": [
{
"device": "/dev/sda1",
"fstype": "ext4",
"mount": "/etc/resolv.conf",
"options": "rw,relatime,data=ordered",
"size_available": 201281392640,
"size_total": 256895700992,
"uuid": "NA"
},
{
"device": "/dev/sda1",
"fstype": "ext4",
"mount": "/etc/hostname",
"options": "rw,relatime,data=ordered",
"size_available": 201281392640,
"size_total": 256895700992,
"uuid": "NA"
},
{
"device": "/dev/sda1",
"fstype": "ext4",
"mount": "/etc/hosts",
"options": "rw,relatime,data=ordered",
"size_available": 201281392640,
"size_total": 256895700992,
"uuid": "NA"
}
],
"ansible_nodename": "ede894599989",
"ansible_os_family": "Debian",
"ansible_pkg_mgr": "apt",
"ansible_processor": [
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"GenuineIntel",
"Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz"
],
"ansible_processor_cores": 8,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 8,
"ansible_product_name": "VirtualBox",
"ansible_product_serial": "0",
"ansible_product_uuid": "25C5EA5A-1DF1-48D9-A2C6-81227DA153C0",
"ansible_product_version": "1.2",
"ansible_python_version": "2.7.6",
"ansible_selinux": false,
"ansible_service_mgr": "upstart",
"ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBALF0xsM8UMXgSKiWNw4t19wxbxLnxQX742t/dIM0O8YLx+/lIP+Q69Dv5uoVt0zKV39eFziRlCh96qj2KYkGEJ6XfVZFnhpculL2Pv2CPpSwKuQ1vTbDO/xxUrvY+bHpfNJf9Rh69bFEE2pTsjomFPCgp8M0qGaFtwg6czSaeBONAAAAFQCGEfVtj97JiexTVRqgQITYlFp/eQAAAIEAg+S9qWn+AIb3amwVoLL/usQYOPCmZY9RVPzpkjJ6OG+HI4B7cXeauPtNTJwT0f9vGEqzf4mPpmS+aCShj6iwdmJ+cOwR5+SJlNalab3CMBoXKVLbT1J2XWFlK0szKKnoReP96IDbkAkGQ3fkm4jz0z6Wy0u6wOQVNcd4G5cwLZ4AAACAFvBm+H1LwNrwWBjWio+ayhglZ4Y25mLMEn2+dqBz0gLK5szEbft1HMPOWIVHvl6vi3v34pAJHKpxXpkLlNliTn8iw9BzCOrgP4V8sp2/85mxEuCdI1w/QERj9cHu5iS2pZ0cUwDE3pfuuGBB3IEliaJyaapowdrM8lN12jQl11E=",
"ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHiYp4e9RfXpxDcEWpK4EuXPHW9++xcFI9hiB0TYAZgxEF9RIgwfucpPawFk7HIFoNc7EXQMlryilLSbg155KWM=",
"ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAILclD2JaC654azEsAfcHRIOA2Ig9/Qk6MX80i/VCEdSH",
"ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDeSUGxZaZsgBsezld0mj3HcbAwx6aykGnejceBjcs6lVwSGMHevofzSXIQDPYBhZoyWNl0PYAHv6AsQ8+3khd2SitUMJAuHSz1ZjgHCCGQP9ijXTKHn+lWCKA8rhLG/dwYwiouoOPZfn1G+erbKO6XiVbELrrf2RadnMGuMinESIOKVj3IunXsaGRMsDOQferOnUf7MvH7xpQnoySyQ1+p4rGruaohWG+Y2cDo7+B2FylPVbrpRDDJkfbt4J96WHx0KOdD0qzOicQP8JqDflqQPJJCWcgrvjQOSe4gXdPB6GZDtBl2qgQRwt1IgizPMm+b7Bwbd2VDe1TeWV2gT/7H",
"ansible_swapfree_mb": 4048,
"ansible_swaptotal_mb": 4048,
"ansible_system": "Linux",
"ansible_system_vendor": "innotek GmbH",
"ansible_uptime_seconds": 178398,
"ansible_user_dir": "/root",
"ansible_user_gecos": "root",
"ansible_user_gid": 0,
"ansible_user_id": "root",
"ansible_user_shell": "/bin/bash",
"ansible_user_uid": 0,
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "docker",
"module_setup": true
}

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